1 /******************************************************************************
2 * Copyright 2012 - 2013 Intel Corporation.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
19 /*****************************************************************************/
21 cloudeebus.Agent = function(objectPath, handler, xml) {
23 this.objectPath = objectPath;
24 this.handler = handler;
29 cloudeebus.Service = function(session, busConnection, name) {
30 this.wampSession = session;
31 this.busConnection = busConnection;
34 this.isCreated = false;
39 cloudeebus.Service.prototype.remove = function() {
42 var promise = new cloudeebus.Promise(function (resolver) {
43 function ServiceRemovedSuccessCB(serviceName) {
44 resolver.fulfill(serviceName, true);
47 function ServiceRemovedErrorCB(error) {
48 var errorStr = cloudeebus.getError(error);
49 resolver.reject(errorStr, true);
56 // call dbusSend with bus type, destination, object, message and arguments
57 self.wampSession.call("serviceRelease", arglist).then(ServiceRemovedSuccessCB, ServiceRemovedErrorCB);
64 cloudeebus.Service.prototype._searchMethod = function(ifName, method, objectJS) {
66 var funcToCall = null;
68 // Check if 'objectJS' has a member 'interfaceProxies' with an interface named 'ifName'
69 // and a method named 'method'
70 if (objectJS.interfaceProxies && objectJS.interfaceProxies[ifName] &&
71 objectJS.interfaceProxies[ifName][method]) {
72 funcToCall = objectJS.interfaceProxies[ifName][method];
74 // retrieve the method directly from 'root' of objectJs
75 funcToCall = objectJS[method];
82 cloudeebus.Service.prototype._addMethod = function(ifName, method, agent) {
85 var methodId = this.name + "#" + agent.objectPath + "#" + ifName + "#" + method;
86 var funcToCall = this._searchMethod(ifName, method, agent.handler);
88 if (funcToCall == null)
89 cloudeebus.log("Method " + method + " doesn't exist in Javascript object");
91 agent.handler.wrapperFunc[method] = function() {
93 var methodId = arguments[0];
95 // affectation of callDict in eval, otherwise dictionary(='{}') interpreted as block of code by eval
96 eval("callDict = " + arguments[1]);
98 result = funcToCall.apply(agent.handler, callDict.args);
99 service._returnMethod(methodId, callDict.callIndex, true, result);
102 var errorStr = cloudeebus.getError(e);
103 cloudeebus.log("Method " + ifName + "." + method + " call on " + agent.objectPath + " exception: " + errorStr);
104 service._returnMethod(methodId, callDict.callIndex, false, errorStr);
107 agent.handler.methodId[agent.objectPath].push(methodId);
108 this.wampSession.subscribe(methodId, agent.handler.wrapperFunc[method]);
113 cloudeebus.Service.prototype._addSignal = function(ifName, signal, agent) {
116 if (agent.handler[signal])
117 cloudeebus.log("Signal '" + signal + "' emitter already implemented");
119 agent.handler[signal] = function() {
121 for (var i=0; i < arguments.length; i++ )
122 args.push(arguments[i]);
123 service._emitSignal(agent.objectPath, signal, args);
129 cloudeebus.Service.prototype._createWrapper = function(agent) {
131 var parser = new DOMParser();
132 var xmlDoc = parser.parseFromString(agent.xml, "text/xml");
133 var ifXml = xmlDoc.getElementsByTagName("interface");
134 agent.handler.wrapperFunc = {};
135 agent.handler.methodId = {};
136 agent.handler.methodId[agent.objectPath] = [];
137 for (var i=0; i < ifXml.length; i++) {
138 var ifName = ifXml[i].attributes.getNamedItem("name").value;
139 var ifChild = ifXml[i].firstChild;
141 if (ifChild.nodeName == "method") {
142 var metName = ifChild.attributes.getNamedItem("name").value;
143 self._addMethod(ifName, metName, agent);
145 if (ifChild.nodeName == "signal") {
146 var metName = ifChild.attributes.getNamedItem("name").value;
147 self._addSignal(ifName, metName, agent);
149 ifChild = ifChild.nextSibling;
155 cloudeebus.Service.prototype.addAgent = function(agent) {
158 var promise = new cloudeebus.Promise(function (resolver) {
159 function ServiceAddAgentSuccessCB(objPath) {
160 self.agents.push(agent);
162 self._createWrapper(agent);
165 var errorStr = cloudeebus.getError(e);
166 cloudeebus.log("Exception creating agent wrapper " + agent.objectPath + " : " + errorStr);
167 resolver.reject(errorStr, true);
170 resolver.fulfill(objPath, true);
173 function ServiceAddAgenterrorCB(error) {
174 var errorStr = cloudeebus.getError(error);
175 cloudeebus.log("Error adding agent : " + agent.objectPath + ", error: " + errorStr);
176 resolver.reject(errorStr, true);
185 // call dbusSend with bus type, destination, object, message and arguments
186 self.wampSession.call("serviceAddAgent", arglist).then(ServiceAddAgentSuccessCB, ServiceAddAgenterrorCB);
193 cloudeebus.Service.prototype._deleteWrapper = function(agent) {
194 var objJs = agent.handler;
195 if (objJs.methodId[agent.objectPath]) {
196 while (objJs.methodId[agent.objectPath].length) {
198 this.wampSession.unsubscribe( objJs.methodId[agent.objectPath].pop() );
201 cloudeebus.log("Unsubscribe error: " + cloudeebus.getError(e));
204 objJs.methodId[agent.objectPath] = null;
209 cloudeebus.Service.prototype.removeAgent = function(rmAgent) {
212 var promise = new cloudeebus.Promise(function (resolver) {
213 function ServiceRemoveAgentSuccessCB(objectPath) {
214 // Searching agent in list
215 for (var idx in self.agents)
216 if (self.agents[idx].objectPath == objectPath) {
217 agent = self.agents[idx];
221 self.agents.splice(idx, 1);
222 self._deleteWrapper(agent);
223 resolver.fulfill(agent, true);
226 function ServiceRemoveAgentErrorCB(error) {
227 var errorStr = cloudeebus.getError(error);
228 cloudeebus.log("Error removing agent : " + rmAgent.objectPath + ", error: " + errorStr);
229 resolver.reject(errorStr, true);
236 // call dbusSend with bus type, destination, object, message and arguments
237 self.wampSession.call("serviceDelAgent", arglist).then(ServiceRemoveAgentSuccessCB, ServiceRemoveAgentErrorCB);
244 cloudeebus.Service.prototype._returnMethod = function(methodId, callIndex, success, result, successCB, errorCB) {
252 this.wampSession.call("returnMethod", arglist).then(successCB, errorCB);
256 cloudeebus.Service.prototype._emitSignal = function(objectPath, signalName, args, successCB, errorCB) {
263 this.wampSession.call("emitSignal", arglist).then(successCB, errorCB);