static void write_message_to_mailbox (client_t *self) { mlm_msg_t *msg = mlm_msg_new ( self->address, mlm_proto_address (self->message), mlm_proto_subject (self->message), mlm_proto_tracker (self->message), mlm_proto_timeout (self->message), mlm_proto_get_content (self->message)); // Try to dispatch to client immediately, if it's connected client_t *target = (client_t *) zhashx_lookup ( self->server->clients, mlm_proto_address (self->message)); if (target) { assert (!target->msg); target->msg = msg; engine_send_event (target, mailbox_message_event); } else // Else store in the eponymous mailbox zsock_send (self->server->mailbox, "ssp", "STORE", mlm_proto_address (self->message), msg); }
static void dispatch_the_service (client_t *self) { service_t *service = s_service_require (self, mlm_proto_address (self->message)); assert (service); s_service_dispatch (service); }
static void write_message_to_service (client_t *self) { mlm_msg_t *msg = mlm_msg_new ( self->address, mlm_proto_address (self->message), mlm_proto_subject (self->message), mlm_proto_tracker (self->message), mlm_proto_timeout (self->message), mlm_proto_get_content (self->message)); service_t *service = s_service_require (self, mlm_proto_address (self->message)); assert (service); if (!s_service_dispatch_message (service, msg)) mlm_msgq_enqueue (service->queue, msg); }
static void store_service_offer (client_t *self) { service_t *service = s_service_require (self, mlm_proto_address (self->message)); assert (service); offer_t *offer = s_offer_new (self, mlm_proto_pattern (self->message)); assert (offer); zlistx_add_end (service->offers, offer); }
static void pass_stream_message_to_app (client_t *self) { zstr_sendm (self->msgpipe, "STREAM DELIVER"); zsock_bsend (self->msgpipe, "sssp", mlm_proto_address (self->message), mlm_proto_sender (self->message), mlm_proto_subject (self->message), mlm_proto_get_content (self->message)); }
static void register_new_client (client_t *self) { self->address = strdup (mlm_proto_address (self->message)); if (*self->address) { // If there's an existing client with this address, expire it // The alternative would be to reject new clients with the same address self->address = strdup (mlm_proto_address (self->message)); client_t *existing = (client_t *) zhashx_lookup ( self->server->clients, self->address); if (existing) engine_send_event (existing, expired_event); // In any case, we now own this address zhashx_update (self->server->clients, self->address, self); } if (*self->address) zsys_info ("client address='%s' - registering", self->address); mlm_proto_set_status_code (self->message, MLM_PROTO_SUCCESS); }
static void pass_mailbox_message_to_app (client_t *self) { zstr_sendm (self->msgpipe, "MAILBOX DELIVER"); zsock_bsend (self->msgpipe, "ssssp", mlm_proto_sender (self->message), mlm_proto_address (self->message), mlm_proto_subject (self->message), mlm_proto_tracker (self->message), mlm_proto_get_content (self->message)); }