data_size,
GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO);
am->cid = caller->cid;
- memcpy (&am[1], data, data_size);
- GNUNET_MQ_send (phone->mq, e);
+ GNUNET_memcpy (&am[1],
+ data,
+ data_size);
+ GNUNET_MQ_send (phone->mq,
+ e);
}
}
+/**
+ * Find the record of the caller matching the @a cid
+ *
+ * @param phone phone to search
+ * @param cid caller ID to search for (in NBO)
+ * @return NULL if @a cid was not found
+ */
+static struct GNUNET_CONVERSATION_Caller *
+find_caller (struct GNUNET_CONVERSATION_Phone *phone,
+ uint32_t cid)
+{
+ struct GNUNET_CONVERSATION_Caller *caller;
+
+ for (caller = phone->caller_head;NULL != caller;caller = caller->next)
+ if (cid == caller->cid)
+ return caller;
+ return NULL;
+}
+
+
/**
* We received a `struct ClientPhoneHangupMessage`.
*
struct GNUNET_CONVERSATION_Phone *phone = cls;
struct GNUNET_CONVERSATION_Caller *caller;
- for (caller = phone->caller_head; NULL != caller; caller = caller->next)
- if (hang->cid == caller->cid)
- break;
+ caller = find_caller (phone,
+ hang->cid);
if (NULL == caller)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
struct GNUNET_CONVERSATION_Phone *phone = cls;
struct GNUNET_CONVERSATION_Caller *caller;
- for (caller = phone->caller_head; NULL != caller; caller = caller->next)
- if (suspend->cid == caller->cid)
- break;
+ caller = find_caller (phone,
+ suspend->cid);
if (NULL == caller)
return;
switch (caller->state)
struct GNUNET_CONVERSATION_Phone *phone = cls;
struct GNUNET_CONVERSATION_Caller *caller;
- for (caller = phone->caller_head; NULL != caller; caller = caller->next)
- if (resume->cid == caller->cid)
- break;
+ caller = find_caller (phone,
+ resume->cid);
if (NULL == caller)
return;
switch (caller->state)
struct GNUNET_CONVERSATION_Phone *phone = cls;
struct GNUNET_CONVERSATION_Caller *caller;
- for (caller = phone->caller_head; NULL != caller; caller = caller->next)
- if (am->cid == caller->cid)
- break;
+ caller = find_caller (phone,
+ am->cid);
if (NULL == caller)
return;
switch (caller->state)
static void
reconnect_phone (struct GNUNET_CONVERSATION_Phone *phone)
{
- GNUNET_MQ_hd_fixed_size (phone_ring,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RING,
- struct ClientPhoneRingMessage);
- GNUNET_MQ_hd_fixed_size (phone_hangup,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP,
- struct ClientPhoneHangupMessage);
- GNUNET_MQ_hd_fixed_size (phone_suspend,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND,
- struct ClientPhoneSuspendMessage);
- GNUNET_MQ_hd_fixed_size (phone_resume,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME,
- struct ClientPhoneResumeMessage);
- GNUNET_MQ_hd_var_size (phone_audio,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO,
- struct ClientAudioMessage);
struct GNUNET_MQ_MessageHandler handlers[] = {
- make_phone_ring_handler (phone),
- make_phone_hangup_handler (phone),
- make_phone_suspend_handler (phone),
- make_phone_resume_handler (phone),
- make_phone_audio_handler (phone),
+ GNUNET_MQ_hd_fixed_size (phone_ring,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RING,
+ struct ClientPhoneRingMessage,
+ phone),
+ GNUNET_MQ_hd_fixed_size (phone_hangup,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP,
+ struct ClientPhoneHangupMessage,
+ phone),
+ GNUNET_MQ_hd_fixed_size (phone_suspend,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND,
+ struct ClientPhoneSuspendMessage,
+ phone),
+ GNUNET_MQ_hd_fixed_size (phone_resume,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME,
+ struct ClientPhoneResumeMessage,
+ phone),
+ GNUNET_MQ_hd_var_size (phone_audio,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO,
+ struct ClientAudioMessage,
+ phone),
GNUNET_MQ_handler_end ()
};
struct GNUNET_MQ_Envelope *e;
struct ClientPhoneRegisterMessage *reg;
- struct GNUNET_CLIENT_Connection *client;
clean_up_callers (phone);
if (NULL != phone->mq)
phone->mq = NULL;
}
phone->state = PS_REGISTER;
- client = GNUNET_CLIENT_connect ("conversation",
- phone->cfg);
- if (NULL == client)
+ phone->mq = GNUNET_CLIENT_connect (phone->cfg,
+ "conversation",
+ handlers,
+ &phone_error_handler,
+ phone);
+ if (NULL == phone->mq)
return;
- phone->mq = GNUNET_MQ_queue_for_connection_client (client,
- handlers,
- &phone_error_handler,
- phone);
- e = GNUNET_MQ_msg (reg, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_REGISTER);
- reg->line = phone->my_record.line;
- GNUNET_MQ_send (phone->mq, e);
+ e = GNUNET_MQ_msg (reg,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_REGISTER);
+ reg->line_port = phone->my_record.line_port;
+ GNUNET_MQ_send (phone->mq,
+ e);
phone->state = PS_READY;
}
void *event_handler_cls)
{
struct GNUNET_CONVERSATION_Phone *phone;
- unsigned long long line;
+ char *line;
+ struct GNUNET_HashCode line_port;
if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (cfg,
+ GNUNET_CONFIGURATION_get_value_string (cfg,
"CONVERSATION",
"LINE",
&line))
"LINE");
return NULL;
}
- if (line >= (1 << 31))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- "CONVERSATION",
- "LINE",
- _("number too large"));
- return NULL;
- }
+ GNUNET_CRYPTO_hash (line,
+ strlen (line),
+ &line_port);
phone = GNUNET_new (struct GNUNET_CONVERSATION_Phone);
if (GNUNET_OK !=
GNUNET_CRYPTO_get_peer_identity (cfg,
phone->event_handler = event_handler;
phone->event_handler_cls = event_handler_cls;
phone->ns = GNUNET_NAMESTORE_connect (cfg);
- phone->my_record.line = htonl ((uint32_t) line);
- phone->my_record.version = htonl (0);
+ phone->my_record.version = htonl (1);
+ phone->my_record.reserved = htonl (0);
+ phone->my_record.line_port = line_port;
reconnect_phone (phone);
if ( (NULL == phone->mq) ||
(NULL == phone->ns) )
GNUNET_assert (CS_RINGING == caller->state);
caller->speaker = speaker;
caller->mic = mic;
- e = GNUNET_MQ_msg (pick, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICK_UP);
+ e = GNUNET_MQ_msg (pick,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICK_UP);
pick->cid = caller->cid;
- GNUNET_MQ_send (phone->mq, e);
+ GNUNET_MQ_send (phone->mq,
+ e);
caller->state = CS_ACTIVE;
caller->event_handler = event_handler;
caller->event_handler_cls = event_handler_cls;
e = GNUNET_MQ_msg (hang,
GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP);
hang->cid = caller->cid;
- GNUNET_MQ_send (phone->mq, e);
+ GNUNET_MQ_send (phone->mq,
+ e);
GNUNET_free (caller);
}
}
caller->speaker = NULL;
caller->mic = NULL;
- e = GNUNET_MQ_msg (suspend, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND);
+ e = GNUNET_MQ_msg (suspend,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND);
suspend->cid = caller->cid;
- GNUNET_MQ_send (phone->mq, e);
+ GNUNET_MQ_send (phone->mq,
+ e);
if (CS_ACTIVE == caller->state)
caller->state = CS_CALLEE_SUSPENDED;
else
(CS_BOTH_SUSPENDED == caller->state) );
caller->speaker = speaker;
caller->mic = mic;
- e = GNUNET_MQ_msg (resume, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME);
+ e = GNUNET_MQ_msg (resume,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME);
resume->cid = caller->cid;
- GNUNET_MQ_send (phone->mq, e);
+ GNUNET_MQ_send (phone->mq,
+ e);
if (CS_CALLEE_SUSPENDED == caller->state)
{
caller->state = CS_ACTIVE;