2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 var validator_ = xwalk.utils.validator;
18 var types_ = validator_.Types;
19 var T_ = xwalk.utils.type;
20 var bridge = xwalk.utils.NativeBridge(extension, true);
22 function throwException_(err) {
23 throw new WebAPIException(err.code, err.name, err.message);
27 W: 1 << 0, // WRITABLE
28 E: 1 << 1, // ENUMERABLE
29 C: 1 << 2 // CONFIGURABLE
32 function addTypeToFilter_(data)
36 for(var field in data) {
37 filter[field] = data[field];
40 if (data instanceof tizen.AttributeFilter) {
41 filter.filterType = "AttributeFilter";
43 filter.matchValue = String(filter.matchValue);
44 } else if (data instanceof tizen.AttributeRangeFilter) {
45 filter.filterType = "AttributeRangeFilter";
46 } else if (data instanceof tizen.CompositeFilter) {
47 filter.filterType = "CompositeFilter";
48 // recursively convert all sub-filters
50 for (var i = 0; i < data.filters.length; ++i) {
51 filter.filters[i] = addTypeToFilter_(data.filters[i]);
54 filter.filterType = "Unknown";
62 * function Messaging () {
63 * propertyFactory_(this, 'ids', [2,3,4], Property.W | Property.E | Property.C);
64 * propertyFactory_(this, 'name', 'Name', Property.E);
65 * propertyFactory_(this, 'age', 25, Property.W);
66 * propertyFactory_(this, 'something', 1);
67 * propertyFactory_(this, 'getSomething', Property.E, {get: function(){return 100;}});
70 * var m = new Messaging();
77 * m.name = 'A brand new name';
78 * console.log(m.name); // Name
80 function propertyFactory_(that, name, value, flags, options) {
82 if (options === null || typeof options !== 'object') {
85 if (!(options.get) && !(options.set)) {
86 options.value = value;
88 if ((flags & Property.W) != 0) { options.writable = true; }
89 if ((flags & Property.E) != 0) { options.enumerable = true; }
90 if ((flags & Property.C) != 0) { options.configurable = true; }
91 Object.defineProperty(
98 function InternalValues_(data) {
99 if (!(this instanceof InternalValues_)) {
100 return new InternalValues_(data);
102 for(var key in data) {
103 if (data.hasOwnProperty(key)) {
104 this[key] = data[key];
109 function updateInternal_(internal, data) {
110 var values = new InternalValues_(data);
111 for(var key in data) {
112 if (values.hasOwnProperty(key) && internal.hasOwnProperty(key)) {
113 internal[key] = values;
119 * Specifies the Messaging service tags.
121 var MessageServiceTag = ['messaging.sms', 'messaging.mms', 'messaging.email'];
123 function Message(type, data) {
124 if (!(this instanceof Message)) {
125 throw new TypeError("Constructor called like a function");
127 if (MessageServiceTag.indexOf(type) === -1) {
128 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
130 if ( !data || typeof data !== 'object') { // 'data' is optional
134 // set initial data from internal MessageInit_ object or to default values
135 var internal = data instanceof MessageInit_,
136 id = internal ? data.id : null,
137 conversationId = internal ? data.conversationId : null,
138 folderId = internal ? data.folderId : null,
139 timestamp = internal ? data.timestamp : null,
140 from = internal ? data.from : null,
141 hasAttachment = internal ? data.hasAttachment : false,
142 isRead = internal ? data.isRead : false,
143 inResponseTo = internal ? data.inResponseTo : null;
144 // create MessageBody object
145 var body = new MessageBody({messageId: id, plainBody: data.plainBody, htmlBody: data.htmlBody});
146 // check 'to', 'cc' and 'bcc' fields
148 if (!(to instanceof Array)) {
152 if (!(cc instanceof Array)) {
156 if (!(bcc instanceof Array)) {
159 // 'attachments' private variable, getter and setter
160 var attachments = (internal ? data.attachments : []) || [];
164 conversationId: conversationId || null,
165 folderId: folderId || null,
167 timestamp: timestamp || null,
173 isRead: isRead || false,
174 hasAttachment: hasAttachment || false,
175 isHighPriority: data.isHighPriority || false,
176 subject: data.subject || '',
177 inResponseTo: inResponseTo || null,
178 attachments: attachments
181 Object.defineProperty(
185 get: function () {return _internal.id;},
186 set: function (value) { if (value instanceof InternalValues_) _internal.id = value.id;},
192 Object.defineProperty(
196 get: function () {return _internal.conversationId;},
197 set: function (value) {
198 if (value instanceof InternalValues_)
199 _internal.conversationId = value.conversationId;
206 Object.defineProperty(
210 get: function () {return _internal.folderId;},
211 set: function (value) {
212 if (value instanceof InternalValues_) _internal.folderId = value.folderId;
219 Object.defineProperty(
223 get: function () {return _internal.type;},
224 set: function (value) {return;},
230 Object.defineProperty(
235 return _internal.timestamp ? new Date(_internal.timestamp * 1000) : _internal.timestamp;
237 set: function (value) {
238 if (value instanceof InternalValues_) {
239 _internal.timestamp = value.timestamp;
247 Object.defineProperty(
251 get: function () {return _internal.from;},
252 set: function (value) {
253 if (value instanceof InternalValues_) _internal.from = value.from;
260 Object.defineProperty(
264 get: function () {return _internal.to;},
265 set: function (value) {
266 if (value instanceof InternalValues_) value = value.to;
267 if (value instanceof Array) _internal.to = value;
274 Object.defineProperty(
278 get: function () {return _internal.cc;},
279 set: function (value) {
280 if (value instanceof InternalValues_) value = value.cc;
281 if (value instanceof Array) _internal.cc = value;
288 Object.defineProperty(
292 get: function () {return _internal.bcc;},
293 set: function (value) {
294 if (value instanceof InternalValues_) value = value.bcc;
295 if (value instanceof Array) _internal.bcc = value;
302 Object.defineProperty(
306 get: function () {return _internal.body;},
307 set: function (value) {
308 if (value instanceof InternalValues_) _internal.body = new MessageBody(value.body);
309 if (value instanceof MessageBody) _internal.body = value;
316 Object.defineProperty(
320 get: function () {return _internal.isRead;},
321 set: function (value) {
322 if (value instanceof InternalValues_) {value = value.isRead;}
323 _internal.isRead = !!value;
330 Object.defineProperty(
334 get: function () {return _internal.attachments.length > 0;},
335 set: function (value) {
336 if (value instanceof InternalValues_)
337 _internal.hasAttachment = value.hasAttachment;
344 Object.defineProperty(
348 get: function () {return _internal.isHighPriority;},
349 set: function (value) {
350 if (value instanceof InternalValues_) value = value.isHighPriority;
351 _internal.isHighPriority = !!value;
358 Object.defineProperty(
362 get: function () {return _internal.subject;},
363 set: function (value) {
364 if (value instanceof InternalValues_) value = value.subject;
365 _internal.subject = String(value);
372 Object.defineProperty(
376 get: function () {return _internal.inResponseTo;},
377 set: function (value) {
378 if (value instanceof InternalValues_) _internal.inResponseTo = value.inResponseTo;
385 Object.defineProperty(
392 cmd: 'Message_messageStatus',
402 set: function (value) {return;},
408 Object.defineProperty(
412 get: function () {return _internal.attachments;},
413 set: function(value) {
414 if (value instanceof InternalValues_) {
415 value = value.attachments;
416 for (var k = 0; k < value.length; ++k) {
417 if (!(value[k] instanceof tizen.MessageAttachment)) {
418 if (_internal.attachments[k]) {
419 updateInternal_(_internal.attachments[k], value[k]);
421 _internal.attachments[k] = new MessageAttachment(
422 new InternalValues_(value[k]));
425 _internal.attachments[k] = value[k];
428 // if new array is shorter than the old one, remove excess elements
429 if (value.length < _internal.length) {
430 _internal.splice(value.length, _internal.length - value.length);
432 } else if (T_.isArray(value)) {
433 for (var k = 0; k < value.length; ++k) {
434 if (!(value[k] instanceof tizen.MessageAttachment)) {
438 _internal.attachments = value;
446 function MessageInit(data) {
447 if (!(this instanceof MessageInit)) {
448 return new MessageInit(data);
450 if (data === null || typeof data !== 'object') {
453 propertyFactory_(this, 'subject' , data.subject || '' , Property.E | Property.W);
454 propertyFactory_(this, 'to' , data.to || [] , Property.E | Property.W);
455 propertyFactory_(this, 'cc' , data.cc || [] , Property.E | Property.W);
456 propertyFactory_(this, 'bcc' , data.bcc || [] , Property.E | Property.W);
457 propertyFactory_(this, 'plainBody' , data.plainBody || '' , Property.E | Property.W);
458 propertyFactory_(this, 'htmlBody' , data.htmlBody || '' , Property.E | Property.W);
459 propertyFactory_(this, 'isHighPriority', data.isHighPriority || false, Property.E | Property.W);
462 function MessageInit_(data) {
463 if (!(this instanceof MessageInit_)) {
464 return new MessageInit_(data);
466 if ( !data || typeof data !== 'object') {
469 this.id = data.id || null;
470 this.conversationId = data.conversationId || null;
471 this.folderId = data.folderId || null;
472 this.timestamp = data.timestamp || null;
473 this.from = data.from || '';
474 this.to = data.to || [];
475 this.cc = data.cc || [];
476 this.bcc = data.bcc || [];
477 this.isRead = data.isRead || false;
478 this.hasAttachment = data.hasAttachment || null;
479 this.isHighPriority = data.isHighPriority || false;
480 this.subject = data.subject || '';
481 this.inResponseTo = data.inResponseTo || null;
482 this.attachments = [];
483 this.plainBody = data.body ? data.body.plainBody : '';
484 this.htmlBody = data.body ? data.body.htmlBody : '';
487 if (data.attachments && data.attachments.constructor === Array) {
488 data.attachments.forEach(function(el) {
491 if (el.constructor === MessageAttachment) {
492 self.attachments.push(el);
494 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
500 function MessageBody(data) {
501 if (!this instanceof MessageBody) {
502 return new MessageBody(data);
504 if (data === null || typeof data !== 'object') {
509 messageId: data.messageId || null,
510 loaded: data.loaded || false,
511 plainBody: data.plainBody || '',
512 htmlBody: data.htmlBody || '',
513 inlineAttachments: data.inlineAttachments || []
517 Object.defineProperty(
521 get: function () {return _internal.messageId;},
522 set: function (value) {
523 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
530 Object.defineProperty(
534 get: function () {return _internal.loaded;},
535 set: function (value) {
536 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
543 Object.defineProperty(
547 get: function () {return _internal.plainBody;},
548 set: function (value) {
549 if (value instanceof InternalValues_) {
550 _internal.plainBody = String(value.plainBody);
552 _internal.plainBody = String(value);
560 Object.defineProperty(
564 get: function () {return _internal.htmlBody;},
565 set: function (value) {
566 if (value instanceof InternalValues_) {
567 _internal.htmlBody = String(value.htmlBody);
569 _internal.htmlBody = String(value);
577 Object.defineProperty(
581 get: function () {return _internal.inlineAttachments;},
582 set: function (value) {
583 if (value instanceof InternalValues_) {
584 _internal.inlineAttachments = value.inlineAttachments;
585 } else if (T_.isArray(value)) {
586 _internal.inlineAttachments = value;
594 var messageAttachmentsLoaded = {};
596 function MessageAttachment(first, second) {
597 validator_.isConstructorCall(this, MessageAttachment);
598 if (!this instanceof MessageAttachment) {
599 return new MessageAttachment(data);
602 var internalConstructor = first instanceof InternalValues_;
604 messageId: internalConstructor ? first.messageId : null,
605 id: internalConstructor ? first.id : null,
606 mimeType: internalConstructor ? first.mimeType : (undefined == second ? null : second),
607 filePath: internalConstructor ? first.filePath : first,
611 Object.defineProperty(
615 get: function () {return _internal.messageId;},
616 set: function (value) {
617 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
623 Object.defineProperty(
627 get: function () {return _internal.id;},
628 set: function (value) {
629 if (value instanceof InternalValues_) _internal.id = value.id;
635 Object.defineProperty(
639 get: function () {return _internal.mimeType;},
640 set: function (value) {
641 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
647 Object.defineProperty(
652 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
656 return _internal.filePath;
658 set: function (value) {
659 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
666 function Messaging() {};
669 * Gets the messaging service of a given type for a given account.
670 * @param {!MessageServiceTag} messageServiceType Type of the services to be retrieved.
671 * @param {!MessageServiceArraySuccessCallback} successCallback Callback function that is called
672 * when the services are successfully retrieved.
673 * @param {ErrorCallback} errorCallback Callback function that is called when an error occurs.
675 Messaging.prototype.getMessageServices = function () {
676 var args = validator_.validateArgs(arguments, [
677 {name: 'messageServiceType', type: types_.ENUM, values: MessageServiceTag},
678 {name: 'successCallback', type: types_.FUNCTION},
679 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
683 cmd: 'Messaging_getMessageServices',
685 messageServiceType: args.messageServiceType
688 success: function (data) {
689 var servicesArr = [];
690 data.forEach(function(e){
691 servicesArr.push(new MessageService(e));
693 args.successCallback.call(null, servicesArr);
695 error: function (e) {
696 if (args.errorCallback) {
697 args.errorCallback.call(
699 new WebAPIException(e.error)
705 function MessageStorage(){};
706 function MessageService(data) {
707 propertyFactory_(this, 'id', data.id, Property.E);
708 propertyFactory_(this, 'type', data.type, Property.E);
709 propertyFactory_(this, 'name', data.name, Property.E);
710 propertyFactory_(this, 'messageStorage', new MessageStorage(this), Property.E);
713 MessageService.prototype.sendMessage = function () {
714 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
716 var args = validator_.validateArgs(arguments, [
717 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
718 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
719 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
720 {name: 'simIndex', type: types_.LONG, optional: true, nullable: true}
723 if (args.message.type != this.type) {
724 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
729 cmd: 'MessageService_sendMessage',
731 message: args.message,
732 simIndex: args.simIndex || 1,
736 success: function (data) {
737 var message = data.message;
739 var body = message.body;
741 updateInternal_(args.message.body, body)
744 updateInternal_(args.message, message);
747 if (args.successCallback) {
748 args.successCallback.call(null, data.recipients);
751 error: function (e) {
752 if (args.errorCallback) {
753 args.errorCallback.call(
755 new WebAPIException(e.error)
762 MessageService.prototype.loadMessageBody = function () {
763 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
765 var args = validator_.validateArgs(arguments, [
766 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
767 {name: 'successCallback', type: types_.FUNCTION},
768 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
771 if (args.message.type != this.type) {
772 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
778 cmd: 'MessageService_loadMessageBody',
780 message: args.message,
784 success: function (data) {
785 var body = data.messageBody;
787 updateInternal_(args.message.body, body)
790 args.successCallback.call(
795 error: function (e) {
796 if (args.errorCallback) {
797 args.errorCallback.call(
799 new WebAPIException(e.error)
805 MessageService.prototype.loadMessageAttachment = function () {
806 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
808 var args = validator_.validateArgs(arguments, [
809 {name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment},
810 {name: 'successCallback', type: types_.FUNCTION},
811 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
815 var firstCall = false;
816 if (!messageAttachmentsLoaded[args.attachment.id]) {
818 messageAttachmentsLoaded[args.attachment.id] = true;
822 cmd: 'MessageService_loadMessageAttachment',
824 attachment: args.attachment,
828 success: function (data) {
829 if (args.successCallback) {
830 var messageAttachment = data.messageAttachment;
831 if (messageAttachment) {
832 updateInternal_(args.attachment, messageAttachment);
835 args.successCallback.call(
841 error: function (e) {
843 messageAttachmentsLoaded[args.attachment.id] = false;
845 if (args.errorCallback) {
846 args.errorCallback.call(
848 new WebAPIException(e.error)
855 MessageService.prototype.sync = function () {
856 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
858 var args = validator_.validateArgs(arguments, [
859 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
860 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
861 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
865 var cid = bridge.listener({
866 success: function () {
867 if (args.successCallback) {
868 args.successCallback.call(null);
871 error: function (e) {
872 if (args.errorCallback) {
873 args.errorCallback.call(
875 new WebAPIException(e.error)
881 var result = bridge.sync({
882 cmd: 'MessageService_sync',
886 limit: args.limit || null
893 MessageService.prototype.syncFolder = function () {
894 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
896 var args = validator_.validateArgs(arguments, [
897 {name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder},
898 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
899 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
900 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
904 var cid = bridge.listener({
905 success: function () {
906 if (args.successCallback) {
907 args.successCallback.call(null);
910 error: function (e) {
911 if (args.errorCallback) {
912 args.errorCallback.call(
914 new WebAPIException(e.error)
920 var result = bridge.sync({
921 cmd: 'MessageService_syncFolder',
926 limit: args.limit || null
933 MessageService.prototype.stopSync = function () {
934 var args = validator_.validateArgs(arguments, [
935 {name: 'opId', type: types_.LONG}
940 cmd: 'MessageService_stopSync',
948 function MessageStorage(service) {
949 propertyFactory_(this, 'service', service);
952 MessageStorage.prototype.addDraftMessage = function () {
953 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
955 var args = validator_.validateArgs(arguments, [
956 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
957 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
958 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
961 if (args.message.type != this.service.type) {
962 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
967 cmd: 'MessageStorage_addDraftMessage',
969 message: args.message,
970 serviceId: self.service.id
973 success: function (data) {
974 var message = data.message;
976 var body = message.body;
978 updateInternal_(args.message.body, body)
981 var attachments = message.attachments;
983 for (var i = 0; i < attachments.length; i++) {
984 messageAttachmentsLoaded[attachments[i].id] = true;
987 updateInternal_(args.message, message);
990 if (args.successCallback) {
991 args.successCallback.call(null);
994 error: function (e) {
995 if (args.errorCallback) {
996 args.errorCallback.call(
998 new WebAPIException(e.error)
1005 MessageStorage.prototype.findMessages = function () {
1006 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1008 var args = validator_.validateArgs(arguments, [
1011 type: types_.PLATFORM_OBJECT,
1012 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1014 {name: 'successCallback', type: types_.FUNCTION},
1015 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
1016 {name: 'sort', type: types_.PLATFORM_OBJECT, values: tizen.SortMode, optional: true,
1018 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true},
1019 {name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
1025 cmd: 'MessageStorage_findMessages',
1027 filter: addTypeToFilter_(args.filter) || null,
1028 sort: args.sort || null,
1029 limit: args.limit || null,
1030 offset: args.offset || null,
1031 serviceId: self.service.id,
1032 type: self.service.type
1035 success: function (data) {
1037 data.forEach(function (el) {
1038 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1040 args.successCallback.call(null, messages);
1042 error: function (e) {
1043 if (args.errorCallback) {
1044 args.errorCallback.call(
1046 new WebAPIException(e.error)
1053 MessageStorage.prototype.removeMessages = function () {
1054 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
1056 var args = validator_.validateArgs(arguments, [
1057 {name: 'messages', type: types_.ARRAY, values: Message},
1058 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1059 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1064 args.messages.forEach(function(msg) {
1065 if (msg.type != self.service.type) {
1066 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
1071 cmd: 'MessageStorage_removeMessages',
1073 messages: args.messages,
1074 serviceId: self.service.id,
1075 type: self.service.type
1078 success: function () {
1079 if (args.successCallback) {
1080 args.successCallback.call(null);
1083 error: function (e) {
1084 if (args.errorCallback) {
1085 args.errorCallback.call(
1087 new WebAPIException(e.error)
1094 MessageStorage.prototype.updateMessages = function () {
1095 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
1097 var args = validator_.validateArgs(arguments, [
1098 {name: 'messages', type: types_.ARRAY, values: Message},
1099 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1100 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1105 args.messages.forEach(function(msg) {
1106 if (msg.type != self.service.type) {
1107 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
1112 cmd: 'MessageStorage_updateMessages',
1114 messages: args.messages,
1115 serviceId: self.service.id
1118 success: function (data) {
1120 i = args.messages.length,
1123 m = args.messages[i];
1125 originals[m.id] = m;
1132 if (originals[m.oldId]) {
1135 updateInternal_(originals[m.oldId].body, body)
1138 updateInternal_(originals[m.oldId], m);
1142 if (args.successCallback) {
1143 args.successCallback.call(null);
1146 error: function (e) {
1147 if (args.errorCallback) {
1148 args.errorCallback.call(
1150 new WebAPIException(e.error)
1157 MessageStorage.prototype.findConversations = function () {
1158 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1160 var args = validator_.validateArgs(arguments, [
1163 type: types_.PLATFORM_OBJECT,
1164 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1166 {name: 'successCallback', type: types_.FUNCTION},
1167 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
1168 {name: 'sort', type: types_.PLATFORM_OBJECT, values: tizen.SortMode, optional: true,
1170 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true},
1171 {name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
1177 cmd: 'MessageStorage_findConversations',
1179 filter: addTypeToFilter_(args.filter),
1180 sort: args.sort || null,
1181 limit: args.limit || null,
1182 offset: args.offset || null,
1183 serviceId: self.service.id
1186 success: function (data) {
1187 var conversations = [];
1188 data.forEach(function (el) {
1189 conversations.push(new MessageConversation(el));
1191 args.successCallback.call(null, conversations);
1193 error: function (e) {
1194 if (args.errorCallback) {
1195 args.errorCallback.call(
1197 new WebAPIException(e.error)
1204 MessageStorage.prototype.removeConversations = function () {
1205 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
1207 var args = validator_.validateArgs(arguments, [
1208 {name: 'conversations', type: types_.ARRAY},
1209 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1210 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1213 args.conversations.forEach(function (el) {
1214 if (!el || el.constructor !== MessageConversation) {
1215 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1222 cmd: 'MessageStorage_removeConversations',
1224 conversations: args.conversations,
1225 serviceId: self.service.id,
1226 type: self.service.type
1229 success: function () {
1230 if (args.successCallback) {
1231 args.successCallback.call(null);
1234 error: function (e) {
1235 if (args.errorCallback) {
1236 args.errorCallback.call(
1238 new WebAPIException(e.error)
1245 MessageStorage.prototype.findFolders = function () {
1246 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1248 var args = validator_.validateArgs(arguments, [
1251 type: types_.PLATFORM_OBJECT,
1252 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1254 {name: 'successCallback', type: types_.FUNCTION},
1255 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1261 cmd: 'MessageStorage_findFolders',
1263 filter: addTypeToFilter_(args.filter),
1264 sort: args.sort || null,
1265 limit: args.limit || null,
1266 offset: args.offset || null,
1267 serviceId: self.service.id
1270 success: function (data) {
1272 data.forEach(function (el) {
1273 folders.push(new MessageFolder(el));
1275 args.successCallback.call(null, folders);
1277 error: function (e) {
1278 if (args.errorCallback) {
1279 args.errorCallback.call(
1281 new WebAPIException(e.error)
1288 MessageStorage.prototype.addMessagesChangeListener = function () {
1289 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1291 var args = validator_.validateArgs(arguments, [
1292 {name: 'messagesChangeCallback', type: types_.LISTENER,
1293 values: ['messagesadded', 'messagesupdated', 'messagesremoved']},
1296 type: types_.PLATFORM_OBJECT,
1297 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1305 var cid = bridge.listener({
1306 messagesadded: function (data) {
1307 if (args.messagesChangeCallback.messagesadded) {
1309 data.forEach(function (el) {
1310 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1312 args.messagesChangeCallback.messagesadded.call(null, messages);
1315 messagesupdated: function (data) {
1316 if (args.messagesChangeCallback.messagesupdated) {
1318 data.forEach(function (el) {
1319 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1321 args.messagesChangeCallback.messagesupdated.call(null, messages);
1324 messagesremoved: function (data) {
1325 if (args.messagesChangeCallback.messagesremoved) {
1327 data.forEach(function (el) {
1328 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1330 args.messagesChangeCallback.messagesremoved.call(null, messages);
1335 var result = bridge.sync({
1336 cmd: 'MessageStorage_addMessagesChangeListener',
1339 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1340 serviceId: self.service.id
1344 bridge.attach(cid, 'watchId', result);
1348 MessageStorage.prototype.addConversationsChangeListener = function () {
1349 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1351 var args = validator_.validateArgs(arguments, [
1352 {name: 'conversationsChangeCallback', type: types_.LISTENER,
1353 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']},
1356 type: types_.PLATFORM_OBJECT,
1357 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1365 var cid = bridge.listener({
1366 conversationsadded: function (data) {
1367 if (args.conversationsChangeCallback.conversationsadded) {
1368 var conversations = [];
1369 data.forEach(function (el) {
1370 conversations.push(new MessageConversation(el));
1372 args.conversationsChangeCallback.conversationsadded.call(null, conversations);
1375 conversationsupdated: function (data) {
1376 if (args.conversationsChangeCallback.conversationsupdated) {
1377 var conversations = [];
1378 data.forEach(function (el) {
1379 conversations.push(new MessageConversation(el));
1381 args.conversationsChangeCallback.conversationsupdated.call(null, conversations);
1384 conversationsremoved: function (data) {
1385 if (args.conversationsChangeCallback.conversationsremoved) {
1386 var conversations = [];
1387 data.forEach(function (el) {
1388 conversations.push(new MessageConversation(el));
1390 args.conversationsChangeCallback.conversationsremoved.call(null, conversations);
1395 var result = bridge.sync({
1396 cmd: 'MessageStorage_addConversationsChangeListener',
1399 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1400 serviceId: self.service.id
1404 bridge.attach(cid, 'watchId', result);
1408 MessageStorage.prototype.addFoldersChangeListener = function () {
1409 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1411 var args = validator_.validateArgs(arguments, [
1412 {name: 'foldersChangeCallback', type: types_.LISTENER,
1413 values: ['foldersadded', 'foldersupdated', 'foldersremoved']},
1416 type: types_.PLATFORM_OBJECT,
1417 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1425 var cid = bridge.listener({
1426 foldersadded: function (data) {
1427 if (args.foldersChangeCallback.foldersadded) {
1429 data.forEach(function (el) {
1430 folders.push(new MessageFolder(el));
1432 args.foldersChangeCallback.foldersadded.call(null, folders);
1435 foldersupdated: function (data) {
1436 if (args.foldersChangeCallback.foldersupdated) {
1438 data.forEach(function (el) {
1439 folders.push(new MessageFolder(el));
1441 args.foldersChangeCallback.foldersupdated.call(null, folders);
1444 foldersremoved: function (data) {
1445 if (args.foldersChangeCallback.foldersremoved) {
1447 data.forEach(function (el) {
1448 folders.push(new MessageFolder(el));
1450 args.foldersChangeCallback.foldersremoved.call(null, folders);
1455 var result = bridge.sync({
1456 cmd: 'MessageStorage_addFoldersChangeListener',
1459 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1460 serviceId: self.service.id
1464 bridge.attach(cid, 'watchId', result);
1468 MessageStorage.prototype.removeChangeListener = function () {
1469 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1471 var args = validator_.validateArgs(arguments, [
1472 {name: 'watchId', type: types_.LONG}
1477 var result = bridge.sync({
1478 cmd: 'MessageStorage_removeChangeListener',
1480 watchId: args.watchId,
1481 serviceId: self.service.id
1485 bridge.find('watchId', args.watchId).forEach(function (e) {
1486 bridge.remove(e.id);
1491 function MessageConversation(data) {
1492 propertyFactory_(this, 'id' , data.id || null , Property.E);
1493 propertyFactory_(this, 'type' , data.type || '' , Property.E);
1494 propertyFactory_(this, 'timestamp' , data.timestamp ? new Date(data.timestamp * 1000) : null , Property.E);
1495 propertyFactory_(this, 'messageCount' , data.messageCount || 0 , Property.E);
1496 propertyFactory_(this, 'unreadMessages', data.unreadMessages || 0 , Property.E);
1497 propertyFactory_(this, 'preview' , data.preview || '' , Property.E);
1498 propertyFactory_(this, 'subject' , data.subject || '' , Property.E);
1499 propertyFactory_(this, 'isRead' , data.isRead || false, Property.E);
1500 propertyFactory_(this, 'from' , data.from || null , Property.E);
1501 propertyFactory_(this, 'to' , data.to || [] , Property.E);
1502 propertyFactory_(this, 'cc' , data.cc || [] , Property.E);
1503 propertyFactory_(this, 'bcc' , data.bcc || [] , Property.E);
1504 propertyFactory_(this, 'lastMessageId' , data.lastMessageId || null , Property.E);
1507 function MessageFolder(data) {
1509 id: data.id || null,
1510 parentId: data.parentId || null,
1511 serviceId: data.serviceId || '',
1512 contentType: data.contentType || '',
1513 name: data.name || '',
1514 path: data.path || '',
1515 type: data.type || '',
1516 synchronizable: data.synchronizable || false
1519 Object.defineProperty(
1523 get: function () {return _internal.id;},
1528 Object.defineProperty(
1532 get: function () {return _internal.parentId;},
1537 Object.defineProperty(
1541 get: function () {return _internal.serviceId;},
1546 Object.defineProperty(
1550 get: function () {return _internal.contentType;},
1555 Object.defineProperty(
1559 get: function () {return _internal.name;},
1560 set: function (value) { if (value) _internal.name = value;},
1565 Object.defineProperty(
1569 get: function () {return _internal.path;},
1574 Object.defineProperty(
1578 get: function () {return _internal.type;},
1583 Object.defineProperty(
1587 get: function () {return _internal.synchronizable;},
1588 set: function (value) { _internal.synchronizable = Boolean(value);},
1594 tizen.Message = Message;
1596 tizen.MessageAttachment = MessageAttachment;
1598 exports = new Messaging();