diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | src/Makefile.am | 18 | ||||
-rw-r--r-- | src/mm-bearer.c | 56 | ||||
-rw-r--r-- | src/mm-bearer.h | 10 |
4 files changed, 82 insertions, 4 deletions
@@ -117,3 +117,5 @@ m4/xsize.m4 TAGS ABOUT-NLS +/src/mm-private-enums-types.c +/src/mm-private-enums-types.h diff --git a/src/Makefile.am b/src/Makefile.am index 6bdb9d6b..590cd341 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,6 +53,22 @@ libserial_la_SOURCES = \ mm-qcdm-serial-port.c \ mm-qcdm-serial-port.h +# Daemon specific enum types +WITH_ENUMS = mm-bearer.h + +mm-private-enums-types.h: Makefile.am $(WITH_ENUMS) $(top_srcdir)/build-aux/mm-enums-template.h + $(AM_V_GEN) glib-mkenums \ + --fhead "#ifndef __MM_PRIVATE_ENUMS_TYPES_H__\n#define __MM_PRIVATE_ENUMS_TYPES_H__\n" \ + --template $(top_srcdir)/build-aux/mm-enums-template.h \ + --ftail "#endif /* __MM_PRIVATE_ENUMS_TYPES_H__ */\n" \ + $(WITH_ENUMS) > $@ + +mm-private-enums-types.c: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.c mm-private-enums-types.h + $(AM_V_GEN) glib-mkenums \ + --fhead "#include \"mm-bearer.h\"\n#include \"mm-private-enums-types.h\"" \ + --template $(top_srcdir)/build-aux/mm-enums-template.c \ + $(WITH_ENUMS) > $@ + sbin_PROGRAMS = modem-manager modem_manager_CPPFLAGS = \ @@ -101,6 +117,8 @@ modem_manager_SOURCES = \ main.c \ mm-log.c \ mm-log.h \ + mm-private-enums-types.h \ + mm-private-enums-types.c \ mm-callback-info.c \ mm-callback-info.h \ $(auth_sources) \ diff --git a/src/mm-bearer.c b/src/mm-bearer.c index fdfad008..33c3a389 100644 --- a/src/mm-bearer.c +++ b/src/mm-bearer.c @@ -25,6 +25,7 @@ #include <ModemManager.h> #include <libmm-common.h> +#include "mm-private-enums-types.h" #include "mm-iface-modem.h" #include "mm-bearer.h" #include "mm-base-modem-at.h" @@ -41,6 +42,7 @@ enum { PROP_CONNECTION, PROP_MODEM, PROP_CONNECTION_ALLOWED, + PROP_STATUS, PROP_LAST }; @@ -55,6 +57,8 @@ struct _MMBearerPrivate { gchar *path; /* Flag to specify whether the bearer can be connected */ gboolean connection_allowed; + /* Status of this bearer */ + MMBearerStatus status; }; /*****************************************************************************/ @@ -67,11 +71,18 @@ handle_connect_ready (MMBearer *self, { GError *error = NULL; - if (!MM_BEARER_GET_CLASS (self)->connect_finish (self, res, &error)) + if (!MM_BEARER_GET_CLASS (self)->connect_finish (self, res, &error)) { + mm_dbg ("Couldn't connect bearer '%s'", self->priv->path); + self->priv->status = MM_BEARER_STATUS_DISCONNECTED; g_dbus_method_invocation_take_error (invocation, error); - else + } + else { + mm_dbg ("Connected bearer '%s'", self->priv->path); + self->priv->status = MM_BEARER_STATUS_CONNECTED; mm_gdbus_bearer_complete_connect (MM_GDBUS_BEARER (self), invocation); + } + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]); g_object_unref (invocation); } @@ -91,6 +102,10 @@ handle_connect (MMBearer *self, if (MM_BEARER_GET_CLASS (self)->connect != NULL && MM_BEARER_GET_CLASS (self)->connect_finish != NULL) { + /* Connecting! */ + mm_dbg ("Connecting bearer '%s'", self->priv->path); + self->priv->status = MM_BEARER_STATUS_CONNECTING; + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]); MM_BEARER_GET_CLASS (self)->connect ( self, number, @@ -112,11 +127,18 @@ handle_disconnect_ready (MMBearer *self, { GError *error = NULL; - if (!MM_BEARER_GET_CLASS (self)->disconnect_finish (self, res, &error)) + if (!MM_BEARER_GET_CLASS (self)->disconnect_finish (self, res, &error)) { + mm_dbg ("Couldn't disconnect bearer '%s'", self->priv->path); + self->priv->status = MM_BEARER_STATUS_CONNECTED; g_dbus_method_invocation_take_error (invocation, error); - else + } + else { + mm_dbg ("Disconnected bearer '%s'", self->priv->path); + self->priv->status = MM_BEARER_STATUS_DISCONNECTED; mm_gdbus_bearer_complete_disconnect (MM_GDBUS_BEARER (self), invocation); + } + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]); g_object_unref (invocation); } @@ -126,6 +148,10 @@ handle_disconnect (MMBearer *self, { if (MM_BEARER_GET_CLASS (self)->disconnect != NULL && MM_BEARER_GET_CLASS (self)->disconnect_finish != NULL) { + /* Disconnecting! */ + mm_dbg ("Disconnecting bearer '%s'", self->priv->path); + self->priv->status = MM_BEARER_STATUS_DISCONNECTING; + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]); MM_BEARER_GET_CLASS (self)->disconnect ( self, (GAsyncReadyCallback)handle_disconnect_ready, @@ -179,6 +205,12 @@ mm_bearer_unexport (MMBearer *self) /*****************************************************************************/ +MMBearerStatus +mm_bearer_get_status (MMBearer *self) +{ + return self->priv->status; +} + const gchar * mm_bearer_get_path (MMBearer *self) { @@ -276,6 +308,9 @@ set_property (GObject *object, case PROP_CONNECTION_ALLOWED: self->priv->connection_allowed = g_value_get_boolean (value); break; + case PROP_STATUS: + self->priv->status = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -303,6 +338,9 @@ get_property (GObject *object, case PROP_CONNECTION_ALLOWED: g_value_set_boolean (value, self->priv->connection_allowed); break; + case PROP_STATUS: + g_value_set_enum (value, self->priv->status); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -316,6 +354,7 @@ mm_bearer_init (MMBearer *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), MM_TYPE_BEARER, MMBearerPrivate); + self->priv->status = MM_BEARER_STATUS_DISCONNECTED; /* Set defaults */ mm_gdbus_bearer_set_interface (MM_GDBUS_BEARER (self), NULL); @@ -396,4 +435,13 @@ mm_bearer_class_init (MMBearerClass *klass) FALSE, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CONNECTION_ALLOWED, properties[PROP_CONNECTION_ALLOWED]); + + properties[PROP_STATUS] = + g_param_spec_enum (MM_BEARER_STATUS, + "Bearer status", + "Status of the bearer", + MM_TYPE_BEARER_STATUS, + MM_BEARER_STATUS_DISCONNECTED, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_STATUS, properties[PROP_STATUS]); } diff --git a/src/mm-bearer.h b/src/mm-bearer.h index aeec20d9..7267dead 100644 --- a/src/mm-bearer.h +++ b/src/mm-bearer.h @@ -39,10 +39,18 @@ typedef struct _MMBearerPrivate MMBearerPrivate; #define MM_BEARER_CONNECTION "bearer-connection" #define MM_BEARER_MODEM "bearer-modem" #define MM_BEARER_CONNECTION_ALLOWED "bearer-connection-allowed" +#define MM_BEARER_STATUS "bearer-status" /* Prefix for all bearer object paths */ #define MM_DBUS_BEARER_PREFIX MM_DBUS_PATH "/Bearers" +typedef enum { /*< underscore_name=mm_bearer_status >*/ + MM_BEARER_STATUS_DISCONNECTED, + MM_BEARER_STATUS_DISCONNECTING, + MM_BEARER_STATUS_CONNECTING, + MM_BEARER_STATUS_CONNECTED, +} MMBearerStatus; + struct _MMBearer { MmGdbusBearerSkeleton parent; MMBearerPrivate *priv; @@ -80,4 +88,6 @@ void mm_bearer_expose_properties (MMBearer *bearer, void mm_bearer_set_connection_allowed (MMBearer *bearer); void mm_bearer_set_connection_forbidden (MMBearer *bearer); +MMBearerStatus mm_bearer_get_status (MMBearer *bearer); + #endif /* MM_BEARER_H */ |