#!/usr/bin/env python

import dbus
import dbus.service
import dbus.glib
import gobject

class TestObject(dbus.service.Object):
	def __init__(self, bus_name, object_path=''):
		dbus.service.Object.__init__(self, bus_name, object_path)
	
	@dbus.service.signal('org.kde.kdbus.test', 's')
	def mySignal(self, output):
		pass
	
	@dbus.service.method('org.kde.kdbus.test', 's', 's')
	def myMethod(self, input):
		return "You sent '" + input + "'"
	

class ExoticObject(dbus.service.Object):
	def __init__(self, bus_name, object_path='/'):
		dbus.service.Object.__init__(self, bus_name, object_path)
		self.myFoo = 0
		
	@dbus.service.method('org.kde.kdbus.test', '(si(a{su}))', 'as')
	def mySignal(self, bigStruct):
		return ("str1", "str2")
	
	@dbus.service.method('org.kde.kdbus.test', 'i')
	def addToMyFoo(self, amount):
		self.myFoo = self.myFoo + amount
	
	@dbus.service.method('org.kde.kdbus.test', '', 'i')
	def getMyFoo(self):
		return self.myFoo
	
	@dbus.service.method('org.kde.kdbus.test', '', 'b')
	def myFooIsPositive(self):
		if self.myFoo > 0:
			return True
		else:
			return False


class BrokenObject(dbus.service.Object):
	def __init__(self, bus_name, object_path='/'):
		dbus.service.Object.__init__(self, bus_name, object_path)
	
	@dbus.service.method('org.kde.kdbus.test.brokenStructIface1', '(i')
	def brokenMethod1(self, amount):
		pass
	
	@dbus.service.method('org.kde.kdbus.test.brokenDictIface1', 'a{ius}')
	def brokenMethod2(self, amount):
		pass
	
	@dbus.service.method('org.kde.kdbus.test.brokenDictIface2', 'a{i}')
	def brokenMethod3(self, amount):
		pass
	
	@dbus.service.method('org.kde.kdbus.test.brokenDictIface3', 'a{i')
	def brokenMethod4(self, amount):
		pass
	
	@dbus.service.method('org.kde.kdbus.test.brokenDictIface4', 'a{()}')
	def brokenMethod5(self, amount):
		pass
	
	@dbus.service.method('org.kde.kdbus.test.notBrokenIface', '(ii)')
	def notBrokenMethod(self, ints):
		pass
	


class AnnotatedObject(dbus.service.Object):
	def __init__(self, bus_name, object_path='/'):
		dbus.service.Object.__init__(self, bus_name, object_path)	
		
	@dbus.service.method('org.kde.kdbus.test.annotatedIface')
	def doNothing(self):
		pass
	
	@dbus.service.method('org.kde.kdbus.test.anotherAnnotatedIface')
	def doSomethingButNotTellingWhat(self):
		pass
		
	# python dbus bindings don't directly support annotation yet, so we override the introspect method
	# and add some annotations manually.
	@dbus.service.method('org.freedesktop.DBus.Introspectable', in_signature='', out_signature='s')
	def Introspect(self):
		reflection_data = '<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">\n'
		reflection_data += '<node name="%s">\n' % (self._object_path)

		interfaces = self._dbus_class_table[self.__class__.__module__ + '.' + self.__class__.__name__]
		i = 0
		for (name, funcs) in interfaces.iteritems():
			reflection_data += '  <interface name="%s">\n' % (name)
			reflection_data += '    <annotation name="org.kde.kdbus.test.ifaceNum" value="%d"/>\n' % (i)

			for func in funcs.values():
				if getattr(func, '_dbus_is_method', False):
					reflection_data += self.__class__._reflect_on_method(func)
				elif getattr(func, '_dbus_is_signal', False):
					reflection_data += self.__class__._reflect_on_signal(func)

			reflection_data += '  </interface>\n'
			i += 1

		reflection_data += '</node>\n'

		return reflection_data


session_bus = dbus.SessionBus()
name = dbus.service.BusName('org.kde.kdbus.test', bus=session_bus)
fooObj = TestObject(name, '/foo/bar')
exObj = ExoticObject(name,'/foo/baz')
bObj = BrokenObject(name,'/foo/broken')
aObj = AnnotatedObject(name,'/really/deep/path/annotated')


loop = gobject.MainLoop()
loop.run()

