1 ///////////////////////////////////////////////////////////////////////////////
2 // This is a partial implementation of the tizen.application web specification
3 // which using a websocket server for implementing the native backend
5 var __application = function () {
9 var socket = new WebSocket("ws://localhost:7681", "app-list-protocol");
10 socket.onmessage = function(msg) {
11 appList = JSON.parse(msg.data);
16 this.launch = function (id, successCallback, errorCallback, argument) {
17 var cmd = {"cmd": "launch", "index": id};
18 socket.send(JSON.stringify(cmd));
20 this.getAppInfo = function(id) {
23 this.addAppInfoEventListener = function(eventCallback, errorCallback) {
24 callback = eventCallback;
28 var __callmanager = function () {
29 var calls = new Array();
30 var callHandlers = new Array();
31 var services = new Array();
33 var messagecb = function(msg) {
34 var ev = JSON.parse(msg.data);
36 if (ev.type == "ModemAdded") {
37 tizen.__account.addAccount(new tizen.Account(ev.ModemAdded, ev));
38 } else if (ev.type == "ModemRemoved") {
39 tizen.__account.deleteAccount(ev.id);
40 } else if (ev.type == "CallAdded") {
41 calls.push(new __call(this, socket, ev));
42 } else if (ev.type == "CallRemoved") {
43 var tmp = new Array();
45 if (calls[i].id != ev.id)
52 if (ev.State == "incoming") {
53 for (var index in callHandlers)
55 if (calls[i].id == ev.id)
56 callHandlers[index].onIncoming(calls[i]);
57 } else if (ev.State == "dialing") {
58 for (var index in callHandlers)
60 if (calls[i].id == ev.id)
61 callHandlers[index].onDialing(calls[i]);
62 } else if (ev.State == "alerting") {
63 for (var index in callHandlers)
65 if (calls[i].id == ev.id)
66 callHandlers[index].onAlerting(calls[i]);
67 } else if (ev.State == "hold") {
68 for (var index in callHandlers)
70 if (calls[i].id == ev.id)
71 callHandlers[index].onHold(calls[i]);
72 } else if (ev.State == "waiting") {
73 for (var index in callHandlers)
75 if (calls[i].id == ev.id)
76 callHandlers[index].onWaiting(calls[i]);
77 } else if (ev.State == "disconnected") {
78 for (var index in callHandlers)
80 if (calls[i].id == ev.id)
81 callHandlers[index].onDisconnected(calls[i]);
82 } else if (ev.State == "disconnecting") {
83 for (var index in callHandlers)
85 if (calls[i].id == ev.id)
86 callHandlers[index].onDisconnecting(calls[i]);
87 } else if (ev.State == "accepted") {
88 for (var index in callHandlers)
90 if (calls[i].id == ev.id)
91 callHandlers[index].onAccepted(calls[i]);
92 } else if (ev.State == "remotelyheld") {
93 for (var index in callHandlers)
95 if (calls[i].id == ev.id)
96 callHandlers[index].onRemotelyHeld(calls[i]);
97 } else if (ev.State == "active") {
98 for (var index in callHandlers)
100 if (calls[i].id == ev.id)
101 callHandlers[index].onActivated(calls[i]);
102 } else if (ev.State == "initializing") {
103 for (var index in callHandlers)
105 if (calls[i].id == ev.id)
106 callHandlers[index].onInitializing(calls[i]);
107 } else if (ev.State == "initialized") {
108 for (var index in callHandlers)
110 if (calls[i].id == ev.id)
111 callHandlers[index].onInitialized(calls[i]);
113 console.log("Unhandled state: " + ev.State);
116 // handlers do not have to implement every callback
123 socket = new WebSocket("ws://localhost:7681", "dialer-protocol");
124 socket.onmessage = messagecb;
125 socket.onclose = function() {
126 setTimeout(function() {
127 // abort reconnect if the socket has already recoverd
128 console.log(socket.readyState);
129 if (socket.readyState == 1)
132 // trigger the cleanup of accounts and callservices
133 services = new Array();
134 tizen.__account.__flush();
136 socket = new WebSocket("ws://localhost:7681", "dialer-protocol");
137 socket.onmessage = messagecb;
138 socket.onclose = openWS;
145 "onAccountUpdated": function(account) {
147 "onAccountAdded": function(account) {
148 services.push(new __callservice(socket, account.id));
150 "onAccountRemoved": function(id) {
151 var tmp = new Array();
152 for (var i in services)
153 if (services[i].id != id)
158 tizen.__account.addAccountListener(listener);
161 this.isCallInProgress = function() {
162 return calls.length > 0;
164 this.addCallHandler = function(handler, callServiceType, serviceName) {
165 callHandlers.push(handler);
167 this.removeCallHandler = function(handler) {
168 var tmp = new Array();
169 for (var item in callHandlers)
175 this.getCallService = function(account) {
177 for (var i in services)
178 if (services[i].id == account.id)
186 var __callservice = function (wsi, serviceid) {
190 this.__defineGetter__("id", function() {
194 this.launchDialer = function(remotePartyId) {
195 socket.send(JSON.stringify({ "cmd": "launchDialer" }));
198 var voicemailNumbers = new Array();
199 this.__defineGetter__("voiceNumbers", function() {
200 return voicemailNumbers;
203 this.makeCall = function(remotePartyId, handler, extension, localVideoOn) {
206 "remotePartyId": remotePartyId.toString(),
207 "extension": extension,
208 "localVideoOn": localVideoOn
210 socket.send(JSON.stringify(c));
214 var __call = function(manager, wsi, data) {
218 this.__defineGetter__("id", function() {
223 this.__defineGetter__("callData", function() {
227 var streamList = new Array();
228 this.__defineGetter__("streamList", function() {
232 this.accept = function() {
233 socket.send(JSON.stringify({"cmd": "accept", "path": id}));
235 this.reject = function() {
236 socket.send(JSON.stringify({"cmd": "reject"}));
238 this.wait = function() {
239 socket.send(JSON.stringify({"cmd": "wait"}));
241 this.redirect = function(rid) {
242 socket.send(JSON.stringify({"cmd": "redirect"}));
244 this.end = function() {
245 socket.send(JSON.stringify({"cmd": "end", "path": id}));
247 this.hold = function() {
248 socket.send(JSON.stringify({"cmd": "hold"}));
250 this.activate = function() {
251 socket.send(JSON.stringify({"cmd": "activate"}));
253 this.migrate = function(callService, callParticipant) {
254 socket.send(JSON.stringify({"cmd": "migrate", "callService": callService, "callParticipant": callParticipant}));
256 this.merge = function(otherCall) {
257 socket.send(JSON.stringify({"cmd": "merge", "otherCall": otherCall}));
259 this.drop = function(participant) {
260 socket.send(JSON.stringify({"cmd": "drop", "participant": participant}));
262 this.split = function(participant) {
263 socket.send(JSON.stringify({"cmd": "split", "participant": participant}));
265 this.addParticipant = function(remotePartyId, successCallback, errorCallback) {
267 this.addStream = function(addStream, successCallback, errorCallback) {
269 this.removeStream = function(addStream, successCallback, errorCallback) {
271 this.setAudioVolume = function(volume, successCallback, errorCallback) {
273 this.setMicrophoneSensitivity = function(sensitivity, successCallback, errorCallback) {
275 this.setLocalVideoEnabled = function(onoff, successCallback, errorCallback) {
277 this.sendDTMF = function(tones, duration, interval, successCallback, errorCallback) {
279 this.record = function() {
281 this.pause = function() {
285 var __accountmanager = function() {
286 var listeners = new Array();
287 var accounts = new Array();
289 this.findServices = function(filter) {
290 /* brain dead matching, patches accepted */
291 var result = new Array();
292 if (accounts.length == 0)
295 for (var i in accounts) {
297 for (var f in filter)
298 if (a[f] && a[f] == filter[f]) {
307 if (result.length == 0)
308 result.push(accounts[0]);
312 this.getAccountById = function(accountid) {
313 for (var i in accounts)
314 if (accounts[i].id == accountid)
318 this.deleteAccount = function(accountid) {
320 for (var i in accounts)
321 if (accountid != accounts[i].id)
325 for (var i in listeners)
326 listeners[i].onAccountRemoved(accountid);
328 this.addAccount = function(account) {
329 accounts.push(account);
330 for (var i in listeners)
331 listeners[i].onAccountAdded(account);
333 this.addAccountListener = function(observer, errorCallback) {
334 listeners.push(observer);
335 return listeners.length;
337 this.removeAccountListener = function(handle) {
339 for (var i in listeners)
341 l.push(listeners[i]);
345 this.__flush = function() {
346 for (var j in listeners) {
347 for (var k in accounts) {
348 listeners[j].onAccountRemoved(accounts[k].id);
351 accounts = new Array();
355 var __tizen = function() {
356 var application = null;
357 this.__defineGetter__("application", function() {
358 if (application == null)
359 application = new __application();
363 this.Account = function (accountId, accountProperties) {
365 var properties = accountProperties;
366 this.__defineGetter__("id", function() {
369 for (var p in properties) {
370 this.__defineGetter__(p, function() {
371 return properties[p];
377 this.__defineGetter__("call", function() {
379 // ensure the account object is created first
382 call = new __callmanager();
387 this.__defineGetter__("account", function() {
389 account = new __accountmanager();
391 // ensure the call object is always the first listener
392 // for new accounts, which means we need a backdoor to
393 // access the acount object before the getter has finished
394 // executing for the first time
395 this.__defineGetter__("__account", function() {
399 call = new __callmanager();
404 var tizen = new __tizen();