4cf39fd4eca0ea5bdd00b8d58c0dabc0ff45b907
[contrib/cloudeebus.git] / src / js / cloudeebus-connection.js
1 /******************************************************************************
2  * Copyright 2012 - 2013 Intel Corporation.
3  * 
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
7  * 
8  * http://www.apache.org/licenses/LICENSE-2.0
9  * 
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  *****************************************************************************/
16
17
18
19 /*****************************************************************************/
20
21 var dbus = { // hook object for dbus types not translated by python-json
22                 Double: function(value, level) {
23                         return value;
24                 }
25 };
26
27
28
29 /*****************************************************************************/
30
31 var cloudeebus = window.cloudeebus = {
32                 version: "0.6.0",
33                 minVersion: "0.6.0"
34 };
35
36 cloudeebus.reset = function() {
37         cloudeebus.sessionBus = null;
38         cloudeebus.systemBus = null;
39         cloudeebus.wampSession = null;
40         cloudeebus.uri = null;
41 };
42
43
44 cloudeebus.log = function(msg) { 
45 };
46
47 cloudeebus.getError = function(error) {
48         if (error.desc && error.uri)
49                 return error.desc + " : " + error.uri; // Python exception (cloudeebus.py)
50         if (error.desc)
51                 return error.desc;
52         if (error.uri)
53                 return error.uri;
54         if (error.name && error.message)
55                 return error.name + " : " + error.message; // Javascript exception
56         if (error.message)
57                 return error.message;
58         if (error.name)
59                 return error.name;
60         return error; // Autobahn error
61 };
62
63 cloudeebus.versionCheck = function(version) {
64         var ver = version.split(".");
65         var min = cloudeebus.minVersion.split(".");
66         for (var i=0; i<ver.length; i++) {
67                 if (Number(ver[i]) > Number(min[i]))
68                         return true;
69                 if (Number(ver[i]) < Number(min[i]))
70                         return false;
71         }
72         return true;
73 };
74
75
76 cloudeebus.connect = function(uri, manifest, successCB, errorCB) {
77         cloudeebus.reset();
78         cloudeebus.uri = uri;
79         
80         function onCloudeebusVersionCheckCB(version) {
81                 if (cloudeebus.versionCheck(version)) {
82                         cloudeebus.log("Connected to " + cloudeebus.uri);
83                         if (successCB)
84                                 successCB();
85                 } else {
86                         var errorMsg = "Cloudeebus server version " + version + " unsupported, need version " + cloudeebus.minVersion + " or superior";
87                         cloudeebus.log(errorMsg);
88                         if (errorCB)
89                                 errorCB(errorMsg);
90                 }
91         }
92         
93         function onWAMPSessionAuthErrorCB(error) {
94                 var errorStr = cloudeebus.getError(error);
95                 cloudeebus.log("Authentication error: " + errorStr);
96                 if (errorCB)
97                         errorCB(errorStr);
98         }
99         
100         function onWAMPSessionAuthenticatedCB(permissions) {
101                 cloudeebus.sessionBus = new cloudeebus.BusConnection("session", cloudeebus.wampSession);
102                 cloudeebus.systemBus = new cloudeebus.BusConnection("system", cloudeebus.wampSession);
103                 cloudeebus.wampSession.call("getVersion").then(onCloudeebusVersionCheckCB, errorCB);
104         }
105         
106         function onWAMPSessionChallengedCB(challenge) {
107                 var signature = cloudeebus.wampSession.authsign(challenge, manifest.key);
108                 cloudeebus.wampSession.auth(signature).then(onWAMPSessionAuthenticatedCB, onWAMPSessionAuthErrorCB);
109         }
110         
111         function onWAMPSessionConnectedCB(session) {
112                 cloudeebus.wampSession = session;
113                 if (manifest)
114                         cloudeebus.wampSession.authreq(
115                                         manifest.name, 
116                                         {permissions: manifest.permissions, 
117                                                  services: manifest.services}
118                                 ).then(onWAMPSessionChallengedCB, onWAMPSessionAuthErrorCB);
119                 else
120                         cloudeebus.wampSession.authreq().then(function() {
121                                 cloudeebus.wampSession.auth().then(onWAMPSessionAuthenticatedCB, onWAMPSessionAuthErrorCB);
122                                 }, onWAMPSessionAuthErrorCB);
123         }
124
125         function onWAMPSessionErrorCB(code, reason) {
126                 if (code == ab.CONNECTION_UNSUPPORTED) {
127                         cloudeebus.log("Browser is not supported");
128                 }
129                 else {
130                         cloudeebus.log("Failed to open session, code = " + code + ", reason = " + reason);
131                 }
132                 if (errorCB)
133                         errorCB(reason);
134         }
135
136         return ab.connect(cloudeebus.uri, onWAMPSessionConnectedCB, onWAMPSessionErrorCB);
137 };
138
139
140 cloudeebus.SessionBus = function() {
141         return cloudeebus.sessionBus;
142 };
143
144
145 cloudeebus.SystemBus = function() {
146         return cloudeebus.systemBus;
147 };
148
149
150
151 /*****************************************************************************/
152
153 cloudeebus.BusConnection = function(name, session) {
154         this.name = name;
155         this.wampSession = session;
156         return this;
157 };
158
159
160 cloudeebus.BusConnection.prototype.getObject = function(busName, objectPath, introspectCB, errorCB) {
161         var proxy = new cloudeebus.ProxyObject(this.wampSession, this, busName, objectPath);
162         if (introspectCB)
163                 proxy._introspect(introspectCB, errorCB);
164         return proxy;
165 };
166
167
168 cloudeebus.BusConnection.prototype.addService = function(serviceName) {
169         var self = this;
170
171         var promise = new cloudeebus.Promise(function (resolver) {
172                 var cloudeebusService = new cloudeebus.Service(self.wampSession, self, serviceName);
173         
174                 function ServiceAddedSuccessCB(serviceName) {
175                         cloudeebusService.isCreated = true;
176                         resolver.fulfill(cloudeebusService, true);
177                 }
178                 
179                 function ServiceAddedErrorCB(error) {
180                         var errorStr = cloudeebus.getError(error);
181                         cloudeebus.log("Error adding service method: " + self.name + ", error: " + errorStr);
182                         resolver.reject(errorStr, true);
183                 }
184
185                 var arglist = [
186                     self.name,
187                     serviceName
188                     ];
189
190                 // call dbusSend with bus type, destination, object, message and arguments
191                 self.wampSession.call("serviceAdd", arglist).then(ServiceAddedSuccessCB, ServiceAddedErrorCB);
192         });
193         
194         return promise;
195 };
196
197
198