summaryrefslogtreecommitdiff
path: root/sunshine/contacts.py
diff options
context:
space:
mode:
Diffstat (limited to 'sunshine/contacts.py')
-rw-r--r--sunshine/contacts.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/sunshine/contacts.py b/sunshine/contacts.py
new file mode 100644
index 0000000..6dd3d0a
--- /dev/null
+++ b/sunshine/contacts.py
@@ -0,0 +1,93 @@
+# telepathy-sunshine is the GaduGadu connection manager for Telepathy
+#
+# Copyright (C) 2009 Olivier Le Thanh Duong <olivier@lethanh.be>
+# Copyright (C) 2010 Krzysztof Klinikowski <kkszysiu@gmail.com>
+#
+# This program 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 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
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+import logging
+import time
+
+import telepathy
+import telepathy.errors
+import dbus
+
+__all__ = ['SunshineContacts']
+
+logger = logging.getLogger('Sunshine.Contacts')
+
+class SunshineContacts(telepathy.server.ConnectionInterfaceContacts):
+
+ attributes = {
+ telepathy.CONNECTION : 'contact-id',
+ telepathy.CONNECTION_INTERFACE_SIMPLE_PRESENCE : 'presence',
+ telepathy.CONNECTION_INTERFACE_ALIASING : 'alias',
+ telepathy.CONNECTION_INTERFACE_AVATARS : 'token',
+ telepathy.CONNECTION_INTERFACE_CAPABILITIES : 'caps'
+ }
+
+ def __init__(self):
+ telepathy.server.ConnectionInterfaceContacts.__init__(self)
+
+ dbus_interface = telepathy.CONNECTION_INTERFACE_CONTACTS
+
+ self._implement_property_get(dbus_interface, \
+ {'ContactAttributeInterfaces' : self.get_contact_attribute_interfaces})
+
+ # Overwrite the dbus attribute to get the sender argument
+ @dbus.service.method(telepathy.CONNECTION_INTERFACE_CONTACTS, in_signature='auasb',
+ out_signature='a{ua{sv}}', sender_keyword='sender')
+ def GetContactAttributes(self, handles, interfaces, hold, sender):
+ #InspectHandle already checks we're connected, the handles and handle type.
+ for interface in interfaces:
+ if interface not in self.attributes:
+ raise telepathy.errors.InvalidArgument(
+ 'Interface %s is not supported by GetContactAttributes' % (interface))
+
+ handle_type = telepathy.HANDLE_TYPE_CONTACT
+ ret = {}
+ for handle in handles:
+ ret[handle] = {}
+
+ functions = {
+ telepathy.CONNECTION :
+ lambda x: zip(x, self.InspectHandles(handle_type, x)),
+ telepathy.CONNECTION_INTERFACE_SIMPLE_PRESENCE :
+ lambda x: self.GetPresences(x).items(),
+ telepathy.CONNECTION_INTERFACE_ALIASING :
+ lambda x: self.GetAliases(x).items(),
+ telepathy.CONNECTION_INTERFACE_AVATARS :
+ lambda x: self.GetKnownAvatarTokens(x).items(),
+ telepathy.CONNECTION_INTERFACE_CAPABILITIES :
+ lambda x: self.GetCapabilities(x).items()
+ }
+
+ #Hold handles if needed
+ if hold:
+ self.HoldHandles(handle_type, handles, sender)
+
+ # Attributes from the interface org.freedesktop.Telepathy.Connection
+ # are always returned, and need not be requested explicitly.
+ interfaces = set(interfaces + [telepathy.CONNECTION])
+ for interface in interfaces:
+ interface_attribute = interface + '/' + self.attributes[interface]
+ results = functions[interface](handles)
+ for handle, value in results:
+ ret[int(handle)][interface_attribute] = value
+ return ret
+
+ def get_contact_attribute_interfaces(self):
+ return self.attributes.keys()