From fbbe17139db2861436ddc18da531b120b8c43cb3 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Fri, 29 Oct 2021 02:39:29 +0200 Subject: [PATCH] sip: origin: Add property tracking usage for tel URIs Fixes #277 --- plugins/sip/calls-sip-account-widget.c | 1 + plugins/sip/calls-sip-origin.c | 26 +++++++++++++++++++++++++- plugins/sip/calls-sip-origin.h | 1 + plugins/sip/calls-sip-provider.c | 13 +++++++++++++ plugins/sip/calls-sip-provider.h | 1 + tests/test-sip.c | 3 +++ 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/plugins/sip/calls-sip-account-widget.c b/plugins/sip/calls-sip-account-widget.c index f0de40a..51995f6 100644 --- a/plugins/sip/calls-sip-account-widget.c +++ b/plugins/sip/calls-sip-account-widget.c @@ -397,6 +397,7 @@ on_apply_clicked (CallsSipAccountWidget *self) gtk_entry_get_text (self->display_name), get_selected_protocol (self), get_port (self), + FALSE, TRUE); update_header (self); diff --git a/plugins/sip/calls-sip-origin.c b/plugins/sip/calls-sip-origin.c index f75878b..04a823d 100644 --- a/plugins/sip/calls-sip-origin.c +++ b/plugins/sip/calls-sip-origin.c @@ -74,6 +74,7 @@ enum { PROP_ACC_ADDRESS, PROP_CALLS, PROP_COUNTRY_CODE, + PROP_CAN_TEL, PROP_LAST_PROP, }; static GParamSpec *props[PROP_LAST_PROP]; @@ -109,6 +110,7 @@ struct _CallsSipOrigin char *transport_protocol; gboolean auto_connect; gboolean direct_mode; + gboolean can_tel; gint local_port; const char *protocol_prefix; @@ -1102,10 +1104,13 @@ supports_protocol (CallsOrigin *origin, if (g_strcmp0 (protocol, "sip") == 0) return TRUE; + if (g_strcmp0 (protocol, "sips") == 0) return g_strcmp0 (self->protocol_prefix, "sips") == 0; - /* TODO need to set a property (from the UI) to allow using origin for telephony */ + if (g_strcmp0 (protocol, "tel") == 0) + return self->can_tel; + return FALSE; } @@ -1184,6 +1189,10 @@ calls_sip_origin_set_property (GObject *object, self->local_port = g_value_get_int (value); break; + case PROP_CAN_TEL: + self->can_tel = g_value_get_boolean (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -1256,6 +1265,10 @@ calls_sip_origin_get_property (GObject *object, g_value_set_string (value, NULL); break; + case PROP_CAN_TEL: + g_value_set_boolean (value, self->can_tel); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -1407,6 +1420,14 @@ calls_sip_origin_class_init (CallsSipOriginClass *klass) G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_SIP_CONTEXT, props[PROP_SIP_CONTEXT]); + props[PROP_CAN_TEL] = + g_param_spec_boolean ("can-tel", + "Can telephone", + "Whether to this account can be used for PSTN telephony", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CAN_TEL, props[PROP_CAN_TEL]); + g_object_class_override_property (object_class, PROP_ACC_STATE, "account-state"); props[PROP_ACC_STATE] = g_object_class_find_property (object_class, "account-state"); @@ -1472,6 +1493,7 @@ calls_sip_origin_set_credentials (CallsSipOrigin *self, const char *display_name, const char *transport_protocol, gint port, + gboolean can_tel, gboolean auto_connect) { g_return_if_fail (CALLS_IS_SIP_ORIGIN (self)); @@ -1509,5 +1531,7 @@ calls_sip_origin_set_credentials (CallsSipOrigin *self, self->port = port; + self->can_tel = can_tel; + recreate_sip (self); } diff --git a/plugins/sip/calls-sip-origin.h b/plugins/sip/calls-sip-origin.h index 5a14b3b..b1c50c2 100644 --- a/plugins/sip/calls-sip-origin.h +++ b/plugins/sip/calls-sip-origin.h @@ -39,6 +39,7 @@ void calls_sip_origin_set_credentials (CallsSipOrigin *sel const char *display_name, const char *transport_protocol, gint port, + gboolean use_for_tel, gboolean auto_connect); G_END_DECLS diff --git a/plugins/sip/calls-sip-provider.c b/plugins/sip/calls-sip-provider.c index faedf3e..2c95820 100644 --- a/plugins/sip/calls-sip-provider.c +++ b/plugins/sip/calls-sip-provider.c @@ -114,6 +114,7 @@ on_origin_pw_looked_up (GObject *source, gint local_port = 0; gboolean auto_connect = TRUE; gboolean direct_mode = FALSE; + gboolean can_tel = FALSE; g_assert (user_data); @@ -136,6 +137,10 @@ on_origin_pw_looked_up (GObject *source, if (g_key_file_has_key (data->key_file, data->name, "DirectMode", NULL)) direct_mode = g_key_file_get_boolean (data->key_file, data->name, "DirectMode", NULL); + if (g_key_file_has_key (data->key_file, data->name, "CanTel", NULL)) + can_tel = + g_key_file_get_boolean (data->key_file, data->name, "CanTel", NULL); + /* PW */ password = secret_password_lookup_finish (result, &error); if (!direct_mode && error) { @@ -164,6 +169,7 @@ on_origin_pw_looked_up (GObject *source, auto_connect, direct_mode, local_port, + can_tel, FALSE); } static void @@ -265,6 +271,7 @@ origin_to_keyfile (CallsSipOrigin *origin, gint local_port; gboolean auto_connect; gboolean direct_mode; + gboolean can_tel; g_assert (CALLS_IS_SIP_ORIGIN (origin)); g_assert (key_file); @@ -279,6 +286,7 @@ origin_to_keyfile (CallsSipOrigin *origin, "auto-connect", &auto_connect, "direct-mode", &direct_mode, "local-port", &local_port, + "can-tel", &can_tel, NULL); g_key_file_set_string (key_file, name, "Host", host); @@ -289,6 +297,7 @@ origin_to_keyfile (CallsSipOrigin *origin, g_key_file_set_boolean (key_file, name, "AutoConnect", auto_connect); g_key_file_set_boolean (key_file, name, "DirectMode", direct_mode); g_key_file_set_integer (key_file, name, "LocalPort", local_port); + g_key_file_set_boolean (key_file, name, "CanTel", can_tel); label_secret = g_strdup_printf ("Calls Password for %s", calls_account_get_address (CALLS_ACCOUNT (origin))); @@ -639,6 +648,7 @@ calls_sip_provider_add_origin (CallsSipProvider *self, TRUE, FALSE, 0, + FALSE, store_credentials); } @@ -653,6 +663,7 @@ calls_sip_provider_add_origin (CallsSipProvider *self, * @auto_connect: Whether to automatically try going online * @direct_mode: Whether to use direct connection mode. Useful when you don't want to * connect to a SIP server. Mostly useful for testing and debugging. + * @can_tel: Whether this origin can be used for PSTN telephony * @store_credentials: Whether to store credentials for this origin to disk * * Adds a new origin (SIP account). If @direct_mode is %TRUE then @host, @user and @@ -671,6 +682,7 @@ calls_sip_provider_add_origin_full (CallsSipProvider *self, gboolean auto_connect, gboolean direct_mode, gint local_port, + gboolean can_tel, gboolean store_credentials) { g_autoptr (CallsSipOrigin) origin = NULL; @@ -702,6 +714,7 @@ calls_sip_provider_add_origin_full (CallsSipProvider *self, "auto-connect", auto_connect, "direct-mode", direct_mode, "local-port", local_port, + "can-tel", can_tel, NULL); g_list_store_append (self->origins, origin); diff --git a/plugins/sip/calls-sip-provider.h b/plugins/sip/calls-sip-provider.h index 2d54033..fb0c4cd 100644 --- a/plugins/sip/calls-sip-provider.h +++ b/plugins/sip/calls-sip-provider.h @@ -55,6 +55,7 @@ CallsSipOrigin *calls_sip_provider_add_origin_full (CallsSipProvider *s gboolean auto_connect, gboolean direct_mode, gint local_port, + gboolean use_for_tel, gboolean store_credentials); gboolean calls_sip_provider_remove_origin (CallsSipProvider *self, CallsSipOrigin *origin); diff --git a/tests/test-sip.c b/tests/test-sip.c index 55083fa..8a19cff 100644 --- a/tests/test-sip.c +++ b/tests/test-sip.c @@ -371,6 +371,7 @@ setup_sip_origins (SipFixture *fixture, FALSE, TRUE, 5060, + FALSE, FALSE); fixture->origin_bob = @@ -384,6 +385,7 @@ setup_sip_origins (SipFixture *fixture, FALSE, TRUE, 5061, + FALSE, FALSE); fixture->origin_offline = @@ -397,6 +399,7 @@ setup_sip_origins (SipFixture *fixture, FALSE, FALSE, 0, + FALSE, FALSE); }