/usr/include/titan/Port.hh is in eclipse-titan 6.3.1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | /******************************************************************************
* Copyright (c) 2000-2017 Ericsson Telecom AB
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Baji, Laszlo
* Balasko, Jeno
* Baranyi, Botond
* Feher, Csaba
* Raduly, Csaba
* Szabados, Kristof
* Szabo, Bence Janos
* Szabo, Janos Zoltan – initial implementation
* Tatarka, Gabor
*
******************************************************************************/
#ifndef PORT_HH
#define PORT_HH
#include <sys/types.h>
#include "Types.h"
#include "Event_Handler.hh"
#include <stddef.h> // only for NULL
#include <sys/select.h>
class COMPONENT;
class COMPONENT_template;
class Text_Buf;
class OCTETSTRING;
class CHARSTRING;
class Index_Redirect;
extern const COMPONENT_template& any_compref;
struct port_connection; // no user serviceable parts inside
/** Base class for all test ports */
class PORT : public Fd_And_Timeout_Event_Handler {
friend class PORT_LIST;
friend struct port_connection;
static PORT *list_head, *list_tail;
// Used during translation port activate. It will
// contains the provider ports. It is needed because the
// names of the ports of system component and the mtc
// can be the same.
static PORT *system_list_head, *system_list_tail;
void add_to_list(boolean system = FALSE);
void remove_from_list(boolean system);
static PORT *lookup_by_name(const char *par_port_name, boolean system = FALSE);
struct port_parameter; // no user serviceable parts inside
static port_parameter *parameter_head, *parameter_tail;
/** @brief Apply the given port parameter.
*
* Applies the parameter to the appropriate port, or all ports if it's
* a parameter for all ports ( "*" )
* @param par_ptr pointer to the port parameter
*/
static void apply_parameter(port_parameter *par_ptr);
void set_system_parameters(const char *system_port);
public:
struct msg_queue_item_base {
struct msg_queue_item_base *next_item;
};
msg_queue_item_base *msg_queue_head, *msg_queue_tail;
public:
/** @brief Store a port parameter
*
* @param component_id component identifier
* @param par_port_name string, name of the port, NULL if the parameter
* refers to all ports ( "*" )
* @param parameter_name string, name of the parameter
* @param parameter_value string, the value
*/
static void add_parameter(const component_id_t& component_id,
const char *par_port_name, const char *parameter_name,
const char *parameter_value);
/** Deallocates the list of port parameters */
static void clear_parameters();
/** @brief Apply port parameters to component
Iterates through all known port parameters and
@param component_reference
@param component_name
*/
static void set_parameters(component component_reference,
const char *component_name);
protected:
const char *port_name;
unsigned int msg_head_count, msg_tail_count, proc_head_count,
proc_tail_count;
boolean is_active, is_started, is_halted;
private:
int n_system_mappings;
char **system_mappings;
PORT *list_prev, *list_next;
port_connection *connection_list_head, *connection_list_tail;
private:
/// Copy constructor disabled.
PORT(const PORT& other_port);
/// Assignment disabled.
PORT& operator=(const PORT& other_port);
public:
PORT(const char *par_port_name);
virtual ~PORT();
inline const char *get_name() const { return port_name; }
void set_name(const char * name);
virtual void log() const;
void activate_port(boolean system = FALSE);
void deactivate_port(boolean system);
static void deactivate_all();
void clear();
static void all_clear();
void start();
static void all_start();
void stop();
static void all_stop();
void halt();
static void all_halt();
boolean port_is_started();
// Returns the outer message port it is mapped to
// when the port works in translation mode.
// In the case of dual faced ports it returns the port object
// it is called on (this).
// Otherwise returns NULL.
// Emits errors when the port is mapped to more than one port or
// has both connections and mappings.
// This function is overridden only in the class of a port with translation
// capability and dual faced ports.
virtual PORT* get_provider_port();
boolean check_port_state(const CHARSTRING& type) const;
static boolean any_check_port_state(const CHARSTRING& type);
static boolean all_check_port_state(const CHARSTRING& type);
// Used by the setstate operation through TTCN_Runtime
virtual void change_port_state(translation_port_state state);
virtual alt_status receive(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_receive(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status check_receive(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_check_receive(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status trigger(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_trigger(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status getcall(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_getcall(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status check_getcall(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_check_getcall(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status getreply(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_getreply(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status check_getreply(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_check_getreply(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status get_exception(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_catch(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL);
virtual alt_status check_catch(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL,
Index_Redirect* index_redirect = NULL);
static alt_status any_check_catch(const COMPONENT_template&
sender_template = any_compref, COMPONENT *sender_ptr = NULL);
alt_status check(const COMPONENT_template& sender_template = any_compref,
COMPONENT *sender_ptr = NULL, Index_Redirect* index_redirect = NULL);
static alt_status any_check(const COMPONENT_template& sender_template =
any_compref, COMPONENT *sender_ptr = NULL);
/** Set a parameter on the port.
* @param parameter_name string
* @param parameter_value
*
* The implementation in the PORT base class issues a warning and
* does nothing. Derived classes need to override this method.
*/
virtual void set_parameter(const char *parameter_name,
const char *parameter_value);
void append_to_msg_queue(msg_queue_item_base*);
private:
/** Callback interface for handling events - introduced in TITAN R7E
* To use the finer granularity interface, this method must not be
* overridden in the descendant Test Port class.
* Note: Error event always triggers event handler call and is indicated in
* the is_error parameter even if not requested.
*/
virtual void Handle_Fd_Event(int fd,
boolean is_readable, boolean is_writable, boolean is_error);
/** Callback interface for handling timeout - introduced in TITAN R7E
* May not be overridden in the descendant Test Port class if
* timeout is not used.
*/
virtual void Handle_Timeout(double time_since_last_call);
/** Callback interface for handling events - introduced in TITAN R7E
* These methods in the descendant Test Port class are called only if
* Handle_Fd_Event is not overridden in the descendant Test Port class.
* The method handling an event which is not used in the Test Port
* may not be overridden in the descendant Test Port class.
* This is true even for the error event handler, although error events
* always trigger event handler call even if not requested.
* (There is an empty default implementation for the error event handler.)
*/
virtual void Handle_Fd_Event_Error(int fd);
virtual void Handle_Fd_Event_Writable(int fd);
virtual void Handle_Fd_Event_Readable(int fd);
public:
/** Callback interface for handling events
* This method is provided for Test Ports developed for TITAN versions
* before R7E.
* (It is called only if event handler has been registered with
* Install_Handler.)
*/
virtual void Event_Handler(const fd_set *read_fds, const fd_set *write_fds,
const fd_set *error_fds, double time_since_last_call);
protected:
/** Interface for handling events and timeout - introduced in TITAN R7E */
typedef enum {
EVENT_RD = FD_EVENT_RD, EVENT_WR = FD_EVENT_WR,
EVENT_ERR = FD_EVENT_ERR,
EVENT_ALL = FD_EVENT_RD | FD_EVENT_WR | FD_EVENT_ERR
} Fd_Event_Type;
void Handler_Add_Fd(int fd, Fd_Event_Type event_mask = EVENT_ALL);
void Handler_Add_Fd_Read(int fd);
void Handler_Add_Fd_Write(int fd);
void Handler_Remove_Fd(int fd, Fd_Event_Type event_mask = EVENT_ALL);
void Handler_Remove_Fd_Read(int fd);
void Handler_Remove_Fd_Write(int fd);
void Handler_Set_Timer(double call_interval, boolean is_timeout = TRUE,
boolean call_anyway = TRUE, boolean is_periodic = TRUE);
/** Interface for handling events and timeout
* This method is provided for Test Ports developed for TITAN versions
* before R7E.
*/
void Install_Handler(const fd_set *read_fds, const fd_set *write_fds,
const fd_set *error_fds, double call_interval);
/** Interface for handling events and timeout
* This method is in use in Test Ports developed for TITAN versions
* before R7E.
* It can be used together with the interface introduced in TITAN R7E.
*/
void Uninstall_Handler();
virtual void user_map(const char *system_port);
virtual void user_unmap(const char *system_port);
virtual void user_start();
virtual void user_stop();
virtual void clear_queue();
component get_default_destination();
static void prepare_message(Text_Buf& outgoing_buf,
const char *message_type);
static void prepare_call(Text_Buf& outgoing_buf,
const char *signature_name);
static void prepare_reply(Text_Buf& outgoing_buf,
const char *signature_name);
static void prepare_exception(Text_Buf& outgoing_buf,
const char *signature_name);
void send_data(Text_Buf& outgoing_buf,
const COMPONENT& destination_component);
void process_data(port_connection *conn_ptr, Text_Buf& incoming_buf);
virtual boolean process_message(const char *message_type,
Text_Buf& incoming_buf, component sender_component, OCTETSTRING&);
virtual boolean process_call(const char *signature_name,
Text_Buf& incoming_buf, component sender_component);
virtual boolean process_reply(const char *signature_name,
Text_Buf& incoming_buf, component sender_component);
virtual boolean process_exception(const char *signature_name,
Text_Buf& incoming_buf, component sender_component);
// Resets the port type variables to NULL after unmap
virtual void reset_port_variables();
// Initializes the port variables after map
virtual void init_port_variables();
private:
port_connection *add_connection(component remote_component,
const char *remote_port, transport_type_enum transport_type);
void remove_connection(port_connection *conn_ptr);
port_connection *lookup_connection_to_compref(component remote_component,
boolean *is_unique);
port_connection *lookup_connection(component remote_component,
const char *remote_port);
void add_local_connection(PORT *other_endpoint);
void remove_local_connection(port_connection *conn_ptr);
static unsigned int get_connection_hash(component local_component,
const char *local_port, component remote_component,
const char *remote_port);
static void unlink_unix_pathname(int socket_fd);
void connect_listen_inet_stream(component remote_component,
const char *remote_port);
void connect_listen_unix_stream(component remote_component,
const char *remote_port);
void connect_local(component remote_component, const char *remote_port);
void connect_stream(component remote_component, const char *remote_port,
transport_type_enum transport_type, Text_Buf& text_buf);
void disconnect_local(port_connection *conn_ptr);
void disconnect_stream(port_connection *conn_ptr);
void send_data_local(port_connection *conn_ptr, Text_Buf& outgoing_data);
boolean send_data_stream(port_connection *conn_ptr, Text_Buf& outgoing_data,
boolean ignore_peer_disconnect);
void handle_incoming_connection(port_connection *conn_ptr);
void handle_incoming_data(port_connection *conn_ptr);
void process_last_message(port_connection *conn_ptr);
void map(const char *system_port, boolean translation);
void unmap(const char *system_port, boolean translation);
public:
static void process_connect_listen(const char *local_port,
component remote_component, const char *remote_port,
transport_type_enum transport_type);
static void process_connect(const char *local_port,
component remote_component, const char *remote_port,
transport_type_enum transport_type, Text_Buf& text_buf);
static void process_disconnect(const char *local_port,
component remote_component, const char *remote_port);
static void make_local_connection(const char *src_port,
const char *dest_port);
static void terminate_local_connection(const char *src_port,
const char *dest_port);
static void map_port(const char *component_port, const char *system_port, boolean translation);
static void unmap_port(const char *component_port, const char *system_port, boolean translation);
};
#endif
|