1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** join functions for remote application **
10 \*****************************************************************************/
17 //#include <sys/types.h>
18 //#include <sys/stat.h>
21 //#define __u8 unsigned char
22 //#define __u16 unsigned short
23 //#define __u32 unsigned long
24 //#include "linux/isdnif.h"
28 * constructor for a new join
29 * the join will have a relation to the calling endpoint
31 JoinRemote::JoinRemote(unsigned long serial, char *remote_name, int remote_id) : Join()
33 PDEBUG(DEBUG_JOIN, "Constructor(new join)");
34 union parameter param;
36 SCPY(j_remote_name, remote_name);
37 j_remote_id = remote_id;
38 j_type = JOIN_TYPE_REMOTE;
40 j_epoint_id = serial; /* this is the endpoint, if created by epoint */
42 PDEBUG(DEBUG_JOIN, "New remote join connected to endpoint id %lu and application %s\n", j_epoint_id, remote_name);
44 /* send new ref to remote socket */
45 memset(¶m, 0, sizeof(union parameter));
47 param.direction = 1; /* new ref from lcr */
48 /* the j_serial is assigned by Join() parent. this is sent as new ref */
49 if (admin_message_from_join(j_remote_id, j_serial, MESSAGE_NEWREF, ¶m)<0)
50 FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", j_remote_name);
57 JoinRemote::~JoinRemote()
62 /* join process is called from the main loop
63 * it processes the current calling state.
64 * returns 0 if join nothing was done
66 int JoinRemote::handler(void)
72 void JoinRemote::message_epoint(unsigned long epoint_id, int message_type, union parameter *param)
74 /* if endpoint has just been removed, but still a message in the que */
75 if (epoint_id != j_epoint_id)
78 /* look for Remote's interface */
79 if (admin_message_from_join(j_remote_id, j_serial, message_type, param)<0)
81 PERROR("No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all joins.\n", j_remote_name);
85 if (message_type == MESSAGE_RELEASE)
92 void JoinRemote::message_remote(int message_type, union parameter *param)
94 struct message *message;
96 /* create relation if no relation exists */
99 class Endpoint *epoint;
101 if (!(epoint = new Endpoint(0, j_serial)))
102 FATAL("No memory for Endpoint instance\n");
103 j_epoint_id = epoint->ep_serial;
104 if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint, 1))) // outgoing
105 FATAL("No memory for Endpoint Application instance\n");
108 /* set serial on bchannel message
109 * also ref is given, so we send message with ref */
110 if (message_type == MESSAGE_BCHANNEL)
112 message_bchannel_from_join(this, param->bchannel.type, param->bchannel.handle);
116 /* cannot just forward, because param is not of container "struct message" */
117 message = message_create(j_serial, j_epoint_id, JOIN_TO_EPOINT, message_type);
118 memcpy(&message->param, param, sizeof(message->param));
119 message_put(message);
121 if (message_type == MESSAGE_RELEASE)
128 void message_bchannel_to_join(unsigned long remote_id, unsigned long ref, int type, unsigned long handle, int tx_gain, int rx_gain, char *pipeline, unsigned char *crypt, int crypt_len, int crypt_type)
130 union parameter param;
132 memset(¶m, 0, sizeof(union parameter));
133 param.bchannel.type = type;
134 param.bchannel.handle = handle;
135 param.bchannel.tx_gain = tx_gain;
136 param.bchannel.rx_gain = rx_gain;
138 SCPY(param.bchannel.pipeline, pipeline);
140 memcpy(param.bchannel.crypt, crypt, crypt_len);
141 param.bchannel.crypt_type = crypt_type;
142 if (admin_message_from_join(remote_id, ref, MESSAGE_BCHANNEL, ¶m)<0)
144 PERROR("No socket with remote id %d found, this happens, if the socket is closed before all bchannels are imported.\n", remote_id);