dbus service : Bug fix on method mapping when using multiple object
authorFrederic PAUT <frederic.paut@linux.intel.com>
Mon, 8 Apr 2013 13:52:56 +0000 (15:52 +0200)
committerFrederic PAUT <frederic.paut@linux.intel.com>
Mon, 8 Apr 2013 13:52:56 +0000 (15:52 +0200)
.gitignore
cloudeebus/cloudeebus.js
cloudeebus/cloudeebus.py
doc/agent/server.html

index 82739b9..bca7b1e 100644 (file)
@@ -4,3 +4,4 @@ dist
 cloudeebus.egg-info
 .project
 .pydevproject
+*.pyc
index 028f195..e9e9578 100644 (file)
@@ -260,17 +260,28 @@ cloudeebus.Service.prototype._addMethod = function(objectPath, ifName, method, o
        }
 };
 
-cloudeebus.Service.prototype._addSignal = function(objectPath, signal, objectJS) {
+cloudeebus.Service.prototype._addSignal = function(objectPath, ifName, signal, objectJS) {
        var service = this;
+       var methodExist = false;
 
-       if (objectJS[signal] != undefined && objectJS[signal] != null)
-               cloudeebus.log("Can not create new method to emit signal '" + signal + "' in object JS this method already exist!");
-       else {
+       if (objectJS.interfaceProxies && objectJS.interfaceProxies[ifName])
+               if (objectJS.interfaceProxies[ifName][signal]) {
+                       methodExist = true;
+               } else {
+                       objectJS.interfaceProxies[ifName][signal] = function() {
+                               var result = JSON.parse(arguments[0]);
+                               service.emitSignal(objectPath, signal, result);
+                       };
+               return;
+       }
+               
+       if ((objectJS[signal] == undefined || objectJS[signal] == null) && !methodExist) 
                objectJS[signal] = function() {
                        var result = JSON.parse(arguments[0]);
                        service.emitSignal(objectPath, signal, result);
                };
-    }
+       else
+               cloudeebus.log("Can not create new method to emit signal '" + signal + "' in object JS this method already exist!");
 };
 
 cloudeebus.Service.prototype._createWrapper = function(xmlTemplate, objectPath, objectJS) {
@@ -289,7 +300,7 @@ cloudeebus.Service.prototype._createWrapper = function(xmlTemplate, objectPath,
                        }
                        if (ifChild.nodeName == "signal") {
                                var metName = ifChild.attributes.getNamedItem("name").value;
-                               self._addSignal(objectPath, metName, objectJS);
+                               self._addSignal(objectPath, ifName, metName, objectJS);
                        }
                        ifChild = ifChild.nextSibling;
                }
index 82cb354..4024da9 100755 (executable)
@@ -48,6 +48,8 @@ from twisted.python import log
 # XML parser module
 from xml.etree.ElementTree import XMLParser
 
+# For debug only
+import os
 
 ###############################################################################
 
@@ -266,9 +268,9 @@ class DynDBusClass():
         
         ## Overload of __init__ method 
         self.def_method("__init__")
-        self.add_method("bus, callback=None, objName='/sample', busName='org.cloudeebus'")
+        self.add_method("bus, callback=None, objPath='/sample', busName='org.cloudeebus'")
         self.add_stmt("self.bus = bus")
-        self.add_stmt("self.objName = objName")
+        self.add_stmt("self.objPath = objPath")
         self.add_stmt("self.callback = callback")        
         self.add_stmt("dbus.service.Object.__init__(self, conn=bus, bus_name=busName)")
         self.end_method()
@@ -276,13 +278,13 @@ class DynDBusClass():
         ## Create 'add_to_connection' method 
         self.def_method("add_to_connection")
         self.add_method("connection=None, path=None")
-        self.add_stmt("dbus.service.Object.add_to_connection(self, connection=self.bus, path=self.objName)")
+        self.add_stmt("dbus.service.Object.add_to_connection(self, connection=self.bus, path=self.objPath)")
         self.end_method()
                
         ## Create 'remove_from_connection' method 
         self.def_method("remove_from_connection")
         self.add_method("connection=None, path=None")
-        self.add_stmt("dbus.service.Object.remove_from_connection(self, connection=None, path=self.objName)")
+        self.add_stmt("dbus.service.Object.remove_from_connection(self, connection=None, path=self.objPath)")
         self.end_method()
                
     def createDBusServiceFromXML(self, xml):
@@ -379,9 +381,9 @@ class DynDBusClass():
     def add_body_method(self):
         if (self.methodToAdd != None):
             if (self.args_str != str()):
-                self.class_code.append_stmt("self.callback('" + self.methodToAdd + "', '" + self.ifName + "', " + "dbus_async_cb, dbus_async_err_cb, %s)" % self.args_str)
+                self.class_code.append_stmt("self.callback('" + self.methodToAdd + "', self.objPath, '"  + self.ifName + "', " + "dbus_async_cb, dbus_async_err_cb, %s)" % self.args_str)
             else:        
-                self.class_code.append_stmt("self.callback('" + self.methodToAdd + "', '" + self.ifName + "', " + "dbus_async_cb, dbus_async_err_cb)")
+                self.class_code.append_stmt("self.callback('" + self.methodToAdd + "', self.objPath, '"  + self.ifName + "', " + "dbus_async_cb, dbus_async_err_cb)")
 
     def add_body_signal(self):
         self.class_code.append_stmt("return") ## TODO: Remove and fix with code ad hoc
@@ -536,8 +538,8 @@ class CloudeebusService:
         else:
             raise Exception("No methodID " + methodId)
 
-    def srvCB(self, name, ifName, async_succes_cb, async_error_cb, *args):
-        methodId = self.srvName + "#" + self.agentObjectPath + "#" + ifName + "#" + name
+    def srvCB(self, name, objPath, ifName, async_succes_cb, async_error_cb, *args):
+        methodId = self.srvName + "#" + objPath + "#" + ifName + "#" + name
         cb = { 'successCB': async_succes_cb, 
                'errorCB': async_error_cb}
         if methodId not in self.servicePendingCalls:
@@ -582,11 +584,23 @@ class CloudeebusService:
         if (self.dynDBusClasses.has_key(self.className) == False):
             self.dynDBusClasses[self.className] = DynDBusClass(self.className, self.globalCtx, self.localCtx)
             self.dynDBusClasses[self.className].createDBusServiceFromXML(xmlTemplate)
+
+            # For Debug only
+            if (1):
+                if (1): ## Force deletion
+                    if os.access('./MyDbusClass.py', os.R_OK) == True:
+                        os.remove('./MyDbusClass.py')
+                    
+                    if os.access('./MyDbusClass.py', os.R_OK) == False:
+                        f = open('./MyDbusClass.py', 'w')
+                        f.write(self.dynDBusClasses[self.className].class_code.exec_string)
+                        f.close()
+                        
             self.dynDBusClasses[self.className].declare()
 
         ## Class already exist, instanciate it if not already instanciated
         if (self.serviceAgents.has_key(self.className) == False):
-            self.serviceAgents[self.className] = eval(self.className + "(self.bus, callback=self.srvCB, objName=self.agentObjectPath, busName=self.srvName)", self.globalCtx, self.localCtx)
+            self.serviceAgents[self.className] = eval(self.className + "(self.bus, callback=self.srvCB, objPath=self.agentObjectPath, busName=self.srvName)", self.globalCtx, self.localCtx)
             
         self.serviceAgents[self.className].add_to_connection()
         return (self.agentObjectPath)
index 4e0cdda..bfc6d6f 100644 (file)
@@ -48,9 +48,32 @@ sampleObjectHandler = {
   }
 };
 
+sampleObjectHandler2 = {
+  interfaceProxies : {
+    "org.cloudeebus.Sample1" : {
+         Add: function(a,b) {
+       this.interfaceProxies["org.cloudeebus.Sample1"].ResultChanged(a+b);
+       return a+b;
+      }, 
+      Release: function() {
+        cloudeebus.SessionBus().service.delAgent("/org/cloudeebus/Sample", logCB, errorCB);
+        cloudeebus.SessionBus().service.remove(logCB, errorCB);
+      },
+    },
+    "org.cloudeebus.Sample2" : {
+      Div: function(a,b) {
+        return a/b;
+      } 
+    }
+  }
+};
+
 function serviceAdded(service) {
   var agentName = "/org/cloudeebus/Sample"; // = DBUS object name
   cloudeebus.SessionBus().service.addAgent(agentName, sampleXml, sampleObjectHandler, logCB, errorCB);
+  
+  agentName = agentName + "2";
+  cloudeebus.SessionBus().service.addAgent(agentName, sampleXml, sampleObjectHandler2, logCB, errorCB);
 }
 
 function connectSuccess() {