changeset 372:f964dcec1611

core: plugins refactored according to bridge + updatedValue now use profile
author Goffi <goffi@goffi.org>
date Wed, 06 Jul 2011 01:06:18 +0200 (2011-07-05)
parents 3ea41a199b36
children a3aa4d046914
files frontends/src/bridge/DBus.py frontends/src/quick_frontend/quick_app.py src/plugins/plugin_misc_groupblog.py src/plugins/plugin_misc_quiz.py src/plugins/plugin_misc_tarot.py src/plugins/plugin_misc_xmllog.py src/plugins/plugin_xep_0045.py src/plugins/plugin_xep_0054.py src/plugins/plugin_xep_0060.py src/plugins/plugin_xep_0077.py src/plugins/plugin_xep_0096.py src/plugins/plugin_xep_0100.py src/plugins/plugin_xep_0163.py src/plugins/plugin_xep_0249.py src/plugins/plugin_xep_0277.py
diffstat 15 files changed, 164 insertions(+), 155 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/bridge/DBus.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/frontends/src/bridge/DBus.py	Wed Jul 06 01:06:18 2011 +0200
@@ -21,12 +21,12 @@
 
 from bridge_frontend import BridgeFrontend
 import dbus, dbus.glib
-from logging import debug
+from logging import debug, error
 
 const_INT_PREFIX = "org.goffi.SAT"  #Interface prefix
 const_OBJ_PATH = '/org/goffi/SAT/bridge'
-const_COMM_SUFFIX = ".communication"
-const_REQ_SUFFIX = ".request"
+const_CORE_SUFFIX = ".core"
+const_PLUGIN_SUFFIX = ".plugin"
 
 class BridgeExceptionNoService(Exception):
     pass
@@ -37,194 +37,196 @@
             self.sessions_bus = dbus.SessionBus()
             self.db_object = self.sessions_bus.get_object(const_INT_PREFIX,
                                 const_OBJ_PATH)
-            self.db_comm_iface = dbus.Interface(self.db_object,
-                                dbus_interface=const_INT_PREFIX + const_COMM_SUFFIX)
-            self.db_req_iface = dbus.Interface(self.db_object,
-                                dbus_interface=const_INT_PREFIX + const_REQ_SUFFIX)
+            self.db_core_iface = dbus.Interface(self.db_object,
+                                dbus_interface=const_INT_PREFIX + const_CORE_SUFFIX)
+            self.db_plugin_iface = dbus.Interface(self.db_object,
+                                dbus_interface=const_INT_PREFIX + const_PLUGIN_SUFFIX)
         except dbus.exceptions.DBusException,e:
             if e._dbus_error_name=='org.freedesktop.DBus.Error.ServiceUnknown':
                 raise BridgeExceptionNoService
             else:
                 raise e
-        #props = self.db_comm_iface.getProperties()
+        #props = self.db_core_iface.getProperties()
 
-    def register(self, functionName, handler, iface="communication"):
-        if iface == "communication":
-            self.db_comm_iface.connect_to_signal(functionName, handler)
-        elif iface == "request":
-            self.db_req_iface.connect_to_signal(functionName, handler)
+    def register(self, functionName, handler, iface="core"):
+        if iface == "core":
+            self.db_core_iface.connect_to_signal(functionName, handler)
+        elif iface == "plugin":
+            self.db_plugin_iface.connect_to_signal(functionName, handler)
+        else:
+            error(_('Unknown interface'))
 
     def addContact(self, entity, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.addContact(entity, profile_key)
+        return self.db_core_iface.addContact(entity, profile_key)
 
     def asyncConnect(self, profile_key="@DEFAULT@", callback=None, errback=None):
-        return self.db_comm_iface.asyncConnect(profile_key, reply_handler=callback, error_handler=errback)
+        return self.db_core_iface.asyncConnect(profile_key, reply_handler=callback, error_handler=errback)
 
     def callMenu(self, category, name, menu_type, profile_key):
-        return unicode(self.db_req_iface.callMenu(category, name, menu_type, profile_key))
+        return unicode(self.db_core_iface.callMenu(category, name, menu_type, profile_key))
 
     def confirmationAnswer(self, id, accepted, data):
-        return self.db_req_iface.confirmationAnswer(id, accepted, data)
+        return self.db_core_iface.confirmationAnswer(id, accepted, data)
 
     def connect(self, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.connect(profile_key)
+        return self.db_core_iface.connect(profile_key)
 
     def createProfile(self, profile):
-        return self.db_req_iface.createProfile(profile)
+        return self.db_core_iface.createProfile(profile)
 
     def delContact(self, entity, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.delContact(entity, profile_key)
+        return self.db_core_iface.delContact(entity, profile_key)
 
     def deleteProfile(self, profile):
-        return self.db_req_iface.deleteProfile(profile)
+        return self.db_core_iface.deleteProfile(profile)
 
     def disconnect(self, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.disconnect(profile_key)
+        return self.db_core_iface.disconnect(profile_key)
 
     def getConfig(self, section, name):
-        return unicode(self.db_comm_iface.getConfig(section, name))
+        return unicode(self.db_core_iface.getConfig(section, name))
 
     def getContacts(self, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.getContacts(profile_key)
+        return self.db_core_iface.getContacts(profile_key)
 
     def getHistory(self, from_jid, to_jid, size):
-        return self.db_comm_iface.getHistory(from_jid, to_jid, size)
+        return self.db_core_iface.getHistory(from_jid, to_jid, size)
 
     def getMenuHelp(self, category, name, menu_type):
-        return unicode(self.db_req_iface.getMenuHelp(category, name, menu_type))
+        return unicode(self.db_core_iface.getMenuHelp(category, name, menu_type))
 
     def getMenus(self, ):
-        return self.db_req_iface.getMenus()
+        return self.db_core_iface.getMenus()
 
     def getParamA(self, name, category, attribute="value", profile_key="@DEFAULT@"):
-        return unicode(self.db_comm_iface.getParamA(name, category, attribute, profile_key))
+        return unicode(self.db_core_iface.getParamA(name, category, attribute, profile_key))
 
     def getParams(self, profile_key="@DEFAULT@"):
-        return unicode(self.db_comm_iface.getParams(profile_key))
+        return unicode(self.db_core_iface.getParams(profile_key))
 
     def getParamsCategories(self, ):
-        return self.db_comm_iface.getParamsCategories()
+        return self.db_core_iface.getParamsCategories()
 
     def getParamsForCategory(self, category, profile_key="@DEFAULT@"):
-        return unicode(self.db_comm_iface.getParamsForCategory(category, profile_key))
+        return unicode(self.db_core_iface.getParamsForCategory(category, profile_key))
 
     def getParamsUI(self, profile_key="@DEFAULT@"):
-        return unicode(self.db_comm_iface.getParamsUI(profile_key))
+        return unicode(self.db_core_iface.getParamsUI(profile_key))
 
     def getPresenceStatus(self, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.getPresenceStatus(profile_key)
+        return self.db_core_iface.getPresenceStatus(profile_key)
 
     def getProfileName(self, profile_key="@DEFAULT@"):
-        return unicode(self.db_req_iface.getProfileName(profile_key))
+        return unicode(self.db_core_iface.getProfileName(profile_key))
 
     def getProfilesList(self, ):
-        return self.db_req_iface.getProfilesList()
+        return self.db_core_iface.getProfilesList()
 
     def getProgress(self, id):
-        return self.db_req_iface.getProgress(id)
+        return self.db_core_iface.getProgress(id)
 
     def getVersion(self, ):
-        return unicode(self.db_req_iface.getVersion())
+        return unicode(self.db_core_iface.getVersion())
 
     def getWaitingSub(self, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.getWaitingSub(profile_key)
+        return self.db_core_iface.getWaitingSub(profile_key)
 
     def isConnected(self, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.isConnected(profile_key)
+        return self.db_core_iface.isConnected(profile_key)
 
     def launchAction(self, action_type, data, profile_key="@DEFAULT@"):
-        return unicode(self.db_req_iface.launchAction(action_type, data, profile_key))
+        return unicode(self.db_core_iface.launchAction(action_type, data, profile_key))
 
     def registerNewAccount(self, login, password, email, host, port=5222):
-        return unicode(self.db_comm_iface.registerNewAccount(login, password, email, host, port))
+        return unicode(self.db_core_iface.registerNewAccount(login, password, email, host, port))
 
     def sendMessage(self, to_jid, message, subject='', mess_type="chat", profile_key="@DEFAULT@"):
-        return self.db_comm_iface.sendMessage(to_jid, message, subject, mess_type, profile_key)
+        return self.db_core_iface.sendMessage(to_jid, message, subject, mess_type, profile_key)
 
     def setParam(self, name, value, category, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.setParam(name, value, category, profile_key)
+        return self.db_core_iface.setParam(name, value, category, profile_key)
 
     def setPresence(self, to_jid='', show='', priority=0, statuses={}, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.setPresence(to_jid, show, priority, statuses, profile_key)
+        return self.db_core_iface.setPresence(to_jid, show, priority, statuses, profile_key)
 
     def subscription(self, sub_type, entity, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.subscription(sub_type, entity, profile_key)
+        return self.db_core_iface.subscription(sub_type, entity, profile_key)
 
     def updateContact(self, entity, name, groups, profile_key="@DEFAULT@"):
-        return self.db_comm_iface.updateContact(entity, name, groups, profile_key)
+        return self.db_core_iface.updateContact(entity, name, groups, profile_key)
 
 
 #methods from plugins
     def getRoomJoined(self, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.getRoomJoined(profile_key)
+        return self.db_plugin_iface.getRoomJoined(profile_key)
 
     def getRoomSubjects(self, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.getRoomSubjects(profile_key)
+        return self.db_plugin_iface.getRoomSubjects(profile_key)
 
     def joinMUC(self, service, roomId, nick, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.joinMUC(service, roomId, nick, profile_key)
+        return self.db_plugin_iface.joinMUC(service, roomId, nick, profile_key)
 
     def tarotGameLaunch(self, players, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.tarotGameLaunch(players, profile_key)
+        return self.db_plugin_iface.tarotGameLaunch(players, profile_key)
     
     def tarotGameCreate(self, room_jid, players, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.tarotGameCreate(room_jid, players, profile_key)
+        return self.db_plugin_iface.tarotGameCreate(room_jid, players, profile_key)
 
     def tarotGameReady(self, player, referee, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.tarotGameReady(player, referee, profile_key)
+        return self.db_plugin_iface.tarotGameReady(player, referee, profile_key)
 
     def tarotGameContratChoosed(self, player, referee, contrat, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.tarotGameContratChoosed(player, referee, contrat, profile_key)
+        return self.db_plugin_iface.tarotGameContratChoosed(player, referee, contrat, profile_key)
 
     def tarotGamePlayCards(self, player, referee, cards, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.tarotGamePlayCards(player, referee, cards, profile_key)
+        return self.db_plugin_iface.tarotGamePlayCards(player, referee, cards, profile_key)
 
     def quizGameLaunch(self, players, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.quizGameLaunch(players, profile_key)
+        return self.db_plugin_iface.quizGameLaunch(players, profile_key)
     
     def quizGameCreate(self, room_jid, players, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.quizGameCreate(room_jid, players, profile_key)
+        return self.db_plugin_iface.quizGameCreate(room_jid, players, profile_key)
 
     def quizGameReady(self, player, referee, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.quizGameReady(player, referee, profile_key)
+        return self.db_plugin_iface.quizGameReady(player, referee, profile_key)
 
     def quizGameAnswer(self, player, referee, answer, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.quizGameAnswer(player, referee, answer, profile_key)
+        return self.db_plugin_iface.quizGameAnswer(player, referee, answer, profile_key)
 
     def sendFile(self, to, path, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.sendFile(to, path, profile_key)
+        return self.db_plugin_iface.sendFile(to, path, profile_key)
 
     def findGateways(self, target, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.findGateways(target, profile_key)
+        return self.db_plugin_iface.findGateways(target, profile_key)
 
     def getCard(self, target, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.getCard(target, profile_key)
+        return self.db_plugin_iface.getCard(target, profile_key)
 
     def getCardCache(self, target):
-        return self.db_comm_iface.getCardCache(target)
+        return self.db_plugin_iface.getCardCache(target)
 
     def getAvatarFile(self, hash):
-        return self.db_comm_iface.getAvatarFile(hash)
+        return self.db_plugin_iface.getAvatarFile(hash)
 
     def in_band_register(self, target, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.in_band_register(target, profile_key)
+        return self.db_plugin_iface.in_band_register(target, profile_key)
 
     def gatewayRegister(self, action, target, data, profile_key='@DEFAULT@'):
         if data == None:
             data = [('', '')] #XXX: we have to do this awful hack because python dbus need to guess the signature
-        return self.db_req_iface.gatewayRegister(action, target, data, profile_key)
+        return self.db_plugin_iface.gatewayRegister(action, target, data, profile_key)
 
     def getLastMicroblogs(self, jid, max_items, profile_key='@DEFAULT@', callback=None, errback=None):
-        return self.db_comm_iface.getLastMicroblogs(jid, max_items, profile_key, reply_handler=callback, error_handler=errback)
+        return self.db_plugin_iface.getLastMicroblogs(jid, max_items, profile_key, reply_handler=callback, error_handler=errback)
 
     def getMblogNodes(self, profile_key='@DEFAULT@', callback=None, errback=None):
-        return self.db_comm_iface.getMblogNodes(profile_key, reply_handler=callback, error_handler=errback)
+        return self.db_plugin_iface.getMblogNodes(profile_key, reply_handler=callback, error_handler=errback)
     
     def sendGroupBlog(self, groups, message, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.sendGroupBlog(groups, message, profile_key)
+        return self.db_plugin_iface.sendGroupBlog(groups, message, profile_key)
     
     def sendPersonalEvent(self, event_type, data, profile_key='@DEFAULT@'):
-        return self.db_comm_iface.sendPersonalEvent(event_type, data, profile_key)
+        return self.db_plugin_iface.sendPersonalEvent(event_type, data, profile_key)
     
     def setMicroblogAccess(self, access="presence", profile_key='@DEFAULT@', callback=None, errback=None):
-        return self.db_comm_iface.setMicroblogAccess(access, profile_key, reply_handler=callback, error_handler=errback)
+        return self.db_plugin_iface.setMicroblogAccess(access, profile_key, reply_handler=callback, error_handler=errback)
--- a/frontends/src/quick_frontend/quick_app.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/frontends/src/quick_frontend/quick_app.py	Wed Jul 06 01:06:18 2011 +0200
@@ -51,33 +51,33 @@
         self.bridge.register("newMessage", self.newMessage)
         self.bridge.register("newAlert", self.newAlert)
         self.bridge.register("presenceUpdate", self.presenceUpdate)
-        self.bridge.register("roomJoined", self.roomJoined)
-        self.bridge.register("roomUserJoined", self.roomUserJoined)
-        self.bridge.register("roomUserLeft", self.roomUserLeft)
-        self.bridge.register("roomNewSubject", self.roomNewSubject)
-        self.bridge.register("tarotGameStarted", self.tarotGameStarted)
-        self.bridge.register("tarotGameNew", self.tarotGameNew)
-        self.bridge.register("tarotGameChooseContrat", self.tarotChooseContrat)
-        self.bridge.register("tarotGameShowCards", self.tarotShowCards)
-        self.bridge.register("tarotGameYourTurn", self.tarotMyTurn)
-        self.bridge.register("tarotGameScore", self.tarotScore)
-        self.bridge.register("tarotGameCardsPlayed", self.tarotCardsPlayed)
-        self.bridge.register("tarotGameInvalidCards", self.tarotInvalidCards)
-        self.bridge.register("quizGameStarted", self.quizGameStarted)
-        self.bridge.register("quizGameNew", self.quizGameNew)
-        self.bridge.register("quizGameQuestion", self.quizGameQuestion)
-        self.bridge.register("quizGamePlayerBuzzed", self.quizGamePlayerBuzzed)
-        self.bridge.register("quizGamePlayerSays", self.quizGamePlayerSays)
-        self.bridge.register("quizGameAnswerResult", self.quizGameAnswerResult)
-        self.bridge.register("quizGameTimerExpired", self.quizGameTimerExpired)
-        self.bridge.register("quizGameTimerRestarted", self.quizGameTimerRestarted)
         self.bridge.register("subscribe", self.subscribe)
         self.bridge.register("paramUpdate", self.paramUpdate)
         self.bridge.register("contactDeleted", self.contactDeleted)
-        self.bridge.register("updatedValue", self.updatedValue, "request")
-        self.bridge.register("askConfirmation", self.askConfirmation, "request")
-        self.bridge.register("actionResult", self.actionResult, "request")
-        self.bridge.register("actionResultExt", self.actionResult, "request")
+        self.bridge.register("updatedValue", self.updatedValue)
+        self.bridge.register("askConfirmation", self.askConfirmation)
+        self.bridge.register("actionResult", self.actionResult)
+        self.bridge.register("actionResultExt", self.actionResult)
+        self.bridge.register("roomJoined", self.roomJoined, "plugin")
+        self.bridge.register("roomUserJoined", self.roomUserJoined, "plugin")
+        self.bridge.register("roomUserLeft", self.roomUserLeft, "plugin")
+        self.bridge.register("roomNewSubject", self.roomNewSubject, "plugin")
+        self.bridge.register("tarotGameStarted", self.tarotGameStarted, "plugin")
+        self.bridge.register("tarotGameNew", self.tarotGameNew, "plugin")
+        self.bridge.register("tarotGameChooseContrat", self.tarotChooseContrat, "plugin")
+        self.bridge.register("tarotGameShowCards", self.tarotShowCards, "plugin")
+        self.bridge.register("tarotGameYourTurn", self.tarotMyTurn, "plugin")
+        self.bridge.register("tarotGameScore", self.tarotScore, "plugin")
+        self.bridge.register("tarotGameCardsPlayed", self.tarotCardsPlayed, "plugin")
+        self.bridge.register("tarotGameInvalidCards", self.tarotInvalidCards, "plugin")
+        self.bridge.register("quizGameStarted", self.quizGameStarted, "plugin")
+        self.bridge.register("quizGameNew", self.quizGameNew, "plugin")
+        self.bridge.register("quizGameQuestion", self.quizGameQuestion, "plugin")
+        self.bridge.register("quizGamePlayerBuzzed", self.quizGamePlayerBuzzed, "plugin")
+        self.bridge.register("quizGamePlayerSays", self.quizGamePlayerSays, "plugin")
+        self.bridge.register("quizGameAnswerResult", self.quizGameAnswerResult, "plugin")
+        self.bridge.register("quizGameTimerExpired", self.quizGameTimerExpired, "plugin")
+        self.bridge.register("quizGameTimerRestarted", self.quizGameTimerRestarted, "plugin")
         
         self.current_action_ids = set()
         self.current_action_ids_cb = {}
@@ -488,7 +488,9 @@
         except KeyError:
             pass
 
-    def updatedValue(self, name, data):
+    def updatedValue(self, name, data, profile):
+        if not self.check_profile(profile):
+            return
         if name == "card_nick":
             target = JID(data['jid'])
             if target in self.contactList:
--- a/src/plugins/plugin_misc_groupblog.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_misc_groupblog.py	Wed Jul 06 01:06:18 2011 +0200
@@ -69,12 +69,12 @@
         for i in range(1,21):
             self.host.plugins["XEP-0163"].addPEPEvent("MICROBLOG_%02d" % i, NS_MICROBLOG % i, self.groupblogCB, None)
 
-        host.bridge.addMethod("cleanBlogCollection", ".communication", in_sign='s', out_sign='',
+        host.bridge.addMethod("cleanBlogCollection", ".plugin", in_sign='s', out_sign='',
                                method=self.cleanBlogCollection,
                                doc = {
                                      })
         
-        host.bridge.addMethod("getMblogNodes", ".communication", in_sign='s', out_sign='a{sas}',
+        host.bridge.addMethod("getMblogNodes", ".plugin", in_sign='s', out_sign='a{sas}',
                                method=self.getMblogNodes,
                                async = True,
                                doc = { 'summary':"retrieve mblog node, and their association with roster's groups",
@@ -82,7 +82,7 @@
                                        'return':'list of microblog data (dict)'
                                      })
 
-        host.bridge.addMethod("sendGroupBlog", ".communication", in_sign='asss', out_sign='',
+        host.bridge.addMethod("sendGroupBlog", ".plugin", in_sign='asss', out_sign='',
                                method=self.sendGroupBlog,
                                doc = { 'summary':"Send a microblog to a list of groups",
                                        'param_0':'list of groups which can read the microblog',
@@ -90,7 +90,7 @@
                                        'param_2':'%(doc_profile)s'
                                      })
         
-        host.bridge.addMethod("subscribeGroupBlog", ".communication", in_sign='ss', out_sign='',
+        host.bridge.addMethod("subscribeGroupBlog", ".plugin", in_sign='ss', out_sign='',
                                method=self.subscribeGroupBlog,
                                doc = { 'summary':"Subscribe to the group blog of somebody",
                                        'param_0':'jid of the group node published',
--- a/src/plugins/plugin_misc_quiz.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_misc_quiz.py	Wed Jul 06 01:06:18 2011 +0200
@@ -64,18 +64,18 @@
         self.host = host
         self.games={}
         self.waiting_inv = {} #Invitation waiting for people to join to launch a game
-        host.bridge.addMethod("quizGameLaunch", ".communication", in_sign='ass', out_sign='', method=self.quizGameLaunch) #args: room_jid, players, profile
-        host.bridge.addMethod("quizGameCreate", ".communication", in_sign='sass', out_sign='', method=self.quizGameCreate) #args: room_jid, players, profile
-        host.bridge.addMethod("quizGameReady", ".communication", in_sign='sss', out_sign='', method=self.newPlayerReady) #args: player, referee, profile
-        host.bridge.addMethod("quizGameAnswer", ".communication", in_sign='ssss', out_sign='', method=self.playerAnswer)
-        host.bridge.addSignal("quizGameStarted", ".communication", signature='ssass') #args: room_jid, referee, players, profile
-        host.bridge.addSignal("quizGameNew", ".communication",
+        host.bridge.addMethod("quizGameLaunch", ".plugin", in_sign='ass', out_sign='', method=self.quizGameLaunch) #args: room_jid, players, profile
+        host.bridge.addMethod("quizGameCreate", ".plugin", in_sign='sass', out_sign='', method=self.quizGameCreate) #args: room_jid, players, profile
+        host.bridge.addMethod("quizGameReady", ".plugin", in_sign='sss', out_sign='', method=self.newPlayerReady) #args: player, referee, profile
+        host.bridge.addMethod("quizGameAnswer", ".plugin", in_sign='ssss', out_sign='', method=self.playerAnswer)
+        host.bridge.addSignal("quizGameStarted", ".plugin", signature='ssass') #args: room_jid, referee, players, profile
+        host.bridge.addSignal("quizGameNew", ".plugin",
                               signature='sa{ss}s',
                               doc = { 'summary': 'Start a new game',
                                       'param_0': "room_jid: jid of game's room",
                                       'param_1': "game_data: data of the game",
                                       'param_2': '%(doc_profile)s'})
-        host.bridge.addSignal("quizGameQuestion", ".communication",
+        host.bridge.addSignal("quizGameQuestion", ".plugin",
                               signature = 'sssis',
                               doc = { 'summary': "Send the current question",
                                       'param_0': "room_jid: jid of game's room",
@@ -83,14 +83,14 @@
                                       'param_2': "question: question to ask",
                                       'param_3': "timer: timer",
                                       'param_4': '%(doc_profile)s'})
-        host.bridge.addSignal("quizGamePlayerBuzzed", ".communication",
+        host.bridge.addSignal("quizGamePlayerBuzzed", ".plugin",
                               signature = 'ssbs',
                               doc = { 'summary': "A player just pressed the buzzer",
                                       'param_0': "room_jid: jid of game's room",
                                       'param_1': "player: player who pushed the buzzer",
                                       'param_2': "pause: should the game be paused ?",
                                       'param_3': '%(doc_profile)s'})
-        host.bridge.addSignal("quizGamePlayerSays", ".communication",
+        host.bridge.addSignal("quizGamePlayerSays", ".plugin",
                               signature = 'sssis',
                               doc = { 'summary': "A player just pressed the buzzer",
                                       'param_0': "room_jid: jid of game's room",
@@ -98,7 +98,7 @@
                                       'param_2': "text: what the player say",
                                       'param_3': "delay: how long, in seconds, the text must appear",
                                       'param_4': '%(doc_profile)s'})
-        host.bridge.addSignal("quizGameAnswerResult", ".communication",
+        host.bridge.addSignal("quizGameAnswerResult", ".plugin",
                               signature = 'ssba{si}s',
                               doc = { 'summary': "Result of the just given answer",
                                       'param_0': "room_jid: jid of game's room",
@@ -106,12 +106,12 @@
                                       'param_2': "good_answer: True if the answer is right",
                                       'param_3': "score: dict of score with player as key",
                                       'param_4': '%(doc_profile)s'})
-        host.bridge.addSignal("quizGameTimerExpired", ".communication",
+        host.bridge.addSignal("quizGameTimerExpired", ".plugin",
                               signature = 'ss',
                               doc = { 'summary': "Nobody answered the question in time",
                                       'param_0': "room_jid: jid of game's room",
                                       'param_1': '%(doc_profile)s'})
-        host.bridge.addSignal("quizGameTimerRestarted", ".communication",
+        host.bridge.addSignal("quizGameTimerRestarted", ".plugin",
                               signature = 'sis',
                               doc = { 'summary': "Nobody answered the question in time",
                                       'param_0': "room_jid: jid of game's room",
--- a/src/plugins/plugin_misc_tarot.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_misc_tarot.py	Wed Jul 06 01:06:18 2011 +0200
@@ -65,19 +65,19 @@
         self.games={}
         self.waiting_inv = {} #Invitation waiting for people to join to launch a game
         self.contrats = [_('Passe'), _('Petite'), _('Garde'), _('Garde Sans'), _('Garde Contre')]
-        host.bridge.addMethod("tarotGameLaunch", ".communication", in_sign='ass', out_sign='', method=self.launchGame) #args: room_jid, players, profile
-        host.bridge.addMethod("tarotGameCreate", ".communication", in_sign='sass', out_sign='', method=self.createGame) #args: room_jid, players, profile
-        host.bridge.addMethod("tarotGameReady", ".communication", in_sign='sss', out_sign='', method=self.newPlayerReady) #args: player, referee, profile
-        host.bridge.addMethod("tarotGameContratChoosed", ".communication", in_sign='ssss', out_sign='', method=self.contratChoosed) #args: player, referee, contrat, profile
-        host.bridge.addMethod("tarotGamePlayCards", ".communication", in_sign='ssa(ss)s', out_sign='', method=self.play_cards) #args: player, referee, cards, profile
-        host.bridge.addSignal("tarotGameStarted", ".communication", signature='ssass') #args: room_jid, referee, players, profile
-        host.bridge.addSignal("tarotGameNew", ".communication", signature='sa(ss)s') #args: room_jid, hand, profile
-        host.bridge.addSignal("tarotGameChooseContrat", ".communication", signature='sss') #args: room_jid, xml_data, profile
-        host.bridge.addSignal("tarotGameShowCards", ".communication", signature='ssa(ss)a{ss}s') #args: room_jid, type ["chien", "poignée",...], cards, data[dict], profile
-        host.bridge.addSignal("tarotGameCardsPlayed", ".communication", signature='ssa(ss)s') #args: room_jid, player, type ["chien", "poignée",...], cards, data[dict], profile
-        host.bridge.addSignal("tarotGameYourTurn", ".communication", signature='ss') #args: room_jid, profile
-        host.bridge.addSignal("tarotGameScore", ".communication", signature='ssasass') #args: room_jid, xml_data, winners (list of nicks), loosers (list of nicks), profile
-        host.bridge.addSignal("tarotGameInvalidCards", ".communication", signature='ssa(ss)a(ss)s') #args: room_jid, game phase, played_cards, invalid_cards, profile
+        host.bridge.addMethod("tarotGameLaunch", ".plugin", in_sign='ass', out_sign='', method=self.launchGame) #args: room_jid, players, profile
+        host.bridge.addMethod("tarotGameCreate", ".plugin", in_sign='sass', out_sign='', method=self.createGame) #args: room_jid, players, profile
+        host.bridge.addMethod("tarotGameReady", ".plugin", in_sign='sss', out_sign='', method=self.newPlayerReady) #args: player, referee, profile
+        host.bridge.addMethod("tarotGameContratChoosed", ".plugin", in_sign='ssss', out_sign='', method=self.contratChoosed) #args: player, referee, contrat, profile
+        host.bridge.addMethod("tarotGamePlayCards", ".plugin", in_sign='ssa(ss)s', out_sign='', method=self.play_cards) #args: player, referee, cards, profile
+        host.bridge.addSignal("tarotGameStarted", ".plugin", signature='ssass') #args: room_jid, referee, players, profile
+        host.bridge.addSignal("tarotGameNew", ".plugin", signature='sa(ss)s') #args: room_jid, hand, profile
+        host.bridge.addSignal("tarotGameChooseContrat", ".plugin", signature='sss') #args: room_jid, xml_data, profile
+        host.bridge.addSignal("tarotGameShowCards", ".plugin", signature='ssa(ss)a{ss}s') #args: room_jid, type ["chien", "poignée",...], cards, data[dict], profile
+        host.bridge.addSignal("tarotGameCardsPlayed", ".plugin", signature='ssa(ss)s') #args: room_jid, player, type ["chien", "poignée",...], cards, data[dict], profile
+        host.bridge.addSignal("tarotGameYourTurn", ".plugin", signature='ss') #args: room_jid, profile
+        host.bridge.addSignal("tarotGameScore", ".plugin", signature='ssasass') #args: room_jid, xml_data, winners (list of nicks), loosers (list of nicks), profile
+        host.bridge.addSignal("tarotGameInvalidCards", ".plugin", signature='ssa(ss)a(ss)s') #args: room_jid, game phase, played_cards, invalid_cards, profile
         host.trigger.add("MUC user joined", self.userJoinedTrigger)
         self.deck_ordered = []
         for value in ['excuse']+map(str,range(1,22)):
--- a/src/plugins/plugin_misc_xmllog.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_misc_xmllog.py	Wed Jul 06 01:06:18 2011 +0200
@@ -72,7 +72,7 @@
         host.memory.importParams(self.params)
         
         #bridge
-        host.bridge.addSignal("xmlLog", ".communication", signature='sss') #args: direction("IN" or "OUT"), xml_data, profile
+        host.bridge.addSignal("xmlLog", ".plugin", signature='sss') #args: direction("IN" or "OUT"), xml_data, profile
         
         do_log = bool(self.host.memory.getParamA("Xml log", "Debug"))
         if do_log:
--- a/src/plugins/plugin_xep_0045.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0045.py	Wed Jul 06 01:06:18 2011 +0200
@@ -58,14 +58,14 @@
         info(_("Plugin XEP_0045 initialization"))
         self.host = host
         self.clients={}
-        host.bridge.addMethod("joinMUC", ".communication", in_sign='ssss', out_sign='', method=self._join)
-        host.bridge.addMethod("getRoomJoined", ".communication", in_sign='s', out_sign='a(ssass)', method=self.getRoomJoined)
-        host.bridge.addMethod("getRoomSubjects", ".communication", in_sign='s', out_sign='a(sss)', method=self.getRoomSubjects)
-        host.bridge.addMethod("getUniqueRoomName", ".communication", in_sign='s', out_sign='s', method=self.getUniqueName)
-        host.bridge.addSignal("roomJoined", ".communication", signature='ssasss') #args: room_id, room_service, room_nicks, user_nick, profile
-        host.bridge.addSignal("roomUserJoined", ".communication", signature='sssa{ss}s') #args: room_id, room_service, user_nick, user_data, profile
-        host.bridge.addSignal("roomUserLeft", ".communication", signature='sssa{ss}s') #args: room_id, room_service, user_nick, user_data, profile
-        host.bridge.addSignal("roomNewSubject", ".communication", signature='ssss') #args: room_id, room_service, subject, profile
+        host.bridge.addMethod("joinMUC", ".plugin", in_sign='ssss', out_sign='', method=self._join)
+        host.bridge.addMethod("getRoomJoined", ".plugin", in_sign='s', out_sign='a(ssass)', method=self.getRoomJoined)
+        host.bridge.addMethod("getRoomSubjects", ".plugin", in_sign='s', out_sign='a(sss)', method=self.getRoomSubjects)
+        host.bridge.addMethod("getUniqueRoomName", ".plugin", in_sign='s', out_sign='s', method=self.getUniqueName)
+        host.bridge.addSignal("roomJoined", ".plugin", signature='ssasss') #args: room_id, room_service, room_nicks, user_nick, profile
+        host.bridge.addSignal("roomUserJoined", ".plugin", signature='sssa{ss}s') #args: room_id, room_service, user_nick, user_data, profile
+        host.bridge.addSignal("roomUserLeft", ".plugin", signature='sssa{ss}s') #args: room_id, room_service, user_nick, user_data, profile
+        host.bridge.addSignal("roomNewSubject", ".plugin", signature='ssss') #args: room_id, room_service, subject, profile
 
     def __check_profile(self, profile):
         """check if profile is used and connected
--- a/src/plugins/plugin_xep_0054.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0054.py	Wed Jul 06 01:06:18 2011 +0200
@@ -71,17 +71,21 @@
         self.vcard_cache = host.memory.getPrivate("vcard_cache") or {}  #used to store nicknames and avatar, key = jid
         if not os.path.exists(self.avatar_path):
             os.makedirs(self.avatar_path)
-        host.bridge.addMethod("getCard", ".communication", in_sign='ss', out_sign='s', method=self.getCard)
-        host.bridge.addMethod("getAvatarFile", ".communication", in_sign='s', out_sign='s', method=self.getAvatarFile)
-        host.bridge.addMethod("getCardCache", ".communication", in_sign='s', out_sign='a{ss}', method=self.getCardCache)
+        host.bridge.addMethod("getCard", ".plugin", in_sign='ss', out_sign='s', method=self.getCard)
+        host.bridge.addMethod("getAvatarFile", ".plugin", in_sign='s', out_sign='s', method=self.getAvatarFile)
+        host.bridge.addMethod("getCardCache", ".plugin", in_sign='s', out_sign='a{ss}', method=self.getCardCache)
 
     def getHandler(self, profile):
         return XEP_0054_handler(self)  
    
-    def update_cache(self, jid, name, value):
+    def update_cache(self, jid, name, value, profile):
         """update cache value
         - save value in memory in case of change
         - send updatedValue signal if the value is new or updated
+        @param jid: jid of the owner of the vcard
+        @param name: name of the item which changed
+        @param value: new value of the item
+        @param profile: profile which received the update
         """
         if not self.vcard_cache.has_key(jid.userhost()):
             self.vcard_cache[jid.userhost()] = {}
@@ -91,7 +95,7 @@
         if not old_value or value != old_value:
             cache[name] = value
             self.host.memory.setPrivate("vcard_cache", self.vcard_cache)
-            self.host.bridge.updatedValue('card_'+name, {'jid':jid.userhost(), name:value})
+            self.host.bridge.updatedValue('card_'+name, {'jid':jid.userhost(), name:value}, profile)
 
     def get_cache(self, jid, name):
         """return cached value for jid
@@ -123,7 +127,7 @@
                 return hash
 
     @defer.deferredGenerator
-    def vCard2Dict(self, vcard, target):
+    def vCard2Dict(self, vcard, target, profile):
         """Convert a VCard to a dict, and save binaries"""
         debug (_("parsing vcard"))
         dictionary = {}
@@ -134,7 +138,7 @@
                 dictionary['fullname'] = unicode(elem)
             elif elem.name == 'NICKNAME':
                 dictionary['nick'] = unicode(elem)
-                self.update_cache(target, 'nick', dictionary['nick'])
+                self.update_cache(target, 'nick', dictionary['nick'], profile)
             elif elem.name == 'URL':
                 dictionary['website'] = unicode(elem)
             elif elem.name == 'EMAIL':
@@ -149,18 +153,18 @@
                 if not dictionary["avatar"]:  #can happen in case of e.g. empty photo elem
                     del dictionary['avatar']
                 else:
-                    self.update_cache(target, 'avatar', dictionary['avatar'])
+                    self.update_cache(target, 'avatar', dictionary['avatar'], profile)
             else:
                 info (_('FIXME: [%s] VCard tag is not managed yet') % elem.name)
 
         yield dictionary
 
-    def vcard_ok(self, answer):
+    def vcard_ok(self, answer, profile):
         """Called after the first get IQ"""
         debug (_("VCard found"))
 
         if answer.firstChildElement().name == "vCard":
-            d = self.vCard2Dict(answer.firstChildElement(), jid.JID(answer["from"]))
+            d = self.vCard2Dict(answer.firstChildElement(), jid.JID(answer["from"]), profile)
             d.addCallback(lambda data: self.host.bridge.actionResult("RESULT", answer['id'], data))
         else:
             error (_("FIXME: vCard not found as first child element"))
@@ -179,13 +183,14 @@
         if not xmlstream:
             error (_('Asking vcard for an non-existant or not connected profile'))
             return ""
+        profile = self.host.memory.getProfileName(profile_key)
         to_jid = jid.JID(target)
         debug(_("Asking for %s's VCard") % to_jid.userhost())
         reg_request=IQ(xmlstream,'get')
         reg_request["from"]=current_jid.full()
         reg_request["to"] = to_jid.userhost()
         query=reg_request.addElement('vCard', NS_VCARD)
-        reg_request.send(to_jid.userhost()).addCallbacks(self.vcard_ok, self.vcard_err)
+        reg_request.send(to_jid.userhost()).addCallbacks(self.vcard_ok, self.vcard_err, [profile])
         return reg_request["id"] 
 
     def getAvatarFile(self, hash):
--- a/src/plugins/plugin_xep_0060.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0060.py	Wed Jul 06 01:06:18 2011 +0200
@@ -47,7 +47,7 @@
         self.host = host
         self.managedNodes=[]
         self.clients={}
-        """host.bridge.addMethod("getItems", ".communication", in_sign='ssa{ss}s', out_sign='as', method=self.getItems,
+        """host.bridge.addMethod("getItems", ".plugin", in_sign='ssa{ss}s', out_sign='as', method=self.getItems,
                               async = True,
                               doc = { 'summary':'retrieve items',
                                       'param_0':'service: pubsub service',
--- a/src/plugins/plugin_xep_0077.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0077.py	Wed Jul 06 01:06:18 2011 +0200
@@ -47,8 +47,8 @@
         info(_("Plugin XEP_0077 initialization"))
         self.host = host
         self.triggers = {}  #used by other protocol (e.g. XEP-0100) to finish registration. key = target_jid
-        host.bridge.addMethod("in_band_register", ".communication", in_sign='ss', out_sign='s', method=self.in_band_register)
-        host.bridge.addMethod("in_band_submit", ".request", in_sign='sa(ss)', out_sign='s', method=self.in_band_submit)
+        host.bridge.addMethod("in_band_register", ".plugin", in_sign='ss', out_sign='s', method=self.in_band_register)
+        host.bridge.addMethod("in_band_submit", ".plugin", in_sign='sa(ss)', out_sign='s', method=self.in_band_submit)
    
     def addTrigger(self, target, cb, profile):
         """Add a callback which is called when registration to target is successful"""
--- a/src/plugins/plugin_xep_0096.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0096.py	Wed Jul 06 01:06:18 2011 +0200
@@ -58,7 +58,7 @@
         info(_("Plugin XEP_0096 initialization"))
         self.host = host
         self._waiting_for_approval = {}
-        host.bridge.addMethod("sendFile", ".communication", in_sign='sss', out_sign='s', method=self.sendFile)
+        host.bridge.addMethod("sendFile", ".plugin", in_sign='sss', out_sign='s', method=self.sendFile)
     
     def getHandler(self, profile):
         return XEP_0096_handler(self)  
--- a/src/plugins/plugin_xep_0100.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0100.py	Wed Jul 06 01:06:18 2011 +0200
@@ -44,8 +44,8 @@
         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='ss', out_sign='s', method=self.findGateways)
-        host.bridge.addMethod("gatewayRegister", ".request", in_sign='ssa(ss)s', out_sign='s', method=self.gatewayRegister)
+        host.bridge.addMethod("findGateways", ".plugin", in_sign='ss', out_sign='s', method=self.findGateways)
+        host.bridge.addMethod("gatewayRegister", ".plugin", in_sign='ssa(ss)s', out_sign='s', method=self.gatewayRegister)
 
     def __inc_handled_items(self, request_id):
         self.__gateways[request_id]['__handled_items']+=1
--- a/src/plugins/plugin_xep_0163.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0163.py	Wed Jul 06 01:06:18 2011 +0200
@@ -50,8 +50,8 @@
         self.pep_events=set()
         self.pep_out_cb={}
         host.trigger.add("PubSub Disco Info", self.disoInfoTrigger)
-        host.bridge.addSignal("personalEvent", ".communication", signature='ssa{ss}s') #args: from (jid), type(MOOD, TUNE, etc), data, profile
-        host.bridge.addMethod("sendPersonalEvent", ".communication", in_sign='sa{ss}s', out_sign='i', method=self.sendPersonalEvent) #args: type(MOOD, TUNE, etc), data, profile_key; return 0 or error_code
+        host.bridge.addSignal("personalEvent", ".plugin", signature='ssa{ss}s') #args: from (jid), type(MOOD, TUNE, etc), data, profile
+        host.bridge.addMethod("sendPersonalEvent", ".plugin", in_sign='sa{ss}s', out_sign='i', method=self.sendPersonalEvent) #args: type(MOOD, TUNE, etc), data, profile_key; return 0 or error_code
         self.addPEPEvent("MOOD", NS_USER_MOOD, self.userMoodCB, self.sendMood)
 
     def disoInfoTrigger(self, disco_info, profile):
--- a/src/plugins/plugin_xep_0249.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0249.py	Wed Jul 06 01:06:18 2011 +0200
@@ -54,7 +54,7 @@
     def __init__(self, host):
         info(_("Plugin XEP_0249 initialization"))
         self.host = host
-        host.bridge.addMethod("inviteMUC", ".communication", in_sign='sssa{ss}s', out_sign='', method=self._invite)
+        host.bridge.addMethod("inviteMUC", ".plugin", in_sign='sssa{ss}s', out_sign='', method=self._invite)
 
     def getHandler(self, profile):
         return XEP_0249_handler(self)
--- a/src/plugins/plugin_xep_0277.py	Wed Jul 06 01:04:24 2011 +0200
+++ b/src/plugins/plugin_xep_0277.py	Wed Jul 06 01:06:18 2011 +0200
@@ -59,7 +59,7 @@
         info(_("Microblogging plugin initialization"))
         self.host = host
         self.host.plugins["XEP-0163"].addPEPEvent("MICROBLOG", NS_MICROBLOG, self.microblogCB, self.sendMicroblog)
-        host.bridge.addMethod("getLastMicroblogs", ".communication",
+        host.bridge.addMethod("getLastMicroblogs", ".plugin",
                               in_sign='sis', out_sign='aa{ss}',
                               method=self.getLastMicroblogs,
                               async = True,
@@ -69,7 +69,7 @@
                                       'param_2':'%(doc_profile)s',
                                       'return':'list of microblog data (dict)'
                                     })
-        host.bridge.addMethod("setMicroblogAccess", ".communication", in_sign='ss', out_sign='',
+        host.bridge.addMethod("setMicroblogAccess", ".plugin", in_sign='ss', out_sign='',
                                method=self.setMicroblogAccess,
                                async = True,
                                doc = {