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.
6 var _next_promise_id = 0;
8 // Preserve 6 spaces to hold onreceived, onsent, ondeliverysuccess,
9 // ondeliveryerror, onserviceadded and onserviceremoved's
10 // callback functions.
11 var _next_listener_id = 6;
13 var Promise = requireNative('sysapps_promise').Promise;
15 var postMessage = function(msg) {
16 var p = new Promise();
18 _promises[_next_promise_id] = p;
19 msg._promise_id = _next_promise_id.toString();
20 _next_promise_id += 1;
22 extension.postMessage(JSON.stringify(msg));
26 function _isFunction(fn) {
27 return !!fn && !fn.nodeName && fn.constructor != String
28 && fn.constructor != RegExp && fn.constructor != Array
29 && /function/i.test( fn + "" );
32 function SmsManager() {}
34 SmsManager.prototype.type = "sms";
36 Object.defineProperty(SmsManager.prototype, 'serviceIDs', {
39 cmd: "msg_smsServiceId",
41 return JSON.parse(extension.internal.sendSyncMessage(JSON.stringify(_msg)));
45 SmsManager.prototype.send = function(to, text, serviceID) {
54 return postMessage(_msg);
57 SmsManager.prototype.clear = function(serviceID) {
64 return postMessage(_msg);
67 SmsManager.prototype.segmentInfo = function(text, serviceID) {
69 cmd: "msg_smsSegmentInfo",
75 return postMessage(_msg);
78 var sms = new SmsManager();
81 Object.defineProperty(exports.sms, 'onreceived', {
82 set: function(callback) {
83 _addEventListener(true, 'received', callback);
87 Object.defineProperty(exports.sms, 'onsent', {
88 set: function(callback) {
89 _addEventListener(true, 'sent', callback);
93 Object.defineProperty(exports.sms, 'ondeliverysuccess', {
94 set: function(callback) {
95 _addEventListener(true, 'deliverysuccess', callback);
99 Object.defineProperty(exports.sms, 'ondeliveryerror', {
100 set: function(callback) {
101 _addEventListener(true, 'deliveryerror', callback);
105 Object.defineProperty(exports.sms, 'onserviceadded', {
106 set: function(callback) {
107 _addEventListener(true, 'serviceadded', callback);
111 Object.defineProperty(exports.sms, 'onserviceremoved', {
112 set: function(callback) {
113 _addEventListener(true, 'serviceremoved', callback);
117 function _addEventListener(isOn, eventName, callback) {
118 if (typeof eventName !== 'string') {
119 console.log("Invalid parameters of eventName!");
123 if (!isOn && (typeof callback !== 'function')) {
124 console.log("Invalid parameters of callback!");
128 if (isOn && (typeof callback !== null) && (typeof callback !== 'function')) {
129 console.log("Invalid parameters of callback!");
134 'eventName': eventName,
141 switch(listener.eventName) {
143 _listeners[0] = listener;
147 _listeners[1] = listener;
150 case 'deliverysuccess':
151 _listeners[2] = listener;
154 case 'deliveryerror':
155 _listeners[3] = listener;
159 _listeners[4] = listener;
162 case 'serviceremoved':
163 _listeners[5] = listener;
167 console.log("Invalid event name!");
171 listener_id = _next_listener_id;
172 _next_listener_id += 1;
173 _listeners[listener_id] = listener;
179 exports.sms.addEventListener = function(eventName, callback) {
180 return _addEventListener(false, eventName, callback);
183 function handleEvent(msg) {
184 for (var id in _listeners) {
185 if (_listeners[id]['eventName'] === msg.cmd && _listeners[id]['callback']) {
186 _listeners[id]['callback'](msg.data);
191 function MessagingCursor(element) {
192 this.messageIndex = 0;
193 this.element = element;
196 MessagingCursor.prototype.next = function() {
198 if (this.messageIndex > this.element.length) {
199 this.messageIndex = this.element.length;
202 ret = this.element[this.messageIndex];
209 MessagingCursor.prototype.previous = function() {
211 if (this.messageIndex < 0) {
212 this.messageIndex = 0;
215 ret = this.element[this.messageIndex];
222 function handleFindMessages(msgObj) {
223 if (msgObj.data.error) {
224 if (_isFunction(_promises[msgObj._promise_id].reject)) {
225 _promises[msgObj._promise_id].reject(msgObj.data.body);
228 if (_isFunction(_promises[msgObj._promise_id].fulfill)) {
229 var cursor = new MessagingCursor(msgObj.data.body.results);
230 _promises[msgObj._promise_id].fulfill(cursor);
234 delete _promises[msgObj._promise_id];
237 function handlePromise(msgObj) {
238 if (msgObj.data.error) {
239 if (_isFunction(_promises[msgObj._promise_id].reject)) {
240 _promises[msgObj._promise_id].reject(msgObj.data.body);
243 if (_isFunction(_promises[msgObj._promise_id].fulfill)) {
244 _promises[msgObj._promise_id].fulfill(msgObj.data.body);
248 delete _promises[msgObj._promise_id];
251 extension.setMessageListener(function(json) {
252 var _msg = JSON.parse(json);
257 case "deliverysuccess":
258 case "deliveryerror":
260 case "serviceadded": {
264 case "msg_findMessages_ret": {
265 handleFindMessages(_msg);
268 case "msg_smsSend_ret":
269 case "msg_smsClear_ret":
270 case "msg_smsSegmentInfo_ret":
271 case "msg_getMessage_ret":
272 case "msg_deleteMessage_ret":
273 case "msg_deleteConversation_ret":
274 case "msg_markMessageRead_ret":
275 case "msg_markConversationRead_ret": {
284 exports.findMessages = function(filter, options) {
286 cmd: "msg_findMessages",
292 return postMessage(_msg);
295 exports.findConversations = function(groupBy, filter, options) {
296 // TODO:(shawn) Spec is not ready for this part.
299 exports.getMessage = function(type, messageID) {
301 cmd: "msg_getMessage",
307 return postMessage(_msg);
310 exports.deleteMessage = function(type, messageID) {
312 cmd: "msg_deleteMessage",
318 return postMessage(_msg);
321 exports.deleteConversation = function(type, conversationID) {
323 cmd: "msg_deleteConversation",
326 conversationID: conversationID
329 return postMessage(_msg);
332 exports.markMessageRead = function(type, messageID, value) {
333 value = (typeof value === 'undefined') ? true : value;
335 cmd: "msg_markMessageRead",
338 messageID: messageID,
342 return postMessage(_msg);
345 exports.markConversationRead = function(type, conversationID, value) {
346 value = (typeof value === 'undefined') ? true : value;
348 cmd: "msg_markConversationRead",
351 conversationID: conversationID,
355 return postMessage(_msg);