diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-27 14:36:54 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:38 +0100 |
commit | 93732cf0757b7320f371ce0ac9681b95b5b98e73 (patch) | |
tree | ad037b570a59e2e03833f4301a5c277a334b645e /src | |
parent | e08ce775c554ab2d4cba445cac93980273f2182a (diff) |
bearers: base bearer creation in the new bearer properties object
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-bearer-3gpp.c | 27 | ||||
-rw-r--r-- | src/mm-bearer-3gpp.h | 5 | ||||
-rw-r--r-- | src/mm-bearer.c | 34 | ||||
-rw-r--r-- | src/mm-bearer.h | 6 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 11 | ||||
-rw-r--r-- | src/mm-iface-modem-3gpp.c | 70 | ||||
-rw-r--r-- | src/mm-iface-modem-3gpp.h | 15 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 105 | ||||
-rw-r--r-- | src/mm-iface-modem.h | 11 |
9 files changed, 141 insertions, 143 deletions
diff --git a/src/mm-bearer-3gpp.c b/src/mm-bearer-3gpp.c index d6cf3f38..cd3c56ec 100644 --- a/src/mm-bearer-3gpp.c +++ b/src/mm-bearer-3gpp.c @@ -787,28 +787,29 @@ disconnect (MMBearer *self, MMBearer * mm_bearer_3gpp_new (MMBaseModem *modem, - const gchar *apn, - const gchar *ip_type, - gboolean allow_roaming) + MMCommonBearerProperties *properties, + GError **error) { static guint id = 0; MMBearer3gpp *bearer; gchar *path; + /* Check mandatory properties */ + if (!mm_common_bearer_properties_get_apn (properties)) { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Invalid input properties: 3GPP bearer requires 'apn'"); + return NULL; + } + /* 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_ALLOW_ROAMING, allow_roaming, + MM_BEARER_3GPP_APN, mm_common_bearer_properties_get_apn (properties), + MM_BEARER_3GPP_IP_TYPE, mm_common_bearer_properties_get_ip_type (properties), + MM_BEARER_3GPP_ALLOW_ROAMING, mm_common_bearer_properties_get_allow_roaming (properties), NULL); - /* Build dict with all properties */ - mm_bearer_expose_properties (MM_BEARER (bearer), - "apn", apn, - "ip-type", ip_type, - "allow-roaming", allow_roaming, - NULL); - /* Set modem and path ONLY after having checked input properties, so that * we don't export invalid bearers. */ path = g_strdup_printf (MM_DBUS_BEARER_3GPP_PREFIX "/%d", id++); diff --git a/src/mm-bearer-3gpp.h b/src/mm-bearer-3gpp.h index b79d13a0..1413cd32 100644 --- a/src/mm-bearer-3gpp.h +++ b/src/mm-bearer-3gpp.h @@ -56,9 +56,8 @@ GType mm_bearer_3gpp_get_type (void); /* Default 3GPP bearer creation implementation */ MMBearer *mm_bearer_3gpp_new (MMBaseModem *modem, - const gchar *apn, - const gchar *ip_type, - gboolean allow_roaming); + MMCommonBearerProperties *properties, + GError **error); const gchar *mm_bearer_3gpp_get_apn (MMBearer3gpp *self); const gchar *mm_bearer_3gpp_get_ip_type (MMBearer3gpp *self); diff --git a/src/mm-bearer.c b/src/mm-bearer.c index b7ab9a72..27623177 100644 --- a/src/mm-bearer.c +++ b/src/mm-bearer.c @@ -480,39 +480,15 @@ mm_bearer_set_connection_forbidden (MMBearer *self, void mm_bearer_expose_properties (MMBearer *bearer, - const gchar *first_property_name, - ...) + MMCommonBearerProperties *properties) { - va_list va_args; - const gchar *key; - GVariantBuilder builder; - - va_start (va_args, first_property_name); - - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); - key = first_property_name; - while (key) { - if (g_str_equal (key, "allow-roaming")) { - gboolean 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 *); - } - va_end (va_args); + GVariant *dictionary; /* Keep the whole list of properties in the interface */ + dictionary = mm_common_bearer_properties_get_dictionary (properties); mm_gdbus_bearer_set_properties (MM_GDBUS_BEARER (bearer), - g_variant_builder_end (&builder)); + dictionary); + g_variant_unref (dictionary); } /*****************************************************************************/ diff --git a/src/mm-bearer.h b/src/mm-bearer.h index 36c09fe0..07a66928 100644 --- a/src/mm-bearer.h +++ b/src/mm-bearer.h @@ -21,7 +21,8 @@ #include <glib.h> #include <glib-object.h> -#include <mm-gdbus-bearer.h> +#include <libmm-common.h> + #include "mm-base-modem.h" #define MM_TYPE_BEARER (mm_bearer_get_type ()) @@ -89,8 +90,7 @@ GType mm_bearer_get_type (void); const gchar *mm_bearer_get_path (MMBearer *bearer); void mm_bearer_expose_properties (MMBearer *bearer, - const gchar *first_property_name, - ...); + MMCommonBearerProperties *properties); void mm_bearer_set_connection_allowed (MMBearer *bearer); void mm_bearer_set_connection_forbidden (MMBearer *bearer, diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index ff9b85fc..d4191aed 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -102,7 +102,7 @@ modem_create_bearer_finish (MMIfaceModem *self, static void modem_create_bearer (MMIfaceModem *self, - GVariant *properties, + MMCommonBearerProperties *properties, GAsyncReadyCallback callback, gpointer user_data) { @@ -116,9 +116,9 @@ modem_create_bearer (MMIfaceModem *self, /* New 3GPP bearer */ if (MM_BROADBAND_MODEM (self)->priv->modem_3gpp_dbus_skeleton) { - bearer = mm_iface_modem_3gpp_create_bearer_from_properties (MM_IFACE_MODEM_3GPP (self), - properties, - &error); + bearer = mm_iface_modem_3gpp_create_bearer (MM_IFACE_MODEM_3GPP (self), + properties, + &error); } else { g_set_error (&error, MM_CORE_ERROR, @@ -134,6 +134,9 @@ modem_create_bearer (MMIfaceModem *self, return; } + /* Expose all properties used during creation */ + mm_bearer_expose_properties (bearer, properties); + /* Set a new ref to the bearer object as result */ result = g_simple_async_result_new (G_OBJECT (self), callback, diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c index 673d88e2..e6c98505 100644 --- a/src/mm-iface-modem-3gpp.c +++ b/src/mm-iface-modem-3gpp.c @@ -320,9 +320,8 @@ handle_scan (MmGdbusModem3gpp *skeleton, /* Create new 3GPP bearer */ MMBearer * mm_iface_modem_3gpp_create_bearer (MMIfaceModem3gpp *self, - const gchar *apn, - const gchar *ip_type, - gboolean allow_roaming) + MMCommonBearerProperties *properties, + GError **error) { MMModem3gppRegistrationState current_state; MMBearer *bearer; @@ -331,11 +330,12 @@ mm_iface_modem_3gpp_create_bearer (MMIfaceModem3gpp *self, /* Create new 3GPP bearer using the method set in the interface, so that * plugins can subclass it and implement their own. */ - bearer = MM_BEARER (MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)-> - create_3gpp_bearer (MM_BASE_MODEM (self), - apn, - ip_type, - allow_roaming)); + bearer = MM_BEARER (MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->create_3gpp_bearer ( + MM_BASE_MODEM (self), + properties, + error)); + if (!bearer) + return NULL; g_object_get (self, MM_IFACE_MODEM_3GPP_REGISTRATION_STATE, ¤t_state, @@ -360,60 +360,6 @@ mm_iface_modem_3gpp_create_bearer (MMIfaceModem3gpp *self, return bearer; } -MMBearer * -mm_iface_modem_3gpp_create_bearer_from_properties (MMIfaceModem3gpp *self, - GVariant *properties, - GError **error) -{ - GVariantIter iter; - const gchar *key; - 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, "{sv}", &key, &value)) { - if (g_str_equal (key, "apn")) { - if (apn) - mm_warn ("Duplicate 'apn' property found, ignoring value '%s'", - g_variant_get_string (value, NULL)); - else - 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'", - g_variant_get_string (value, NULL)); - else - 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); - } - - /* Check mandatory properties */ - if (!apn) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Invalid input properties: 3GPP bearer requires 'apn'"); - g_free (ip_type); - return NULL; - } - - return mm_iface_modem_3gpp_create_bearer (self, apn, ip_type, allow_roaming); -} - /*****************************************************************************/ typedef struct { diff --git a/src/mm-iface-modem-3gpp.h b/src/mm-iface-modem-3gpp.h index e0f3fc0c..24054e2a 100644 --- a/src/mm-iface-modem-3gpp.h +++ b/src/mm-iface-modem-3gpp.h @@ -19,6 +19,8 @@ #include <glib-object.h> #include <gio/gio.h> +#include <libmm-common.h> + #include "mm-at-serial-port.h" #define MM_TYPE_IFACE_MODEM_3GPP (mm_iface_modem_3gpp_get_type ()) @@ -145,9 +147,8 @@ struct _MMIfaceModem3gpp { /* Create 3GPP bearer */ MMBearer * (* create_3gpp_bearer) (MMBaseModem *modem, - const gchar *apn, - const gchar *ip_type, - gboolean allow_roaming); + MMCommonBearerProperties *properties, + GError **error); }; GType mm_iface_modem_3gpp_get_type (void); @@ -198,12 +199,8 @@ gboolean mm_iface_modem_3gpp_run_all_registration_checks_finish (MMIfaceModem3gp /* Create new 3GPP bearer */ MMBearer *mm_iface_modem_3gpp_create_bearer (MMIfaceModem3gpp *self, - const gchar *apn, - const gchar *ip_type, - gboolean allow_roaming); -MMBearer *mm_iface_modem_3gpp_create_bearer_from_properties (MMIfaceModem3gpp *self, - GVariant *properties, - GError **error); + MMCommonBearerProperties *properties, + GError **error); /* Allow registering in the network */ gboolean mm_iface_modem_3gpp_register_in_network_finish (MMIfaceModem3gpp *self, diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index bb43c174..a14910bf 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -124,10 +124,25 @@ bearer_status_changed (MMBearer *bearer, } } +gchar * +mm_iface_modem_create_bearer_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + const gchar *path; + + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return NULL; + + path = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); + + return g_strdup (path); +} + static void -handle_create_bearer_ready (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) +create_bearer_ready (MMIfaceModem *self, + GAsyncResult *res, + GSimpleAsyncResult *simple) { MMBearer *bearer; GError *error = NULL; @@ -136,7 +151,7 @@ handle_create_bearer_ready (MMIfaceModem *self, res, &error); if (error) - g_dbus_method_invocation_take_error (ctx->invocation, error); + g_simple_async_result_take_error (simple, error); else { MMBearerList *list = NULL; @@ -145,7 +160,7 @@ handle_create_bearer_ready (MMIfaceModem *self, NULL); if (!mm_bearer_list_add_bearer (list, bearer, &error)) - g_dbus_method_invocation_take_error (ctx->invocation, error); + g_simple_async_result_take_error (simple, error); else { /* If bearer properly created and added to the list, follow its * status */ @@ -153,21 +168,25 @@ handle_create_bearer_ready (MMIfaceModem *self, "notify::" MM_BEARER_STATUS, (GCallback)bearer_status_changed, self); - - mm_gdbus_modem_complete_create_bearer (ctx->skeleton, - ctx->invocation, - mm_bearer_get_path (bearer)); + /* It is safe to set the static path here because we're not completing + * in idle */ + g_simple_async_result_set_op_res_gpointer (simple, + (gchar *)mm_bearer_get_path (bearer), + NULL); } g_object_unref (bearer); + g_object_unref (list); } - dbus_call_context_free (ctx); + + g_simple_async_result_complete (simple); + g_object_unref (simple); } -static gboolean -handle_create_bearer (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - GVariant *arg_properties, - MMIfaceModem *self) +void +mm_iface_modem_create_bearer (MMIfaceModem *self, + MMCommonBearerProperties *properties, + GAsyncReadyCallback callback, + gpointer user_data) { MMBearerList *list = NULL; @@ -176,8 +195,10 @@ handle_create_bearer (MmGdbusModem *skeleton, NULL); if (mm_bearer_list_get_count (list) == mm_bearer_list_get_max (list)) { - g_dbus_method_invocation_return_error ( - invocation, + g_simple_async_report_error_in_idle ( + G_OBJECT (self), + callback, + user_data, MM_CORE_ERROR, MM_CORE_ERROR_TOO_MANY, "Cannot add new bearer: already reached maximum (%u)", @@ -185,14 +206,60 @@ handle_create_bearer (MmGdbusModem *skeleton, } else { MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer ( self, - arg_properties, + properties, + (GAsyncReadyCallback)create_bearer_ready, + g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + mm_iface_modem_create_bearer)); + } + + g_object_unref (list); +} + +static void +handle_create_bearer_ready (MMIfaceModem *self, + GAsyncResult *res, + DbusCallContext *ctx) +{ + gchar *bearer_path; + GError *error = NULL; + + bearer_path = mm_iface_modem_create_bearer_finish (self, res, &error); + if (!bearer_path) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else { + mm_gdbus_modem_complete_create_bearer (ctx->skeleton, + ctx->invocation, + bearer_path); + g_free (bearer_path); + } + dbus_call_context_free (ctx); +} + +static gboolean +handle_create_bearer (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + GVariant *dictionary, + MMIfaceModem *self) +{ + GError *error = NULL; + MMCommonBearerProperties *properties; + + properties = mm_common_bearer_properties_new_from_dictionary (dictionary, &error); + if (!properties) { + g_dbus_method_invocation_take_error (invocation, error); + } else { + mm_iface_modem_create_bearer ( + self, + properties, (GAsyncReadyCallback)handle_create_bearer_ready, dbus_call_context_new (skeleton, invocation, self)); + g_object_unref (properties); } - g_object_unref (list); return TRUE; } diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h index 1afd166c..e5ab1b77 100644 --- a/src/mm-iface-modem.h +++ b/src/mm-iface-modem.h @@ -232,7 +232,7 @@ struct _MMIfaceModem { /* Create bearer */ void (*create_bearer) (MMIfaceModem *self, - GVariant *properties, + MMCommonBearerProperties *properties, GAsyncReadyCallback callback, gpointer user_data); MMBearer * (*create_bearer_finish) (MMIfaceModem *self, @@ -323,4 +323,13 @@ gboolean mm_iface_modem_set_allowed_bands_finish (MMIfaceModem *self, GAsyncResult *res, GError **error); +/* Allow creating bearers */ +void mm_iface_modem_create_bearer (MMIfaceModem *self, + MMCommonBearerProperties *properties, + GAsyncReadyCallback callback, + gpointer user_data); +gchar *mm_iface_modem_create_bearer_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); + #endif /* MM_IFACE_MODEM_H */ |