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 socket = new WebSocket("ws://localhost:7681", "dialer-protocol");
32 var services = new Array();
35 "onAccountUpdated": function(account) {
37 "onAccountAdded": function(account) {
38 services.push(new __callservice(socket, account.id));
40 "onAccountRemoved": function(id) {
41 var tmp = new Array();
42 for (var i in services)
43 if (services[i].id != id)
48 tizen.__account.addAccountListener(listener);
50 socket.onmessage = function(msg) {
51 var ev = JSON.parse(msg.data);
53 if (ev.type == "ModemAdded") {
54 tizen.__account.addAccount(new tizen.Account(ev.ModemAdded, ev));
55 } else if (ev.type == "ModemRemoved") {
56 tizen.__account.deleteAccount(ev.id);
57 } else if (ev.type == "CallAdded") {
58 calls.push(new __call(this, socket, ev));
59 } else if (ev.type == "CallRemoved") {
60 var tmp = new Array();
62 if (calls[i].id != ev.id)
65 } else if (ev.type == "PropertyChanged" && ev.State) {
67 if (ev.State == "incoming") {
68 for (var index in callHandlers)
70 if (calls[i].id == ev.id)
71 callHandlers[index].onIncoming(calls[i]);
72 } else if (ev.State == "dialing") {
73 for (var index in callHandlers)
75 if (calls[i].id == ev.id)
76 callHandlers[index].onDialing(calls[i]);
77 } else if (ev.State == "alerting") {
78 for (var index in callHandlers)
80 if (calls[i].id == ev.id)
81 callHandlers[index].onAlerting(calls[i]);
82 } else if (ev.State == "hold") {
83 for (var index in callHandlers)
85 if (calls[i].id == ev.id)
86 callHandlers[index].onHold(calls[i]);
87 } else if (ev.State == "waiting") {
88 for (var index in callHandlers)
90 if (calls[i].id == ev.id)
91 callHandlers[index].onWaiting(calls[i]);
92 } else if (ev.State == "disconnected") {
93 for (var index in callHandlers)
95 if (calls[i].id == ev.id)
96 callHandlers[index].onDisconnected(calls[i]);
97 } else if (ev.State == "disconnecting") {
98 for (var index in callHandlers)
100 if (calls[i].id == ev.id)
101 callHandlers[index].onDisconnecting(calls[i]);
102 } else if (ev.State == "accepted") {
103 for (var index in callHandlers)
105 if (calls[i].id == ev.id)
106 callHandlers[index].onAccepted(calls[i]);
107 } else if (ev.State == "remotelyheld") {
108 for (var index in callHandlers)
110 if (calls[i].id == ev.id)
111 callHandlers[index].onRemotelyHeld(calls[i]);
112 } else if (ev.State == "active") {
113 for (var index in callHandlers)
115 if (calls[i].id == ev.id)
116 callHandlers[index].onActivated(calls[i]);
117 } else if (ev.State == "initializing") {
118 for (var index in callHandlers)
120 if (calls[i].id == ev.id)
121 callHandlers[index].onInitializing(calls[i]);
122 } else if (ev.State == "initialized") {
123 for (var index in callHandlers)
125 if (calls[i].id == ev.id)
126 callHandlers[index].onInitialized(calls[i]);
128 console.log("Unhandled state: " + ev.State);
131 // handlers do not have to implement every callback
134 console.log("Unhandled event");
140 this.isCallInProgress = function() {
141 return calls.length > 0;
143 this.addCallHandler = function(handler, callServiceType, serviceName) {
144 callHandlers.push(handler);
146 this.removeCallHandler = function(handler) {
147 var tmp = new Array();
148 for (var item in callHandlers)
154 this.getCallService = function(account) {
156 for (var i in services)
157 if (services[i].id == account.id)
165 var __callservice = function (wsi, serviceid) {
169 this.__defineGetter__("id", function() {
173 this.launchDialer = function(remotePartyId) {
174 socket.send(JSON.stringify({ "cmd": "launchDialer" }));
177 var voicemailNumbers = new Array();
178 this.__defineGetter__("voiceNumbers", function() {
179 return voicemailNumbers;
182 this.makeCall = function(remotePartyId, handler, extension, localVideoOn) {
185 "remotePartyId": remotePartyId.toString(),
186 "extension": extension,
187 "localVideoOn": localVideoOn
189 socket.send(JSON.stringify(c));
193 var __call = function(manager, wsi, data) {
197 this.__defineGetter__("id", function() {
202 this.__defineGetter__("callData", function() {
206 var streamList = new Array();
207 this.__defineGetter__("streamList", function() {
211 this.accept = function() {
212 socket.send(JSON.stringify({"cmd": "accept"}));
214 this.reject = function() {
215 socket.send(JSON.stringify({"cmd": "reject"}));
217 this.wait = function() {
218 socket.send(JSON.stringify({"cmd": "wait"}));
220 this.redirect = function(rid) {
221 socket.send(JSON.stringify({"cmd": "redirect"}));
223 this.end = function() {
224 socket.send(JSON.stringify({"cmd": "end", "path": id}));
226 this.hold = function() {
227 socket.send(JSON.stringify({"cmd": "hold"}));
229 this.activate = function() {
230 socket.send(JSON.stringify({"cmd": "activate"}));
232 this.migrate = function(callService, callParticipant) {
233 socket.send(JSON.stringify({"cmd": "migrate", "callService": callService, "callParticipant": callParticipant}));
235 this.merge = function(otherCall) {
236 socket.send(JSON.stringify({"cmd": "merge", "otherCall": otherCall}));
238 this.drop = function(participant) {
239 socket.send(JSON.stringify({"cmd": "drop", "participant": participant}));
241 this.split = function(participant) {
242 socket.send(JSON.stringify({"cmd": "split", "participant": participant}));
244 this.addParticipant = function(remotePartyId, successCallback, errorCallback) {
246 this.addStream = function(addStream, successCallback, errorCallback) {
248 this.removeStream = function(addStream, successCallback, errorCallback) {
250 this.setAudioVolume = function(volume, successCallback, errorCallback) {
252 this.setMicrophoneSensitivity = function(sensitivity, successCallback, errorCallback) {
254 this.setLocalVideoEnabled = function(onoff, successCallback, errorCallback) {
256 this.sendDTMF = function(tones, duration, interval, successCallback, errorCallback) {
258 this.record = function() {
260 this.pause = function() {
264 var __accountmanager = function() {
265 var listeners = new Array();
266 var accounts = new Array();
268 this.findServices = function(filter) {
269 /* brain dead matching, patches accepted */
270 var result = new Array();
271 if (accounts.length == 0)
274 for (var i in accounts) {
276 for (var f in filter)
277 if (a[f] && a[f] == filter[f]) {
286 if (result.length == 0)
287 result.push(accounts[0]);
291 this.getAccountById = function(accountid) {
292 for (var i in accounts)
293 if (accounts[i].id == accountid)
297 this.deleteAccount = function(accountid) {
299 for (var i in accounts)
300 if (accountid != accounts[i].id)
304 for (var i in listeners)
305 listeners[i].onAccountRemoved(accountid);
307 this.addAccount = function(account) {
308 accounts.push(account);
309 for (var i in listeners)
310 listeners[i].onAccountAdded(account);
312 this.addAccountListener = function(observer, errorCallback) {
313 listeners.push(observer);
314 return listeners.length;
316 this.removeAccountListener = function(handle) {
318 for (var i in listeners)
320 l.push(listeners[i]);
325 var __tizen = function() {
326 var application = null;
327 this.__defineGetter__("application", function() {
328 if (application == null)
329 application = new __application();
333 this.Account = function (accountId, accountProperties) {
335 var properties = accountProperties;
336 this.__defineGetter__("id", function() {
339 for (var p in properties) {
340 this.__defineGetter__(p, function() {
341 return properties[p];
347 this.__defineGetter__("call", function() {
349 // ensure the account object is created first
352 call = new __callmanager();
357 this.__defineGetter__("account", function() {
359 account = new __accountmanager();
361 // ensure the call object is always the first listener
362 // for new accounts, which means we need a backdoor to
363 // access the acount object before the getter has finished
364 // executing for the first time
365 this.__defineGetter__("__account", function() {
369 call = new __callmanager();
374 var tizen = new __tizen();