diff options
-rw-r--r-- | src/conversation/gnunet-service-conversation.c | 548 |
1 files changed, 216 insertions, 332 deletions
diff --git a/src/conversation/gnunet-service-conversation.c b/src/conversation/gnunet-service-conversation.c index 8937c8f497..08458f278f 100644 --- a/src/conversation/gnunet-service-conversation.c +++ b/src/conversation/gnunet-service-conversation.c @@ -172,7 +172,12 @@ struct Line /** * Handle to the line client. */ - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; + + /** + * Message queue for @e client. + */ + struct GNUNET_MQ_Handle *mq; /** * Our open port. @@ -199,11 +204,6 @@ struct Line static const struct GNUNET_CONFIGURATION_Handle *cfg; /** - * Notification context containing all connected clients. - */ -static struct GNUNET_SERVER_NotificationContext *nc; - -/** * Handle for cadet */ static struct GNUNET_CADET_Handle *cadet; @@ -238,28 +238,23 @@ find_channel_by_line (struct Line *line, /** * Function to handle a pickup request message from the client * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` of the client from which the message is + * @param msg the message from the client */ static void handle_client_pickup_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientPhonePickupMessage *msg) { - const struct ClientPhonePickupMessage *msg; - struct GNUNET_MQ_Envelope *e; + struct Line *line = cls; struct CadetPhonePickupMessage *mppm; - struct Line *line; + struct GNUNET_MQ_Envelope *env; struct Channel *ch; - msg = (const struct ClientPhonePickupMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL == line) + if (NULL == line->port) { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + /* we never opened the port, bad client! */ + GNUNET_break_op (0); + GNUNET_SERVICE_client_drop (line->client); return; } for (ch = line->channel_head; NULL != ch; ch = ch->next) @@ -271,24 +266,21 @@ handle_client_pickup_message (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Channel %u not found\n", msg->cid); - GNUNET_SERVER_receive_done (client, - GNUNET_YES); + GNUNET_SERVICE_client_continue (line->client); return; } switch (ch->status) { case CS_CALLEE_INIT: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_RINGING: ch->status = CS_CALLEE_CONNECTED; break; case CS_CALLEE_CONNECTED: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_SHUTDOWN: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -298,17 +290,17 @@ handle_client_pickup_message (void *cls, case CS_CALLER_CONNECTED: case CS_CALLER_SHUTDOWN: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; } GNUNET_break (CS_CALLEE_CONNECTED == ch->status); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending PICK_UP message to cadet\n"); - e = GNUNET_MQ_msg (mppm, - GNUNET_MESSAGE_TYPE_CONVERSATION_CADET_PHONE_PICK_UP); - GNUNET_MQ_send (ch->mq, e); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + env = GNUNET_MQ_msg (mppm, + GNUNET_MESSAGE_TYPE_CONVERSATION_CADET_PHONE_PICK_UP); + GNUNET_MQ_send (ch->mq, + env); + GNUNET_SERVICE_client_continue (line->client); } @@ -373,31 +365,18 @@ mq_done_finish_caller_shutdown (void *cls) /** * Function to handle a hangup request message from the client * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` the hangup is for + * @param msg the message from the client */ static void handle_client_hangup_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientPhoneHangupMessage *msg) { - const struct ClientPhoneHangupMessage *msg; + struct Line *line = cls; struct GNUNET_MQ_Envelope *e; struct CadetPhoneHangupMessage *mhum; - struct Line *line; struct Channel *ch; - msg = (const struct ClientPhoneHangupMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL == line) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } for (ch = line->channel_head; NULL != ch; ch = ch->next) if (msg->cid == ch->cid) break; @@ -407,8 +386,7 @@ handle_client_hangup_message (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Channel %u not found\n", msg->cid); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -419,8 +397,7 @@ handle_client_hangup_message (void *cls, { case CS_CALLEE_INIT: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_RINGING: ch->status = CS_CALLEE_SHUTDOWN; @@ -430,8 +407,7 @@ handle_client_hangup_message (void *cls, break; case CS_CALLEE_SHUTDOWN: /* maybe the other peer closed asynchronously... */ - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; case CS_CALLER_CALLING: ch->status = CS_CALLER_SHUTDOWN; @@ -441,7 +417,7 @@ handle_client_hangup_message (void *cls, break; case CS_CALLER_SHUTDOWN: /* maybe the other peer closed asynchronously... */ - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -453,39 +429,25 @@ handle_client_hangup_message (void *cls, ch); GNUNET_MQ_send (ch->mq, e); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); } /** * Function to handle a suspend request message from the client * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` the message is about + * @param msg the message from the client */ static void handle_client_suspend_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientPhoneSuspendMessage *msg) { - const struct ClientPhoneSuspendMessage *msg; + struct Line *line = cls; struct GNUNET_MQ_Envelope *e; struct CadetPhoneSuspendMessage *mhum; - struct Line *line; struct Channel *ch; - msg = (const struct ClientPhoneSuspendMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL == line) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } for (ch = line->channel_head; NULL != ch; ch = ch->next) if (msg->cid == ch->cid) break; @@ -495,15 +457,13 @@ handle_client_suspend_message (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Channel %u not found\n", msg->cid); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } if (GNUNET_YES == ch->suspended_local) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -514,34 +474,29 @@ handle_client_suspend_message (void *cls, { case CS_CALLEE_INIT: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_RINGING: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_CONNECTED: ch->suspended_local = GNUNET_YES; break; case CS_CALLEE_SHUTDOWN: /* maybe the other peer closed asynchronously... */ - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; case CS_CALLER_CALLING: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLER_CONNECTED: ch->suspended_local = GNUNET_YES; break; case CS_CALLER_SHUTDOWN: /* maybe the other peer closed asynchronously... */ - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -550,39 +505,25 @@ handle_client_suspend_message (void *cls, GNUNET_MESSAGE_TYPE_CONVERSATION_CADET_PHONE_SUSPEND); GNUNET_MQ_send (ch->mq, e); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); } /** * Function to handle a resume request message from the client * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` the message is about + * @param msg the message from the client */ static void handle_client_resume_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientPhoneResumeMessage *msg) { - const struct ClientPhoneResumeMessage *msg; + struct Line *line = cls; struct GNUNET_MQ_Envelope *e; struct CadetPhoneResumeMessage *mhum; - struct Line *line; struct Channel *ch; - msg = (const struct ClientPhoneResumeMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL == line) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } for (ch = line->channel_head; NULL != ch; ch = ch->next) if (msg->cid == ch->cid) break; @@ -592,14 +533,13 @@ handle_client_resume_message (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Channel %u not found\n", msg->cid); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } if (GNUNET_YES != ch->suspended_local) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -610,34 +550,29 @@ handle_client_resume_message (void *cls, { case CS_CALLEE_INIT: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_RINGING: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_CONNECTED: ch->suspended_local = GNUNET_NO; break; case CS_CALLEE_SHUTDOWN: /* maybe the other peer closed asynchronously... */ - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; case CS_CALLER_CALLING: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLER_CONNECTED: ch->suspended_local = GNUNET_NO; break; case CS_CALLER_SHUTDOWN: /* maybe the other peer closed asynchronously... */ - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -646,46 +581,27 @@ handle_client_resume_message (void *cls, GNUNET_MESSAGE_TYPE_CONVERSATION_CADET_PHONE_RESUME); GNUNET_MQ_send (ch->mq, e); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); } /** * Function to handle call request from the client * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` the message is about + * @param msg the message from the client */ static void handle_client_call_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientCallMessage *msg) { - const struct ClientCallMessage *msg; - struct Line *line; + struct Line *line = cls; struct Channel *ch; struct GNUNET_MQ_Envelope *e; struct CadetPhoneRingMessage *ring; struct CadetPhoneRingInfoPS rs; - msg = (const struct ClientCallMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL != line) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - line = GNUNET_new (struct Line); - line->client = client; line->line_port = msg->line_port; - GNUNET_SERVER_client_set_user_context (client, - line); - GNUNET_SERVER_notification_context_add (nc, - client); rs.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CONVERSATION_RING); rs.purpose.size = htonl (sizeof (struct CadetPhoneRingInfoPS)); rs.line_port = line->line_port; @@ -718,8 +634,7 @@ handle_client_call_message (void *cls, "Sending RING message via CADET\n"); GNUNET_MQ_send (ch->mq, e); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); } @@ -738,34 +653,36 @@ channel_audio_sent_notify (void *cls) /** + * Function to check audio data from the client + * + * @param cls the `struct Line` the message is about + * @param msg the message from the client + * @return #GNUNET_OK (any data is ok) + */ +static int +check_client_audio_message (void *cls, + const struct ClientAudioMessage *msg) +{ + return GNUNET_OK; +} + + +/** * Function to handle audio data from the client * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` the message is about + * @param msg the message from the client */ static void handle_client_audio_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientAudioMessage *msg) { - const struct ClientAudioMessage *msg; + struct Line *line = cls; struct ClientAudioMessage *mam; - struct Line *line; struct Channel *ch; size_t size; - size = ntohs (message->size) - sizeof (struct ClientAudioMessage); - msg = (const struct ClientAudioMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL == line) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } + size = ntohs (msg->header.size) - sizeof (struct ClientAudioMessage); ch = find_channel_by_line (line, msg->cid); if (NULL == ch) @@ -774,8 +691,7 @@ handle_client_audio_message (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Channel %u not found\n", msg->cid); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } @@ -785,8 +701,7 @@ handle_client_audio_message (void *cls, case CS_CALLEE_RINGING: case CS_CALLER_CALLING: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; case CS_CALLEE_CONNECTED: case CS_CALLER_CONNECTED: @@ -796,16 +711,14 @@ handle_client_audio_message (void *cls, case CS_CALLER_SHUTDOWN: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK, "Cadet audio channel in shutdown; audio data dropped\n"); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); return; } if (GNUNET_YES == ch->suspended_local) { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "This channel is suspended locally\n"); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (line->client); return; } if (NULL != ch->env) @@ -829,8 +742,7 @@ handle_client_audio_message (void *cls, ch); GNUNET_MQ_send (ch->mq, ch->env); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); } @@ -853,7 +765,8 @@ handle_cadet_ring_message (void *cls, struct Channel *ch = *channel_ctx; struct Line *line = ch->line; const struct CadetPhoneRingMessage *msg; - struct ClientPhoneRingMessage cring; + struct GNUNET_MQ_Envelope *env; + struct ClientPhoneRingMessage *cring; struct CadetPhoneRingInfoPS rs; msg = (const struct CadetPhoneRingMessage *) message; @@ -888,17 +801,15 @@ handle_cadet_ring_message (void *cls, } GNUNET_CADET_receive_done (channel); ch->status = CS_CALLEE_RINGING; - cring.header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RING); - cring.header.size = htons (sizeof (cring)); - cring.cid = ch->cid; - cring.caller_id = msg->caller_id; + env = GNUNET_MQ_msg (cring, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RING); + cring->cid = ch->cid; + cring->caller_id = msg->caller_id; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending RING message to client. CID is %u\n", (unsigned int) ch->cid); - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &cring.header, - GNUNET_NO); + GNUNET_MQ_send (line->mq, + env); return GNUNET_OK; } @@ -921,13 +832,13 @@ handle_cadet_hangup_message (void *cls, { struct Channel *ch = *channel_ctx; struct Line *line = ch->line; - struct ClientPhoneHangupMessage hup; + struct GNUNET_MQ_Envelope *env; + struct ClientPhoneHangupMessage *hup; enum ChannelStatus status; + uint32_t cid; GNUNET_CADET_receive_done (channel); - hup.header.size = htons (sizeof (hup)); - hup.header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP); - hup.cid = ch->cid; + cid = ch->cid; status = ch->status; destroy_line_cadet_channels (ch); switch (status) @@ -948,10 +859,11 @@ handle_cadet_hangup_message (void *cls, } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending HANG UP message to client\n"); - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &hup.header, - GNUNET_NO); + env = GNUNET_MQ_msg (hup, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP); + hup->cid = cid; + GNUNET_MQ_send (line->mq, + env); return GNUNET_OK; } @@ -975,7 +887,8 @@ handle_cadet_pickup_message (void *cls, { struct Channel *ch = *channel_ctx; struct Line *line = ch->line; - struct ClientPhonePickedupMessage pick; + struct GNUNET_MQ_Envelope *env; + struct ClientPhonePickedupMessage *pick; GNUNET_CADET_receive_done (channel); switch (ch->status) @@ -1001,15 +914,13 @@ handle_cadet_pickup_message (void *cls, mq_done_finish_caller_shutdown (ch); return GNUNET_SYSERR; } - pick.header.size = htons (sizeof (pick)); - pick.header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICKED_UP); - pick.cid = ch->cid; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending PICKED UP message to client\n"); - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &pick.header, - GNUNET_NO); + env = GNUNET_MQ_msg (pick, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICKED_UP); + pick->cid = ch->cid; + GNUNET_MQ_send (line->mq, + env); return GNUNET_OK; } @@ -1032,12 +943,10 @@ handle_cadet_suspend_message (void *cls, { struct Channel *ch = *channel_ctx; struct Line *line = ch->line; - struct ClientPhoneSuspendMessage suspend; + struct GNUNET_MQ_Envelope *env; + struct ClientPhoneSuspendMessage *suspend; GNUNET_CADET_receive_done (channel); - suspend.header.size = htons (sizeof (suspend)); - suspend.header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND); - suspend.cid = ch->cid; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Suspending channel CID: %u\n", ch->cid); @@ -1063,10 +972,11 @@ handle_cadet_suspend_message (void *cls, case CS_CALLER_SHUTDOWN: return GNUNET_OK; } - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &suspend.header, - GNUNET_NO); + env = GNUNET_MQ_msg (suspend, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND); + suspend->cid = ch->cid; + GNUNET_MQ_send (line->mq, + env); return GNUNET_OK; } @@ -1089,7 +999,8 @@ handle_cadet_resume_message (void *cls, { struct Channel *ch = *channel_ctx; struct Line *line; - struct ClientPhoneResumeMessage resume; + struct GNUNET_MQ_Envelope *env; + struct ClientPhoneResumeMessage *resume; if (NULL == ch) { @@ -1098,9 +1009,6 @@ handle_cadet_resume_message (void *cls, return GNUNET_SYSERR; } line = ch->line; - resume.header.size = htons (sizeof (resume)); - resume.header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME); - resume.cid = ch->cid; GNUNET_CADET_receive_done (channel); if (GNUNET_YES != ch->suspended_remote) { @@ -1130,10 +1038,11 @@ handle_cadet_resume_message (void *cls, case CS_CALLER_SHUTDOWN: return GNUNET_OK; } - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &resume.header, - GNUNET_NO); + env = GNUNET_MQ_msg (resume, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME); + resume->cid = ch->cid; + GNUNET_MQ_send (line->mq, + env); return GNUNET_OK; } @@ -1157,7 +1066,7 @@ handle_cadet_audio_message (void *cls, struct Channel *ch = *channel_ctx; const struct CadetAudioMessage *msg; size_t msize = ntohs (message->size) - sizeof (struct CadetAudioMessage); - char buf[msize + sizeof (struct ClientAudioMessage)] GNUNET_ALIGN; + struct GNUNET_MQ_Envelope *env; struct ClientAudioMessage *cam; msg = (const struct CadetAudioMessage *) message; @@ -1175,17 +1084,15 @@ handle_cadet_audio_message (void *cls, "Forwarding %u bytes of AUDIO data to client CID %u\n", (unsigned int) msize, ch->cid); - cam = (struct ClientAudioMessage *) buf; - cam->header.size = htons (sizeof (buf)); - cam->header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO); + env = GNUNET_MQ_msg_extra (cam, + msize, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO); cam->cid = ch->cid; GNUNET_memcpy (&cam[1], &msg[1], msize); - GNUNET_SERVER_notification_context_unicast (nc, - ch->line->client, - &cam->header, - GNUNET_YES); + GNUNET_MQ_send (ch->line->mq, + env); return GNUNET_OK; } @@ -1244,7 +1151,8 @@ inbound_end (void *cls, { struct Channel *ch = channel_ctx; struct Line *line; - struct ClientPhoneHangupMessage hup; + struct GNUNET_MQ_Envelope *env; + struct ClientPhoneHangupMessage *hup; if (NULL == ch) { @@ -1257,32 +1165,24 @@ inbound_end (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Channel destroyed by CADET in state %d\n", ch->status); - hup.header.size = htons (sizeof (hup)); - hup.header.type = htons (GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP); - hup.cid = ch->cid; switch (ch->status) { case CS_CALLEE_INIT: + case CS_CALLEE_SHUTDOWN: + case CS_CALLER_SHUTDOWN: break; case CS_CALLEE_RINGING: case CS_CALLEE_CONNECTED: - if (NULL != line) - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &hup.header, - GNUNET_NO); - break; - case CS_CALLEE_SHUTDOWN: - break; case CS_CALLER_CALLING: case CS_CALLER_CONNECTED: if (NULL != line) - GNUNET_SERVER_notification_context_unicast (nc, - line->client, - &hup.header, - GNUNET_NO); - break; - case CS_CALLER_SHUTDOWN: + { + env = GNUNET_MQ_msg (hup, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP); + hup->cid = ch->cid; + GNUNET_MQ_send (line->mq, + env); + } break; } destroy_line_cadet_channels (ch); @@ -1295,27 +1195,43 @@ inbound_end (void *cls, /** + * A client connected. Initialize the `struct Line` data structure. + * + * @param cls closure, NULL + * @param client identification of the client + * @param mq message queue for @a client + * @return the `struct Line` for the client + */ +static void * +client_connect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + struct GNUNET_MQ_Handle *mq) +{ + struct Line *line; + + line = GNUNET_new (struct Line); + line->client = client; + line->mq = mq; + return line; +} + + +/** * A client disconnected. Remove all of its data structure entries. * * @param cls closure, NULL * @param client identification of the client + * @param app_ctx our `struct Line *` for @a client */ static void -handle_client_disconnect (void *cls, - struct GNUNET_SERVER_Client *client) +client_disconnect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + void *app_ctx) { - struct Line *line; + struct Line *line = app_ctx; struct Channel *ch; struct Channel *chn; - if (NULL == client) - return; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL == line) - return; - GNUNET_SERVER_client_set_user_context (client, - NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client disconnected, closing line\n"); if (NULL != line->port) @@ -1336,41 +1252,21 @@ handle_client_disconnect (void *cls, /** * Function to register a phone. * - * @param cls closure, NULL - * @param client the client from which the message is - * @param message the message from the client + * @param cls the `struct Line` of the client from which the message is + * @param msg the message from the client */ static void handle_client_register_message (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientPhoneRegisterMessage *msg) { - const struct ClientPhoneRegisterMessage *msg; - struct Line *line; + struct Line *line = cls; - msg = (const struct ClientPhoneRegisterMessage *) message; - line = GNUNET_SERVER_client_get_user_context (client, - struct Line); - if (NULL != line) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - line = GNUNET_new (struct Line); - line->client = client; - GNUNET_SERVER_notification_context_add (nc, - client); - GNUNET_SERVER_client_set_user_context (client, - line); line->line_port = msg->line_port; line->port = GNUNET_CADET_open_port (cadet, &msg->line_port, &inbound_channel, line); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (line->client); } @@ -1387,11 +1283,6 @@ do_shutdown (void *cls) GNUNET_CADET_disconnect (cadet); cadet = NULL; } - if (NULL != nc) - { - GNUNET_SERVER_notification_context_destroy (nc); - nc = NULL; - } } @@ -1399,38 +1290,14 @@ do_shutdown (void *cls) * Main function that will be run by the scheduler. * * @param cls closure - * @param server server handle * @param c configuration + * @param service service handle */ static void run (void *cls, - struct GNUNET_SERVER_Handle *server, - const struct GNUNET_CONFIGURATION_Handle *c) + const struct GNUNET_CONFIGURATION_Handle *c, + struct GNUNET_SERVICE_Handle *service) { - static const struct GNUNET_SERVER_MessageHandler server_handlers[] = { - {&handle_client_register_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_REGISTER, - sizeof (struct ClientPhoneRegisterMessage)}, - {&handle_client_pickup_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICK_UP, - sizeof (struct ClientPhonePickupMessage) }, - {&handle_client_suspend_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND, - sizeof (struct ClientPhoneSuspendMessage) }, - {&handle_client_resume_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME, - sizeof (struct ClientPhoneResumeMessage) }, - {&handle_client_hangup_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP, - sizeof (struct ClientPhoneHangupMessage) }, - {&handle_client_call_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_CALL, - sizeof (struct ClientCallMessage) }, - {&handle_client_audio_message, NULL, - GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO, - 0}, - {NULL, NULL, 0, 0} - }; static struct GNUNET_CADET_MessageHandler cadet_handlers[] = { {&handle_cadet_ring_message, GNUNET_MESSAGE_TYPE_CONVERSATION_CADET_PHONE_RING, @@ -1466,34 +1333,51 @@ run (void *cls, GNUNET_SCHEDULER_shutdown (); return; } - nc = GNUNET_SERVER_notification_context_create (server, - 16); - GNUNET_SERVER_add_handlers (server, - server_handlers); - GNUNET_SERVER_disconnect_notify (server, - &handle_client_disconnect, - NULL); GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); } + /** - * The main function for the conversation service. - * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error + * Define "main" method using service macro. */ -int -main (int argc, - char *const *argv) -{ - return (GNUNET_OK == - GNUNET_SERVICE_run (argc, argv, - "conversation", - GNUNET_SERVICE_OPTION_NONE, - &run, NULL)) ? 0 : 1; -} +GNUNET_SERVICE_MAIN +("conversation", + GNUNET_SERVICE_OPTION_NONE, + &run, + &client_connect_cb, + &client_disconnect_cb, + NULL, + GNUNET_MQ_hd_fixed_size (client_register_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_REGISTER, + struct ClientPhoneRegisterMessage, + NULL), + GNUNET_MQ_hd_fixed_size (client_pickup_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICK_UP, + struct ClientPhonePickupMessage, + NULL), + GNUNET_MQ_hd_fixed_size (client_suspend_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND, + struct ClientPhoneSuspendMessage, + NULL), + GNUNET_MQ_hd_fixed_size (client_resume_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME, + struct ClientPhoneResumeMessage, + NULL), + GNUNET_MQ_hd_fixed_size (client_hangup_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP, + struct ClientPhoneHangupMessage, + NULL), + GNUNET_MQ_hd_fixed_size (client_call_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_CALL, + struct ClientCallMessage, + NULL), + GNUNET_MQ_hd_var_size (client_audio_message, + GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO, + struct ClientAudioMessage, + NULL), + GNUNET_MQ_handler_end ()); + /* end of gnunet-service-conversation.c */ |