aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-12-19 18:42:49 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:35 +0100
commit9962f5cbde7e16a93897846a209d990b362b6942 (patch)
tree96b7de19873021f5ff4794f94e3bf9f93fb0c9d2
parentcadc27ca0ee20fd312a73751a298c4227e753036 (diff)
bearer: new `bearer-state' property
-rw-r--r--.gitignore2
-rw-r--r--src/Makefile.am18
-rw-r--r--src/mm-bearer.c56
-rw-r--r--src/mm-bearer.h10
4 files changed, 82 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore
index dd6d8eb8..416f36c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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 */