+ @property
+ def session(self):
+ """
+ @abstract
+ """
+ raise NotImplementedError()
+
+ def Disconnect(self):
+ """
+ @abstract
+ """
+ raise NotImplementedError("Abstract function called")
+
+ def handle(self, handleType, handleId):
+ """
+ @abstract
+ """
+ raise NotImplementedError("Abstract function called")
+
+ def get_presences(self, contactIds):
+ """
+ @return {ContactHandle: (Status, Presence Type, Message)}
+ """
+ presences = {}
+ for handleId in contactIds:
+ h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
+ if isinstance(h, handle.ConnectionHandle):
+ isDnd = self.session.backend.is_dnd()
+ if isDnd:
+ presence = TheOneRingPresence.HIDDEN
+ else:
+ state = self.session.stateMachine.get_state()
+ if state == state_machine.StateMachine.STATE_ACTIVE:
+ presence = TheOneRingPresence.ONLINE
+ elif state == state_machine.StateMachine.STATE_IDLE:
+ presence = TheOneRingPresence.AWAY
+ else:
+ raise telepathy.errors.InvalidArgument("Unsupported state on the state machine: %s" % state)
+ presenceType = TheOneRingPresence.TO_PRESENCE_TYPE[presence]
+ else:
+ presence = TheOneRingPresence.ONLINE
+ presenceType = TheOneRingPresence.TO_PRESENCE_TYPE[presence]
+
+ presences[h] = (presenceType, presence)
+ return presences
+
+ def set_presence(self, status):
+ if status == self.ONLINE:
+ self.session.backend.set_dnd(False)
+ self.session.stateMachine.set_state(state_machine.StateMachine.STATE_ACTIVE)
+ elif status == self.AWAY:
+ self.session.stateMachine.set_state(state_machine.StateMachine.STATE_IDLE)
+ elif status == self.HIDDEN:
+ self.session.backend.set_dnd(True)
+ elif status == self.OFFLINE:
+ self.Disconnect()
+ else:
+ raise telepathy.errors.InvalidArgument("Unsupported status: %r" % status)
+ _moduleLogger.info("Setting Presence to '%s'" % status)
+