1
/* libtinymail-camel - The Tiny Mail base library for Camel
2
* Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org>
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with self library; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
22
#include <glib/gi18n-lib.h>
24
#include <tny-gnome-device.h>
33
#include <libnm_glib.h>
36
static GObjectClass *parent_class = NULL;
38
#include "tny-gnome-device-priv.h"
40
static void tny_gnome_device_on_online (TnyDevice *self);
41
static void tny_gnome_device_on_offline (TnyDevice *self);
42
static gboolean tny_gnome_device_is_online (TnyDevice *self);
45
emit_status (TnyDevice *self)
47
if (tny_gnome_device_is_online (self))
48
tny_gnome_device_on_online (self);
50
tny_gnome_device_on_offline (self);
58
nm_callback (libnm_glib_ctx *nm_ctx, gpointer user_data)
60
TnyDevice *self = (TnyDevice *)user_data;
69
tny_gnome_device_reset (TnyDevice *self)
71
TnyGnomeDevicePriv *priv = TNY_GNOME_DEVICE_GET_PRIVATE (self);
73
const gboolean status_before = tny_gnome_device_is_online (self);
78
/* Signal if it changed: */
79
if (status_before != tny_gnome_device_is_online (self))
80
g_idle_add_full (G_PRIORITY_DEFAULT,
81
(GSourceFunc) emit_status,
83
(GDestroyNotify) g_object_unref);
89
tny_gnome_device_force_online (TnyDevice *self)
91
TnyGnomeDevicePriv *priv = TNY_GNOME_DEVICE_GET_PRIVATE (self);
93
const gboolean already_online = tny_gnome_device_is_online (self);
98
/* Signal if it changed: */
100
g_idle_add_full (G_PRIORITY_DEFAULT,
101
(GSourceFunc) emit_status,
103
(GDestroyNotify) g_object_unref);
110
tny_gnome_device_force_offline (TnyDevice *self)
112
TnyGnomeDevicePriv *priv = TNY_GNOME_DEVICE_GET_PRIVATE (self);
114
const gboolean already_offline = !tny_gnome_device_is_online (self);
117
priv->forced = FALSE;
119
/* Signal if it changed: */
120
if (!already_offline)
121
g_idle_add_full (G_PRIORITY_DEFAULT,
122
(GSourceFunc) emit_status,
124
(GDestroyNotify) g_object_unref);
130
tny_gnome_device_on_online (TnyDevice *self)
132
gdk_threads_enter ();
133
g_signal_emit (self, tny_device_signals [TNY_DEVICE_CONNECTION_CHANGED], 0, TRUE);
134
gdk_threads_leave ();
140
tny_gnome_device_on_offline (TnyDevice *self)
142
gdk_threads_enter ();
143
g_signal_emit (self, tny_device_signals [TNY_DEVICE_CONNECTION_CHANGED], 0, FALSE);
144
gdk_threads_leave ();
150
tny_gnome_device_is_online (TnyDevice *self)
152
TnyGnomeDevicePriv *priv = TNY_GNOME_DEVICE_GET_PRIVATE (self);
153
gboolean retval = priv->forced;
156
if (!priv->fset && !priv->invnm)
158
libnm_glib_state state = libnm_glib_get_network_state (priv->nm_ctx);
162
case LIBNM_ACTIVE_NETWORK_CONNECTION:
167
case LIBNM_NO_NETWORKMANAGER:
168
case LIBNM_INVALID_CONTEXT:
169
g_print (_("Invalid network manager installation. Going to assume Offline status\n"));
172
libnm_glib_unregister_callback (priv->nm_ctx, priv->callback_id);
173
libnm_glib_shutdown (priv->nm_ctx);
175
case LIBNM_NO_NETWORK_CONNECTION:
186
/* #define IMMEDIATE_ONLINE_TEST */
189
tny_gnome_device_instance_init (GTypeInstance *instance, gpointer g_class)
191
TnyGnomeDevice *self = (TnyGnomeDevice *)instance;
192
TnyGnomeDevicePriv *priv = TNY_GNOME_DEVICE_GET_PRIVATE (self);
195
priv->forced = FALSE;
197
#ifdef IMMEDIATE_ONLINE_TEST
204
priv->nm_ctx = libnm_glib_init ();
205
#ifndef IMMEDIATE_ONLINE_TEST
206
priv->callback_id = libnm_glib_register_callback
207
(priv->nm_ctx, nm_callback, self, NULL);
217
* tny_gnome_device_new:
219
* Create a #TnyDevice for GNOME desktops. If available, it uses NetworkManager
220
* to know about the network status and changes of your computer.
222
* Return value: A new #TnyDevice instance
225
tny_gnome_device_new (void)
227
TnyGnomeDevice *self = g_object_new (TNY_TYPE_GNOME_DEVICE, NULL);
229
return TNY_DEVICE (self);
234
tny_gnome_device_finalize (GObject *object)
236
TnyGnomeDevice *self = (TnyGnomeDevice *)object;
237
TnyGnomeDevicePriv *priv = TNY_GNOME_DEVICE_GET_PRIVATE (self);
242
libnm_glib_unregister_callback (priv->nm_ctx, priv->callback_id);
243
libnm_glib_shutdown (priv->nm_ctx);
247
(*parent_class->finalize) (object);
254
tny_device_init (gpointer g, gpointer iface_data)
256
TnyDeviceIface *klass = (TnyDeviceIface *)g;
258
klass->is_online_func = tny_gnome_device_is_online;
259
klass->reset_func = tny_gnome_device_reset;
260
klass->force_offline_func = tny_gnome_device_force_offline;
261
klass->force_online_func = tny_gnome_device_force_online;
269
tny_gnome_device_class_init (TnyGnomeDeviceClass *class)
271
GObjectClass *object_class;
273
parent_class = g_type_class_peek_parent (class);
274
object_class = (GObjectClass*) class;
276
object_class->finalize = tny_gnome_device_finalize;
278
g_type_class_add_private (object_class, sizeof (TnyGnomeDevicePriv));
284
tny_gnome_device_get_type (void)
286
static GType type = 0;
288
if (G_UNLIKELY(type == 0))
290
static const GTypeInfo info =
292
sizeof (TnyGnomeDeviceClass),
293
NULL, /* base_init */
294
NULL, /* base_finalize */
295
(GClassInitFunc) tny_gnome_device_class_init, /* class_init */
296
NULL, /* class_finalize */
297
NULL, /* class_data */
298
sizeof (TnyGnomeDevice),
300
tny_gnome_device_instance_init /* instance_init */
303
static const GInterfaceInfo tny_device_info =
305
(GInterfaceInitFunc) tny_device_init, /* interface_init */
306
NULL, /* interface_finalize */
307
NULL /* interface_data */
310
type = g_type_register_static (G_TYPE_OBJECT,
314
g_type_add_interface_static (type, TNY_TYPE_DEVICE,