diff options
Diffstat (limited to 'plugins/fibocom/mm-broadband-modem-fibocom.c')
-rw-r--r-- | plugins/fibocom/mm-broadband-modem-fibocom.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/plugins/fibocom/mm-broadband-modem-fibocom.c b/plugins/fibocom/mm-broadband-modem-fibocom.c index 900e6e42..d134e640 100644 --- a/plugins/fibocom/mm-broadband-modem-fibocom.c +++ b/plugins/fibocom/mm-broadband-modem-fibocom.c @@ -16,8 +16,10 @@ #include <config.h> #include "mm-broadband-modem-fibocom.h" +#include "mm-broadband-bearer-fibocom-ecm.h" #include "mm-broadband-modem.h" #include "mm-iface-modem.h" +#include "mm-log.h" static void iface_modem_init (MMIfaceModem *iface); @@ -25,6 +27,78 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemFibocom, mm_broadband_modem_fibocom, MM_ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)) /*****************************************************************************/ +/* Create Bearer (Modem interface) */ + +static MMBaseBearer * +modem_create_bearer_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +broadband_bearer_fibocom_ecm_new_ready (GObject *source, + GAsyncResult *res, + GTask *task) +{ + MMBaseBearer *bearer = NULL; + GError *error = NULL; + + bearer = mm_broadband_bearer_fibocom_ecm_new_finish (res, &error); + if (!bearer) + g_task_return_error (task, error); + else + g_task_return_pointer (task, bearer, g_object_unref); + g_object_unref (task); +} + +static void +broadband_bearer_new_ready (GObject *source, + GAsyncResult *res, + GTask *task) +{ + MMBaseBearer *bearer = NULL; + GError *error = NULL; + + bearer = mm_broadband_bearer_new_finish (res, &error); + if (!bearer) + g_task_return_error (task, error); + else + g_task_return_pointer (task, bearer, g_object_unref); + g_object_unref (task); +} + +static void +modem_create_bearer (MMIfaceModem *self, + MMBearerProperties *properties, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (self, NULL, callback, user_data); + + /* If we get a NET port, create Fibocom ECM bearer */ + if (mm_base_modem_peek_best_data_port (MM_BASE_MODEM (self), MM_PORT_TYPE_NET)) { + mm_obj_dbg (self, "Creating Fibocom ECM bearer"); + mm_broadband_bearer_fibocom_ecm_new (MM_BROADBAND_MODEM_FIBOCOM (self), + properties, + NULL, /* cancellable */ + (GAsyncReadyCallback) broadband_bearer_fibocom_ecm_new_ready, + task); + } else { + /* Otherwise, use generic broadband bearer for PPP */ + mm_obj_dbg (self, "Creating generic PPP bearer"); + mm_broadband_bearer_new (MM_BROADBAND_MODEM (self), + properties, + NULL, /* cancellable */ + (GAsyncReadyCallback) broadband_bearer_new_ready, + task); + } +} + +/*****************************************************************************/ MMBroadbandModemFibocom * mm_broadband_modem_fibocom_new (const gchar *device, @@ -39,7 +113,7 @@ mm_broadband_modem_fibocom_new (const gchar *device, MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_PRODUCT_ID, product_id, - MM_BASE_MODEM_DATA_NET_SUPPORTED, FALSE, + MM_BASE_MODEM_DATA_NET_SUPPORTED, TRUE, MM_BASE_MODEM_DATA_TTY_SUPPORTED, TRUE, NULL); } @@ -52,6 +126,8 @@ mm_broadband_modem_fibocom_init (MMBroadbandModemFibocom *self) static void iface_modem_init (MMIfaceModem *iface) { + iface->create_bearer = modem_create_bearer; + iface->create_bearer_finish = modem_create_bearer_finish; } static void |