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(¶m, 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);
}
*/
JoinRemote::~JoinRemote()
{
-
}
}
}
-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;
{
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);
}
}
+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(¶m, 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, ¶m)<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;
+ }
+}
+