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