Applying some great performance improvements, login is now 2X faster
[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, 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                         chan = channel.text.TextChannel(self._connRef())
50                         self._textChannels[handle] = chan
51                         self._connRef().add_channel(chan, handle, suppress_handler)
52                 return chan
53
54         def channel_for_call(self, handle, suppress_handler=False):
55                 if handle in self._callChannels:
56                         chan = self._callChannels[handle]
57                 else:
58                         _moduleLogger.debug("Requesting new call channel")
59                         contact = handle.contact
60
61                         chan = channel.call.CallChannel(self._connRef())
62                         self._callChannels[handle] = chan
63                         self._connRef().add_channel(chan, handle, suppress_handler)
64                 return chan