dbus service : Invoking a JS method from DBus, Bug Fix in dynamic code generated
authorFrederic PAUT <frederic.paut@linux.intel.com>
Thu, 21 Feb 2013 12:37:10 +0000 (13:37 +0100)
committerFrederic PAUT <frederic.paut@linux.intel.com>
Thu, 21 Feb 2013 12:38:04 +0000 (13:38 +0100)
cloudeebus/cloudeebus.js
cloudeebus/cloudeebus.py

index 8c6244d..c679145 100644 (file)
@@ -132,6 +132,97 @@ cloudeebus.BusConnection.prototype.getObject = function(busName, objectPath, int
 };
 
 
+cloudeebus.BusConnection.prototype.addService = function(serviceName, successCB, errorCB) {
+       self = this;
+       
+       cloudeebusService = new cloudeebus.Service(this.wampSession, this, serviceName);
+       
+       function busServiceAddedSuccessCB() {
+               if (successCB)
+                       successCB(cloudeebusService);
+       }
+       
+       function busServiceAddedErrorCB(error) {
+               if (errorCB)
+                       errorCB();
+       }
+       
+       cloudeebusService.add(busServiceAddedSuccessCB, busServiceAddedErrorCB);
+       
+       return cloudeebusService;
+};
+
+
+/*****************************************************************************/
+
+cloudeebus.Service = function(session, busConnection, name) {
+       this.wampSession = session;
+       this.busConnection = busConnection; 
+       this.name = name;
+       this.isCreated = false;
+       return this;
+};
+
+cloudeebus.Service.prototype.add = function(successCB, errorCB) {
+       self = this;
+       
+       function addServiceSuccessCB(dbusService) {
+               if (successCB) {
+                       try { // calling dbus hook object function for un-translated types
+                               successCB(dbusService);
+                       }
+                       catch (e) {
+                               alert("Method callback exception: " + e);
+                       }
+               }
+       }
+       
+       function addServiceErrorCB(error) {
+               if (errorCB)
+                       errorCB(error.desc);
+       }
+
+       var arglist = [
+           this.busConnection,
+           this.name
+           ];
+
+       // call dbusSend with bus type, destination, object, message and arguments
+       self.wampSession.call("serviceAdd", arglist).then(addServiceSuccessCB, addServiceErrorCB);
+};
+
+cloudeebus.Service.prototype.addAgent = function(objectPath, xmlTemplate, successCB, errorCB) {
+       self = this;
+       
+       function addAgentSuccessCB(dbusService) {
+               if (successCB) {
+                       try { // calling dbus hook object function for un-translated types
+                               successCB(dbusService);
+                       }
+                       catch (e) {
+                               alert("Method callback exception: " + e);
+                       }
+               }
+       }
+       
+       function addAgentErrorCB(error) {
+               if (errorCB)
+                       errorCB(error.desc);
+       }
+
+       var arglist = [
+           objectPath,
+           xmlTemplate
+           ];
+
+       // call dbusSend with bus type, destination, object, message and arguments
+       self.wampSession.call("serviceAddAgent", arglist).then(addAgentSuccessCB, addAgentErrorCB);
+};
+
+cloudeebus.Service.prototype.registerMethod = function(methodId, methodHandler) {
+       self.wampSession.subscribe(methodId, methodHandler);
+};
+
 
 /*****************************************************************************/
 
@@ -333,28 +424,3 @@ cloudeebus.ProxyObject.prototype.disconnectSignal = function(ifName, signal) {
                cloudeebus.log("Unsubscribe error: " + e);
        }
 };
-
-/******************* Agent Management ****************************************/
-cloudeebus.createService = function(busName, dbusSrvName, objectPath, busConnection, xml_template) {
-       var self = this; 
-
-       function createServiceSuccessCB(className) {
-               cloudeebus.log("createServiceSuccessCB=: " + className);
-       }
-
-       function createServiceErrorCB(error) {
-               cloudeebus.log("createServiceErrorCB=: " + error.desc);
-       }
-       
-       var arglist = [
-           busName,
-               dbusSrvName,
-               objectPath,
-               busConnection,
-               xml_template
-       ];
-
-       // call dbusSend with bus type, destination, object, message and arguments
-       self.wampSession.call("createService", arglist).then(createServiceSuccessCB, createServiceErrorCB);
-};
-/*****************************************************************************/
index 35789c2..fc2e614 100755 (executable)
@@ -48,6 +48,9 @@ from twisted.python import log
 # XML parser module
 from xml.etree.ElementTree import XMLParser
 
+# For debug only
+import os
+
 ###############################################################################
 
 VERSION = "0.2.1"
@@ -314,24 +317,29 @@ class dynDBusClass():
         if (direction == 'out'):
             self.signature['out'] = signature                        
         
-    def add_method(self, args = None, async_cb = None, async_err_cb = None):
+    def add_method(self, args = None, async_success_cb = None, async_err_cb = None):
+        async_cb_str = str()
         if (self.methodToAdd != None):
             name = self.methodToAdd
         else:
             name = self.signalToAdd
         if (args != None):
             self.args_str = args
-        if (async_cb != None):
-            if (self.args_str != str()):
-                self.args_str += ", "
-            self.args_str += async_cb
+        if (async_success_cb != None):
+            async_cb_str = async_success_cb
         if (async_err_cb != None):
-            if (self.args_str != str()):
-                self.args_str += ", "
-            self.args_str += async_err_cb
+            if (async_cb_str != str()):
+                async_cb_str += ", "
+            async_cb_str += async_err_cb
                         
-        if (self.args_str != str()):
-            self.class_code.append_stmt("def " + name + "(self, %s):" % self.args_str)
+        parameters = self.args_str
+        if (async_cb_str != str()):
+            if (parameters != str()):
+                parameters += ", "
+            parameters +=async_cb_str       
+        
+        if (parameters != str()):
+            self.class_code.append_stmt("def " + name + "(self, %s):" % parameters)               
         else:
             self.class_code.append_stmt("def " + name + "(self):")
         self.class_code.indent()
@@ -351,9 +359,9 @@ class dynDBusClass():
         decorator += ")"
         self.class_code.append_stmt(decorator)
         if (self.signature.has_key('name') and self.signature['name'] != str()):
-            self.add_method(self.signature['name'], async_cb='dbus_async_cb', async_err_cb='dbus_async_err_cb')
+            self.add_method(self.signature['name'], async_success_cb='dbus_async_cb', async_err_cb='dbus_async_err_cb')
         else:
-            self.add_method(async_cb='dbus_async_cb', async_err_cb='dbus_async_err_cb')
+            self.add_method(async_success_cb='dbus_async_cb', async_err_cb='dbus_async_err_cb')
 
     def add_dbus_signal(self):
         decorator = '@dbus.service.signal("' + self.ifName + '"'
@@ -372,7 +380,7 @@ class dynDBusClass():
             if (self.args_str != str()):
                 self.class_code.append_stmt("self.callback('" + self.methodToAdd + "', dbus_async_cb, dbus_async_err_cb, %s)" % self.args_str)
             else:        
-                self.class_code.append_stmt("self.callback('" + self.methodToAdd + "')")
+                self.class_code.append_stmt("self.callback('" + self.methodToAdd + "', 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
@@ -490,11 +498,10 @@ class CloudeebusService:
 
 
     def srvCB(self, name, async_succes_cb, async_error_cb, *args):
-        seconds = 10
         print "self.srvCB(name='%s', args=%s')\n\n" % (name, str(args))
-        if (async_error_cb != None):
-            t.start()
-            time.sleep(seconds + 2)
+        methodId = self.srvName + "#" + self.agentObjectPath + "#" + name
+        print "factory.dispatch(methodId='%s', json.dumps(args)=%s')\n\n" % (methodId, json.dumps(args))
+        factory.dispatch(methodId, json.dumps(args))
         
     @exportRpc
     def serviceAdd(self, list):
@@ -513,17 +520,28 @@ class CloudeebusService:
         '''
         arguments: objectPath, xmlTemplate
         '''
-        objectPath = list[0]
+        self.agentObjectPath = list[0]
         xmlTemplate = list[1]
-        className = re.sub('/', '_', objectPath[1:])
+        className = re.sub('/', '_', self.agentObjectPath[1:])
         if (self.dynDBusClasses.has_key(className) == False):
             self.dynDBusClasses[className] = dynDBusClass(className, globals(), locals())
             self.dynDBusClasses[className].createDBusServiceFromXML(xmlTemplate)
-            self.dynDBusClasses[className].declare()
-#            self.dynDBusClass[className].p()
-
+            
+            # 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[className].class_code.exec_string)
+                        f.close()
+#                self.dynDBusClass[className].p()
+                self.dynDBusClasses[className].declare()
+            
             if (self.serviceAgents.has_key(className) == False):            
-                exe_str = "self.serviceAgents[" + className +"] = " + className + "(self.bus, callback=self.srvCB, objName=objectPath, busName=self.srvName)"
+                exe_str = "self.serviceAgents[" + className +"] = " + className + "(self.bus, callback=self.srvCB, objName=self.agentObjectPath, busName=self.srvName)"
                 exec (exe_str, globals(), locals())
                     
     @exportRpc