1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var g_next_async_call_id = 0;
6 var g_async_calls = [];
9 // Preserve 6 spaces to hold onreceived, onsent, ondeliverysuccess,
10 // ondeliveryerror, onserviceadded and onserviceremoved's
11 // callback functions.
12 var g_next_async_call_id = 6;
14 function AsyncCall(resolve, reject) {
15 this.resolve = resolve;
19 function createPromise(msg) {
20 var promise = new Promise(function(resolve, reject) {
21 g_async_calls[g_next_async_call_id] = new AsyncCall(resolve, reject);
23 msg.asyncCallId = g_next_async_call_id;
24 extension.postMessage(JSON.stringify(msg));
25 ++g_next_async_call_id;
29 function _isFunction(fn) {
30 return !!fn && !fn.nodeName && fn.constructor != String
31 && fn.constructor != RegExp && fn.constructor != Array
32 && /function/i.test( fn + "" );
35 function SmsManager() {}
37 SmsManager.prototype.type = "sms";
39 Object.defineProperty(SmsManager.prototype, 'serviceIDs', {
42 cmd: "msg_smsServiceId",
44 return JSON.parse(extension.internal.sendSyncMessage(JSON.stringify(_msg)));
48 SmsManager.prototype.send = function(to, text, serviceID) {
57 return postMessage(_msg);
60 SmsManager.prototype.clear = function(serviceID) {
67 return postMessage(_msg);
70 SmsManager.prototype.segmentInfo = function(text, serviceID) {
72 cmd: "msg_smsSegmentInfo",
78 return postMessage(_msg);
81 var sms = new SmsManager();
84 Object.defineProperty(exports.sms, 'onreceived', {
85 set: function(callback) {
86 _addEventListener(true, 'received', callback);
90 Object.defineProperty(exports.sms, 'onsent', {
91 set: function(callback) {
92 _addEventListener(true, 'sent', callback);
96 Object.defineProperty(exports.sms, 'ondeliverysuccess', {
97 set: function(callback) {
98 _addEventListener(true, 'deliverysuccess', callback);
102 Object.defineProperty(exports.sms, 'ondeliveryerror', {
103 set: function(callback) {
104 _addEventListener(true, 'deliveryerror', callback);
108 Object.defineProperty(exports.sms, 'onserviceadded', {
109 set: function(callback) {
110 _addEventListener(true, 'serviceadded', callback);
114 Object.defineProperty(exports.sms, 'onserviceremoved', {
115 set: function(callback) {
116 _addEventListener(true, 'serviceremoved', callback);
120 function _addEventListener(isOn, eventName, callback) {
121 if (typeof eventName !== 'string') {
122 console.log("Invalid parameters of eventName!");
126 if (!isOn && (typeof callback !== 'function')) {
127 console.log("Invalid parameters of callback!");
131 if (isOn && (typeof callback !== null) && (typeof callback !== 'function')) {
132 console.log("Invalid parameters of callback!");
137 'eventName': eventName,
144 switch(listener.eventName) {
146 g_listeners[0] = listener;
150 g_listeners[1] = listener;
153 case 'deliverysuccess':
154 g_listeners[2] = listener;
157 case 'deliveryerror':
158 g_listeners[3] = listener;
162 g_listeners[4] = listener;
165 case 'serviceremoved':
166 g_listeners[5] = listener;
170 console.log("Invalid event name!");
174 listener_id = g_next_async_call_id;
175 g_next_async_call_id += 1;
176 g_listeners[listener_id] = listener;
182 exports.sms.addEventListener = function(eventName, callback) {
183 return _addEventListener(false, eventName, callback);
186 function handleEvent(msg) {
187 for (var id in g_listeners) {
188 if (g_listeners[id]['eventName'] === msg.cmd && g_listeners[id]['callback']) {
189 g_listeners[id]['callback'](msg.data);
194 function MessagingCursor(element) {
195 this.messageIndex = 0;
196 this.element = element;
199 MessagingCursor.prototype.next = function() {
201 if (this.messageIndex > this.element.length) {
202 this.messageIndex = this.element.length;
205 ret = this.element[this.messageIndex];
212 MessagingCursor.prototype.previous = function() {
214 if (this.messageIndex < 0) {
215 this.messageIndex = 0;
218 ret = this.element[this.messageIndex];
225 function handleFindMessages(msgObj) {
226 if (msgObj.data.error) {
227 if (_isFunction(g_promises[msgObj.asyncCallId].reject)) {
228 g_promises[msgObj.asyncCallId].reject(msgObj.data.body);
231 if (_isFunction(g_promises[msgObj.asyncCallId].resolve)) {
232 var cursor = new MessagingCursor(msgObj.data.body.results);
233 g_promises[msgObj.asyncCallId].resolve(cursor);
237 delete g_promises[msgObj.asyncCallId];
240 function handlePromise(msgObj) {
241 if (msgObj.data.error) {
242 if (_isFunction(g_promises[msgObj.asyncCallId].reject)) {
243 g_promises[msgObj.asyncCallId].reject(msgObj.data.body);
246 if (_isFunction(g_promises[msgObj.asyncCallId].resolve)) {
247 g_promises[msgObj.asyncCallId].resolve(msgObj.data.body);
251 delete g_promises[msgObj.asyncCallId];
254 extension.setMessageListener(function(json) {
255 var _msg = JSON.parse(json);
260 case "deliverysuccess":
261 case "deliveryerror":
263 case "serviceadded": {
267 case "msg_findMessages_ret": {
268 handleFindMessages(_msg);
271 case "msg_smsSend_ret":
272 case "msg_smsClear_ret":
273 case "msg_smsSegmentInfo_ret":
274 case "msg_getMessage_ret":
275 case "msg_deleteMessage_ret":
276 case "msg_deleteConversation_ret":
277 case "msg_markMessageRead_ret":
278 case "msg_markConversationRead_ret": {
287 exports.findMessages = function(filter, options) {
289 cmd: "msg_findMessages",
295 return postMessage(_msg);
298 exports.findConversations = function(groupBy, filter, options) {
299 // TODO:(shawn) Spec is not ready for this part.
302 exports.getMessage = function(type, messageID) {
304 cmd: "msg_getMessage",
310 return postMessage(_msg);
313 exports.deleteMessage = function(type, messageID) {
315 cmd: "msg_deleteMessage",
321 return postMessage(_msg);
324 exports.deleteConversation = function(type, conversationID) {
326 cmd: "msg_deleteConversation",
329 conversationID: conversationID
332 return postMessage(_msg);
335 exports.markMessageRead = function(type, messageID, value) {
336 value = (typeof value === 'undefined') ? true : value;
338 cmd: "msg_markMessageRead",
341 messageID: messageID,
345 return postMessage(_msg);
348 exports.markConversationRead = function(type, conversationID, value) {
349 value = (typeof value === 'undefined') ? true : value;
351 cmd: "msg_markConversationRead",
354 conversationID: conversationID,
358 return postMessage(_msg);