adding signal emission
[contrib/cloudeebus.git] / cloudeebus / cloudeebus.py
index 936dd3e..0f85747 100755 (executable)
@@ -229,6 +229,8 @@ class XmlCbParser: # The target object of the parser
                                                 attrib['type'])
                 return
             if (self.current == 'signal'):
+                if (attrib.has_key('name') == False):
+                    attrib['name'] = 'value'
                 self.dynDBusClass.add_signature(attrib['name'], 'in',
                                                 attrib['type'])
                 return
@@ -488,15 +490,33 @@ class CloudeebusService:
 
 
     @exportRpc
+    def emitSignal(self, list):
+        '''
+        arguments: agentObjectPath, signalName, result (to emit)
+        '''
+        objectPath = list[0]
+        className = re.sub('/', '_', objectPath[1:])
+        signalName = list[1]
+        result = list[2]
+        if (self.serviceAgents.has_key(className) == True):
+            exe_str = "self.serviceAgents['"+ className +"']."+ signalName + "(" + str(result) + ")"
+            eval(exe_str, self.globalCtx, self.localCtx)
+        else:
+            raise Exception("No object path " + objectPath)
+
+    @exportRpc
     def returnMethod(self, list):
         '''
-        arguments: methodId, success (=true, error otherwise), result (to return)
+        arguments: methodId, callIndex, success (=true, error otherwise), result (to return)
         '''
         methodId = list[0]
-        success = list[1]
-        result = list[2]
+        callIndex = list[1]
+        success = list[2]
+        result = list[3]
         if (self.servicePendingCalls.has_key(methodId)):
-            cb = self.servicePendingCalls[methodId]
+            cb = self.servicePendingCalls[methodId]['calls'][callIndex]
+            if cb is None:
+                raise Exception("No pending call " + str(callIndex) + " for methodID " + methodId)
             if (success):                
                 successCB = cb["successCB"]
                 if (result != None):
@@ -509,7 +529,10 @@ class CloudeebusService:
                     errorCB(result)
                 else:
                     errorCB()
-            del self.servicePendingCalls[methodId]
+            self.servicePendingCalls[methodId]['calls'][callIndex] = None
+            self.servicePendingCalls[methodId]['count'] = self.servicePendingCalls[methodId]['count'] - 1
+            if self.servicePendingCalls[methodId]['count'] == 0:
+                del self.servicePendingCalls[methodId]
         else:
             raise Exception("No methodID " + methodId)
 
@@ -517,8 +540,12 @@ class CloudeebusService:
         methodId = self.srvName + "#" + self.agentObjectPath + "#" + name
         cb = { 'successCB': async_succes_cb, 
                'errorCB': async_error_cb}
-        self.servicePendingCalls[methodId] = cb
-        factory.dispatch(methodId, json.dumps(args))
+        if methodId not in self.servicePendingCalls:
+            self.servicePendingCalls[methodId] = {'count': 0, 'calls': []}
+        pendingCallStr = json.dumps({'callIndex': len(self.servicePendingCalls[methodId]['calls']), 'args': args})
+        self.servicePendingCalls[methodId]['calls'].append(cb)
+        self.servicePendingCalls[methodId]['count'] = self.servicePendingCalls[methodId]['count'] + 1
+        factory.dispatch(methodId, pendingCallStr)
                     
     @exportRpc
     def serviceAdd(self, list):