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);
21 var privUtils_ = xwalk.utils;
29 function addTypeToFilter_(data) {
32 for (var field in data) {
33 filter[field] = data[field];
36 if (data instanceof tizen.AttributeFilter) {
37 filter.filterType = 'AttributeFilter';
38 } else if (data instanceof tizen.AttributeRangeFilter) {
39 filter.filterType = 'AttributeRangeFilter';
40 } else if (data instanceof tizen.CompositeFilter) {
41 filter.filterType = 'CompositeFilter';
42 // recursively convert all sub-filters
44 for (var i = 0; i < data.filters.length; ++i) {
45 filter.filters[i] = addTypeToFilter_(data.filters[i]);
48 filter.filterType = 'Unknown';
54 function propertyFactory_(that, name, value, flags, options) {
56 if (options === null || typeof options !== 'object') {
59 if (!options.get && !options.set) {
60 options.value = value;
62 if ((flags & Property.WRITEABLE) != 0) {
63 options.writable = true;
65 if ((flags & Property.ENUMERABLE) != 0) {
66 options.enumerable = true;
68 if ((flags & Property.CONFIGURABLE) != 0) {
69 options.configurable = true;
71 Object.defineProperty(that, name, options);
74 function InternalValues_(data) {
75 if (!(this instanceof InternalValues_)) {
76 return new InternalValues_(data);
78 for (var key in data) {
79 if (data.hasOwnProperty(key)) {
80 this[key] = data[key];
85 function updateInternal_(internal, data) {
86 var values = new InternalValues_(data);
87 for (var key in data) {
88 if (values.hasOwnProperty(key) && internal.hasOwnProperty(key)) {
89 internal[key] = values;
94 var MessageServiceTag = {
97 EMAIL: 'messaging.email'
100 function Message(type, data) {
101 validator_.isConstructorCall(this, Message);
103 if (Object.values(MessageServiceTag).indexOf(type) == -1) {
104 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
107 if (!data || typeof data !== 'object') {
111 var internal = data instanceof MessageInit_,
112 id = internal ? data.id : null,
113 conversationId = internal ? data.conversationId : null,
114 folderId = internal ? data.folderId : null,
115 timestamp = internal ? data.timestamp : null,
116 from = internal ? data.from : null,
117 hasAttachment = internal ? data.hasAttachment : false,
118 isRead = internal ? data.isRead : false,
119 inResponseTo = internal ? data.inResponseTo : null;
121 var body = new MessageBody({
123 plainBody: data.plainBody,
124 htmlBody: data.htmlBody
128 if (!(to instanceof Array)) {
133 if (!(cc instanceof Array)) {
138 if (!(bcc instanceof Array)) {
142 var attachments = (internal ? data.attachments : []) || [];
146 conversationId: conversationId || null,
147 folderId: folderId || null,
149 timestamp: timestamp || null,
155 isRead: isRead || false,
156 hasAttachment: hasAttachment || false,
157 isHighPriority: data.isHighPriority || false,
158 subject: data.subject || '',
159 inResponseTo: inResponseTo || null,
160 attachments: attachments
163 Object.defineProperty(this, 'id', {
167 set: function(value) {
168 if (value instanceof InternalValues_) _internal.id = value.id;
173 Object.defineProperty(this, 'conversationId', {
175 return _internal.conversationId;
177 set: function(value) {
178 if (value instanceof InternalValues_)
179 _internal.conversationId = value.conversationId;
184 Object.defineProperty(this, 'folderId', {
186 return _internal.folderId;
188 set: function(value) {
189 if (value instanceof InternalValues_) _internal.folderId = value.folderId;
194 Object.defineProperty(this, 'type', {
196 return _internal.type;
198 set: function(value) {
204 Object.defineProperty(this, 'timestamp', {
206 return _internal.timestamp
207 ? new Date(_internal.timestamp * 1000)
208 : _internal.timestamp;
210 set: function(value) {
211 if (value instanceof InternalValues_) {
212 _internal.timestamp = value.timestamp;
218 Object.defineProperty(this, 'from', {
220 return _internal.from;
222 set: function(value) {
223 if (value instanceof InternalValues_) _internal.from = value.from;
228 Object.defineProperty(this, 'to', {
232 set: function(value) {
233 if (value instanceof InternalValues_) value = value.to;
234 if (value instanceof Array) _internal.to = value;
239 Object.defineProperty(this, 'cc', {
243 set: function(value) {
244 if (value instanceof InternalValues_) value = value.cc;
245 if (value instanceof Array) _internal.cc = value;
250 Object.defineProperty(this, 'bcc', {
252 return _internal.bcc;
254 set: function(value) {
255 if (value instanceof InternalValues_) value = value.bcc;
256 if (value instanceof Array) _internal.bcc = value;
261 Object.defineProperty(this, 'body', {
263 return _internal.body;
265 set: function(value) {
266 if (value instanceof InternalValues_)
267 _internal.body = new MessageBody(value.body);
268 if (value instanceof MessageBody) _internal.body = value;
273 Object.defineProperty(this, 'isRead', {
275 return _internal.isRead;
277 set: function(value) {
278 if (value instanceof InternalValues_) {
279 value = value.isRead;
281 _internal.isRead = !!value;
286 Object.defineProperty(this, 'hasAttachment', {
288 return _internal.attachments.length > 0;
290 set: function(value) {
291 if (value instanceof InternalValues_)
292 _internal.hasAttachment = value.hasAttachment;
297 Object.defineProperty(this, 'isHighPriority', {
299 return _internal.isHighPriority;
301 set: function(value) {
302 if (value instanceof InternalValues_) value = value.isHighPriority;
303 _internal.isHighPriority = !!value;
308 Object.defineProperty(this, 'subject', {
310 return _internal.subject;
312 set: function(value) {
313 if (value instanceof InternalValues_) value = value.subject;
314 _internal.subject = String(value);
319 Object.defineProperty(this, 'inResponseTo', {
321 return _internal.inResponseTo;
323 set: function(value) {
324 if (value instanceof InternalValues_)
325 _internal.inResponseTo = value.inResponseTo;
330 Object.defineProperty(this, 'messageStatus', {
337 var result = native.callSync('MessageGetMessageStatus', callArgs);
338 if (native.isSuccess(result)) {
339 return native.getResultObject(result);
344 set: function(value) {
350 Object.defineProperty(this, 'attachments', {
352 return _internal.attachments;
354 set: function(value) {
355 if (value instanceof InternalValues_) {
356 value = value.attachments;
357 for (var k = 0; k < value.length; ++k) {
358 if (!(value[k] instanceof tizen.MessageAttachment)) {
359 if (_internal.attachments[k]) {
360 updateInternal_(_internal.attachments[k], value[k]);
362 _internal.attachments[k] = new MessageAttachment(
363 new InternalValues_(value[k])
367 _internal.attachments[k] = value[k];
370 // if new array is shorter than the old one, remove excess elements
371 if (value.length < _internal.length) {
372 _internal.splice(value.length, _internal.length - value.length);
374 } else if (T_.isArray(value)) {
375 for (var k = 0; k < value.length; ++k) {
376 if (!(value[k] instanceof tizen.MessageAttachment)) {
380 _internal.attachments = value;
387 function MessageInit_(data) {
388 if (!(this instanceof MessageInit_)) {
389 return new MessageInit_(data);
391 if (!data || typeof data !== 'object') {
394 this.id = data.id || null;
395 this.conversationId = data.conversationId || null;
396 this.folderId = data.folderId || null;
397 this.timestamp = data.timestamp || null;
398 this.from = data.from || '';
399 this.to = data.to || [];
400 this.cc = data.cc || [];
401 this.bcc = data.bcc || [];
402 this.isRead = data.isRead || false;
403 this.hasAttachment = data.hasAttachment || null;
404 this.isHighPriority = data.isHighPriority || false;
405 this.subject = data.subject || '';
406 this.inResponseTo = data.inResponseTo || null;
407 this.attachments = [];
408 this.plainBody = data.body ? data.body.plainBody : '';
409 this.htmlBody = data.body ? data.body.htmlBody : '';
412 if (data.attachments && data.attachments.constructor === Array) {
413 data.attachments.forEach(function(el) {
416 if (el.constructor === MessageAttachment) {
417 self.attachments.push(el);
419 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
425 function MessageBody(data) {
426 if (!this instanceof MessageBody) {
427 return new MessageBody(data);
429 if (data === null || typeof data !== 'object') {
434 messageId: data.messageId || null,
435 loaded: data.loaded || false,
436 plainBody: data.plainBody || '',
437 htmlBody: data.htmlBody || '',
438 inlineAttachments: data.inlineAttachments || []
441 Object.defineProperty(this, 'messageId', {
443 return _internal.messageId;
445 set: function(value) {
446 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
451 Object.defineProperty(this, 'loaded', {
453 return _internal.loaded;
455 set: function(value) {
456 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
461 Object.defineProperty(this, 'plainBody', {
463 return _internal.plainBody;
465 set: function(value) {
466 if (value instanceof InternalValues_) {
467 _internal.plainBody = String(value.plainBody);
469 _internal.plainBody = String(value);
475 Object.defineProperty(this, 'htmlBody', {
477 return _internal.htmlBody;
479 set: function(value) {
480 if (value instanceof InternalValues_) {
481 _internal.htmlBody = String(value.htmlBody);
483 _internal.htmlBody = String(value);
489 Object.defineProperty(this, 'inlineAttachments', {
491 return _internal.inlineAttachments;
493 set: function(value) {
494 if (value instanceof InternalValues_) {
495 _internal.inlineAttachments = value.inlineAttachments;
496 } else if (T_.isArray(value)) {
497 _internal.inlineAttachments = value;
504 var messageAttachmentsLoaded = {};
506 function MessageAttachment(first, second) {
507 validator_.isConstructorCall(this, MessageAttachment);
508 if (!this instanceof MessageAttachment) {
509 return new MessageAttachment(data);
512 var internalConstructor = first instanceof InternalValues_;
514 messageId: internalConstructor ? first.messageId : null,
515 id: internalConstructor ? first.id : null,
516 mimeType: internalConstructor
518 : undefined == second
521 filePath: internalConstructor ? first.filePath : first
524 Object.defineProperty(this, 'messageId', {
526 return _internal.messageId;
528 set: function(value) {
529 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
534 Object.defineProperty(this, 'id', {
538 set: function(value) {
539 if (value instanceof InternalValues_) _internal.id = value.id;
544 Object.defineProperty(this, 'mimeType', {
546 return _internal.mimeType;
548 set: function(value) {
549 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
554 Object.defineProperty(this, 'filePath', {
556 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
560 return _internal.filePath;
562 set: function(value) {
563 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
569 function Messaging() {}
571 Messaging.prototype.getMessageServices = function() {
572 var args = validator_.validateArgs(arguments, [
574 name: 'messageServiceType',
576 values: Object.values(MessageServiceTag)
578 { name: 'successCallback', type: types_.FUNCTION },
579 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
582 var callArgs = { messageServiceType: args.messageServiceType };
583 var callback = function(result) {
584 if (native.isFailure(result)) {
585 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
587 var data = native.getResultObject(result);
588 var servicesArr = [];
589 data.forEach(function(e) {
590 servicesArr.push(new MessageService(e));
592 args.successCallback(servicesArr);
595 var result = native.call('GetMessageServices', callArgs, callback);
596 if (native.isFailure(result)) {
597 throw native.getErrorObject(result);
601 function MessageStorage() {}
602 function MessageService(data) {
603 propertyFactory_(this, 'id', data.id, Property.ENUMERABLE);
604 propertyFactory_(this, 'type', data.type, Property.ENUMERABLE);
605 propertyFactory_(this, 'name', data.name, Property.ENUMERABLE);
609 new MessageStorage(this),
614 MessageService.prototype.sendMessage = function() {
615 var args = validator_.validateArgs(arguments, [
616 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
618 name: 'successCallback',
619 type: types_.FUNCTION,
623 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
624 { name: 'simIndex', type: types_.LONG, optional: true, nullable: true }
627 if (args.message.type != this.type) {
628 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
634 message: args.message,
635 simIndex: args.simIndex || 1,
638 var callback = function(result) {
639 if (native.isFailure(result)) {
640 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
642 var data = native.getResultObject(result);
643 var message = data.message;
645 var body = message.body;
647 updateInternal_(args.message.body, body);
650 updateInternal_(args.message, message);
652 native.callIfPossible(args.successCallback, data.recipients);
655 var result = native.call('MessageServiceSendMessage', callArgs, callback);
656 if (native.isFailure(result)) {
657 throw native.getErrorObject(result);
661 MessageService.prototype.loadMessageBody = function() {
662 var args = validator_.validateArgs(arguments, [
663 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
664 { name: 'successCallback', type: types_.FUNCTION },
665 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
668 if (args.message.type != this.type) {
669 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
675 message: args.message,
679 var callback = function(result) {
680 if (native.isFailure(result)) {
681 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
683 var data = native.getResultObject(result);
684 var body = data.messageBody;
686 updateInternal_(args.message.body, body);
689 args.successCallback(args.message);
693 var result = native.call('MessageServiceLoadMessageBody', callArgs, callback);
695 if (native.isFailure(result)) {
696 throw native.getErrorObject(result);
699 MessageService.prototype.loadMessageAttachment = function() {
700 var args = validator_.validateArgs(arguments, [
701 { name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment },
702 { name: 'successCallback', type: types_.FUNCTION },
703 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
707 var firstCall = false;
708 if (!messageAttachmentsLoaded[args.attachment.id]) {
710 messageAttachmentsLoaded[args.attachment.id] = true;
714 attachment: args.attachment,
718 var callback = function(result) {
719 if (native.isFailure(result)) {
720 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
722 var data = native.getResultObject(result);
723 var messageAttachment = data.messageAttachment;
724 if (messageAttachment) {
725 updateInternal_(args.attachment, messageAttachment);
728 args.successCallback(args.attachment);
732 var result = native.call('MessageServiceLoadMessageAttachment', callArgs, callback);
734 if (native.isFailure(result)) {
735 throw native.getErrorObject(result);
739 MessageService.prototype.sync = function() {
740 var args = validator_.validateArgs(arguments, [
742 name: 'successCallback',
743 type: types_.FUNCTION,
747 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
748 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
755 limit: args.limit || null
758 var callback = function(result) {
759 if (native.isFailure(result)) {
760 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
762 native.callIfPossible(args.successCallback);
766 var result = native.call('MessageServiceSync', callArgs, callback);
768 if (native.isFailure(result)) {
769 throw native.getErrorObject(result);
772 return native.getResultObject(result);
775 MessageService.prototype.syncFolder = function() {
776 var args = validator_.validateArgs(arguments, [
777 { name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder },
779 name: 'successCallback',
780 type: types_.FUNCTION,
784 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
785 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
793 limit: args.limit || null
796 var callback = function(result) {
797 if (native.isFailure(result)) {
798 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
800 native.callIfPossible(args.successCallback);
804 var result = native.call('MessageServiceSyncFolder', callArgs, callback);
806 if (native.isFailure(result)) {
807 throw native.getErrorObject(result);
810 return native.getResultObject(result);
813 MessageService.prototype.stopSync = function() {
814 var args = validator_.validateArgs(arguments, [{ name: 'opId', type: types_.LONG }]);
821 var result = native.callSync('MessageServiceStopSync', callArgs);
822 if (native.isFailure(result)) {
823 throw native.getErrorObject(result);
827 function MessageStorage(service) {
828 propertyFactory_(this, 'service', service);
831 MessageStorage.prototype.addDraftMessage = function() {
832 var args = validator_.validateArgs(arguments, [
833 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
835 name: 'successCallback',
836 type: types_.FUNCTION,
840 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
843 if (args.message.type != this.service.type) {
844 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
850 message: args.message,
851 serviceId: self.service.id
853 var callback = function(result) {
854 if (native.isFailure(result)) {
855 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
857 var data = native.getResultObject(result);
858 var message = data.message;
860 var body = message.body;
862 updateInternal_(args.message.body, body);
865 var attachments = message.attachments;
867 for (var i = 0; i < attachments.length; i++) {
868 messageAttachmentsLoaded[attachments[i].id] = true;
871 updateInternal_(args.message, message);
873 native.callIfPossible(args.successCallback, data.recipients);
876 var result = native.call('MessageStorageAddDraftMessage', callArgs, callback);
877 if (native.isFailure(result)) {
878 throw native.getErrorObject(result);
882 MessageStorage.prototype.findMessages = function() {
883 var args = validator_.validateArgs(arguments, [
886 type: types_.PLATFORM_OBJECT,
888 tizen.AttributeFilter,
889 tizen.AttributeRangeFilter,
890 tizen.CompositeFilter
893 { name: 'successCallback', type: types_.FUNCTION },
894 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
897 type: types_.PLATFORM_OBJECT,
898 values: tizen.SortMode,
902 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
903 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
909 filter: addTypeToFilter_(args.filter) || null,
910 sort: args.sort || null,
911 limit: args.limit || null,
912 offset: args.offset || null,
913 serviceId: self.service.id,
914 type: self.service.type
916 var callback = function(result) {
917 if (native.isFailure(result)) {
918 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
920 var data = native.getResultObject(result);
922 data.forEach(function(el) {
923 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
925 native.callIfPossible(args.successCallback, messages);
928 var result = native.call('MessageStorageFindMessages', callArgs, callback);
929 if (native.isFailure(result)) {
930 throw native.getErrorObject(result);
934 MessageStorage.prototype.removeMessages = function() {
935 var args = validator_.validateArgs(arguments, [
936 { name: 'messages', type: types_.ARRAY, values: Message },
938 name: 'successCallback',
939 type: types_.FUNCTION,
943 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
948 args.messages.forEach(function(msg) {
949 if (msg.type != self.service.type) {
950 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
955 messages: args.messages,
956 serviceId: self.service.id,
957 type: self.service.type
959 var callback = function(result) {
960 if (native.isFailure(result)) {
961 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
963 native.callIfPossible(args.successCallback);
966 var result = native.call('MessageStorageRemoveMessages', callArgs, callback);
967 if (native.isFailure(result)) {
968 throw native.getErrorObject(result);
972 MessageStorage.prototype.updateMessages = function() {
973 var args = validator_.validateArgs(arguments, [
974 { name: 'messages', type: types_.ARRAY, values: Message },
976 name: 'successCallback',
977 type: types_.FUNCTION,
981 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
986 args.messages.forEach(function(msg) {
987 if (msg.type != self.service.type) {
988 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
993 messages: args.messages,
994 serviceId: self.service.id
996 var callback = function(result) {
997 if (native.isFailure(result)) {
998 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1000 var data = native.getResultObject(result);
1002 i = args.messages.length,
1005 m = args.messages[i];
1007 originals[m.id] = m;
1014 if (originals[m.oldId]) {
1017 updateInternal_(originals[m.oldId].body, body);
1020 updateInternal_(originals[m.oldId], m);
1024 native.callIfPossible(args.successCallback);
1027 var result = native.call('MessageStorageUpdateMessages', callArgs, callback);
1028 if (native.isFailure(result)) {
1029 throw native.getErrorObject(result);
1033 MessageStorage.prototype.findConversations = function() {
1034 var args = validator_.validateArgs(arguments, [
1037 type: types_.PLATFORM_OBJECT,
1039 tizen.AttributeFilter,
1040 tizen.AttributeRangeFilter,
1041 tizen.CompositeFilter
1044 { name: 'successCallback', type: types_.FUNCTION },
1045 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
1048 type: types_.PLATFORM_OBJECT,
1049 values: tizen.SortMode,
1053 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
1054 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
1060 filter: addTypeToFilter_(args.filter),
1061 sort: args.sort || null,
1062 limit: args.limit || null,
1063 offset: args.offset || null,
1064 serviceId: self.service.id
1066 var callback = function(result) {
1067 if (native.isFailure(result)) {
1068 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1070 var data = native.getResultObject(result);
1071 var conversations = [];
1072 data.forEach(function(el) {
1073 conversations.push(new MessageConversation(el));
1075 args.successCallback(conversations);
1078 var result = native.call('MessageStorageFindConversations', callArgs, callback);
1079 if (native.isFailure(result)) {
1080 throw native.getErrorObject(result);
1084 MessageStorage.prototype.removeConversations = function() {
1085 var args = validator_.validateArgs(arguments, [
1086 { name: 'conversations', type: types_.ARRAY },
1088 name: 'successCallback',
1089 type: types_.FUNCTION,
1093 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1096 args.conversations.forEach(function(el) {
1097 if (!el || el.constructor !== MessageConversation) {
1098 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1105 conversations: args.conversations,
1106 serviceId: self.service.id,
1107 type: self.service.type
1109 var callback = function(result) {
1110 if (native.isFailure(result)) {
1111 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1113 native.callIfPossible(args.successCallback);
1116 var result = native.call('MessageStorageRemoveConversations', callArgs, callback);
1117 if (native.isFailure(result)) {
1118 throw native.getErrorObject(result);
1122 MessageStorage.prototype.findFolders = function() {
1123 var args = validator_.validateArgs(arguments, [
1126 type: types_.PLATFORM_OBJECT,
1128 tizen.AttributeFilter,
1129 tizen.AttributeRangeFilter,
1130 tizen.CompositeFilter
1133 { name: 'successCallback', type: types_.FUNCTION },
1134 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1140 filter: addTypeToFilter_(args.filter),
1141 sort: args.sort || null,
1142 limit: args.limit || null,
1143 offset: args.offset || null,
1144 serviceId: self.service.id
1146 var callback = function(result) {
1147 if (native.isFailure(result)) {
1148 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1150 var data = native.getResultObject(result);
1152 data.forEach(function(el) {
1153 folders.push(new MessageFolder(el));
1155 args.successCallback(folders);
1158 var result = native.call('MessageStorageFindFolders', callArgs, callback);
1159 if (native.isFailure(result)) {
1160 throw native.getErrorObject(result);
1164 function pushMessage(messages, el) {
1165 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1168 function pushConversation(conversations, el) {
1169 conversations.push(new MessageConversation(el));
1172 function pushFolder(folders, el) {
1173 folders.push(new MessageFolder(el));
1176 function getListenerFunction(listenerMap, pushMethod) {
1177 return function(msg) {
1178 var action = msg.action;
1179 var data = native.getResultObject(msg);
1181 data.forEach(function(el) {
1182 pushMethod(messages, el);
1185 for (var key in listenerMap) {
1186 if (listenerMap.hasOwnProperty(key)) {
1187 native.callIfPossible(listenerMap[key][action], messages);
1193 var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener';
1194 var MessagesChangeListeners = {};
1196 MESSAGES_CHANGE_LISTENER,
1197 getListenerFunction(MessagesChangeListeners, pushMessage)
1200 var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener';
1201 var ConversationsChangeListeners = {};
1203 CONVERSATIONS_CHANGE_LISTENER,
1204 getListenerFunction(ConversationsChangeListeners, pushConversation)
1207 var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener';
1208 var FoldersChangeListeners = {};
1210 FOLDERS_CHANGE_LISTENER,
1211 getListenerFunction(FoldersChangeListeners, pushFolder)
1214 MessageStorage.prototype.addMessagesChangeListener = function() {
1215 var args = validator_.validateArgs(arguments, [
1217 name: 'messagesChangeCallback',
1218 type: types_.LISTENER,
1219 values: ['messagesadded', 'messagesupdated', 'messagesremoved']
1223 type: types_.PLATFORM_OBJECT,
1225 tizen.AttributeFilter,
1226 tizen.AttributeRangeFilter,
1227 tizen.CompositeFilter
1237 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1238 serviceId: self.service.id
1240 var result = native.callSync('MessageStorageAddMessagesChangeListener', callArgs);
1241 if (native.isFailure(result)) {
1242 throw native.getErrorObject(result);
1244 var opId = native.getResultObject(result);
1245 MessagesChangeListeners[opId] = args.messagesChangeCallback;
1250 MessageStorage.prototype.addConversationsChangeListener = function() {
1251 var args = validator_.validateArgs(arguments, [
1253 name: 'conversationsChangeCallback',
1254 type: types_.LISTENER,
1255 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']
1259 type: types_.PLATFORM_OBJECT,
1261 tizen.AttributeFilter,
1262 tizen.AttributeRangeFilter,
1263 tizen.CompositeFilter
1273 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1274 serviceId: self.service.id
1276 var result = native.callSync(
1277 'MessageStorageAddConversationsChangeListener',
1280 if (native.isFailure(result)) {
1281 throw native.getErrorObject(result);
1283 var opId = native.getResultObject(result);
1284 ConversationsChangeListeners[opId] = args.conversationsChangeCallback;
1289 MessageStorage.prototype.addFoldersChangeListener = function() {
1290 var args = validator_.validateArgs(arguments, [
1292 name: 'foldersChangeCallback',
1293 type: types_.LISTENER,
1294 values: ['foldersadded', 'foldersupdated', 'foldersremoved']
1298 type: types_.PLATFORM_OBJECT,
1300 tizen.AttributeFilter,
1301 tizen.AttributeRangeFilter,
1302 tizen.CompositeFilter
1312 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1313 serviceId: self.service.id
1315 var result = native.callSync('MessageStorageAddFolderChangeListener', callArgs);
1316 if (native.isFailure(result)) {
1317 throw native.getErrorObject(result);
1319 var opId = native.getResultObject(result);
1320 FoldersChangeListeners[opId] = args.foldersChangeCallback;
1325 MessageStorage.prototype.removeChangeListener = function() {
1326 var args = validator_.validateArgs(arguments, [
1327 { name: 'watchId', type: types_.LONG }
1333 watchId: args.watchId,
1334 serviceId: self.service.id
1336 var result = native.callSync('MessageStorageRemoveChangeListener', callArgs);
1337 if (native.isFailure(result)) {
1338 throw native.getErrorObject(result);
1340 if (MessagesChangeListeners.hasOwnProperty(args.watchId)) {
1341 delete MessagesChangeListeners[args.watchId];
1342 } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) {
1343 delete ConversationsChangeListeners[args.watchId];
1344 } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) {
1345 delete FoldersChangeListeners[args.watchId];
1350 function MessageConversation(data) {
1351 propertyFactory_(this, 'id', data.id || null, Property.ENUMERABLE);
1352 propertyFactory_(this, 'type', data.type || '', Property.ENUMERABLE);
1356 data.timestamp ? new Date(data.timestamp * 1000) : null,
1359 propertyFactory_(this, 'messageCount', data.messageCount || 0, Property.ENUMERABLE);
1363 data.unreadMessages || 0,
1366 propertyFactory_(this, 'preview', data.preview || '', Property.ENUMERABLE);
1367 propertyFactory_(this, 'subject', data.subject || '', Property.ENUMERABLE);
1368 propertyFactory_(this, 'isRead', data.isRead || false, Property.ENUMERABLE);
1369 propertyFactory_(this, 'from', data.from || null, Property.ENUMERABLE);
1370 propertyFactory_(this, 'to', data.to || [], Property.ENUMERABLE);
1371 propertyFactory_(this, 'cc', data.cc || [], Property.ENUMERABLE);
1372 propertyFactory_(this, 'bcc', data.bcc || [], Property.ENUMERABLE);
1376 data.lastMessageId || null,
1381 function MessageFolder(data) {
1383 id: data.id || null,
1384 parentId: data.parentId || null,
1385 serviceId: data.serviceId || '',
1386 contentType: data.contentType || '',
1387 name: data.name || '',
1388 path: data.path || '',
1389 type: data.type || '',
1390 synchronizable: data.synchronizable || false
1393 Object.defineProperty(this, 'id', {
1395 return _internal.id;
1400 Object.defineProperty(this, 'parentId', {
1402 return _internal.parentId;
1407 Object.defineProperty(this, 'serviceId', {
1409 return _internal.serviceId;
1414 Object.defineProperty(this, 'contentType', {
1416 return _internal.contentType;
1421 Object.defineProperty(this, 'name', {
1423 return _internal.name;
1425 set: function(value) {
1426 if (value) _internal.name = value;
1431 Object.defineProperty(this, 'path', {
1433 return _internal.path;
1438 Object.defineProperty(this, 'type', {
1440 return _internal.type;
1445 Object.defineProperty(this, 'synchronizable', {
1447 return _internal.synchronizable;
1449 set: function(value) {
1450 _internal.synchronizable = Boolean(value);
1456 tizen.Message = Message;
1458 tizen.MessageAttachment = MessageAttachment;
1460 exports = new Messaging();