diff options
Diffstat (limited to 'src/mm-iface-modem.c')
-rw-r--r-- | src/mm-iface-modem.c | 218 |
1 files changed, 109 insertions, 109 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index d9766fef..4176af3b 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -24,6 +24,7 @@ #include "mm-iface-modem.h" #include "mm-base-modem.h" #include "mm-sim.h" +#include "mm-bearer-list.h" #include "mm-log.h" typedef struct _InitializationContext InitializationContext; @@ -71,20 +72,29 @@ handle_create_bearer_ready (MMIfaceModem *self, GAsyncResult *res, DbusCallContext *ctx) { - gchar *path; + MMBearer *bearer; GError *error = NULL; - path = MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer_finish (self, - res, - &error); + bearer = MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer_finish (self, + res, + &error); if (error) - g_dbus_method_invocation_take_error (ctx->invocation, - error); - else - mm_gdbus_modem_complete_create_bearer (ctx->skeleton, - ctx->invocation, - path); - g_free (path); + g_dbus_method_invocation_take_error (ctx->invocation, error); + else { + MMBearerList *list = NULL; + + g_object_get (self, + MM_IFACE_MODEM_BEARER_LIST, &list, + NULL); + + if (!mm_bearer_list_add_bearer (list, bearer, &error)) + g_dbus_method_invocation_take_error (ctx->invocation, error); + else + mm_gdbus_modem_complete_create_bearer (ctx->skeleton, + ctx->invocation, + mm_bearer_get_path (bearer)); + g_object_unref (bearer); + } dbus_call_context_free (ctx); } @@ -94,87 +104,78 @@ handle_create_bearer (MmGdbusModem *skeleton, GVariant *arg_properties, MMIfaceModem *self) { - MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer ( - self, - arg_properties, - (GAsyncReadyCallback)handle_create_bearer_ready, - dbus_call_context_new (skeleton, - invocation, - self)); - return TRUE; -} + MMBearerList *list = NULL; -/*****************************************************************************/ + g_object_get (self, + MM_IFACE_MODEM_BEARER_LIST, &list, + NULL); -static void -handle_delete_bearer_ready (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) -{ - GError *error = NULL; + if (mm_bearer_list_get_count (list) == mm_bearer_list_get_max (list)) { + g_dbus_method_invocation_return_error ( + invocation, + MM_CORE_ERROR, + MM_CORE_ERROR_TOO_MANY, + "Cannot add new bearer: already reached maximum (%u)", + mm_bearer_list_get_count (list)); + } else { + MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer ( + self, + arg_properties, + (GAsyncReadyCallback)handle_create_bearer_ready, + dbus_call_context_new (skeleton, + invocation, + self)); + } - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->delete_bearer_finish (self, - res, - &error)) - g_dbus_method_invocation_take_error (ctx->invocation, - error); - else - mm_gdbus_modem_complete_delete_bearer (ctx->skeleton, - ctx->invocation); - dbus_call_context_free (ctx); + g_object_unref (list); + return TRUE; } +/*****************************************************************************/ + static gboolean handle_delete_bearer (MmGdbusModem *skeleton, GDBusMethodInvocation *invocation, const gchar *arg_bearer, MMIfaceModem *self) { - MM_IFACE_MODEM_GET_INTERFACE (self)->delete_bearer ( - self, - arg_bearer, - (GAsyncReadyCallback)handle_delete_bearer_ready, - dbus_call_context_new (skeleton, - invocation, - self)); - return TRUE; -} - -/*****************************************************************************/ - -static void -handle_list_bearers_ready (MMIfaceModem *self, - GAsyncResult *res, - DbusCallContext *ctx) -{ - GStrv path_list; + MMBearerList *list = NULL; GError *error = NULL; - path_list = MM_IFACE_MODEM_GET_INTERFACE (self)->list_bearers_finish (self, - res, - &error); - if (error) - g_dbus_method_invocation_take_error (ctx->invocation, - error); + g_object_get (self, + MM_IFACE_MODEM_BEARER_LIST, &list, + NULL); + + if (!mm_bearer_list_delete_bearer (list, arg_bearer, &error)) + g_dbus_method_invocation_take_error (invocation, error); else - mm_gdbus_modem_complete_list_bearers (ctx->skeleton, - ctx->invocation, - (const gchar *const *)path_list); - g_strfreev (path_list); - dbus_call_context_free (ctx); + mm_gdbus_modem_complete_delete_bearer (skeleton, invocation); + + g_object_unref (list); + return TRUE; } +/*****************************************************************************/ + static gboolean handle_list_bearers (MmGdbusModem *skeleton, GDBusMethodInvocation *invocation, MMIfaceModem *self) { - MM_IFACE_MODEM_GET_INTERFACE (self)->list_bearers ( - self, - (GAsyncReadyCallback)handle_list_bearers_ready, - dbus_call_context_new (skeleton, - invocation, - self)); + GStrv paths; + MMBearerList *list = NULL; + + g_object_get (self, + MM_IFACE_MODEM_BEARER_LIST, &list, + NULL); + + paths = mm_bearer_list_get_paths (list); + mm_gdbus_modem_complete_list_bearers (skeleton, + invocation, + (const gchar *const *)paths); + + g_strfreev (paths); + g_object_unref (list); return TRUE; } @@ -1514,8 +1515,7 @@ typedef enum { INITIALIZATION_STEP_FIRST, INITIALIZATION_STEP_CURRENT_CAPABILITIES, INITIALIZATION_STEP_MODEM_CAPABILITIES, - INITIALIZATION_STEP_MAX_BEARERS, - INITIALIZATION_STEP_MAX_ACTIVE_BEARERS, + INITIALIZATION_STEP_BEARERS, INITIALIZATION_STEP_MANUFACTURER, INITIALIZATION_STEP_MODEL, INITIALIZATION_STEP_REVISION, @@ -1645,8 +1645,6 @@ load_current_capabilities_ready (MMIfaceModem *self, } UINT_REPLY_READY_FN (modem_capabilities, "Modem Capabilities") -UINT_REPLY_READY_FN (max_bearers, "Max Bearers") -UINT_REPLY_READY_FN (max_active_bearers, "Max Active Bearers") STR_REPLY_READY_FN (manufacturer, "Manufacturer") STR_REPLY_READY_FN (model, "Model") STR_REPLY_READY_FN (revision, "Revision") @@ -1799,44 +1797,38 @@ interface_initialization_step (InitializationContext *ctx) /* Fall down to next step */ ctx->step++; - case INITIALIZATION_STEP_MAX_BEARERS: - /* Max bearers value is meant to be loaded only once during the whole - * lifetime of the modem. Therefore, if we already have them loaded, - * don't try to load them again. */ - if (mm_gdbus_modem_get_max_bearers (ctx->skeleton) == 0 && - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_max_bearers && - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_max_bearers_finish) { - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_max_bearers ( - ctx->self, - (GAsyncReadyCallback)load_max_bearers_ready, - ctx); - return; - } - /* Default to one bearer */ - mm_gdbus_modem_set_max_bearers (ctx->skeleton, 1); - /* Fall down to next step */ - ctx->step++; + case INITIALIZATION_STEP_BEARERS: { + MMBearerList *list = NULL; - case INITIALIZATION_STEP_MAX_ACTIVE_BEARERS: - /* Max active bearers value is meant to be loaded only once during the - * whole lifetime of the modem. Therefore, if we already have them - * loaded, don't try to load them again. */ - if (mm_gdbus_modem_get_max_active_bearers (ctx->skeleton) == 0 && - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_max_active_bearers && - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_max_active_bearers_finish) { - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_max_active_bearers ( - ctx->self, - (GAsyncReadyCallback)load_max_active_bearers_ready, - ctx); - return; + /* Bearers setup is meant to be loaded only once during the whole + * lifetime of the modem. The list may have been created by the object + * implementing the interface; if so use it. */ + g_object_get (ctx->self, + MM_IFACE_MODEM_BEARER_LIST, &list, + NULL); + + if (!list) { + list = mm_bearer_list_new (1, 1); + + /* Create new default list */ + g_object_set (ctx->self, + MM_IFACE_MODEM_BEARER_LIST, list, + NULL); } - /* If no specific way of getting max active bearers, assume they are - * equal to the absolute max bearers */ - mm_gdbus_modem_set_max_active_bearers ( - ctx->skeleton, - mm_gdbus_modem_get_max_bearers (ctx->skeleton)); + + if (mm_gdbus_modem_get_max_bearers (ctx->skeleton) == 0) + mm_gdbus_modem_set_max_bearers ( + ctx->skeleton, + mm_bearer_list_get_max (list)); + if (mm_gdbus_modem_get_max_active_bearers (ctx->skeleton) == 0) + mm_gdbus_modem_set_max_active_bearers ( + ctx->skeleton, + mm_bearer_list_get_max_active (list)); + g_object_unref (list); + /* Fall down to next step */ ctx->step++; + } case INITIALIZATION_STEP_MANUFACTURER: /* Manufacturer is meant to be loaded only once during the whole @@ -2190,6 +2182,14 @@ iface_modem_init (gpointer g_iface) MM_MODEM_CAPABILITY_NONE, G_PARAM_READWRITE)); + g_object_interface_install_property + (g_iface, + g_param_spec_object (MM_IFACE_MODEM_BEARER_LIST, + "Bearer list", + "List of bearers handled by the modem", + MM_TYPE_BEARER_LIST, + G_PARAM_READWRITE)); + initialized = TRUE; } |