};
+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);
+};
+
/*****************************************************************************/
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);
-};
-/*****************************************************************************/
# XML parser module
from xml.etree.ElementTree import XMLParser
+# For debug only
+import os
+
###############################################################################
VERSION = "0.2.1"
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()
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 + '"'
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
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):
'''
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