aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-12-20 21:42:39 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:35 +0100
commite385b5b07972129488ad049224af807610cf3be7 (patch)
tree416d510e2f10ae7cfa9fab3bf4b292bc3b61f227
parentfdd05ee977479206774627a38e57a002146787c6 (diff)
api,core: new 'allow-roaming' property to be set when creating a bearer
This new boolean property, applicable to 3GPP bearers, will specify whether 3GPP bearers are allowed to get connected when registered in a roaming network.
-rw-r--r--new/org.freedesktop.ModemManager1.Bearer.xml2
-rw-r--r--new/org.freedesktop.ModemManager1.Modem.xml14
-rw-r--r--src/mm-bearer-3gpp.c59
-rw-r--r--src/mm-bearer-3gpp.h10
-rw-r--r--src/mm-bearer.c19
5 files changed, 74 insertions, 30 deletions
diff --git a/new/org.freedesktop.ModemManager1.Bearer.xml b/new/org.freedesktop.ModemManager1.Bearer.xml
index 78e67742..49528e2e 100644
--- a/new/org.freedesktop.ModemManager1.Bearer.xml
+++ b/new/org.freedesktop.ModemManager1.Bearer.xml
@@ -233,7 +233,7 @@
List of properties used when creating the bearer.
-->
- <property name="Properties" type="a{ss}" access="read" />
+ <property name="Properties" type="a{sv}" access="read" />
</interface>
</node>
diff --git a/new/org.freedesktop.ModemManager1.Modem.xml b/new/org.freedesktop.ModemManager1.Modem.xml
index f5afb70a..93e02928 100644
--- a/new/org.freedesktop.ModemManager1.Modem.xml
+++ b/new/org.freedesktop.ModemManager1.Modem.xml
@@ -60,15 +60,17 @@
Allowed properties are:
<variablelist>
<varlistentry><term><literal>"apn"</literal></term>
- <listitem><para>Access Point Name. Required in 3GPP.</para></listitem></varlistentry>
+ <listitem><para>Access Point Name, given as a string value (signature <literal>"s"</literal>). Required in 3GPP.</para></listitem></varlistentry>
<varlistentry><term><literal>"ip-type"</literal></term>
- <listitem><para>Addressing type, one of <literal>"IPV4"</literal>, <literal>"IPV4V6"</literal>, or <literal>"IPV6"</literal>. Optional in 3GPP and CDMA.</para></listitem></varlistentry>
+ <listitem><para>Addressing type, given as a string value (signature <literal>"s"</literal>). One of <literal>"IPV4"</literal>, <literal>"IPV4V6"</literal>, or <literal>"IPV6"</literal>. Optional in 3GPP and CDMA.</para></listitem></varlistentry>
<varlistentry><term><literal>"user"</literal></term>
- <listitem><para>User name (if any) required by the network. Optional in 3GPP.</para></listitem></varlistentry>
+ <listitem><para>User name (if any) required by the network, given as a string value (signature <literal>"s"</literal>). Optional in 3GPP.</para></listitem></varlistentry>
<varlistentry><term><literal>"password"</literal></term>
- <listitem><para>Password (if any) required by the network. Optional in 3GPP.</para></listitem></varlistentry>
+ <listitem><para>Password (if any) required by the network, given as a string value (signature <literal>"s"</literal>). Optional in 3GPP.</para></listitem></varlistentry>
+ <varlistentry><term><literal>"allow-roaming"</literal></term>
+ <listitem><para>Flag to tell whether connection is allowed during roaming, given as a boolean value (signature <literal>"b"</literal>). Optional in 3GPP.</para></listitem></varlistentry>
<varlistentry><term><literal>"number"</literal></term>
- <listitem><para>Telephone number to dial. Required in POTS.</para></listitem></varlistentry>
+ <listitem><para>Telephone number to dial, given as a string value (signature <literal>"s"</literal>). Required in POTS.</para></listitem></varlistentry>
</variablelist>
Some properties are only applicable to a bearer of certain access
@@ -76,7 +78,7 @@
applicable to CDMA2000 Packet Data Session bearers.
-->
<method name="CreateBearer">
- <arg name="properties" type="a{ss}" direction="in" />
+ <arg name="properties" type="a{sv}" direction="in" />
<arg name="path" type="o" direction="out" />
</method>
diff --git a/src/mm-bearer-3gpp.c b/src/mm-bearer-3gpp.c
index 024726ba..ee067b88 100644
--- a/src/mm-bearer-3gpp.c
+++ b/src/mm-bearer-3gpp.c
@@ -37,6 +37,7 @@ enum {
PROP_0,
PROP_APN,
PROP_IP_TYPE,
+ PROP_ALLOW_ROAMING,
PROP_LAST
};
@@ -47,6 +48,8 @@ struct _MMBearer3gppPrivate {
gchar *apn;
/* IP type of the PDP context */
gchar *ip_type;
+ /* Flag to allow/forbid connections while roaming */
+ gboolean allow_roaming;
/* Data port used when modem is connected */
MMPort *port;
@@ -769,24 +772,35 @@ mm_bearer_3gpp_new_from_properties (MMBaseModem *modem,
{
GVariantIter iter;
const gchar *key;
- const gchar *value;
+ GVariant *value;
gchar *apn = NULL;
gchar *ip_type = NULL;
+ gboolean allow_roaming = FALSE;
+ gboolean allow_roaming_found = FALSE;
mm_dbg ("Creating 3GPP bearer with properties...");
g_variant_iter_init (&iter, properties);
- while (g_variant_iter_loop (&iter, "{ss}", &key, &value)) {
- mm_dbg (" Property '%s', value '%s'", key, value);
+ while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) {
if (g_str_equal (key, "apn")) {
if (apn)
- mm_warn ("Duplicate 'apn' property found, ignoring value '%s'", value);
+ mm_warn ("Duplicate 'apn' property found, ignoring value '%s'",
+ g_variant_get_string (value, NULL));
else
- apn = g_strdup (value);
+ apn = g_variant_dup_string (value, NULL);
} else if (g_str_equal (key, "ip-type")) {
if (ip_type)
- mm_warn ("Duplicate 'ip-type' property found, ignoring value '%s'", value);
+ mm_warn ("Duplicate 'ip-type' property found, ignoring value '%s'",
+ g_variant_get_string (value, NULL));
else
- ip_type = g_strdup (value);
+ ip_type = g_variant_dup_string (value, NULL);
+ } else if (g_str_equal (key, "allow-roaming")) {
+ if (allow_roaming_found)
+ mm_warn ("Duplicate 'allow-roaming' property found, ignoring value '%s'",
+ g_variant_get_string (value, NULL));
+ else {
+ allow_roaming_found = TRUE;
+ allow_roaming = g_variant_get_boolean (value);
+ }
}
else
mm_dbg ("Ignoring property '%s' in 3GPP bearer", key);
@@ -804,13 +818,15 @@ mm_bearer_3gpp_new_from_properties (MMBaseModem *modem,
return mm_bearer_3gpp_new (modem,
apn,
- ip_type);
+ ip_type,
+ allow_roaming);
}
MMBearer *
mm_bearer_3gpp_new (MMBaseModem *modem,
const gchar *apn,
- const gchar *ip_type)
+ const gchar *ip_type,
+ gboolean allow_roaming)
{
static guint id = 0;
MMBearer3gpp *bearer;
@@ -818,14 +834,16 @@ mm_bearer_3gpp_new (MMBaseModem *modem,
/* Create the object */
bearer = g_object_new (MM_TYPE_BEARER_3GPP,
- MM_BEARER_3GPP_APN, apn,
- MM_BEARER_3GPP_IP_TYPE, ip_type,
+ MM_BEARER_3GPP_APN, apn,
+ MM_BEARER_3GPP_IP_TYPE, ip_type,
+ MM_BEARER_3GPP_ALLOW_ROAMING, allow_roaming,
NULL);
/* Build dict with all properties */
mm_bearer_expose_properties (MM_BEARER (bearer),
- "apn", apn,
- "ip-type", ip_type,
+ "apn", apn,
+ "ip-type", ip_type,
+ "allow-roaming", allow_roaming,
NULL);
/* Set modem and path ONLY after having checked input properties, so that
@@ -857,6 +875,9 @@ set_property (GObject *object,
g_free (self->priv->ip_type);
self->priv->ip_type = g_value_dup_string (value);
break;
+ case PROP_ALLOW_ROAMING:
+ self->priv->allow_roaming = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -878,6 +899,9 @@ get_property (GObject *object,
case PROP_IP_TYPE:
g_value_set_string (value, self->priv->ip_type);
break;
+ case PROP_ALLOW_ROAMING:
+ g_value_set_boolean (value, self->priv->allow_roaming);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -891,6 +915,7 @@ mm_bearer_3gpp_init (MMBearer3gpp *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
MM_TYPE_BEARER_3GPP,
MMBearer3gppPrivate);
+ self->priv->allow_roaming = TRUE;
}
static void
@@ -936,4 +961,12 @@ mm_bearer_3gpp_class_init (MMBearer3gppClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (object_class, PROP_IP_TYPE, properties[PROP_IP_TYPE]);
+
+ properties[PROP_ALLOW_ROAMING] =
+ g_param_spec_boolean (MM_BEARER_3GPP_ALLOW_ROAMING,
+ "Allow roaming",
+ "Whether connections are allowed when roaming",
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_ALLOW_ROAMING, properties[PROP_ALLOW_ROAMING]);
}
diff --git a/src/mm-bearer-3gpp.h b/src/mm-bearer-3gpp.h
index de75e673..b9d86685 100644
--- a/src/mm-bearer-3gpp.h
+++ b/src/mm-bearer-3gpp.h
@@ -31,9 +31,10 @@
#define MM_IS_BEARER_3GPP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BEARER_3GPP))
#define MM_BEARER_3GPP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BEARER_3GPP, MMBearer3gppClass))
-#define MM_BEARER_3GPP_CID "bearer-3gpp-cid"
-#define MM_BEARER_3GPP_APN "bearer-3gpp-apn"
-#define MM_BEARER_3GPP_IP_TYPE "bearer-3gpp-ip-type"
+#define MM_BEARER_3GPP_CID "bearer-3gpp-cid"
+#define MM_BEARER_3GPP_APN "bearer-3gpp-apn"
+#define MM_BEARER_3GPP_IP_TYPE "bearer-3gpp-ip-type"
+#define MM_BEARER_3GPP_ALLOW_ROAMING "bearer-3gpp-allow-roaming"
/* Prefix for all 3GPP bearer object paths */
#define MM_DBUS_BEARER_3GPP_PREFIX MM_DBUS_BEARER_PREFIX "/3GPP"
@@ -55,7 +56,8 @@ GType mm_bearer_3gpp_get_type (void);
MMBearer *mm_bearer_3gpp_new (MMBaseModem *modem,
const gchar *apn,
- const gchar *ip_type);
+ const gchar *ip_type,
+ gboolean allow_roaming);
MMBearer *mm_bearer_3gpp_new_from_properties (MMBaseModem *modem,
GVariant *properties,
GError **error);
diff --git a/src/mm-bearer.c b/src/mm-bearer.c
index d897e730..d2b1caf1 100644
--- a/src/mm-bearer.c
+++ b/src/mm-bearer.c
@@ -472,15 +472,22 @@ mm_bearer_expose_properties (MMBearer *bearer,
va_start (va_args, first_property_name);
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}"));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
key = first_property_name;
while (key) {
- const gchar *value;
+ if (g_str_equal (key, "allow-roaming")) {
+ gboolean value;
- /* If a key with NULL value is given, just ignore it. */
- value = va_arg (va_args, gchar *);
- if (value)
- g_variant_builder_add (&builder, "{ss}", key, value);
+ value = va_arg (va_args, gboolean);
+ g_variant_builder_add (&builder, "{sv}", key, g_variant_new_boolean (value));
+ } else {
+ const gchar *value;
+
+ /* If a key with NULL value is given, just ignore it. */
+ value = va_arg (va_args, gchar *);
+ if (value)
+ g_variant_builder_add (&builder, "{sv}", key, g_variant_new_string (value));
+ }
key = va_arg (va_args, gchar *);
}