# HG changeset patch # User Goffi # Date 1264913823 -39600 # Node ID d35c5edab53fe534f36c3f64a8c775f7942754f4 # Parent d46f849664aaed0528746eea44468f741fefc003 SàT: multi-profile: memory & dbus bridge's methods profile management /!\ profiles not managed yet for dbus signals diff -r d46f849664aa -r d35c5edab53f frontends/sat_bridge_frontend/DBus.py --- a/frontends/sat_bridge_frontend/DBus.py Sat Jan 30 16:17:33 2010 +1100 +++ b/frontends/sat_bridge_frontend/DBus.py Sun Jan 31 15:57:03 2010 +1100 @@ -40,29 +40,69 @@ elif iface == "request": self.db_req_iface.connect_to_signal(functionName, handler) - def connect(self): - return self.db_comm_iface.connect() + def connect(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.connect(profile_key) + + def disconnect(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.disconnect(profile_key) + + def isConnected(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.isConnected(profile_key) - def disconnect(self): - return self.db_comm_iface.disconnect() + def getContacts(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.getContacts(profile_key) + + def getPresenceStatus(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.getPresenceStatus(profile_key) - def getContacts(self): - return self.db_comm_iface.getContacts() + def getWaitingSub(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.getWaitingSub(profile_key) + + def sendMessage(self, to, message, profile_key='@DEFAULT@'): + return self.db_comm_iface.sendMessage(to, message, profile_key) + + def setPresence(self, to="", show="", priority=0, statuses={}, profile_key='@DEFAULT@'): + return self.db_comm_iface.setPresence(to, show, priority, statuses, profile_key) - def getPresenceStatus(self): - return self.db_comm_iface.getPresenceStatus() + def subscription(self, type, entity, profile_key='@DEFAULT@'): + return self.db_comm_iface.subscription(type, entity, profile_key) + + def setParam(self, name, value, category, profile_key='@DEFAULT@'): + return self.db_comm_iface.setParam(name, value, category, profile_key) + + def getParamA(self, name, category, profile_key='@DEFAULT@'): + return self.db_comm_iface.getParamA(name, category, profile_key) + + def getParams(self, profile_key='@DEFAULT@'): + return self.db_comm_iface.getParams(profile_key) + + def getParamsForCategory(self, category, profile_key='@DEFAULT@'): + return self.db_comm_iface.getParamsForCategory(category, profile_key) - def getWaitingSub(self): - return self.db_comm_iface.getWaitingSub() + def getParamsCategories(self): + return self.db_comm_iface.getParamsCategories(profile_key) - def sendMessage(self, to, message): - return self.db_comm_iface.sendMessage(to, message) + def getHistory(self, from_jid, to_jid, size): + return self.db_comm_iface.getHistory(from_jid, to_jid, size) + + def addContact(self, jid, profile_key='@DEFAULT@'): + return self.db_comm_iface.addContact(jid, profile_key) + def delContact(self, jid, profile_key='@DEFAULT@'): + return self.db_comm_iface.delContact(jid, profile_key) + + def launchAction(self, type, data): + return self.db_req_iface.launchAction(type, data) + + def confirmationAnswer(self, id, accepted, data): + return self.db_req_iface.confirmationAnswer(id, accepted, data) + +#methods from plugins def sendFile(self, to, path, profile_key='@DEFAULT@'): return self.db_comm_iface.sendFile(to, path, profile_key) - def findGateways(self, target): - return self.db_comm_iface.findGateways(target) + def findGateways(self, target, profile_key='@DEFAULT@'): + return self.db_comm_iface.findGateways(target, profile_key) def getCard(self, target, profile_key='@DEFAULT@'): return self.db_comm_iface.getCard(target, profile_key) @@ -75,45 +115,6 @@ def in_band_register(self, target, profile_key='@DEFAULT@'): return self.db_comm_iface.in_band_register(target, profile_key) - - def setPresence(self, to="", show="", priority=0, statuses={}): - return self.db_comm_iface.setPresence(to, show, priority, statuses) - - def subscription(self, type, entity): - return self.db_comm_iface.subscription(type, entity) - - def setParam(self, name, value, category): - return self.db_comm_iface.setParam(name, value, category) - - def getParamA(self, name, category): - return self.db_comm_iface.getParamA(name, category) - - def getParams(self): - return self.db_comm_iface.getParams() - - def getParamsForCategory(self, category): - return self.db_comm_iface.getParamsForCategory(category) - - def getParamsCategories(self): - return self.db_comm_iface.getParamsCategories() - - def getHistory(self, from_jid, to_jid, size): - return self.db_comm_iface.getHistory(from_jid, to_jid, size) - - def addContact(self, jid): - return self.db_comm_iface.addContact(jid) - - def delContact(self, jid): - return self.db_comm_iface.delContact(jid) - - def isConnected(self): - return self.db_comm_iface.isConnected() - - def launchAction(self, type, data): - return self.db_req_iface.launchAction(type, data) - - def confirmationAnswer(self, id, accepted, data): - return self.db_req_iface.confirmationAnswer(id, accepted, data) def gatewayRegister(self, action, target, data): if data == None: diff -r d46f849664aa -r d35c5edab53f plugins/plugin_xep_0100.py --- a/plugins/plugin_xep_0100.py Sat Jan 30 16:17:33 2010 +1100 +++ b/plugins/plugin_xep_0100.py Sun Jan 31 15:57:03 2010 +1100 @@ -43,7 +43,7 @@ info("Gateways plugin initialization") self.host = host self.__gateways = {} #dict used to construct the answer to findGateways. Key = target jid - host.bridge.addMethod("findGateways", ".communication", in_sign='s', out_sign='s', method=self.findGateways) + host.bridge.addMethod("findGateways", ".communication", in_sign='ss', out_sign='s', method=self.findGateways) host.bridge.addMethod("gatewayRegister", ".request", in_sign='ssa(ss)', out_sign='s', method=self.gatewayRegister) def __inc_handled_items(self, request_id): @@ -109,6 +109,7 @@ """ client = self.host.getClient(profile_key) assert(client) + print "target ===>", target to_jid = jid.JID(target) debug ("find gateways (target = %s)" % to_jid.full()) request_id = self.host.get_next_id() diff -r d46f849664aa -r d35c5edab53f sat.tac --- a/sat.tac Sat Jan 30 16:17:33 2010 +1100 +++ b/sat.tac Sun Jan 31 15:57:03 2010 +1100 @@ -81,7 +81,7 @@ print "SatXMPPClient" client.XMPPClient._authd(self, xmlstream) self.__connected=True - print "********** CONNECTED **********" + print "********** [%s] CONNECTED **********" % self.profile self.streamInitialized() self.host_app.bridge.connected() #we send the signal to the clients @@ -107,7 +107,7 @@ def connectionLost(self, connector, unused_reason): self.__connected=False - print "********** DISCONNECTED **********" + print "********** [%s] DISCONNECTED **********" % self.profile try: self.keep_alife.stop() except AttributeError: @@ -164,14 +164,14 @@ if item.name: item_attr['name'] = item.name info ("new contact in roster list: %s", item.jid.full()) - self.host.memory.addContact(item.jid, item_attr, item.groups) + self.host.memory.addContact(item.jid, item_attr, item.groups, self.parent.profile) self.host.bridge.newContact(item.jid.full(), item_attr, item.groups) def onRosterRemove(self, entity): """Called when a roster removal event is received""" #TODO: send a signal to frontends print "removing %s from roster list" % entity.full() - self.host.memory.delContact(entity) + self.host.memory.delContact(entity, self.parent.profile) class SatPresenceProtocol(xmppim.PresenceClientProtocol): @@ -187,7 +187,7 @@ del statuses[None] self.host.memory.addPresenceStatus(entity, show or "", - int(priority), statuses) + int(priority), statuses, self.parent.profile) #now it's time to notify frontends self.host.bridge.presenceUpdate(entity.full(), show or "", @@ -197,7 +197,7 @@ if statuses and statuses.has_key(None): #we only want string keys statuses["default"] = statuses[None] del statuses[None] - self.host.memory.addPresenceStatus(entity, "unavailable", 0, statuses) + self.host.memory.addPresenceStatus(entity, "unavailable", 0, statuses, self.parent.profile) #now it's time to notify frontends self.host.bridge.presenceUpdate(entity.full(), "unavailable", 0, statuses) @@ -211,22 +211,22 @@ def subscribedReceived(self, entity): debug ("subscription approved for [%s]" % entity.userhost()) - self.host.memory.delWaitingSub(entity.userhost()) + self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile) self.host.bridge.subscribe('subscribed', entity.userhost()) def unsubscribedReceived(self, entity): debug ("unsubscription confirmed for [%s]" % entity.userhost()) - self.host.memory.delWaitingSub(entity.userhost()) + self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile) self.host.bridge.subscribe('unsubscribed', entity.userhost()) def subscribeReceived(self, entity): debug ("subscription request for [%s]" % entity.userhost()) - self.host.memory.addWaitingSub('subscribe', entity.userhost()) + self.host.memory.addWaitingSub('subscribe', entity.userhost(), self.parent.profile) self.host.bridge.subscribe('subscribe', entity.userhost()) def unsubscribeReceived(self, entity): debug ("unsubscription asked for [%s]" % entity.userhost()) - self.host.memory.addWaitingSub('unsubscribe', entity.userhost()) + self.host.memory.addWaitingSub('unsubscribe', entity.userhost(), self.parent.profile) self.host.bridge.subscribe('unsubscribe', entity.userhost()) class SatDiscoProtocol(disco.DiscoClientProtocol): diff -r d46f849664aa -r d35c5edab53f sat_bridge/DBus.py --- a/sat_bridge/DBus.py Sat Jan 30 16:17:33 2010 +1100 +++ b/sat_bridge/DBus.py Sun Jan 31 15:57:03 2010 +1100 @@ -124,76 +124,76 @@ return self.cb["registerNewAccount"](login, password, host, port) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='', out_signature='') - def connect(self): + in_signature='s', out_signature='') + def connect(self, profile_key='@DEFAULT@'): info ("Connection asked") return self.cb["connect"]() @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='', out_signature='') - def disconnect(self): + in_signature='s', out_signature='') + def disconnect(self, profile_key='@DEFAULT@'): info ("Disconnection asked") - return self.cb["disconnect"]() + return self.cb["disconnect"](profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, in_signature='', out_signature='b') - def isConnected(self): + def isConnected(self, profile_key='@DEFAULT@'): info ("Connection status asked") - return self.cb["isConnected"]() + return self.cb["isConnected"](profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='', out_signature='a(sa{ss}as)') - def getContacts(self): + in_signature='s', out_signature='a(sa{ss}as)') + def getContacts(self, profile_key='@DEFAULT@'): debug("getContacts...") - return self.cb["getContacts"]() - - @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='', out_signature='a{sa{s(sia{ss})}}') - def getPresenceStatus(self): - debug("getPresenceStatus...") - return self.cb["getPresenceStatus"]() + return self.cb["getContacts"](profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='', out_signature='a{ss}') - def getWaitingSub(self): - debug("getWaitingSub...") - return self.cb["getWaitingSub"]() + in_signature='s', out_signature='a{sa{s(sia{ss})}}') + def getPresenceStatus(self, profile_key='@DEFAULT@'): + debug("getPresenceStatus...") + return self.cb["getPresenceStatus"](profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='ss', out_signature='') - def sendMessage(self, to, message): - debug("sendMessage...") - self.cb["sendMessage"](to, message) - - @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='ssia{ss}', out_signature='') - def setPresence(self, to="", show="", priority=0, statuses={}): - self.cb["setPresence"](to, show, priority, statuses) - - @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='ss', out_signature='') - def subscription(self, type, entity): - self.cb["subscription"](type, entity) + in_signature='s', out_signature='a{ss}') + def getWaitingSub(self, profile_key='@DEFAULT@'): + debug("getWaitingSub...") + return self.cb["getWaitingSub"](profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, in_signature='sss', out_signature='') - def setParam(self, name, value, category): - self.cb["setParam"](str(name), str(value), str(category)) + def sendMessage(self, to, message, profile_key='@DEFAULT@'): + debug("sendMessage...") + self.cb["sendMessage"](to, message, profile_key) + + @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, + in_signature='ssia{ss}s', out_signature='') + def setPresence(self, to="", show="", priority=0, statuses={}, profile_key='@DEFAULT@'): + self.cb["setPresence"](to, show, priority, statuses, profile_key) + + @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, + in_signature='sss', out_signature='') + def subscription(self, type, entity, profile_key='@DEFAULT@'): + self.cb["subscription"](type, entity, profile_key) + + @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, + in_signature='ssss', out_signature='') + def setParam(self, name, value, category, profile_key='@DEFAULT@'): + self.cb["setParam"](str(name), str(value), str(category), profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='ss', out_signature='s') - def getParamA(self, name, category="default"): - return self.cb["getParamA"](name, category) - - @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='', out_signature='s') - def getParams(self): - return self.cb["getParams"]() + in_signature='sss', out_signature='s') + def getParamA(self, name, category="default", profile_key='@DEFAULT@'): + return self.cb["getParamA"](name, category, profile_key = profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, in_signature='s', out_signature='s') - def getParamsForCategory(self, category): - return self.cb["getParamsForCategory"](category) + def getParams(self, profile_key='@DEFAULT@'): + return self.cb["getParams"](profile_key) + + @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, + in_signature='ss', out_signature='s') + def getParamsForCategory(self, category, profile_key='@DEFAULT@'): + return self.cb["getParamsForCategory"](category, profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, in_signature='', out_signature='as') @@ -207,16 +207,16 @@ return self.cb["getHistory"](from_jid, to_jid, size) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='s', out_signature='') - def addContact(self, entity): - debug("Subscription asked for %s", entity) - return self.cb["addContact"](entity) + in_signature='ss', out_signature='') + def addContact(self, entity, profile_key='@DEFAULT@'): + debug("Subscription asked for %s (profile %s)", entity, profile_key) + return self.cb["addContact"](entity, profile_key) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, - in_signature='s', out_signature='') - def delContact(self, entity): - debug("Unsubscription asked for %s", entity) - return self.cb["delContact"](entity) + in_signature='ss', out_signature='') + def delContact(self, entity, profile_key='@DEFAULT@'): + debug("Unsubscription asked for %s (profile %s)", entity, profile_key) + return self.cb["delContact"](entity, profile_key) @dbus.service.method(const_INT_PREFIX+const_REQ_SUFFIX, in_signature='sa{ss}', out_signature='s') diff -r d46f849664aa -r d35c5edab53f tools/memory.py --- a/tools/memory.py Sat Jan 30 16:17:33 2010 +1100 +++ b/tools/memory.py Sun Jan 31 15:57:03 2010 +1100 @@ -36,7 +36,7 @@ SAVEFILE_PRIVATE="/private" #file used to store misc values (mainly for plugins) class Param(): - """This class manage parameter with xml""" + """This class manage parameters with xml""" ### TODO: add desciption in params #TODO: mettre Watched dans un plugin @@ -505,53 +505,99 @@ return None - def addContact(self, contact_jid, attributes, groups): + def addContact(self, contact_jid, attributes, groups, profile_key='@DEFAULT@'): debug("Memory addContact: %s",contact_jid.userhost()) + profile = self.getProfileName(profile_key) + if not profile: + error ('Trying to add a contact to a non-existant profile') + return assert(isinstance(attributes,dict)) assert(isinstance(groups,set)) - self.contacts[contact_jid.userhost()]=[attributes, groups] + if not self.contacts.has_key(profile): + self.contacts[profile] = {} + self.contacts[profile][contact_jid.userhost()]=[attributes, groups] - def delContact(self, contact_jid): + def delContact(self, contact_jid, profile_key='@DEFAULT@'): debug("Memory delContact: %s",contact_jid.userhost()) - if self.contacts.has_key(contact_jid.userhost()): - del self.contacts[contact_jid.userhost()] + profile = self.getProfileName(profile_key) + if not profile: + error ('Trying to delete a contact for a non-existant profile') + return + if self.contacts.has_key(profile) and self.contacts[profile].has_key(contact_jid.userhost()): + del self.contacts[profile][contact_jid.userhost()] - def getContact(self, contact_jid): - if self.contacts.has_key(contact_jid.userhost()): - self.contacts[contact_jid.userhost()] + def getContact(self, contact_jid, profile_key='@DEFAULT@'): + profile = self.getProfileName(profile_key) + if not profile: + error('Asking a contact for a non-existant profile') + return None + if self.contacts.has_key(profile) and self.contacts[profile].has_key(contact_jid.userhost()): + self.contacts[profile][contact_jid.userhost()] else: return None - def getContacts(self): + def getContacts(self, profile_key='@DEFAULT@'): + """Return list of contacts for given profile + @param profile_key: profile key + @return list of [contact, attr, groups]""" debug ("Memory getContact OK (%s)", self.contacts) + profile = self.getProfileName(profile_key) + if not profile: + error('Asking contacts for a non-existant profile') + return [] ret=[] - for contact in self.contacts: - attr, groups = self.contacts[contact] + for contact in self.contacts[profile]: + attr, groups = self.contacts[profile][contact] ret.append([contact, attr, groups ]) return ret - def addPresenceStatus(self, contact_jid, show, priority, statuses): - if not self.presenceStatus.has_key(contact_jid.userhost()): - self.presenceStatus[contact_jid.userhost()] = {} + def addPresenceStatus(self, contact_jid, show, priority, statuses, profile_key='@DEFAULT@'): + profile = self.getProfileName(profile_key) + if not profile: + error('Trying to add presence status to a non-existant profile') + return + if not self.presenceStatus.has_key(profile): + self.presenceStatus[profile] = {} + if not self.presenceStatus[profile].has_key(contact_jid.userhost()): + self.presenceStatus[profile][contact_jid.userhost()] = {} resource = jid.parse(contact_jid.full())[2] or '' - self.presenceStatus[contact_jid.userhost()][resource] = (show, priority, statuses) + self.presenceStatus[profile][contact_jid.userhost()][resource] = (show, priority, statuses) - def addWaitingSub(self, type, contact_jid): + def addWaitingSub(self, type, contact_jid, profile_key): """Called when a subcription request is received""" - self.subscriptions[contact_jid] = type + profile = self.getProfileName(profile_key) + assert(profile) + if not self.subscriptions.has_key(profile): + self.subscriptions[profile] = {} + self.subscriptions[profile][contact_jid] = type - def delWaitingSub(self, contact_jid): + def delWaitingSub(self, contact_jid, profile_key): """Called when a subcription request is finished""" - if self.subscriptions.has_key(contact_jid): - del self.subscriptions[contact_jid] + profile = self.getProfileName(profile_key) + assert(profile) + if self.subscriptions.has_key(profile) and self.subscriptions[profile].has_key(contact_jid): + del self.subscriptions[profile][contact_jid] - def getWaitingSub(self): + def getWaitingSub(self, profile_key='@DEFAULT@'): """Called to get a list of currently waiting subscription requests""" - return self.subscriptions + profile = self.getProfileName(profile_key) + if not profile: + error('Asking waiting subscriptions for a non-existant profile') + return {} + if not self.subscriptions.has_key(profile): + return {} + + return self.subscriptions[profile] - def getPresenceStatus(self): - debug ("Memory getPresenceStatus (%s)", self.presenceStatus) - return self.presenceStatus + def getPresenceStatus(self, profile_key='@DEFAULT@'): + profile = self.getProfileName(profile_key) + if not profile: + error('Asking contacts for a non-existant profile') + return {} + if not self.presenceStatus.has_key(profile): + self.presenceStatus[profile] = {} + debug ("Memory getPresenceStatus (%s)", self.presenceStatus[profile]) + return self.presenceStatus[profile] def getParamA(self, name, category, attr="value", profile_key="@DEFAULT@"): return self.params.getParamA(name, category, attr, profile_key)