1
#! /usr/bin/env python 
2
import gobject
3
import tinymail
4
5
import dbus
6
from dbus.mainloop.glib import DBusGMainLoop
7
8
class NMDevice(gobject.GObject, tinymail.Device):
9
	"""
10
	An implementation of the tinymail device interface
11
	that uses Network manager.
12
	"""
13
	ACTIVE_NETWORK_CONNECTION = 3
14
15
	def __init__(self):
16
		gobject.GObject.__init__(self)
17
		self.__online = False
18
		self.__forced = False
19
20
		DBusGMainLoop(set_as_default=True)
21
		bus = dbus.SystemBus()
22
		nm_object = bus.get_object(
23
			'org.freedesktop.NetworkManager', 
24
			'/org/freedesktop/NetworkManager')
25
		nm_interface = dbus.Interface(
26
			nm_object, 
27
			dbus_interface='org.freedesktop.NetworkManager')
28
29
		self.__state = nm_interface.get_dbus_method('state')
30
		nm_interface.connect_to_signal('StateChange', self.__update_state)
31
		self.__state(reply_handler=self.__update_state,
32
				error_handler=self.__dbus_error)
33
34
	def do_is_online(self):
35
		return self.online
36
37
	def do_force_online(self):
38
		self.__forced = True
39
		self.online = True
40
41
	def do_force_offline(self):
42
		self.__forced = True
43
		self.online = False
44
45
	def reset(self):
46
		self.__forced = False
47
		self.__state(reply_handler=self.__update_state,
48
				error_handler=self.__dbus_error)
49
50
	def __update_state(self, state):
51
		if not self.__forced:
52
			self.online = (state == ACTIVE_NETWORK_CONNECTION)
53
54
	def __dbus_error(self, error):
55
		raise error
56
57
	def __get_online(self):
58
		return self.__online
59
60
	def __set_online(self, online):
61
		if (online != self.__online):
62
			self.emit("connection-changed", online)
63
			self.__online = online
64
65
	online = property(__get_online, __set_online)
66
67
gobject.type_register(NMDevice)