added exporting/importing bchannel stacks to the remote application
[lcr.git] / joinremote.cpp
index 3b7291c..f2c08b7 100644 (file)
@@ -37,12 +37,13 @@ JoinRemote::JoinRemote(unsigned long serial, char *remote_name, int remote_id) :
        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_name);
 
        /* send new ref to remote socket */
        memset(&param, 0, sizeof(param));
+       /* 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);
 }
@@ -53,7 +54,6 @@ JoinRemote::JoinRemote(unsigned long serial, char *remote_name, int remote_id) :
  */
 JoinRemote::~JoinRemote()
 {
-
 }
 
 
@@ -87,7 +87,7 @@ 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;
 
@@ -96,12 +96,22 @@ void JoinRemote::message_remote(unsigned long ref, int message_type, union param
        {
                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");
+               j_epoint_id = epoint->ep_serial;
                if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint)))
                        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.addr);
+               return;
+       }
+       
+       /* cannot just forward, because param is not of container "struct message" */
        message = message_create(j_serial, j_epoint_id, JOIN_TO_EPOINT, message_type);
        memcpy(&message->param, param, sizeof(message->param));
        message_put(message);
@@ -113,5 +123,35 @@ void JoinRemote::message_remote(unsigned long ref, int message_type, union param
        }
 }
 
+void message_bchannel_to_join(int serial, int type, unsigned long addr)
+{
+       union parameter param;
+       class Join *join;
+       class JoinRemote *joinremote;
+
+       /* find join serial */
+       join = find_join_id(serial);
+       if (!join)
+       {
+               PDEBUG(DEBUG_JOIN | DEBUG_BCHANNEL, "Join %d not found\n", serial);
+               return;
+       }
+       if (!join->j_type != JOIN_TYPE_REMOTE)
+       {
+               PERROR("Join %d not of remote type. This shall not happen.\n", serial);
+               return;
+       }
+       joinremote = (class JoinRemote *)join;
+
+       memset(&param, 0, sizeof(union parameter));
+       param.bchannel.type = type;
+       param.bchannel.addr = addr;
+       if (admin_message_from_join(joinremote->j_remote_id, joinremote->j_serial, MESSAGE_BCHANNEL, &param)<0)
+       {
+               PERROR("No socket with remote application '%s' found, this shall not happen. Closing socket shall cause release of all joins.\n", joinremote->j_remote_name);
+               return;         
+       }
+}
+