1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
10 \*****************************************************************************/
14 unsigned int new_remote = 1000;
19 Premote::Premote(int type, char *portname, struct port_settings *settings, struct interface *interface, int remote_id) : Port(type, portname, settings, interface)
21 union parameter param;
23 p_callerinfo.itype = (interface->extension)?INFO_ITYPE_ISDN_EXTENSION:INFO_ITYPE_ISDN;
24 p_r_ref = new_remote++;
25 SCPY(p_r_remote_app, interface->remote_app);
26 p_r_tones = (interface->is_tones == IS_YES);
28 /* send new ref to remote socket */
29 memset(¶m, 0, sizeof(union parameter));
30 if (type == PORT_TYPE_REMOTE_OUT)
31 param.newref.direction = 1; /* new ref from lcr */
32 p_r_remote_id = remote_id;
33 if (admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_NEWREF, ¶m) < 0)
34 FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", p_r_remote_app);
36 PDEBUG(DEBUG_PORT, "Created new RemotePort(%s).\n", portname);
45 PDEBUG(DEBUG_PORT, "Destroyed Remote process(%s).\n", p_name);
49 * endpoint sends messages to the port
51 int Premote::message_epoint(unsigned int epoint_id, int message_type, union parameter *param)
53 struct epoint_list *epointlist;
55 if (Port::message_epoint(epoint_id, message_type, param))
58 switch (message_type) {
60 struct interface *interface;
61 interface = getinterfacebyname(p_interface_name);
63 PERROR("Cannot find interface %s.\n", p_interface_name);
66 /* attach only if not already */
67 epointlist = p_epointlist;
69 if (epointlist->epoint_id == epoint_id)
71 epointlist = epointlist->next;
74 epointlist_new(epoint_id);
76 /* set context to pbx */
77 if (!param->setup.dialinginfo.context[0]) {
78 if (interface->remote_context[0])
79 SCPY(param->setup.dialinginfo.context, interface->remote_context);
81 SCPY(param->setup.dialinginfo.context, "lcr");
84 new_state(PORT_STATE_OUT_SETUP);
87 case MESSAGE_PROCEEDING:
88 new_state(PORT_STATE_IN_PROCEEDING);
91 case MESSAGE_ALERTING:
92 new_state(PORT_STATE_IN_ALERTING);
96 new_state(PORT_STATE_CONNECT);
99 case MESSAGE_DISCONNECT:
100 new_state(PORT_STATE_OUT_DISCONNECT);
103 case MESSAGE_RELEASE:
104 new_state(PORT_STATE_RELEASE);
108 /* look for Remote's interface */
109 if (admin_message_from_lcr(p_r_remote_id, p_r_ref, message_type, param)<0) {
110 PERROR("No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all remote ports.\n", p_r_remote_app);
114 if (message_type == MESSAGE_RELEASE) {
115 new_state(PORT_STATE_RELEASE);
123 void Premote::message_remote(int message_type, union parameter *param)
125 class Endpoint *epoint;
126 struct lcr_msg *message;
127 struct interface *interface;
129 switch (message_type) {
130 case MESSAGE_TRAFFIC:
131 bridge_tx(param->traffic.data, param->traffic.len);
135 interface = getinterfacebyname(p_interface_name);
137 PERROR("Cannot find interface %s.\n", p_interface_name);
141 /* enable audio path */
142 if (interface->is_tones == IS_YES) {
143 union parameter newparam;
144 memset(&newparam, 0, sizeof(union parameter));
145 admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_PATTERN, &newparam);
146 newparam.audiopath = 1;
147 admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_AUDIOPATH, &newparam);
150 /* set source interface */
151 param->setup.callerinfo.itype = p_callerinfo.itype;
152 SCPY(param->setup.callerinfo.interface, interface->name);
154 /* create endpoint */
156 FATAL("Incoming call but already got an endpoint.\n");
157 if (!(epoint = new Endpoint(p_serial, 0)))
158 FATAL("No memory for Endpoint instance\n");
159 epoint->ep_app = new_endpointapp(epoint, 0, interface->app); //incoming
161 epointlist_new(epoint->ep_serial);
163 new_state(PORT_STATE_IN_SETUP);
166 case MESSAGE_PROCEEDING:
167 new_state(PORT_STATE_OUT_PROCEEDING);
170 case MESSAGE_ALERTING:
171 new_state(PORT_STATE_OUT_ALERTING);
174 case MESSAGE_CONNECT:
175 new_state(PORT_STATE_CONNECT);
178 case MESSAGE_DISCONNECT:
179 new_state(PORT_STATE_IN_DISCONNECT);
182 case MESSAGE_RELEASE:
183 new_state(PORT_STATE_RELEASE);
187 /* cannot just forward, because param is not of container "struct lcr_msg" */
188 message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, message_type);
189 memcpy(&message->param, param, sizeof(message->param));
190 message_put(message);
192 if (message_type == MESSAGE_RELEASE) {
193 new_state(PORT_STATE_RELEASE);
199 /* receive from remote Port instance */
200 int Premote::bridge_rx(unsigned char *data, int len)
202 union parameter newparam;
205 /* don't send tones, if not enabled or not connected */
207 && p_state != PORT_STATE_CONNECT)
210 memset(&newparam, 0, sizeof(union parameter));
211 /* split, if exeeds data size */
213 l = (len > (int)sizeof(newparam.traffic.data)) ? sizeof(newparam.traffic.data) : len;
214 newparam.traffic.len = l;
216 memcpy(newparam.traffic.data, data, l);
218 admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_TRAFFIC, &newparam);