Merge branch 'master' of ssh://jolly@www.mISDN.org/var/git/lcr
[lcr.git] / joinremote.cpp
index 4b5e458..ec65f35 100644 (file)
  * constructor for a new join 
  * the join will have a relation to the calling endpoint
  */
-JoinRemote::JoinRemote(unsigned long serial, char *remote) : Join()
+JoinRemote::JoinRemote(unsigned long serial, char *remote_name, int remote_id) : Join()
 {
        PDEBUG(DEBUG_JOIN, "Constructor(new join)");
-       union parameter *param;
+       union parameter param;
 
-       SCPY(j_remote, remote);
+       SCPY(j_remote_name, remote_name);
+       j_remote_id = remote_id;
        j_type = JOIN_TYPE_REMOTE;
 
-       j_epoint_id = serial;
+       j_epoint_id = serial; /* this is the endpoint, if created by epoint */
        if (j_epoint_id)
-               PDEBUG(DEBUG_JOIN, "New remote join connected to endpoint id %lu and application %s\n", j_epoint_id, remote);
+               PDEBUG(DEBUG_JOIN, "New remote join connected to endpoint id %lu and application %s\n", j_epoint_id, remote_name);
 
        /* send new ref to remote socket */
-       memset(&param, 0, sizeof(param));
-       if (admin_message_from_join(j_remote, j_serial, MESSAGE_NEWREF, param)<0)
-               FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", j_remote);
+       memset(&param, 0, sizeof(union parameter));
+       if (serial)
+               param.direction = 1; /* new ref from lcr */
+       /* the j_serial is assigned by Join() parent. this is sent as new ref */
+       if (admin_message_from_join(j_remote_id, j_serial, MESSAGE_NEWREF, &param)<0)
+               FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", j_remote_name);
 }
 
 
@@ -52,7 +56,6 @@ JoinRemote::JoinRemote(unsigned long serial, char *remote) : Join()
  */
 JoinRemote::~JoinRemote()
 {
-
 }
 
 
@@ -73,9 +76,9 @@ void JoinRemote::message_epoint(unsigned long epoint_id, int message_type, union
                return;
        
        /* look for Remote's interface */
-       if (admin_message_from_join(j_remote, j_serial, message_type, param)<0)
+       if (admin_message_from_join(j_remote_id, j_serial, message_type, param)<0)
        {
-               PERROR("No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all joins.\n", j_remote);
+               PERROR("No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all joins.\n", j_remote_name);
                return;         
        }
 
@@ -86,21 +89,31 @@ void JoinRemote::message_epoint(unsigned long epoint_id, int message_type, union
        }
 }
 
-void JoinRemote::message_remote(unsigned long ref, int message_type, union parameter *param)
+void JoinRemote::message_remote(int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        /* create relation if no relation exists */
        if (!j_epoint_id)
        {
                class Endpoint          *epoint;
 
-               if (!(epoint = new Endpoint(0, j_serial, ref)))
+               if (!(epoint = new Endpoint(0, j_serial)))
                        FATAL("No memory for Endpoint instance\n");
-               if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint)))
+               j_epoint_id = epoint->ep_serial;
+               if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint, 1))) // outgoing
                        FATAL("No memory for Endpoint Application instance\n");
        }
 
+       /* set serial on bchannel message
+        * also ref is given, so we send message with ref */
+       if (message_type == MESSAGE_BCHANNEL)
+       {
+               message_bchannel_from_join(this, param->bchannel.type, param->bchannel.handle);
+               return;
+       }
+       
+       /* cannot just forward, because param is not of container "struct lcr_msg" */
        message = message_create(j_serial, j_epoint_id, JOIN_TO_EPOINT, message_type);
        memcpy(&message->param, param, sizeof(message->param));
        message_put(message);
@@ -112,5 +125,26 @@ void JoinRemote::message_remote(unsigned long ref, int message_type, union param
        }
 }
 
+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)
+{
+       union parameter param;
+
+       memset(&param, 0, sizeof(union parameter));
+       param.bchannel.type = type;
+       param.bchannel.handle = handle;
+       param.bchannel.tx_gain = tx_gain;
+       param.bchannel.rx_gain = rx_gain;
+       if (pipeline)
+               SCPY(param.bchannel.pipeline, pipeline);
+       if (crypt_len)
+               memcpy(param.bchannel.crypt, crypt, crypt_len);
+       param.bchannel.crypt_type = crypt_type;
+       if (admin_message_from_join(remote_id, ref, MESSAGE_BCHANNEL, &param)<0)
+       {
+               PERROR("No socket with remote id %d found, this happens, if the socket is closed before all bchannels are imported.\n", remote_id);
+               return;         
+       }
+}
+