/*
This file is part of GNUnet
- Copyright (C) 2013 GNUnet e.V.
+ Copyright (C) 2013, 2016 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
*/
const struct GNUNET_CONFIGURATION_Handle *cfg;
- /**
- * Handle to talk with CONVERSATION service.
- */
- struct GNUNET_CLIENT_Connection *client;
-
/**
* Our caller identity.
*/
* @param call call to reconnect
*/
static void
-reconnect_call (struct GNUNET_CONVERSATION_Call *call);
+fail_call (struct GNUNET_CONVERSATION_Call *call);
/**
e = GNUNET_MQ_msg_extra (am,
data_size,
GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO);
- memcpy (&am[1], data, data_size);
- GNUNET_MQ_send (call->mq, e);
+ GNUNET_memcpy (&am[1],
+ data,
+ data_size);
+ GNUNET_MQ_send (call->mq,
+ e);
}
{
case CS_LOOKUP:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_RINGING:
GNUNET_break_op (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_SUSPENDED_CALLER:
call->state = CS_SUSPENDED_BOTH;
{
case CS_LOOKUP:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_RINGING:
GNUNET_break_op (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_SUSPENDED_CALLER:
GNUNET_break_op (0);
{
case CS_LOOKUP:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_RINGING:
call->state = CS_ACTIVE;
case CS_SUSPENDED_BOTH:
case CS_ACTIVE:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_SHUTDOWN:
GNUNET_CONVERSATION_call_stop (call);
{
case CS_LOOKUP:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_RINGING:
case CS_SUSPENDED_CALLER:
eh = call->event_handler;
eh_cls = call->event_handler_cls;
GNUNET_CONVERSATION_call_stop (call);
- eh (eh_cls, GNUNET_CONVERSATION_EC_CALL_HUNG_UP);
+ eh (eh_cls,
+ GNUNET_CONVERSATION_EC_CALL_HUNG_UP);
return;
case CS_SHUTDOWN:
GNUNET_CONVERSATION_call_stop (call);
{
case CS_LOOKUP:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_RINGING:
GNUNET_break (0);
- reconnect_call (call);
+ fail_call (call);
break;
case CS_SUSPENDED_CALLER:
/* can happen: we suspended, other peer did not yet
GNUNET_break_op (0);
continue;
}
- memcpy (&call->phone_record,
- rd[i].data,
- rd[i].data_size);
- e = GNUNET_MQ_msg (ccm, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_CALL);
- ccm->line = call->phone_record.line;
+ GNUNET_memcpy (&call->phone_record,
+ rd[i].data,
+ rd[i].data_size);
+ e = GNUNET_MQ_msg (ccm,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_CALL);
+ ccm->line_port = call->phone_record.line_port;
ccm->target = call->phone_record.peer;
ccm->caller_id = *GNUNET_IDENTITY_ego_get_private_key (call->caller_id);
- GNUNET_MQ_send (call->mq, e);
+ GNUNET_MQ_send (call->mq,
+ e);
call->state = CS_RINGING;
call->event_handler (call->event_handler_cls,
GNUNET_CONVERSATION_EC_CALL_RINGING);
}
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_("Connection to conversation service lost, trying to reconnect\n"));
- reconnect_call (call);
+ fail_call (call);
}
/**
- * The call got disconnected, reconnect to the service.
+ * The call got disconnected, destroy the handle.
*
* @param call call to reconnect
*/
static void
-reconnect_call (struct GNUNET_CONVERSATION_Call *call)
+fail_call (struct GNUNET_CONVERSATION_Call *call)
{
if (CS_ACTIVE == call->state)
{
GNUNET_MQ_destroy (call->mq);
call->mq = NULL;
}
- if (NULL != call->client)
- {
- GNUNET_CLIENT_disconnect (call->client);
- call->client = NULL;
- }
call->state = CS_SHUTDOWN;
call->event_handler (call->event_handler_cls,
GNUNET_CONVERSATION_EC_CALL_ERROR);
GNUNET_CONVERSATION_CallEventHandler event_handler,
void *event_handler_cls)
{
- GNUNET_MQ_hd_fixed_size (call_suspend,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND,
- struct ClientPhoneSuspendMessage);
- GNUNET_MQ_hd_fixed_size (call_resume,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME,
- struct ClientPhoneResumeMessage);
- GNUNET_MQ_hd_fixed_size (call_picked_up,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICKED_UP,
- struct ClientPhonePickedupMessage);
- GNUNET_MQ_hd_fixed_size (call_hangup,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP,
- struct ClientPhoneHangupMessage);
- GNUNET_MQ_hd_var_size (call_audio,
- GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO,
- struct ClientAudioMessage);
struct GNUNET_CONVERSATION_Call *call
= GNUNET_new (struct GNUNET_CONVERSATION_Call);
struct GNUNET_MQ_MessageHandler handlers[] = {
- make_call_suspend_handler (call),
- make_call_resume_handler (call),
- make_call_picked_up_handler (call),
- make_call_hangup_handler (call),
- make_call_audio_handler (call),
+ GNUNET_MQ_hd_fixed_size (call_suspend,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND,
+ struct ClientPhoneSuspendMessage,
+ call),
+ GNUNET_MQ_hd_fixed_size (call_resume,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_RESUME,
+ struct ClientPhoneResumeMessage,
+ call),
+ GNUNET_MQ_hd_fixed_size (call_picked_up,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_PICKED_UP,
+ struct ClientPhonePickedupMessage,
+ call),
+ GNUNET_MQ_hd_fixed_size (call_hangup,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_HANG_UP,
+ struct ClientPhoneHangupMessage,
+ call),
+ GNUNET_MQ_hd_var_size (call_audio,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_AUDIO,
+ struct ClientAudioMessage,
+ call),
GNUNET_MQ_handler_end ()
};
struct GNUNET_CRYPTO_EcdsaPublicKey my_zone;
- call->client = GNUNET_CLIENT_connect ("conversation", cfg);
- if (NULL == call->client)
+ call->mq = GNUNET_CLIENT_connect (cfg,
+ "conversation",
+ handlers,
+ &call_error_handler,
+ call);
+ if (NULL == call->mq)
{
GNUNET_break (0);
GNUNET_free (call);
GNUNET_CONVERSATION_call_stop (call);
return NULL;
}
- call->mq = GNUNET_MQ_queue_for_connection_client (call->client,
- handlers,
- &call_error_handler,
- call);
call->state = CS_LOOKUP;
GNUNET_IDENTITY_ego_get_public_key (call->zone_id,
&my_zone);
&my_zone,
GNUNET_GNSRECORD_TYPE_PHONE,
GNUNET_NO,
- NULL /* FIXME: add shortening support */,
&handle_gns_response, call);
GNUNET_assert (NULL != call->gns_lookup);
return call;
GNUNET_MQ_destroy (call->mq);
call->mq = NULL;
}
- if (NULL != call->client)
- {
- GNUNET_CLIENT_disconnect (call->client);
- call->client = NULL;
- }
if (NULL != call->gns_lookup)
{
GNUNET_GNS_lookup_cancel (call->gns_lookup);
}
call->speaker = NULL;
call->mic = NULL;
- e = GNUNET_MQ_msg (suspend, GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND);
- GNUNET_MQ_send (call->mq, e);
+ e = GNUNET_MQ_msg (suspend,
+ GNUNET_MESSAGE_TYPE_CONVERSATION_CS_PHONE_SUSPEND);
+ GNUNET_MQ_send (call->mq,
+ e);
if (CS_SUSPENDED_CALLER == call->state)
call->state = CS_SUSPENDED_BOTH;
else