if (NULL == label)
name = GNUNET_strdup (GNUNET_GNSRECORD_pkey_to_zkey (&caller->caller_id));
else
- GNUNET_asprintf (&name, "%.gnu", label);
+ GNUNET_asprintf (&name, "%s.gnu", label);
caller->caller_id_str = name;
caller->state = CS_RINGING;
phone->event_handler (phone->event_handler_cls,
if (hang->cid == caller->cid)
break;
if (NULL == caller)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received HANG_UP message for unknown caller ID %u\n",
+ (unsigned int) hang->cid);
return;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received HANG_UP message, terminating call with `%s'\n",
+ caller->caller_id_str);
switch (caller->state)
{
case CS_RESOLVE:
+ /* application doesn't even know about call yet */
GNUNET_NAMESTORE_cancel (caller->qe);
caller->qe = NULL;
break;
{
struct GNUNET_CONVERSATION_Phone *phone = cls;
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Internal MQ error %d\n"),
- error);
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Connection to conversation service lost, trying to reconnect\n"));
reconnect_phone (phone);
}
+/**
+ * Clean up all callers of the given phone.
+ *
+ * @param phone phone to clean up callers for
+ */
+static void
+clean_up_callers (struct GNUNET_CONVERSATION_Phone *phone)
+{
+ struct GNUNET_CONVERSATION_Caller *caller;
+
+ while (NULL != (caller = phone->caller_head))
+ {
+ /* make sure mic/speaker are disabled *before* callback */
+ if (CS_ACTIVE == caller->state)
+ {
+ caller->speaker->disable_speaker (caller->speaker->cls);
+ caller->mic->disable_microphone (caller->mic->cls);
+ caller->state = CS_CALLER_SUSPENDED;
+ }
+ phone->event_handler (phone->event_handler_cls,
+ GNUNET_CONVERSATION_EC_PHONE_HUNG_UP,
+ caller,
+ caller->caller_id_str);
+ GNUNET_CONVERSATION_caller_hang_up (caller);
+ }
+}
+
+
/**
* The phone got disconnected, reconnect to the service.
*
};
struct GNUNET_MQ_Envelope *e;
struct ClientPhoneRegisterMessage *reg;
- struct GNUNET_CONVERSATION_Caller *caller;
- while (NULL != (caller = phone->caller_head))
- {
- phone->event_handler (phone->event_handler_cls,
- GNUNET_CONVERSATION_EC_PHONE_HUNG_UP,
- caller,
- caller->caller_id_str);
- GNUNET_CONVERSATION_caller_hang_up (caller);
- }
+ clean_up_callers (phone);
if (NULL != phone->mq)
{
GNUNET_MQ_destroy (phone->mq);
caller);
GNUNET_free_non_null (caller->caller_id_str);
GNUNET_free (caller);
- e = GNUNET_MQ_msg (hang, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP);
+ e = GNUNET_MQ_msg (hang,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP);
GNUNET_MQ_send (phone->mq, e);
}
void
GNUNET_CONVERSATION_phone_destroy (struct GNUNET_CONVERSATION_Phone *phone)
{
- struct GNUNET_CONVERSATION_Caller *caller;
-
- while (NULL != (caller = phone->caller_head))
- {
- phone->event_handler (phone->event_handler_cls,
- GNUNET_CONVERSATION_EC_PHONE_HUNG_UP,
- caller,
- caller->caller_id_str);
- GNUNET_CONVERSATION_caller_hang_up (caller);
- }
+ clean_up_callers (phone);
if (NULL != phone->ns)
{
GNUNET_NAMESTORE_disconnect (phone->ns);