}
};
-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) {
}
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;
}
# XML parser module
from xml.etree.ElementTree import XMLParser
+# For debug only
+import os
###############################################################################
## 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()
## 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):
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
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:
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)
}
};
+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() {