mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2025-01-07 12:25:31 +00:00
sip: origin: make create_inbound a private function
and shuffle the functions around so that we don't need forward declarations
This commit is contained in:
parent
e798d61b83
commit
b88d432401
2 changed files with 173 additions and 178 deletions
|
@ -110,6 +110,178 @@ enum {
|
||||||
static GParamSpec *props[PROP_LAST_PROP];
|
static GParamSpec *props[PROP_LAST_PROP];
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_call (CallsSipOrigin *self,
|
||||||
|
CallsCall *call,
|
||||||
|
const gchar *reason)
|
||||||
|
{
|
||||||
|
CallsOrigin *origin;
|
||||||
|
CallsSipCall *sip_call;
|
||||||
|
gboolean inbound;
|
||||||
|
nua_handle_t *nh;
|
||||||
|
|
||||||
|
origin = CALLS_ORIGIN (self);
|
||||||
|
sip_call = CALLS_SIP_CALL (call);
|
||||||
|
|
||||||
|
self->calls = g_list_remove (self->calls, call);
|
||||||
|
|
||||||
|
g_object_get (sip_call,
|
||||||
|
"inbound", &inbound,
|
||||||
|
"nua-handle", &nh,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
/* TODO support multiple simultaneous calls */
|
||||||
|
if (self->oper->call_handle == nh)
|
||||||
|
self->oper->call_handle = NULL;
|
||||||
|
|
||||||
|
g_signal_emit_by_name (origin, "call-removed", call, reason);
|
||||||
|
g_object_unref (call);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_calls (CallsSipOrigin *self,
|
||||||
|
const gchar *reason)
|
||||||
|
{
|
||||||
|
CallsCall *call;
|
||||||
|
GList *next;
|
||||||
|
|
||||||
|
while (self->calls != NULL) {
|
||||||
|
call = self->calls->data;
|
||||||
|
next = self->calls->next;
|
||||||
|
|
||||||
|
calls_call_hang_up (call);
|
||||||
|
|
||||||
|
g_list_free_1 (self->calls);
|
||||||
|
self->calls = next;
|
||||||
|
|
||||||
|
g_signal_emit_by_name (self, "call-removed", call, reason);
|
||||||
|
g_object_unref (call);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_hash_table_remove_all (self->call_handles);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->oper->call_handle, nua_handle_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_call_state_changed_cb (CallsSipOrigin *self,
|
||||||
|
CallsCallState new_state,
|
||||||
|
CallsCallState old_state,
|
||||||
|
CallsCall *call)
|
||||||
|
{
|
||||||
|
g_assert (CALLS_IS_SIP_ORIGIN (self));
|
||||||
|
g_assert (CALLS_IS_CALL (call));
|
||||||
|
|
||||||
|
if (new_state != CALLS_CALL_STATE_DISCONNECTED)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_call (self, call, "Disconnected");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_call (CallsSipOrigin *self,
|
||||||
|
const gchar *address,
|
||||||
|
gboolean inbound,
|
||||||
|
nua_handle_t *handle)
|
||||||
|
{
|
||||||
|
CallsSipCall *sip_call;
|
||||||
|
CallsCall *call;
|
||||||
|
g_autofree gchar *local_sdp = NULL;
|
||||||
|
|
||||||
|
/* TODO get free port by creating GSocket and passing that to the pipeline */
|
||||||
|
guint local_port = get_port_for_rtp ();
|
||||||
|
|
||||||
|
sip_call = calls_sip_call_new (address, inbound, handle);
|
||||||
|
g_assert (sip_call != NULL);
|
||||||
|
|
||||||
|
if (self->oper->call_handle)
|
||||||
|
nua_handle_unref (self->oper->call_handle);
|
||||||
|
|
||||||
|
self->oper->call_handle = handle;
|
||||||
|
|
||||||
|
self->calls = g_list_append (self->calls, sip_call);
|
||||||
|
g_hash_table_insert (self->call_handles, handle, sip_call);
|
||||||
|
|
||||||
|
call = CALLS_CALL (sip_call);
|
||||||
|
|
||||||
|
g_signal_emit_by_name (CALLS_ORIGIN (self), "call-added", call);
|
||||||
|
g_signal_connect_swapped (call, "state-changed",
|
||||||
|
G_CALLBACK (on_call_state_changed_cb),
|
||||||
|
self);
|
||||||
|
|
||||||
|
if (!inbound) {
|
||||||
|
calls_sip_call_setup_local_media_connection (sip_call, local_port, local_port + 1);
|
||||||
|
|
||||||
|
local_sdp = calls_sip_media_manager_static_capabilities (self->media_manager,
|
||||||
|
local_port,
|
||||||
|
check_sips (address));
|
||||||
|
|
||||||
|
g_assert (local_sdp);
|
||||||
|
|
||||||
|
g_debug ("Setting local SDP for outgoing call to %s:\n%s", address, local_sdp);
|
||||||
|
|
||||||
|
/* TODO handle IPv4 vs IPv6 for nua_invite (SOATAG_TAG) */
|
||||||
|
nua_invite (self->oper->call_handle,
|
||||||
|
SOATAG_AF (SOA_AF_IP4_IP6),
|
||||||
|
SOATAG_USER_SDP_STR (local_sdp),
|
||||||
|
SIPTAG_TO_STR (address),
|
||||||
|
SOATAG_RTP_SORT (SOA_RTP_SORT_REMOTE),
|
||||||
|
SOATAG_RTP_SELECT (SOA_RTP_SELECT_ALL),
|
||||||
|
TAG_END ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
dial (CallsOrigin *origin,
|
||||||
|
const gchar *address)
|
||||||
|
{
|
||||||
|
CallsSipOrigin *self;
|
||||||
|
nua_handle_t *nh;
|
||||||
|
g_assert (CALLS_ORIGIN (origin));
|
||||||
|
g_assert (CALLS_IS_SIP_ORIGIN (origin));
|
||||||
|
|
||||||
|
if (address == NULL) {
|
||||||
|
g_warning ("Tried dialing on origin '%s' without an address",
|
||||||
|
calls_origin_get_name (origin));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self = CALLS_SIP_ORIGIN (origin);
|
||||||
|
|
||||||
|
nh = nua_handle (self->nua, self->oper,
|
||||||
|
NUTAG_MEDIA_ENABLE (1),
|
||||||
|
SOATAG_ACTIVE_AUDIO (SOA_ACTIVE_SENDRECV),
|
||||||
|
TAG_END ());
|
||||||
|
|
||||||
|
g_debug ("Calling `%s'", address);
|
||||||
|
|
||||||
|
add_call (CALLS_SIP_ORIGIN (origin), address, FALSE, nh);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
create_inbound (CallsSipOrigin *self,
|
||||||
|
const gchar *address,
|
||||||
|
nua_handle_t *handle)
|
||||||
|
{
|
||||||
|
g_assert (CALLS_IS_SIP_ORIGIN (self));
|
||||||
|
g_assert (address != NULL);
|
||||||
|
|
||||||
|
/* TODO support multiple calls */
|
||||||
|
if (self->oper->call_handle)
|
||||||
|
nua_handle_unref (self->oper->call_handle);
|
||||||
|
|
||||||
|
self->oper->call_handle = handle;
|
||||||
|
|
||||||
|
add_call (self, address, TRUE, handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sip_authenticate (CallsSipOrigin *origin,
|
sip_authenticate (CallsSipOrigin *origin,
|
||||||
nua_handle_t *nh,
|
nua_handle_t *nh,
|
||||||
|
@ -344,7 +516,7 @@ sip_callback (nua_event_t event,
|
||||||
g_debug ("Cannot handle more than one call. Rejecting");
|
g_debug ("Cannot handle more than one call. Rejecting");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
calls_sip_origin_create_inbound (origin, from, nh);
|
create_inbound (origin, from, nh);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -636,161 +808,6 @@ init_sip_account (CallsSipOrigin *self,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
remove_call (CallsSipOrigin *self,
|
|
||||||
CallsCall *call,
|
|
||||||
const gchar *reason)
|
|
||||||
{
|
|
||||||
CallsOrigin *origin;
|
|
||||||
CallsSipCall *sip_call;
|
|
||||||
gboolean inbound;
|
|
||||||
nua_handle_t *nh;
|
|
||||||
|
|
||||||
origin = CALLS_ORIGIN (self);
|
|
||||||
sip_call = CALLS_SIP_CALL (call);
|
|
||||||
|
|
||||||
self->calls = g_list_remove (self->calls, call);
|
|
||||||
|
|
||||||
g_object_get (sip_call,
|
|
||||||
"inbound", &inbound,
|
|
||||||
"nua-handle", &nh,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
/* TODO support multiple simultaneous calls */
|
|
||||||
if (self->oper->call_handle == nh)
|
|
||||||
self->oper->call_handle = NULL;
|
|
||||||
|
|
||||||
g_signal_emit_by_name (origin, "call-removed", call, reason);
|
|
||||||
g_object_unref (call);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
remove_calls (CallsSipOrigin *self,
|
|
||||||
const gchar *reason)
|
|
||||||
{
|
|
||||||
CallsCall *call;
|
|
||||||
GList *next;
|
|
||||||
|
|
||||||
while (self->calls != NULL) {
|
|
||||||
call = self->calls->data;
|
|
||||||
next = self->calls->next;
|
|
||||||
|
|
||||||
calls_call_hang_up (call);
|
|
||||||
|
|
||||||
g_list_free_1 (self->calls);
|
|
||||||
self->calls = next;
|
|
||||||
|
|
||||||
g_signal_emit_by_name (self, "call-removed", call, reason);
|
|
||||||
g_object_unref (call);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hash_table_remove_all (self->call_handles);
|
|
||||||
|
|
||||||
g_clear_pointer (&self->oper->call_handle, nua_handle_unref);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_call_state_changed_cb (CallsSipOrigin *self,
|
|
||||||
CallsCallState new_state,
|
|
||||||
CallsCallState old_state,
|
|
||||||
CallsCall *call)
|
|
||||||
{
|
|
||||||
g_assert (CALLS_IS_SIP_ORIGIN (self));
|
|
||||||
g_assert (CALLS_IS_CALL (call));
|
|
||||||
|
|
||||||
if (new_state != CALLS_CALL_STATE_DISCONNECTED)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_call (self, call, "Disconnected");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
add_call (CallsSipOrigin *self,
|
|
||||||
const gchar *address,
|
|
||||||
gboolean inbound,
|
|
||||||
nua_handle_t *handle)
|
|
||||||
{
|
|
||||||
CallsSipCall *sip_call;
|
|
||||||
CallsCall *call;
|
|
||||||
g_autofree gchar *local_sdp = NULL;
|
|
||||||
|
|
||||||
/* TODO get free port by creating GSocket and passing that to the pipeline */
|
|
||||||
guint local_port = get_port_for_rtp ();
|
|
||||||
|
|
||||||
sip_call = calls_sip_call_new (address, inbound, handle);
|
|
||||||
g_assert (sip_call != NULL);
|
|
||||||
|
|
||||||
if (self->oper->call_handle)
|
|
||||||
nua_handle_unref (self->oper->call_handle);
|
|
||||||
|
|
||||||
self->oper->call_handle = handle;
|
|
||||||
|
|
||||||
self->calls = g_list_append (self->calls, sip_call);
|
|
||||||
g_hash_table_insert (self->call_handles, handle, sip_call);
|
|
||||||
|
|
||||||
call = CALLS_CALL (sip_call);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (CALLS_ORIGIN (self), "call-added", call);
|
|
||||||
g_signal_connect_swapped (call, "state-changed",
|
|
||||||
G_CALLBACK (on_call_state_changed_cb),
|
|
||||||
self);
|
|
||||||
|
|
||||||
if (!inbound) {
|
|
||||||
calls_sip_call_setup_local_media_connection (sip_call, local_port, local_port + 1);
|
|
||||||
|
|
||||||
local_sdp = calls_sip_media_manager_static_capabilities (self->media_manager,
|
|
||||||
local_port,
|
|
||||||
check_sips (address));
|
|
||||||
|
|
||||||
g_assert (local_sdp);
|
|
||||||
|
|
||||||
g_debug ("Setting local SDP for outgoing call to %s:\n%s", address, local_sdp);
|
|
||||||
|
|
||||||
/* TODO handle IPv4 vs IPv6 for nua_invite (SOATAG_TAG) */
|
|
||||||
nua_invite (self->oper->call_handle,
|
|
||||||
SOATAG_AF (SOA_AF_IP4_IP6),
|
|
||||||
SOATAG_USER_SDP_STR (local_sdp),
|
|
||||||
SIPTAG_TO_STR (address),
|
|
||||||
SOATAG_RTP_SORT (SOA_RTP_SORT_REMOTE),
|
|
||||||
SOATAG_RTP_SELECT (SOA_RTP_SELECT_ALL),
|
|
||||||
TAG_END ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
dial (CallsOrigin *origin,
|
|
||||||
const gchar *address)
|
|
||||||
{
|
|
||||||
CallsSipOrigin *self;
|
|
||||||
nua_handle_t *nh;
|
|
||||||
g_assert (CALLS_ORIGIN (origin));
|
|
||||||
g_assert (CALLS_IS_SIP_ORIGIN (origin));
|
|
||||||
|
|
||||||
if (address == NULL) {
|
|
||||||
g_warning ("Tried dialing on origin '%s' without an address",
|
|
||||||
calls_origin_get_name (origin));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self = CALLS_SIP_ORIGIN (origin);
|
|
||||||
|
|
||||||
nh = nua_handle (self->nua, self->oper,
|
|
||||||
NUTAG_MEDIA_ENABLE (1),
|
|
||||||
SOATAG_ACTIVE_AUDIO (SOA_ACTIVE_SENDRECV),
|
|
||||||
TAG_END ());
|
|
||||||
|
|
||||||
g_debug ("Calling `%s'", address);
|
|
||||||
|
|
||||||
add_call (CALLS_SIP_ORIGIN (origin), address, FALSE, nh);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calls_sip_origin_set_property (GObject *object,
|
calls_sip_origin_set_property (GObject *object,
|
||||||
guint property_id,
|
guint property_id,
|
||||||
|
@ -1111,24 +1128,6 @@ calls_sip_origin_init (CallsSipOrigin *self)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
calls_sip_origin_create_inbound (CallsSipOrigin *self,
|
|
||||||
const gchar *address,
|
|
||||||
nua_handle_t *handle)
|
|
||||||
{
|
|
||||||
g_return_if_fail (address != NULL);
|
|
||||||
g_return_if_fail (CALLS_IS_SIP_ORIGIN (self));
|
|
||||||
|
|
||||||
/* TODO support multiple calls */
|
|
||||||
if (self->oper->call_handle)
|
|
||||||
nua_handle_unref (self->oper->call_handle);
|
|
||||||
|
|
||||||
self->oper->call_handle = handle;
|
|
||||||
|
|
||||||
add_call (self, address, TRUE, handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
CallsSipOrigin *
|
CallsSipOrigin *
|
||||||
calls_sip_origin_new (const gchar *name,
|
calls_sip_origin_new (const gchar *name,
|
||||||
CallsSipContext *sip_context,
|
CallsSipContext *sip_context,
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include "calls-sip-util.h"
|
#include "calls-sip-util.h"
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include <sofia-sip/nua.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -45,9 +44,6 @@ CallsSipOrigin *calls_sip_origin_new (const gchar *na
|
||||||
const gchar *protocol,
|
const gchar *protocol,
|
||||||
gboolean direct_connection,
|
gboolean direct_connection,
|
||||||
gboolean auto_connect);
|
gboolean auto_connect);
|
||||||
void calls_sip_origin_create_inbound (CallsSipOrigin *self,
|
|
||||||
const gchar *number,
|
|
||||||
nua_handle_t *handle);
|
|
||||||
void calls_sip_origin_go_online (CallsSipOrigin *self,
|
void calls_sip_origin_go_online (CallsSipOrigin *self,
|
||||||
gboolean online);
|
gboolean online);
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
Loading…
Reference in a new issue