1
0
Fork 0
mirror of https://gitlab.gnome.org/GNOME/calls.git synced 2025-01-07 12:25:31 +00:00

sip: allow specifying local port and use IPv6

This commit is contained in:
Evangelos Ribeiro Tzaras 2021-03-02 18:40:41 +01:00
parent 37b9fe1c30
commit 1836c7c915
4 changed files with 51 additions and 17 deletions

View file

@ -72,6 +72,7 @@ struct _CallsSipOrigin
gchar *transport_protocol; gchar *transport_protocol;
const gchar *protocol_prefix; const gchar *protocol_prefix;
gint port; gint port;
gint local_port;
GList *calls; GList *calls;
GHashTable *call_handles; GHashTable *call_handles;
@ -97,6 +98,7 @@ enum {
PROP_ACC_DIRECT, PROP_ACC_DIRECT,
PROP_ACC_AUTO_CONNECT, PROP_ACC_AUTO_CONNECT,
PROP_SIP_CONTEXT, PROP_SIP_CONTEXT,
PROP_SIP_LOCAL_PORT,
PROP_ACC_STATE, PROP_ACC_STATE,
PROP_CALLS, PROP_CALLS,
PROP_LAST_PROP, PROP_LAST_PROP,
@ -421,6 +423,8 @@ setup_nua (CallsSipOrigin *self)
g_autofree gchar *address = NULL; g_autofree gchar *address = NULL;
nua_t *nua; nua_t *nua;
gboolean use_sips; gboolean use_sips;
g_autofree gchar * sip_url = NULL;
g_autofree gchar * sips_url = NULL;
g_return_val_if_fail (CALLS_IS_SIP_ORIGIN (self), NULL); g_return_val_if_fail (CALLS_IS_SIP_ORIGIN (self), NULL);
@ -428,14 +432,20 @@ setup_nua (CallsSipOrigin *self)
use_sips = check_sips (address); use_sips = check_sips (address);
// TODO URLs must be changed to accomodate IPv6 use case (later, not important right now) if (self->local_port > 0) {
// Note: This is why using hostname does not work! (do we need two nua contexts for ipv4 and ipv6?) sip_url = g_strdup_printf ("sip:*:%d", self->local_port);
sips_url = g_strdup_printf ("sips:*:%d", self->local_port);
} else {
sip_url = g_strdup ("sip:*:*");
sips_url = g_strdup_printf ("sips:*:*");
}
nua = nua_create (self->ctx->root, nua = nua_create (self->ctx->root,
sip_callback, sip_callback,
self, self,
NUTAG_USER_AGENT ("sofia-test/0.0.1"), NUTAG_USER_AGENT ("sofia-test/0.0.1"),
NUTAG_URL ("sip:0.0.0.0:5060"), NUTAG_URL (sip_url),
TAG_IF (use_sips, NUTAG_SIPS_URL ("sips:0.0.0.0:5060")), TAG_IF (use_sips, NUTAG_SIPS_URL (sips_url)),
NUTAG_M_USERNAME (self->user), NUTAG_M_USERNAME (self->user),
SIPTAG_FROM_STR (address), SIPTAG_FROM_STR (address),
NUTAG_ENABLEINVITE (1), NUTAG_ENABLEINVITE (1),
@ -786,6 +796,10 @@ calls_sip_origin_set_property (GObject *object,
self->auto_connect = g_value_get_boolean (value); self->auto_connect = g_value_get_boolean (value);
break; break;
case PROP_SIP_LOCAL_PORT:
self->local_port = g_value_get_int (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break; break;
@ -834,6 +848,10 @@ calls_sip_origin_get_property (GObject *object,
g_value_set_boolean (value, self->auto_connect); g_value_set_boolean (value, self->auto_connect);
break; break;
case PROP_SIP_LOCAL_PORT:
g_value_set_int (value, self->local_port);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break; break;
@ -974,6 +992,14 @@ calls_sip_origin_class_init (CallsSipOriginClass *klass)
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (object_class, PROP_SIP_CONTEXT, props[PROP_SIP_CONTEXT]); g_object_class_install_property (object_class, PROP_SIP_CONTEXT, props[PROP_SIP_CONTEXT]);
props[PROP_SIP_LOCAL_PORT] =
g_param_spec_int ("local-port",
"Local port",
"The local port to which the SIP stack binds to",
1025, 65535, 5060,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (object_class, PROP_SIP_LOCAL_PORT, props[PROP_SIP_LOCAL_PORT]);
props[PROP_ACC_STATE] = props[PROP_ACC_STATE] =
g_param_spec_enum ("account-state", g_param_spec_enum ("account-state",
"Account state", "Account state",
@ -1052,6 +1078,7 @@ calls_sip_origin_new (const gchar *name,
const gchar *password, const gchar *password,
const gchar *host, const gchar *host,
gint port, gint port,
gint local_port,
const gchar *protocol, const gchar *protocol,
gboolean direct_connection, gboolean direct_connection,
gboolean auto_connect) gboolean auto_connect)
@ -1066,6 +1093,7 @@ calls_sip_origin_new (const gchar *name,
"password", password, "password", password,
"host", host, "host", host,
"port", port, "port", port,
"local-port", local_port,
"protocol", protocol, "protocol", protocol,
"direct-connection", direct_connection, "direct-connection", direct_connection,
"auto-connect", auto_connect, "auto-connect", auto_connect,
@ -1076,6 +1104,7 @@ calls_sip_origin_new (const gchar *name,
return origin; return origin;
} }
void void
calls_sip_origin_go_online (CallsSipOrigin *self, calls_sip_origin_go_online (CallsSipOrigin *self,
gboolean online) gboolean online)

View file

@ -37,11 +37,12 @@ G_DECLARE_FINAL_TYPE (CallsSipOrigin, calls_sip_origin, CALLS, SIP_ORIGIN, GObje
CallsSipOrigin *calls_sip_origin_new (const gchar *name, CallsSipOrigin *calls_sip_origin_new (const gchar *name,
CallsSipContext *sip_context, CallsSipContext *sip_context,
const gchar *user, const gchar *user,
const gchar *password, const gchar *password,
const gchar *host, const gchar *host,
gint port, gint port,
const gchar *protocol, gint local_port,
const gchar *protocol,
gboolean direct_connection, gboolean direct_connection,
gboolean auto_connect); gboolean auto_connect);
void calls_sip_origin_create_inbound (CallsSipOrigin *self, void calls_sip_origin_create_inbound (CallsSipOrigin *self,

View file

@ -111,6 +111,7 @@ calls_sip_provider_load_accounts (CallsSipProvider *self)
g_autofree gchar *host = NULL; g_autofree gchar *host = NULL;
g_autofree gchar *protocol = NULL; g_autofree gchar *protocol = NULL;
gint port = 0; gint port = 0;
gint local_port = 0;
gboolean direct_connection = gboolean direct_connection =
g_key_file_get_boolean (key_file, groups[i], "Direct", NULL); g_key_file_get_boolean (key_file, groups[i], "Direct", NULL);
gboolean auto_connect = TRUE; gboolean auto_connect = TRUE;
@ -118,8 +119,10 @@ calls_sip_provider_load_accounts (CallsSipProvider *self)
if (g_key_file_has_key (key_file, groups[i], "AutoConnect", NULL)) if (g_key_file_has_key (key_file, groups[i], "AutoConnect", NULL))
auto_connect = g_key_file_get_boolean (key_file, groups[i], "AutoConnect", NULL); auto_connect = g_key_file_get_boolean (key_file, groups[i], "AutoConnect", NULL);
if (direct_connection) if (direct_connection) {
local_port = 5060;
goto skip; goto skip;
}
if (!check_required_keys (key_file, groups[i])) { if (!check_required_keys (key_file, groups[i])) {
g_warning ("Not all required keys found in section %s of file `%s'", g_warning ("Not all required keys found in section %s of file `%s'",
@ -132,6 +135,7 @@ calls_sip_provider_load_accounts (CallsSipProvider *self)
host = g_key_file_get_string (key_file, groups[i], "Host", NULL); host = g_key_file_get_string (key_file, groups[i], "Host", NULL);
protocol = g_key_file_get_string (key_file, groups[i], "Protocol", NULL); protocol = g_key_file_get_string (key_file, groups[i], "Protocol", NULL);
port = g_key_file_get_integer (key_file, groups[i], "Port", NULL); port = g_key_file_get_integer (key_file, groups[i], "Port", NULL);
local_port = g_key_file_get_integer (key_file, groups[i], "LocalPort", NULL);
skip: skip:
if (protocol == NULL) if (protocol == NULL)
@ -144,15 +148,12 @@ calls_sip_provider_load_accounts (CallsSipProvider *self)
else else
port = 5060; port = 5060;
} }
g_debug ("Adding origin for SIP account %s", groups[i]); g_debug ("Adding origin for SIP account %s", groups[i]);
calls_sip_provider_add_origin (self,
groups[i], calls_sip_provider_add_origin (self, groups[i],
user, user, password,
password, host, port, local_port,
host,
port,
protocol, protocol,
direct_connection, direct_connection,
auto_connect); auto_connect);
@ -380,6 +381,7 @@ calls_sip_provider_add_origin (CallsSipProvider *self,
const gchar *password, const gchar *password,
const gchar *host, const gchar *host,
gint port, gint port,
gint local_port,
const gchar *protocol, const gchar *protocol,
gboolean direct_connection, gboolean direct_connection,
gboolean auto_connect) gboolean auto_connect)
@ -394,6 +396,7 @@ calls_sip_provider_add_origin (CallsSipProvider *self,
password, password,
host, host,
port, port,
local_port,
protocol, protocol,
direct_connection, direct_connection,
auto_connect); auto_connect);

View file

@ -41,6 +41,7 @@ void calls_sip_provider_add_origin (CallsSipProvider *s
const gchar *password, const gchar *password,
const gchar *host, const gchar *host,
gint port, gint port,
gint local_port,
const gchar *protocol, const gchar *protocol,
gboolean direct_connection, gboolean direct_connection,
gboolean auto_connect); gboolean auto_connect);