import telepathy
+import tp
import util.coroutines as coroutines
import gtk_toolbox
_moduleLogger = logging.getLogger("channel.text")
-class TextChannel(telepathy.server.ChannelTypeText):
+class TextChannel(tp.ChannelTypeText):
"""
- Look into implementing ChannelInterfaceMessages for rich text formatting
+ @todo Look into implementing ChannelInterfaceMessages for rich text formatting
+
+ @bug Stopped working on Maemo 4.1
"""
def __init__(self, connection, manager, props, contactHandle):
self.__manager = manager
self.__props = props
- try:
- # HACK Older python-telepathy way
- telepathy.server.ChannelTypeText.__init__(self, connection, contactHandle)
- self._requested = props[telepathy.interfaces.CHANNEL_INTERFACE + '.Requested']
- self._implement_property_get(
- telepathy.interfaces.CHANNEL_INTERFACE,
- {"Requested": lambda: self._requested}
- )
- except TypeError:
- # HACK Newer python-telepathy way
- telepathy.server.ChannelTypeText.__init__(self, connection, manager, props)
+ tp.ChannelTypeText.__init__(self, connection, manager, props)
self.__nextRecievedId = 0
self.__lastMessageTimestamp = datetime.datetime(1, 1, 1)
self.__otherHandle = contactHandle
- # HACK Older python-telepathy doesn't provide this
- self._immutable_properties = {
- 'ChannelType': telepathy.server.interfaces.CHANNEL_INTERFACE,
- 'TargetHandle': telepathy.server.interfaces.CHANNEL_INTERFACE,
- 'Interfaces': telepathy.server.interfaces.CHANNEL_INTERFACE,
- 'TargetHandleType': telepathy.server.interfaces.CHANNEL_INTERFACE,
- 'TargetID': telepathy.server.interfaces.CHANNEL_INTERFACE,
- 'Requested': telepathy.server.interfaces.CHANNEL_INTERFACE
- }
-
self.__callback = coroutines.func_sink(
coroutines.expand_positional(
self._on_conversations_updated
try:
mergedConversations = self._conn.session.voicemails.get_conversation(self._contactKey)
except KeyError:
- _moduleLogger.debug("Nothing in the conversation yet for %r" % (self._contactKey, ))
+ _moduleLogger.debug("No voicemails in the conversation yet for %r" % (self._contactKey, ))
else:
self._report_conversation(mergedConversations)
try:
mergedConversations = self._conn.session.texts.get_conversation(self._contactKey)
except KeyError:
- _moduleLogger.debug("Nothing in the conversation yet for %r" % (self._contactKey, ))
+ _moduleLogger.debug("No texts conversation yet for %r" % (self._contactKey, ))
else:
self._report_conversation(mergedConversations)
- def get_props(self):
- # HACK Older python-telepathy doesn't provide this
- props = dict()
- for prop, iface in self._immutable_properties.items():
- props[iface + '.' + prop] = \
- self._prop_getters[iface][prop]()
- return props
-
@gtk_toolbox.log_exception(_moduleLogger)
def Send(self, messageType, text):
if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
+ _moduleLogger.info("Sending message to %r" % (self.__otherHandle, ))
self._conn.session.backend.send_sms(self.__otherHandle.phoneNumber, text)
self._conn.session.textsStateMachine.reset_timers()
self.close()
def close(self):
+ _moduleLogger.debug("Closing text")
self._conn.session.voicemails.updateSignalHandler.unregister_sink(
self.__callback
)
)
self.__callback = None
- telepathy.server.ChannelTypeText.Close(self)
- if self.__manager.channel_exists(self.__props):
- # HACK Older python-telepathy requires doing this manually
- self.__manager.remove_channel(self)
+ tp.ChannelTypeText.Close(self)
self.remove_from_connection()
@property
def _contactKey(self):
- contactKey = self.__otherHandle.contactID, self.__otherHandle.phoneNumber
+ contactKey = self.__otherHandle.phoneNumber
return contactKey
@gtk_toolbox.log_exception(_moduleLogger)
self._report_conversation(mergedConversations)
def _report_conversation(self, mergedConversations):
+ # Can't filter out messages in a texting conversation that came in
+ # before the last one sent because that creates a race condition of two
+ # people sending at about the same time, which happens quite a bit
newConversations = mergedConversations.conversations
+ if not newConversations:
+ _moduleLogger.debug(
+ "No messages ended up existing for %r" % (self._contactKey, )
+ )
+ return
newConversations = self._filter_out_reported(newConversations)
newConversations = self._filter_out_read(newConversations)
newConversations = list(newConversations)
for newMessage in messages:
formattedMessage = self._format_message(newMessage)
self._report_new_message(formattedMessage)
+ for conv in newConversations:
+ conv.isRead = True
def _filter_out_reported(self, conversations):
return (
if self.__lastMessageTimestamp < conversation.time
)
- def _filter_out_read(self, conversations):
+ @staticmethod
+ def _filter_out_read(conversations):
return (
conversation
for conversation in conversations