updated py2deb
[theonering] / src / channel_manager.py
1 import weakref
2 import logging
3
4 import telepathy
5
6 import channel
7
8
9 _moduleLogger = logging.getLogger("channel_manager")
10
11
12 class ChannelManager(object):
13
14         def __init__(self, connection):
15                 self._connRef = weakref.ref(connection)
16                 self._listChannels = weakref.WeakValueDictionary()
17                 self._textChannels = weakref.WeakValueDictionary()
18                 self._callChannels = weakref.WeakValueDictionary()
19
20         def close(self):
21                 for chan in self._listChannels.values():
22                         chan.remove_from_connection()# so that dbus lets it die.
23                 for chan in self._textChannels.values():
24                         chan.Close()
25                 for chan in self._callChannels.values():
26                         chan.Close()
27
28         def channel_for_list(self, handle, suppress_handler=False):
29                 if handle in self._listChannels:
30                         chan = self._listChannels[handle]
31                 else:
32                         if handle.get_type() == telepathy.HANDLE_TYPE_GROUP:
33                                 chan = channel.contact_list.GroupChannel(self._connRef(), handle)
34                         elif handle.get_type() == telepathy.HANDLE_TYPE_CONTACT:
35                                 chan = channel.contact_list.creat_contact_list_channel(self._connRef(), handle)
36                         else:
37                                 _moduleLogger.warn("Unknown channel type %r" % handle.get_type())
38                         self._listChannels[handle] = chan
39                         self._connRef().add_channel(chan, handle, suppress_handler)
40                 return chan
41
42         def channel_for_text(self, handle, conversation=None, suppress_handler=False):
43                 if handle in self._textChannels:
44                         chan = self._textChannels[handle]
45                 else:
46                         _moduleLogger.debug("Requesting new text channel")
47                         contact = handle.contact
48
49                         if conversation is None:
50                                 client = self._connRef().msn_client
51                                 conversation = None
52                         chan = channel.text.TextChannel(self._connRef(), conversation)
53                         self._textChannels[handle] = chan
54                         self._connRef().add_channel(chan, handle, suppress_handler)
55                 return chan
56
57         def channel_forcall(self, handle, conversation=None, suppress_handler=False):
58                 if handle in self._callChannels:
59                         chan = self._callChannels[handle]
60                 else:
61                         _moduleLogger.debug("Requesting new call channel")
62                         contact = handle.contact
63
64                         if conversation is None:
65                                 client = self._connRef().msn_client
66                                 conversation = None
67                         chan = channel.call.CallChannel(self._connRef(), conversation)
68                         self._callChannels[handle] = chan
69                         self._connRef().add_channel(chan, handle, suppress_handler)
70                 return chan