X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=joinremote.cpp;h=ec65f350addc1ce1670cec73633bef29e03dfe51;hp=4b5e45869b4edc992a1cecc1f8f8d563edd37f66;hb=27b95197734350cc99c29929c2527f2c6d5541d6;hpb=701b046a45c2c79cc6d07ac3a4f84f499f7ed376 diff --git a/joinremote.cpp b/joinremote.cpp index 4b5e458..ec65f35 100644 --- a/joinremote.cpp +++ b/joinremote.cpp @@ -28,22 +28,26 @@ * 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(¶m, 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(¶m, 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, ¶m)<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(¶m, 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, ¶m)<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; + } +} +