aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy')
-rw-r--r--libempathy/empathy-connectivity.c192
-rw-r--r--libempathy/empathy-connectivity.h6
2 files changed, 186 insertions, 12 deletions
diff --git a/libempathy/empathy-connectivity.c b/libempathy/empathy-connectivity.c
index 264b58d06..47d02989e 100644
--- a/libempathy/empathy-connectivity.c
+++ b/libempathy/empathy-connectivity.c
@@ -20,13 +20,27 @@
*/
#include "config.h"
+#include "empathy-connectivity.h"
-#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
+#ifdef HAVE_NM
+#include <nm-client.h>
+#endif
+
+#include "empathy-utils.h"
+#include "empathy-marshal.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_CONNECTIVITY
+#include "empathy-debug.h"
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyConnectivity)
typedef struct {
+#ifdef HAVE_NM
+ NMClient *nm_client;
+#endif
+
+ gboolean connected;
+ gboolean use_conn;
gboolean dispose_run;
} EmpathyConnectivityPriv;
@@ -35,11 +49,47 @@ enum {
LAST_SIGNAL
};
+enum {
+ PROP_0,
+ PROP_USE_CONN,
+};
+
static guint signals[LAST_SIGNAL];
static EmpathyConnectivity *connectivity_singleton = NULL;
G_DEFINE_TYPE (EmpathyConnectivity, empathy_connectivity, G_TYPE_OBJECT);
+#ifdef HAVE_NM
+static void
+connectivity_nm_state_change_cb (NMClient *client,
+ const GParamSpec *pspec,
+ EmpathyConnectivity *connectivity)
+{
+ EmpathyConnectivityPriv *priv;
+ gboolean old_nm_connected;
+ gboolean new_nm_connected;
+ NMState state;
+
+ priv = GET_PRIV (connectivity);
+
+ if (!priv->use_conn)
+ return;
+
+ state = nm_client_get_state (priv->nm_client);
+ old_nm_connected = priv->connected;
+ new_nm_connected = state == NM_STATE_CONNECTED;
+ new_nm_connected = !(state == NM_STATE_CONNECTING
+ || state == NM_STATE_DISCONNECTED);
+
+ DEBUG ("New NetworkManager network state %d", state);
+
+ priv->connected = new_nm_connected;
+
+ g_signal_emit (connectivity, signals[STATE_CHANGE], 0,
+ old_nm_connected, new_nm_connected);
+}
+#endif
+
static void
empathy_connectivity_init (EmpathyConnectivity *connectivity)
{
@@ -50,21 +100,40 @@ empathy_connectivity_init (EmpathyConnectivity *connectivity)
connectivity->priv = priv;
priv->dispose_run = FALSE;
+
+#ifdef HAVE_NM
+ priv->nm_client = nm_client_new ();
+ if (priv->nm_client != NULL)
+ {
+ g_signal_connect (priv->nm_client, "notify::" NM_CLIENT_STATE,
+ G_CALLBACK (connectivity_nm_state_change_cb), connectivity);
+ }
+ else
+ {
+ DEBUG ("Failed to get NetworkManager proxy");
+ }
+#endif
}
static void
connectivity_finalize (GObject *object)
{
- EmpathyConnectivity *manager = EMPATHY_CONNECTIVITY (obj);
+ EmpathyConnectivity *manager = EMPATHY_CONNECTIVITY (object);
EmpathyConnectivityPriv *priv = GET_PRIV (manager);
- G_OBJECT_CLASS (empathy_connectivity_parent_class)->finalize (obj);
+ if (priv->nm_client != NULL)
+ {
+ g_object_unref (priv->nm_client);
+ priv->nm_client = NULL;
+ }
+
+ G_OBJECT_CLASS (empathy_connectivity_parent_class)->finalize (object);
}
static void
connectivity_dispose (GObject *object)
{
- EmpathyConnectivity *manager = EMPATHY_CONNECTIVITY (obj);
+ EmpathyConnectivity *manager = EMPATHY_CONNECTIVITY (object);
EmpathyConnectivityPriv *priv = GET_PRIV (manager);
if (priv->dispose_run)
@@ -72,7 +141,7 @@ connectivity_dispose (GObject *object)
priv->dispose_run = TRUE;
- G_OBJECT_CLASS (empathy_connectivity_parent_class)->dispose (obj);
+ G_OBJECT_CLASS (empathy_connectivity_parent_class)->dispose (object);
}
static GObject *
@@ -82,23 +151,63 @@ connectivity_constructor (GType type,
{
GObject *retval;
- if (!manager_singleton)
+ if (!connectivity_singleton)
{
retval = G_OBJECT_CLASS (empathy_connectivity_parent_class)->constructor
(type, n_construct_params, construct_params);
- manager_singleton = EMPATHY_CONNECTIVITY (retval);
- g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
+ connectivity_singleton = EMPATHY_CONNECTIVITY (retval);
+ g_object_add_weak_pointer (retval, (gpointer) &connectivity_singleton);
}
else
{
- retval = g_object_ref (manager_singleton);
+ retval = g_object_ref (connectivity_singleton);
}
return retval;
}
static void
+connectivity_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyConnectivity *connectivity = EMPATHY_CONNECTIVITY (object);
+
+ switch (param_id)
+ {
+ case PROP_USE_CONN:
+ g_value_set_boolean (value, empathy_connectivity_get_use_conn (
+ connectivity));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+static void
+connectivity_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyConnectivity *connectivity = EMPATHY_CONNECTIVITY (object);
+
+ switch (param_id)
+ {
+ case PROP_USE_CONN:
+ empathy_connectivity_set_use_conn (connectivity,
+ g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+static void
empathy_connectivity_class_init (EmpathyConnectivityClass *klass)
{
GObjectClass *oclass = G_OBJECT_CLASS (klass);
@@ -106,6 +215,8 @@ empathy_connectivity_class_init (EmpathyConnectivityClass *klass)
oclass->finalize = connectivity_finalize;
oclass->dispose = connectivity_dispose;
oclass->constructor = connectivity_constructor;
+ oclass->get_property = connectivity_get_property;
+ oclass->set_property = connectivity_set_property;
signals[STATE_CHANGE] =
g_signal_new ("state-change",
@@ -113,9 +224,17 @@ empathy_connectivity_class_init (EmpathyConnectivityClass *klass)
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT, /* TODO */
+ _empathy_marshal_VOID__BOOLEAN_BOOLEAN,
G_TYPE_NONE,
- 0, NULL);
+ 2, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, NULL);
+
+ g_object_class_install_property (oclass,
+ PROP_USE_CONN,
+ g_param_spec_boolean ("use-conn",
+ "Use connectivity managers",
+ "Set presence according to connectivity managers",
+ TRUE,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
g_type_class_add_private (oclass, sizeof (EmpathyConnectivityPriv));
}
@@ -127,3 +246,52 @@ empathy_connectivity_dup_singleton (void)
{
return g_object_new (EMPATHY_TYPE_CONNECTIVITY, NULL);
}
+
+gboolean
+empathy_connectivity_is_online (EmpathyConnectivity *connectivity)
+{
+ EmpathyConnectivityPriv *priv = GET_PRIV (connectivity);
+
+ if (priv->use_conn)
+ {
+#ifdef HAVE_NM
+ return priv->connected;
+#else
+ return TRUE;
+#endif
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+gboolean
+empathy_connectivity_get_use_conn (EmpathyConnectivity *connectivity)
+{
+ EmpathyConnectivityPriv *priv = GET_PRIV (connectivity);
+
+ return priv->use_conn;
+}
+
+void
+empathy_connectivity_set_use_conn (EmpathyConnectivity *connectivity,
+ gboolean use_conn)
+{
+ EmpathyConnectivityPriv *priv = GET_PRIV (connectivity);
+
+ if (use_conn == priv->use_conn)
+ return;
+
+ DEBUG ("use_conn gconf key changed; new value = %s",
+ use_conn ? "true" : "false");
+
+ priv->use_conn = use_conn;
+
+#ifdef HAVE_NM
+ if (use_conn)
+ connectivity_nm_state_change_cb (priv->nm_client, NULL, connectivity);
+#endif
+
+ g_object_notify (G_OBJECT (connectivity), "use-conn");
+}
diff --git a/libempathy/empathy-connectivity.h b/libempathy/empathy-connectivity.h
index 391c6597f..ca507e910 100644
--- a/libempathy/empathy-connectivity.h
+++ b/libempathy/empathy-connectivity.h
@@ -59,6 +59,12 @@ GType empathy_connectivity_get_type (void);
EmpathyConnectivity * empathy_connectivity_dup_singleton (void);
+gboolean empathy_connectivity_is_online (EmpathyConnectivity *connectivity);
+
+gboolean empathy_connectivity_get_use_conn (EmpathyConnectivity *connectivity);
+void empathy_connectivity_set_use_conn (EmpathyConnectivity *connectivity,
+ gboolean use_conn);
+
G_END_DECLS
#endif /* __EMPATHY_CONNECTIVITY_H__ */