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 native = new xwalk.utils.NativeManager(extension);
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(
395 var result = native.callSync('Message_messageStatus', callArgs);
396 if (native.isSuccess(result)) {
397 return native.getResultObject(result);
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}
682 var callArgs = {messageServiceType: args.messageServiceType};
683 var callback = function(result) {
684 if (native.isFailure(result)) {
685 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
687 var data = native.getResultObject(result);
688 var servicesArr = [];
689 data.forEach(function(e){
690 servicesArr.push(new MessageService(e));
692 args.successCallback(servicesArr);
695 var result = native.call('Messaging_getMessageServices', callArgs, callback);
696 if (native.isFailure(result)) {
697 throw native.getErrorObject(result);
701 function MessageStorage(){};
702 function MessageService(data) {
703 propertyFactory_(this, 'id', data.id, Property.E);
704 propertyFactory_(this, 'type', data.type, Property.E);
705 propertyFactory_(this, 'name', data.name, Property.E);
706 propertyFactory_(this, 'messageStorage', new MessageStorage(this), Property.E);
709 MessageService.prototype.sendMessage = function () {
710 var args = validator_.validateArgs(arguments, [
711 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
712 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
713 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
714 {name: 'simIndex', type: types_.LONG, optional: true, nullable: true}
717 if (args.message.type != this.type) {
718 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
724 message: args.message,
725 simIndex: args.simIndex || 1,
728 var callback = function(result) {
729 if (native.isFailure(result)) {
730 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
732 var data = native.getResultObject(result);
733 var message = data.message;
735 var body = message.body;
737 updateInternal_(args.message.body, body)
740 updateInternal_(args.message, message);
742 native.callIfPossible(args.successCallback, data.recipients);
745 var result = native.call('MessageService_sendMessage', callArgs, callback);
746 if (native.isFailure(result)) {
747 throw native.getErrorObject(result);
751 MessageService.prototype.loadMessageBody = function () {
752 var args = validator_.validateArgs(arguments, [
753 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
754 {name: 'successCallback', type: types_.FUNCTION},
755 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
758 if (args.message.type != this.type) {
759 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
765 message: args.message,
769 var callback = function(result) {
770 if (native.isFailure(result)) {
771 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
773 var data = native.getResultObject(result);
774 var body = data.messageBody;
776 updateInternal_(args.message.body, body)
779 args.successCallback(args.message);
783 var result = native.call('MessageService_loadMessageBody', callArgs, callback);
785 if (native.isFailure(result)) {
786 throw native.getErrorObject(result);
790 MessageService.prototype.loadMessageAttachment = function () {
791 var args = validator_.validateArgs(arguments, [
792 {name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment},
793 {name: 'successCallback', type: types_.FUNCTION},
794 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
798 var firstCall = false;
799 if (!messageAttachmentsLoaded[args.attachment.id]) {
801 messageAttachmentsLoaded[args.attachment.id] = true;
805 attachment: args.attachment,
809 var callback = function(result) {
810 if (native.isFailure(result)) {
811 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
813 var data = native.getResultObject(result);
814 var messageAttachment = data.messageAttachment;
815 if (messageAttachment) {
816 updateInternal_(args.attachment, messageAttachment);
819 args.successCallback(args.attachment);
823 var result = native.call('MessageService_loadMessageAttachment', callArgs, callback);
825 if (native.isFailure(result)) {
826 throw native.getErrorObject(result);
831 MessageService.prototype.sync = function () {
832 var args = validator_.validateArgs(arguments, [
833 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
834 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
835 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
842 limit: args.limit || null
845 var callback = function(result) {
846 if (native.isFailure(result)) {
847 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
849 native.callIfPossible(args.successCallback);
853 var result = native.call('MessageService_sync', callArgs, callback);
855 if (native.isFailure(result)) {
856 throw native.getErrorObject(result);
859 return native.getResultObject(result);
862 MessageService.prototype.syncFolder = function () {
863 var args = validator_.validateArgs(arguments, [
864 {name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder},
865 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
866 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
867 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
875 limit: args.limit || null
878 var callback = function(result) {
879 if (native.isFailure(result)) {
880 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
882 native.callIfPossible(args.successCallback);
886 var result = native.call('MessageService_syncFolder', callArgs, callback);
888 if (native.isFailure(result)) {
889 throw native.getErrorObject(result);
892 return native.getResultObject(result);
896 MessageService.prototype.stopSync = function () {
897 var args = validator_.validateArgs(arguments, [
898 {name: 'opId', type: types_.LONG}
906 var result = native.callSync('MessageService_stopSync', callArgs);
907 if (native.isFailure(result)) {
908 throw native.getErrorObject(result);
912 function MessageStorage(service) {
913 propertyFactory_(this, 'service', service);
916 MessageStorage.prototype.addDraftMessage = function () {
917 var args = validator_.validateArgs(arguments, [
918 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
919 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
920 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
923 if (args.message.type != this.service.type) {
924 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
930 message: args.message,
931 serviceId: self.service.id
933 var callback = function(result) {
934 if (native.isFailure(result)) {
935 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
937 var data = native.getResultObject(result);
938 var message = data.message;
940 var body = message.body;
942 updateInternal_(args.message.body, body)
945 var attachments = message.attachments;
947 for (var i = 0; i < attachments.length; i++) {
948 messageAttachmentsLoaded[attachments[i].id] = true;
951 updateInternal_(args.message, message);
953 native.callIfPossible(args.successCallback, data.recipients);
956 var result = native.call('MessageStorage_addDraftMessage', callArgs, callback);
957 if (native.isFailure(result)) {
958 throw native.getErrorObject(result);
962 MessageStorage.prototype.findMessages = function () {
963 var args = validator_.validateArgs(arguments, [
966 type: types_.PLATFORM_OBJECT,
967 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
969 {name: 'successCallback', type: types_.FUNCTION},
970 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
971 {name: 'sort', type: types_.PLATFORM_OBJECT, values: tizen.SortMode, optional: true,
973 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true},
974 {name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
980 filter: addTypeToFilter_(args.filter) || null,
981 sort: args.sort || null,
982 limit: args.limit || null,
983 offset: args.offset || null,
984 serviceId: self.service.id,
985 type: self.service.type
987 var callback = function(result) {
988 if (native.isFailure(result)) {
989 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
991 var data = native.getResultObject(result);
993 data.forEach(function (el) {
994 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
996 native.callIfPossible(args.successCallback, messages);
999 var result = native.call('MessageStorage_findMessages', callArgs, callback);
1000 if (native.isFailure(result)) {
1001 throw native.getErrorObject(result);
1005 MessageStorage.prototype.removeMessages = function () {
1006 var args = validator_.validateArgs(arguments, [
1007 {name: 'messages', type: types_.ARRAY, values: Message},
1008 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1009 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1014 args.messages.forEach(function(msg) {
1015 if (msg.type != self.service.type) {
1016 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1021 messages: args.messages,
1022 serviceId: self.service.id,
1023 type: self.service.type
1025 var callback = function(result) {
1026 if (native.isFailure(result)) {
1027 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1029 native.callIfPossible(args.successCallback);
1032 var result = native.call('MessageStorage_removeMessages', callArgs, callback);
1033 if (native.isFailure(result)) {
1034 throw native.getErrorObject(result);
1038 MessageStorage.prototype.updateMessages = function () {
1039 var args = validator_.validateArgs(arguments, [
1040 {name: 'messages', type: types_.ARRAY, values: Message},
1041 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1042 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1047 args.messages.forEach(function(msg) {
1048 if (msg.type != self.service.type) {
1049 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1054 messages: args.messages,
1055 serviceId: self.service.id
1057 var callback = function(result) {
1058 if (native.isFailure(result)) {
1059 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1061 var data = native.getResultObject(result);
1063 i = args.messages.length,
1066 m = args.messages[i];
1068 originals[m.id] = m;
1075 if (originals[m.oldId]) {
1078 updateInternal_(originals[m.oldId].body, body)
1081 updateInternal_(originals[m.oldId], m);
1085 native.callIfPossible(args.successCallback);
1088 var result = native.call('MessageStorage_updateMessages', callArgs, callback);
1089 if (native.isFailure(result)) {
1090 throw native.getErrorObject(result);
1094 MessageStorage.prototype.findConversations = function () {
1095 var args = validator_.validateArgs(arguments, [
1098 type: types_.PLATFORM_OBJECT,
1099 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1101 {name: 'successCallback', type: types_.FUNCTION},
1102 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
1103 {name: 'sort', type: types_.PLATFORM_OBJECT, values: tizen.SortMode, optional: true,
1105 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true},
1106 {name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
1112 filter: addTypeToFilter_(args.filter),
1113 sort: args.sort || null,
1114 limit: args.limit || null,
1115 offset: args.offset || null,
1116 serviceId: self.service.id
1118 var callback = function(result) {
1119 if (native.isFailure(result)) {
1120 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1122 var data = native.getResultObject(result);
1123 var conversations = [];
1124 data.forEach(function (el) {
1125 conversations.push(new MessageConversation(el));
1127 args.successCallback(conversations);
1130 var result = native.call('MessageStorage_findConversations', callArgs, callback);
1131 if (native.isFailure(result)) {
1132 throw native.getErrorObject(result);
1136 MessageStorage.prototype.removeConversations = function () {
1137 var args = validator_.validateArgs(arguments, [
1138 {name: 'conversations', type: types_.ARRAY},
1139 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1140 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1143 args.conversations.forEach(function (el) {
1144 if (!el || el.constructor !== MessageConversation) {
1145 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1152 conversations: args.conversations,
1153 serviceId: self.service.id,
1154 type: self.service.type
1156 var callback = function(result) {
1157 if (native.isFailure(result)) {
1158 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1160 native.callIfPossible(args.successCallback);
1163 var result = native.call('MessageStorage_removeConversations', callArgs, callback);
1164 if (native.isFailure(result)) {
1165 throw native.getErrorObject(result);
1169 MessageStorage.prototype.findFolders = function () {
1170 var args = validator_.validateArgs(arguments, [
1173 type: types_.PLATFORM_OBJECT,
1174 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1176 {name: 'successCallback', type: types_.FUNCTION},
1177 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1183 filter: addTypeToFilter_(args.filter),
1184 sort: args.sort || null,
1185 limit: args.limit || null,
1186 offset: args.offset || null,
1187 serviceId: self.service.id
1189 var callback = function(result) {
1190 if (native.isFailure(result)) {
1191 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1193 var data = native.getResultObject(result);
1195 data.forEach(function (el) {
1196 folders.push(new MessageFolder(el));
1198 args.successCallback(folders);
1201 var result = native.call('MessageStorage_findFolders', callArgs, callback);
1202 if (native.isFailure(result)) {
1203 throw native.getErrorObject(result);
1207 function pushMessage(messages, el) {
1208 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1211 function pushConversation(conversations, el) {
1212 conversations.push(new MessageConversation(el));
1215 function pushFolder(folders, el) {
1216 folders.push(new MessageFolder(el));
1219 function getListenerFunction(listenerMap, pushMethod) {
1220 return function(msg) {
1221 var action = msg.action;
1222 var data = native.getResultObject(msg);
1224 data.forEach(function (el) {
1225 pushMethod(messages, el);
1228 for (var key in listenerMap) {
1229 if (listenerMap.hasOwnProperty(key)) {
1230 native.callIfPossible(listenerMap[key][action], messages);
1236 var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener';
1237 var MessagesChangeListeners = {};
1238 native.addListener(MESSAGES_CHANGE_LISTENER,
1239 getListenerFunction(MessagesChangeListeners, pushMessage));
1241 var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener';
1242 var ConversationsChangeListeners = {};
1243 native.addListener(CONVERSATIONS_CHANGE_LISTENER,
1244 getListenerFunction(ConversationsChangeListeners, pushConversation));
1246 var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener';
1247 var FoldersChangeListeners = {};
1248 native.addListener(FOLDERS_CHANGE_LISTENER,
1249 getListenerFunction(FoldersChangeListeners, pushFolder));
1251 MessageStorage.prototype.addMessagesChangeListener = function () {
1252 var args = validator_.validateArgs(arguments, [
1253 {name: 'messagesChangeCallback', type: types_.LISTENER,
1254 values: ['messagesadded', 'messagesupdated', 'messagesremoved']},
1257 type: types_.PLATFORM_OBJECT,
1258 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1267 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1268 serviceId: self.service.id
1270 var result = native.callSync('MessageStorage_addMessagesChangeListener', callArgs);
1271 if (native.isFailure(result)) {
1272 throw native.getErrorObject(result);
1274 var opId = native.getResultObject(result);
1275 MessagesChangeListeners[opId] = args.messagesChangeCallback;
1280 MessageStorage.prototype.addConversationsChangeListener = function () {
1281 var args = validator_.validateArgs(arguments, [
1282 {name: 'conversationsChangeCallback', type: types_.LISTENER,
1283 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']},
1286 type: types_.PLATFORM_OBJECT,
1287 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1296 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1297 serviceId: self.service.id
1299 var result = native.callSync('MessageStorage_addConversationsChangeListener', callArgs);
1300 if (native.isFailure(result)) {
1301 throw native.getErrorObject(result);
1303 var opId = native.getResultObject(result);
1304 ConversationsChangeListeners[opId] = args.conversationsChangeCallback;
1309 MessageStorage.prototype.addFoldersChangeListener = function () {
1310 var args = validator_.validateArgs(arguments, [
1311 {name: 'foldersChangeCallback', type: types_.LISTENER,
1312 values: ['foldersadded', 'foldersupdated', 'foldersremoved']},
1315 type: types_.PLATFORM_OBJECT,
1316 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1325 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1326 serviceId: self.service.id
1328 var result = native.callSync('MessageStorage_addFoldersChangeListener', callArgs);
1329 if (native.isFailure(result)) {
1330 throw native.getErrorObject(result);
1332 var opId = native.getResultObject(result);
1333 FoldersChangeListeners[opId] = args.foldersChangeCallback;
1338 MessageStorage.prototype.removeChangeListener = function () {
1339 var args = validator_.validateArgs(arguments, [
1340 {name: 'watchId', type: types_.LONG}
1346 watchId: args.watchId,
1347 serviceId: self.service.id
1349 var result = native.callSync('MessageStorage_removeChangeListener', callArgs);
1350 if (native.isFailure(result)) {
1351 throw native.getErrorObject(result);
1353 if (MessagesChangeListeners.hasOwnProperty(args.watchId)) {
1354 delete MessagesChangeListeners[args.watchId];
1355 } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) {
1356 delete ConversationsChangeListeners[args.watchId];
1357 } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) {
1358 delete FoldersChangeListeners[args.watchId];
1363 function MessageConversation(data) {
1364 propertyFactory_(this, 'id' , data.id || null , Property.E);
1365 propertyFactory_(this, 'type' , data.type || '' , Property.E);
1366 propertyFactory_(this, 'timestamp' , data.timestamp ? new Date(data.timestamp * 1000) : null , Property.E);
1367 propertyFactory_(this, 'messageCount' , data.messageCount || 0 , Property.E);
1368 propertyFactory_(this, 'unreadMessages', data.unreadMessages || 0 , Property.E);
1369 propertyFactory_(this, 'preview' , data.preview || '' , Property.E);
1370 propertyFactory_(this, 'subject' , data.subject || '' , Property.E);
1371 propertyFactory_(this, 'isRead' , data.isRead || false, Property.E);
1372 propertyFactory_(this, 'from' , data.from || null , Property.E);
1373 propertyFactory_(this, 'to' , data.to || [] , Property.E);
1374 propertyFactory_(this, 'cc' , data.cc || [] , Property.E);
1375 propertyFactory_(this, 'bcc' , data.bcc || [] , Property.E);
1376 propertyFactory_(this, 'lastMessageId' , data.lastMessageId || null , Property.E);
1379 function MessageFolder(data) {
1381 id: data.id || null,
1382 parentId: data.parentId || null,
1383 serviceId: data.serviceId || '',
1384 contentType: data.contentType || '',
1385 name: data.name || '',
1386 path: data.path || '',
1387 type: data.type || '',
1388 synchronizable: data.synchronizable || false
1391 Object.defineProperty(
1395 get: function () {return _internal.id;},
1400 Object.defineProperty(
1404 get: function () {return _internal.parentId;},
1409 Object.defineProperty(
1413 get: function () {return _internal.serviceId;},
1418 Object.defineProperty(
1422 get: function () {return _internal.contentType;},
1427 Object.defineProperty(
1431 get: function () {return _internal.name;},
1432 set: function (value) { if (value) _internal.name = value;},
1437 Object.defineProperty(
1441 get: function () {return _internal.path;},
1446 Object.defineProperty(
1450 get: function () {return _internal.type;},
1455 Object.defineProperty(
1459 get: function () {return _internal.synchronizable;},
1460 set: function (value) { _internal.synchronizable = Boolean(value);},
1466 tizen.Message = Message;
1468 tizen.MessageAttachment = MessageAttachment;
1470 exports = new Messaging();