Skip to content
Snippets Groups Projects
dbus_support.py 4.25 KiB
Newer Older
roidelapluie's avatar
roidelapluie committed
# -*- coding:utf-8 -*-
roidelapluie's avatar
roidelapluie committed
## src/common/dbus_support.py
roidelapluie's avatar
roidelapluie committed
## Copyright (C) 2005 Andrew Sayman <lorien420 AT myrealbox.com>
##                    Dimitur Kirov <dkirov AT gmail.com>
## Copyright (C) 2005-2006 Nikos Kouremenos <kourem AT gmail.com>
## Copyright (C) 2005-2007 Yann Leboulanger <asterix AT lagaule.org>
## Copyright (C) 2006 Jean-Marie Traissard <jim AT lapin.org>
##                    Stefan Bethge <stefan AT lanpartei.de>
## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org>
## This file is part of Gajim.
##
## Gajim is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 3 only.
## Gajim is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
roidelapluie's avatar
roidelapluie committed
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
roidelapluie's avatar
roidelapluie committed
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
nkour's avatar
nkour committed
from common import gajim
_GAJIM_ERROR_IFACE = 'org.gajim.dbus.Error'

	if sys.platform == 'darwin':
js's avatar
js committed
		try:
			import osx.dbus
			osx.dbus.load(True)
js's avatar
js committed
		except ImportError:
js's avatar
js committed
			pass
	# test if dbus-x11 is installed
	bus = dbus.SessionBus()
	supported = True # does user have D-Bus bindings?
	if not os.name == 'nt': # only say that to non Windows users
		print _('D-Bus python bindings are missing in this computer')
		print _('D-Bus capabilities of Gajim cannot be used')

class SystemBus:
	'''A Singleton for the DBus SystemBus'''
	def __init__(self):
		self.system_bus = None
	def SystemBus(self):
		if not supported:
			raise exceptions.DbusNotSupported

		if not self.present():
				raise exceptions.SystemBusNotPresent
		return self.system_bus

	def bus(self):
		return self.SystemBus()

	def present(self):
		if not supported:
			return False
		if self.system_bus is None:
			try:
				self.system_bus = dbus.SystemBus()
				self.system_bus = None
				return False
			if self.system_bus is None:
				return False
			# Don't exit Gajim when dbus is stopped
			self.system_bus.set_exit_on_disconnect(False)
nkour's avatar
nkour committed
	'''A Singleton for the D-Bus SessionBus'''
	def __init__(self):
		self.session_bus = None
	def SessionBus(self):
		if not supported:
			raise exceptions.DbusNotSupported

		if not self.present():
				raise exceptions.SessionBusNotPresent
		return self.session_bus

	def bus(self):
		return self.SessionBus()

	def present(self):
		if not supported:
			return False
		if self.session_bus is None:
			try:
				self.session_bus = dbus.SessionBus()
				self.session_bus = None
				return False
			if self.session_bus is None:
				return False
		return True

session_bus = SessionBus()

def get_interface(interface, path):
	'''Returns an interface on the current SessionBus. If the interface isn\'t
	running, it tries to start it first.'''
	if not supported:
		return None
	if session_bus.present():
		bus = session_bus.SessionBus()
	else:
		return None
	try:
		obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
		dbus_iface = dbus.Interface(obj, 'org.freedesktop.DBus')
		running_services = dbus_iface.ListNames()
		started = True
		if interface not in running_services:
			# try to start the service
			if dbus_iface.StartServiceByName(interface, dbus.UInt32(0)) == 1:
				started = True
			else:
				started = False
		if not started:
			return None
		obj = bus.get_object(interface, path)
		return dbus.Interface(obj, interface)
	except Exception, e:
		gajim.log.debug(str(e))
		return None


def get_notifications_interface():
	'''Returns the notifications interface.'''
	return get_interface('org.freedesktop.Notifications',
		'/org/freedesktop/Notifications')

if supported:
	class MissingArgument(dbus.DBusException):
		_dbus_error_name = _GAJIM_ERROR_IFACE + '.MissingArgument'
	class InvalidArgument(dbus.DBusException):
		'''Raised when one of the provided arguments is invalid.'''
		_dbus_error_name = _GAJIM_ERROR_IFACE + '.InvalidArgument'
roidelapluie's avatar
roidelapluie committed
# vim: se ts=3: