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 privUtils_.deprecationWarn(
102 'Message() is deprecated and will be ' +
103 'removed from next release without any alternatives. ',
106 validator_.isConstructorCall(this, Message);
108 if (Object.values(MessageServiceTag).indexOf(type) == -1) {
109 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
112 if (!data || typeof data !== 'object') {
116 var internal = data instanceof MessageInit_,
117 id = internal ? data.id : null,
118 conversationId = internal ? data.conversationId : null,
119 folderId = internal ? data.folderId : null,
120 timestamp = internal ? data.timestamp : null,
121 from = internal ? data.from : null,
122 hasAttachment = internal ? data.hasAttachment : false,
123 isRead = internal ? data.isRead : false,
124 inResponseTo = internal ? data.inResponseTo : null;
126 var body = new MessageBody({
128 plainBody: data.plainBody,
129 htmlBody: data.htmlBody
133 if (!(to instanceof Array)) {
138 if (!(cc instanceof Array)) {
143 if (!(bcc instanceof Array)) {
147 var attachments = (internal ? data.attachments : []) || [];
151 conversationId: conversationId || null,
152 folderId: folderId || null,
154 timestamp: timestamp || null,
160 isRead: isRead || false,
161 hasAttachment: hasAttachment || false,
162 isHighPriority: data.isHighPriority || false,
163 subject: data.subject || '',
164 inResponseTo: inResponseTo || null,
165 attachments: attachments
168 Object.defineProperty(this, 'id', {
172 set: function(value) {
173 if (value instanceof InternalValues_) _internal.id = value.id;
178 Object.defineProperty(this, 'conversationId', {
180 return _internal.conversationId;
182 set: function(value) {
183 if (value instanceof InternalValues_)
184 _internal.conversationId = value.conversationId;
189 Object.defineProperty(this, 'folderId', {
191 return _internal.folderId;
193 set: function(value) {
194 if (value instanceof InternalValues_) _internal.folderId = value.folderId;
199 Object.defineProperty(this, 'type', {
201 return _internal.type;
203 set: function(value) {
209 Object.defineProperty(this, 'timestamp', {
211 return _internal.timestamp
212 ? new Date(_internal.timestamp * 1000)
213 : _internal.timestamp;
215 set: function(value) {
216 if (value instanceof InternalValues_) {
217 _internal.timestamp = value.timestamp;
223 Object.defineProperty(this, 'from', {
225 return _internal.from;
227 set: function(value) {
228 if (value instanceof InternalValues_) _internal.from = value.from;
233 Object.defineProperty(this, 'to', {
237 set: function(value) {
238 if (value instanceof InternalValues_) value = value.to;
239 if (value instanceof Array) _internal.to = value;
244 Object.defineProperty(this, 'cc', {
248 set: function(value) {
249 if (value instanceof InternalValues_) value = value.cc;
250 if (value instanceof Array) _internal.cc = value;
255 Object.defineProperty(this, 'bcc', {
257 return _internal.bcc;
259 set: function(value) {
260 if (value instanceof InternalValues_) value = value.bcc;
261 if (value instanceof Array) _internal.bcc = value;
266 Object.defineProperty(this, 'body', {
268 return _internal.body;
270 set: function(value) {
271 if (value instanceof InternalValues_)
272 _internal.body = new MessageBody(value.body);
273 if (value instanceof MessageBody) _internal.body = value;
278 Object.defineProperty(this, 'isRead', {
280 return _internal.isRead;
282 set: function(value) {
283 if (value instanceof InternalValues_) {
284 value = value.isRead;
286 _internal.isRead = !!value;
291 Object.defineProperty(this, 'hasAttachment', {
293 return _internal.attachments.length > 0;
295 set: function(value) {
296 if (value instanceof InternalValues_)
297 _internal.hasAttachment = value.hasAttachment;
302 Object.defineProperty(this, 'isHighPriority', {
304 return _internal.isHighPriority;
306 set: function(value) {
307 if (value instanceof InternalValues_) value = value.isHighPriority;
308 _internal.isHighPriority = !!value;
313 Object.defineProperty(this, 'subject', {
315 return _internal.subject;
317 set: function(value) {
318 if (value instanceof InternalValues_) value = value.subject;
319 _internal.subject = String(value);
324 Object.defineProperty(this, 'inResponseTo', {
326 return _internal.inResponseTo;
328 set: function(value) {
329 if (value instanceof InternalValues_)
330 _internal.inResponseTo = value.inResponseTo;
335 Object.defineProperty(this, 'messageStatus', {
342 var result = native.callSync('MessageGetMessageStatus', callArgs);
343 if (native.isSuccess(result)) {
344 return native.getResultObject(result);
349 set: function(value) {
355 Object.defineProperty(this, 'attachments', {
357 return _internal.attachments;
359 set: function(value) {
360 if (value instanceof InternalValues_) {
361 value = value.attachments;
362 for (var k = 0; k < value.length; ++k) {
363 if (!(value[k] instanceof tizen.MessageAttachment)) {
364 if (_internal.attachments[k]) {
365 updateInternal_(_internal.attachments[k], value[k]);
367 _internal.attachments[k] = new MessageAttachment(
368 new InternalValues_(value[k])
372 _internal.attachments[k] = value[k];
375 // if new array is shorter than the old one, remove excess elements
376 if (value.length < _internal.length) {
377 _internal.splice(value.length, _internal.length - value.length);
379 } else if (T_.isArray(value)) {
380 for (var k = 0; k < value.length; ++k) {
381 if (!(value[k] instanceof tizen.MessageAttachment)) {
385 _internal.attachments = value;
392 function MessageInit_(data) {
393 if (!(this instanceof MessageInit_)) {
394 return new MessageInit_(data);
396 if (!data || typeof data !== 'object') {
399 this.id = data.id || null;
400 this.conversationId = data.conversationId || null;
401 this.folderId = data.folderId || null;
402 this.timestamp = data.timestamp || null;
403 this.from = data.from || '';
404 this.to = data.to || [];
405 this.cc = data.cc || [];
406 this.bcc = data.bcc || [];
407 this.isRead = data.isRead || false;
408 this.hasAttachment = data.hasAttachment || null;
409 this.isHighPriority = data.isHighPriority || false;
410 this.subject = data.subject || '';
411 this.inResponseTo = data.inResponseTo || null;
412 this.attachments = [];
413 this.plainBody = data.body ? data.body.plainBody : '';
414 this.htmlBody = data.body ? data.body.htmlBody : '';
417 if (data.attachments && data.attachments.constructor === Array) {
418 data.attachments.forEach(function(el) {
421 if (el.constructor === MessageAttachment) {
422 self.attachments.push(el);
424 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
430 function MessageBody(data) {
431 if (!this instanceof MessageBody) {
432 return new MessageBody(data);
434 if (data === null || typeof data !== 'object') {
439 messageId: data.messageId || null,
440 loaded: data.loaded || false,
441 plainBody: data.plainBody || '',
442 htmlBody: data.htmlBody || '',
443 inlineAttachments: data.inlineAttachments || []
446 Object.defineProperty(this, 'messageId', {
448 return _internal.messageId;
450 set: function(value) {
451 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
456 Object.defineProperty(this, 'loaded', {
458 return _internal.loaded;
460 set: function(value) {
461 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
466 Object.defineProperty(this, 'plainBody', {
468 return _internal.plainBody;
470 set: function(value) {
471 if (value instanceof InternalValues_) {
472 _internal.plainBody = String(value.plainBody);
474 _internal.plainBody = String(value);
480 Object.defineProperty(this, 'htmlBody', {
482 return _internal.htmlBody;
484 set: function(value) {
485 if (value instanceof InternalValues_) {
486 _internal.htmlBody = String(value.htmlBody);
488 _internal.htmlBody = String(value);
494 Object.defineProperty(this, 'inlineAttachments', {
496 return _internal.inlineAttachments;
498 set: function(value) {
499 if (value instanceof InternalValues_) {
500 _internal.inlineAttachments = value.inlineAttachments;
501 } else if (T_.isArray(value)) {
502 _internal.inlineAttachments = value;
509 var messageAttachmentsLoaded = {};
511 function MessageAttachment(first, second) {
512 privUtils_.deprecationWarn(
513 'MessageAttachment() is deprecated and will be ' +
514 'removed from next release without any alternatives. ',
517 validator_.isConstructorCall(this, MessageAttachment);
518 if (!this instanceof MessageAttachment) {
519 return new MessageAttachment(data);
522 var internalConstructor = first instanceof InternalValues_;
524 messageId: internalConstructor ? first.messageId : null,
525 id: internalConstructor ? first.id : null,
526 mimeType: internalConstructor
528 : undefined == second
531 filePath: internalConstructor ? first.filePath : first
534 Object.defineProperty(this, 'messageId', {
536 return _internal.messageId;
538 set: function(value) {
539 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
544 Object.defineProperty(this, 'id', {
548 set: function(value) {
549 if (value instanceof InternalValues_) _internal.id = value.id;
554 Object.defineProperty(this, 'mimeType', {
556 return _internal.mimeType;
558 set: function(value) {
559 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
564 Object.defineProperty(this, 'filePath', {
566 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
570 return _internal.filePath;
572 set: function(value) {
573 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
579 function Messaging() {}
581 Messaging.prototype.getMessageServices = function() {
582 privUtils_.deprecationWarn(
583 'getMessageServices() is deprecated and will be ' +
584 'removed from next release without any alternatives. ',
587 var args = validator_.validateArgs(arguments, [
589 name: 'messageServiceType',
591 values: Object.values(MessageServiceTag)
593 { name: 'successCallback', type: types_.FUNCTION },
594 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
597 var callArgs = { messageServiceType: args.messageServiceType };
598 var callback = function(result) {
599 if (native.isFailure(result)) {
600 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
602 var data = native.getResultObject(result);
603 var servicesArr = [];
604 data.forEach(function(e) {
605 servicesArr.push(new MessageService(e));
607 args.successCallback(servicesArr);
610 var result = native.call('GetMessageServices', callArgs, callback);
611 if (native.isFailure(result)) {
612 throw native.getErrorObject(result);
616 function MessageStorage() {}
617 function MessageService(data) {
618 propertyFactory_(this, 'id', data.id, Property.ENUMERABLE);
619 propertyFactory_(this, 'type', data.type, Property.ENUMERABLE);
620 propertyFactory_(this, 'name', data.name, Property.ENUMERABLE);
624 new MessageStorage(this),
629 MessageService.prototype.sendMessage = function() {
630 privUtils_.deprecationWarn(
631 'sendMessage() is deprecated and will be ' +
632 'removed from next release without any alternatives. ',
635 var args = validator_.validateArgs(arguments, [
636 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
638 name: 'successCallback',
639 type: types_.FUNCTION,
643 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
644 { name: 'simIndex', type: types_.LONG, optional: true, nullable: true }
647 if (args.message.type != this.type) {
648 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
654 message: args.message,
655 simIndex: args.simIndex || 1,
658 var callback = function(result) {
659 if (native.isFailure(result)) {
660 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
662 var data = native.getResultObject(result);
663 var message = data.message;
665 var body = message.body;
667 updateInternal_(args.message.body, body);
670 updateInternal_(args.message, message);
672 native.callIfPossible(args.successCallback, data.recipients);
675 var result = native.call('MessageServiceSendMessage', callArgs, callback);
676 if (native.isFailure(result)) {
677 throw native.getErrorObject(result);
681 MessageService.prototype.loadMessageBody = function() {
682 privUtils_.deprecationWarn(
683 'loadMessageBody() is deprecated and will be ' +
684 'removed from next release without any alternatives. ',
687 var args = validator_.validateArgs(arguments, [
688 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
689 { name: 'successCallback', type: types_.FUNCTION },
690 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
693 if (args.message.type != this.type) {
694 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
700 message: args.message,
704 var callback = function(result) {
705 if (native.isFailure(result)) {
706 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
708 var data = native.getResultObject(result);
709 var body = data.messageBody;
711 updateInternal_(args.message.body, body);
714 args.successCallback(args.message);
718 var result = native.call('MessageServiceLoadMessageBody', callArgs, callback);
720 if (native.isFailure(result)) {
721 throw native.getErrorObject(result);
724 MessageService.prototype.loadMessageAttachment = function() {
725 privUtils_.deprecationWarn(
726 'loadMessageAttachment() is deprecated and will be ' +
727 'removed from next release without any alternatives. ',
730 var args = validator_.validateArgs(arguments, [
731 { name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment },
732 { name: 'successCallback', type: types_.FUNCTION },
733 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
737 var firstCall = false;
738 if (!messageAttachmentsLoaded[args.attachment.id]) {
740 messageAttachmentsLoaded[args.attachment.id] = true;
744 attachment: args.attachment,
748 var callback = function(result) {
749 if (native.isFailure(result)) {
750 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
752 var data = native.getResultObject(result);
753 var messageAttachment = data.messageAttachment;
754 if (messageAttachment) {
755 updateInternal_(args.attachment, messageAttachment);
758 args.successCallback(args.attachment);
762 var result = native.call('MessageServiceLoadMessageAttachment', callArgs, callback);
764 if (native.isFailure(result)) {
765 throw native.getErrorObject(result);
769 MessageService.prototype.sync = function() {
770 privUtils_.deprecationWarn(
771 'sync() is deprecated and will be ' +
772 'removed from next release without any alternatives. ',
775 var args = validator_.validateArgs(arguments, [
777 name: 'successCallback',
778 type: types_.FUNCTION,
782 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
783 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
790 limit: args.limit || null
793 var callback = function(result) {
794 if (native.isFailure(result)) {
795 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
797 native.callIfPossible(args.successCallback);
801 var result = native.call('MessageServiceSync', callArgs, callback);
803 if (native.isFailure(result)) {
804 throw native.getErrorObject(result);
807 return native.getResultObject(result);
810 MessageService.prototype.syncFolder = function() {
811 privUtils_.deprecationWarn(
812 'syncFolder() is deprecated and will be ' +
813 'removed from next release without any alternatives. ',
816 var args = validator_.validateArgs(arguments, [
817 { name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder },
819 name: 'successCallback',
820 type: types_.FUNCTION,
824 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
825 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
833 limit: args.limit || null
836 var callback = function(result) {
837 if (native.isFailure(result)) {
838 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
840 native.callIfPossible(args.successCallback);
844 var result = native.call('MessageServiceSyncFolder', callArgs, callback);
846 if (native.isFailure(result)) {
847 throw native.getErrorObject(result);
850 return native.getResultObject(result);
853 MessageService.prototype.stopSync = function() {
854 privUtils_.deprecationWarn(
855 'stopSync() is deprecated and will be ' +
856 'removed from next release without any alternatives. ',
859 var args = validator_.validateArgs(arguments, [{ name: 'opId', type: types_.LONG }]);
866 var result = native.callSync('MessageServiceStopSync', callArgs);
867 if (native.isFailure(result)) {
868 throw native.getErrorObject(result);
872 function MessageStorage(service) {
873 propertyFactory_(this, 'service', service);
876 MessageStorage.prototype.addDraftMessage = function() {
877 privUtils_.deprecationWarn(
878 'addDraftMessage() is deprecated and will be ' +
879 'removed from next release without any alternatives. ',
882 var args = validator_.validateArgs(arguments, [
883 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
885 name: 'successCallback',
886 type: types_.FUNCTION,
890 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
893 if (args.message.type != this.service.type) {
894 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
900 message: args.message,
901 serviceId: self.service.id
903 var callback = function(result) {
904 if (native.isFailure(result)) {
905 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
907 var data = native.getResultObject(result);
908 var message = data.message;
910 var body = message.body;
912 updateInternal_(args.message.body, body);
915 var attachments = message.attachments;
917 for (var i = 0; i < attachments.length; i++) {
918 messageAttachmentsLoaded[attachments[i].id] = true;
921 updateInternal_(args.message, message);
923 native.callIfPossible(args.successCallback, data.recipients);
926 var result = native.call('MessageStorageAddDraftMessage', callArgs, callback);
927 if (native.isFailure(result)) {
928 throw native.getErrorObject(result);
932 MessageStorage.prototype.findMessages = function() {
933 privUtils_.deprecationWarn(
934 'findMessages() is deprecated and will be ' +
935 'removed from next release without any alternatives. ',
938 var args = validator_.validateArgs(arguments, [
941 type: types_.PLATFORM_OBJECT,
943 tizen.AttributeFilter,
944 tizen.AttributeRangeFilter,
945 tizen.CompositeFilter
948 { name: 'successCallback', type: types_.FUNCTION },
949 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
952 type: types_.PLATFORM_OBJECT,
953 values: tizen.SortMode,
957 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
958 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
964 filter: addTypeToFilter_(args.filter) || null,
965 sort: args.sort || null,
966 limit: args.limit || null,
967 offset: args.offset || null,
968 serviceId: self.service.id,
969 type: self.service.type
971 var callback = function(result) {
972 if (native.isFailure(result)) {
973 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
975 var data = native.getResultObject(result);
977 data.forEach(function(el) {
978 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
980 native.callIfPossible(args.successCallback, messages);
983 var result = native.call('MessageStorageFindMessages', callArgs, callback);
984 if (native.isFailure(result)) {
985 throw native.getErrorObject(result);
989 MessageStorage.prototype.removeMessages = function() {
990 privUtils_.deprecationWarn(
991 'removeMessages() is deprecated and will be ' +
992 'removed from next release without any alternatives. ',
995 var args = validator_.validateArgs(arguments, [
996 { name: 'messages', type: types_.ARRAY, values: Message },
998 name: 'successCallback',
999 type: types_.FUNCTION,
1003 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1008 args.messages.forEach(function(msg) {
1009 if (msg.type != self.service.type) {
1010 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1015 messages: args.messages,
1016 serviceId: self.service.id,
1017 type: self.service.type
1019 var callback = function(result) {
1020 if (native.isFailure(result)) {
1021 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1023 native.callIfPossible(args.successCallback);
1026 var result = native.call('MessageStorageRemoveMessages', callArgs, callback);
1027 if (native.isFailure(result)) {
1028 throw native.getErrorObject(result);
1032 MessageStorage.prototype.updateMessages = function() {
1033 privUtils_.deprecationWarn(
1034 'updateMessages() is deprecated and will be ' +
1035 'removed from next release without any alternatives. ',
1038 var args = validator_.validateArgs(arguments, [
1039 { name: 'messages', type: types_.ARRAY, values: Message },
1041 name: 'successCallback',
1042 type: types_.FUNCTION,
1046 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1051 args.messages.forEach(function(msg) {
1052 if (msg.type != self.service.type) {
1053 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1058 messages: args.messages,
1059 serviceId: self.service.id
1061 var callback = function(result) {
1062 if (native.isFailure(result)) {
1063 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1065 var data = native.getResultObject(result);
1067 i = args.messages.length,
1070 m = args.messages[i];
1072 originals[m.id] = m;
1079 if (originals[m.oldId]) {
1082 updateInternal_(originals[m.oldId].body, body);
1085 updateInternal_(originals[m.oldId], m);
1089 native.callIfPossible(args.successCallback);
1092 var result = native.call('MessageStorageUpdateMessages', callArgs, callback);
1093 if (native.isFailure(result)) {
1094 throw native.getErrorObject(result);
1098 MessageStorage.prototype.findConversations = function() {
1099 privUtils_.deprecationWarn(
1100 'findConversations() is deprecated and will be ' +
1101 'removed from next release without any alternatives. ',
1104 var args = validator_.validateArgs(arguments, [
1107 type: types_.PLATFORM_OBJECT,
1109 tizen.AttributeFilter,
1110 tizen.AttributeRangeFilter,
1111 tizen.CompositeFilter
1114 { name: 'successCallback', type: types_.FUNCTION },
1115 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
1118 type: types_.PLATFORM_OBJECT,
1119 values: tizen.SortMode,
1123 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
1124 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
1130 filter: addTypeToFilter_(args.filter),
1131 sort: args.sort || null,
1132 limit: args.limit || null,
1133 offset: args.offset || null,
1134 serviceId: self.service.id
1136 var callback = function(result) {
1137 if (native.isFailure(result)) {
1138 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1140 var data = native.getResultObject(result);
1141 var conversations = [];
1142 data.forEach(function(el) {
1143 conversations.push(new MessageConversation(el));
1145 args.successCallback(conversations);
1148 var result = native.call('MessageStorageFindConversations', callArgs, callback);
1149 if (native.isFailure(result)) {
1150 throw native.getErrorObject(result);
1154 MessageStorage.prototype.removeConversations = function() {
1155 privUtils_.deprecationWarn(
1156 'removeConversations() is deprecated and will be ' +
1157 'removed from next release without any alternatives. ',
1160 var args = validator_.validateArgs(arguments, [
1161 { name: 'conversations', type: types_.ARRAY },
1163 name: 'successCallback',
1164 type: types_.FUNCTION,
1168 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1171 args.conversations.forEach(function(el) {
1172 if (!el || el.constructor !== MessageConversation) {
1173 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1180 conversations: args.conversations,
1181 serviceId: self.service.id,
1182 type: self.service.type
1184 var callback = function(result) {
1185 if (native.isFailure(result)) {
1186 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1188 native.callIfPossible(args.successCallback);
1191 var result = native.call('MessageStorageRemoveConversations', callArgs, callback);
1192 if (native.isFailure(result)) {
1193 throw native.getErrorObject(result);
1197 MessageStorage.prototype.findFolders = function() {
1198 privUtils_.deprecationWarn(
1199 'findFolders() is deprecated and will be ' +
1200 'removed from next release without any alternatives. ',
1203 var args = validator_.validateArgs(arguments, [
1206 type: types_.PLATFORM_OBJECT,
1208 tizen.AttributeFilter,
1209 tizen.AttributeRangeFilter,
1210 tizen.CompositeFilter
1213 { name: 'successCallback', type: types_.FUNCTION },
1214 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1220 filter: addTypeToFilter_(args.filter),
1221 sort: args.sort || null,
1222 limit: args.limit || null,
1223 offset: args.offset || null,
1224 serviceId: self.service.id
1226 var callback = function(result) {
1227 if (native.isFailure(result)) {
1228 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1230 var data = native.getResultObject(result);
1232 data.forEach(function(el) {
1233 folders.push(new MessageFolder(el));
1235 args.successCallback(folders);
1238 var result = native.call('MessageStorageFindFolders', callArgs, callback);
1239 if (native.isFailure(result)) {
1240 throw native.getErrorObject(result);
1244 function pushMessage(messages, el) {
1245 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1248 function pushConversation(conversations, el) {
1249 conversations.push(new MessageConversation(el));
1252 function pushFolder(folders, el) {
1253 folders.push(new MessageFolder(el));
1256 function getListenerFunction(listenerMap, pushMethod) {
1257 return function(msg) {
1258 var action = msg.action;
1259 var data = native.getResultObject(msg);
1261 data.forEach(function(el) {
1262 pushMethod(messages, el);
1265 for (var key in listenerMap) {
1266 if (listenerMap.hasOwnProperty(key)) {
1267 native.callIfPossible(listenerMap[key][action], messages);
1273 var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener';
1274 var MessagesChangeListeners = {};
1276 MESSAGES_CHANGE_LISTENER,
1277 getListenerFunction(MessagesChangeListeners, pushMessage)
1280 var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener';
1281 var ConversationsChangeListeners = {};
1283 CONVERSATIONS_CHANGE_LISTENER,
1284 getListenerFunction(ConversationsChangeListeners, pushConversation)
1287 var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener';
1288 var FoldersChangeListeners = {};
1290 FOLDERS_CHANGE_LISTENER,
1291 getListenerFunction(FoldersChangeListeners, pushFolder)
1294 MessageStorage.prototype.addMessagesChangeListener = function() {
1295 privUtils_.deprecationWarn(
1296 'addMessagesChangeListener() is deprecated and will be ' +
1297 'removed from next release without any alternatives. ',
1300 var args = validator_.validateArgs(arguments, [
1302 name: 'messagesChangeCallback',
1303 type: types_.LISTENER,
1304 values: ['messagesadded', 'messagesupdated', 'messagesremoved']
1308 type: types_.PLATFORM_OBJECT,
1310 tizen.AttributeFilter,
1311 tizen.AttributeRangeFilter,
1312 tizen.CompositeFilter
1322 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1323 serviceId: self.service.id
1325 var result = native.callSync('MessageStorageAddMessagesChangeListener', callArgs);
1326 if (native.isFailure(result)) {
1327 throw native.getErrorObject(result);
1329 var opId = native.getResultObject(result);
1330 MessagesChangeListeners[opId] = args.messagesChangeCallback;
1335 MessageStorage.prototype.addConversationsChangeListener = function() {
1336 privUtils_.deprecationWarn(
1337 'addConversationsChangeListener() is deprecated and will be ' +
1338 'removed from next release without any alternatives. ',
1341 var args = validator_.validateArgs(arguments, [
1343 name: 'conversationsChangeCallback',
1344 type: types_.LISTENER,
1345 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']
1349 type: types_.PLATFORM_OBJECT,
1351 tizen.AttributeFilter,
1352 tizen.AttributeRangeFilter,
1353 tizen.CompositeFilter
1363 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1364 serviceId: self.service.id
1366 var result = native.callSync(
1367 'MessageStorageAddConversationsChangeListener',
1370 if (native.isFailure(result)) {
1371 throw native.getErrorObject(result);
1373 var opId = native.getResultObject(result);
1374 ConversationsChangeListeners[opId] = args.conversationsChangeCallback;
1379 MessageStorage.prototype.addFoldersChangeListener = function() {
1380 privUtils_.deprecationWarn(
1381 'addFoldersChangeListener() is deprecated and will be ' +
1382 'removed from next release without any alternatives. ',
1385 var args = validator_.validateArgs(arguments, [
1387 name: 'foldersChangeCallback',
1388 type: types_.LISTENER,
1389 values: ['foldersadded', 'foldersupdated', 'foldersremoved']
1393 type: types_.PLATFORM_OBJECT,
1395 tizen.AttributeFilter,
1396 tizen.AttributeRangeFilter,
1397 tizen.CompositeFilter
1407 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1408 serviceId: self.service.id
1410 var result = native.callSync('MessageStorageAddFolderChangeListener', callArgs);
1411 if (native.isFailure(result)) {
1412 throw native.getErrorObject(result);
1414 var opId = native.getResultObject(result);
1415 FoldersChangeListeners[opId] = args.foldersChangeCallback;
1420 MessageStorage.prototype.removeChangeListener = function() {
1421 privUtils_.deprecationWarn(
1422 'removeChangeListener() is deprecated and will be ' +
1423 'removed from next release without any alternatives. ',
1426 var args = validator_.validateArgs(arguments, [
1427 { name: 'watchId', type: types_.LONG }
1433 watchId: args.watchId,
1434 serviceId: self.service.id
1436 var result = native.callSync('MessageStorageRemoveChangeListener', callArgs);
1437 if (native.isFailure(result)) {
1438 throw native.getErrorObject(result);
1440 if (MessagesChangeListeners.hasOwnProperty(args.watchId)) {
1441 delete MessagesChangeListeners[args.watchId];
1442 } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) {
1443 delete ConversationsChangeListeners[args.watchId];
1444 } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) {
1445 delete FoldersChangeListeners[args.watchId];
1450 function MessageConversation(data) {
1451 propertyFactory_(this, 'id', data.id || null, Property.ENUMERABLE);
1452 propertyFactory_(this, 'type', data.type || '', Property.ENUMERABLE);
1456 data.timestamp ? new Date(data.timestamp * 1000) : null,
1459 propertyFactory_(this, 'messageCount', data.messageCount || 0, Property.ENUMERABLE);
1463 data.unreadMessages || 0,
1466 propertyFactory_(this, 'preview', data.preview || '', Property.ENUMERABLE);
1467 propertyFactory_(this, 'subject', data.subject || '', Property.ENUMERABLE);
1468 propertyFactory_(this, 'isRead', data.isRead || false, Property.ENUMERABLE);
1469 propertyFactory_(this, 'from', data.from || null, Property.ENUMERABLE);
1470 propertyFactory_(this, 'to', data.to || [], Property.ENUMERABLE);
1471 propertyFactory_(this, 'cc', data.cc || [], Property.ENUMERABLE);
1472 propertyFactory_(this, 'bcc', data.bcc || [], Property.ENUMERABLE);
1476 data.lastMessageId || null,
1481 function MessageFolder(data) {
1483 id: data.id || null,
1484 parentId: data.parentId || null,
1485 serviceId: data.serviceId || '',
1486 contentType: data.contentType || '',
1487 name: data.name || '',
1488 path: data.path || '',
1489 type: data.type || '',
1490 synchronizable: data.synchronizable || false
1493 Object.defineProperty(this, 'id', {
1495 return _internal.id;
1500 Object.defineProperty(this, 'parentId', {
1502 return _internal.parentId;
1507 Object.defineProperty(this, 'serviceId', {
1509 return _internal.serviceId;
1514 Object.defineProperty(this, 'contentType', {
1516 return _internal.contentType;
1521 Object.defineProperty(this, 'name', {
1523 return _internal.name;
1525 set: function(value) {
1526 if (value) _internal.name = value;
1531 Object.defineProperty(this, 'path', {
1533 return _internal.path;
1538 Object.defineProperty(this, 'type', {
1540 return _internal.type;
1545 Object.defineProperty(this, 'synchronizable', {
1547 return _internal.synchronizable;
1549 set: function(value) {
1550 _internal.synchronizable = Boolean(value);
1556 tizen.Message = Message;
1558 tizen.MessageAttachment = MessageAttachment;
1560 exports = new Messaging();