2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
21 #include <Commons/Exception.h>
22 #include "ReqReceiverMessage.h"
23 #include "Messaging.h"
24 #include "CallbackMgr.h"
25 #include "MsgServiceHandleMgr.h"
26 #include "WidgetFilePathMgr.h"
32 #include <msg_storage.h>
37 const char* TEXT_AREA = "Text";
38 const char* TEXT_FILE_EXTENSION = ".txt";
39 const char* TEXT_DIR_SEPERATOR = "/";
40 const int WHITE_COLOR = 0xffffff;
41 const int BLACK_COLOR = 0x000000;
42 const int ROOT_LAYOUT_WIDTH = 100;
43 const int ROOT_LAYOUT_HEIGHT = 100;
44 const char* EMPTY_ID = "0";
52 Mms::Mms(const string& id) :
56 LoggerD("m_id=" << getIdRef());
58 char buf[] = "XXXXXX";
59 mode_t mask = umask(S_IWGRP | S_IWOTH);
61 LoggerD("buf : " << buf << " i : " << i);
64 m_bodyFilePath = getWidgetPath()+TEXT_DIR_SEPERATOR+m_bodyFilePath+TEXT_FILE_EXTENSION;
66 if (getIdRef().empty()) {
69 readExistingMessage();
73 Mms::Mms(const string& id, const msg_struct_t msg_data) :
77 LoggerD("m_id=" << getIdRef());
79 m_messageData = createNewCopyOfPLatformMsgWithAddressList(msg_data);
81 char buf[] = "XXXXXX";
82 mode_t mask = umask(S_IWGRP | S_IWOTH);
84 LoggerD("buf : " << buf << " i : " << i);
87 m_bodyFilePath = getWidgetPath()+TEXT_DIR_SEPERATOR+m_bodyFilePath+TEXT_FILE_EXTENSION;
89 readConversationId(m_messageData);
90 readRecipientList(m_messageData);
91 readPriority(m_messageData);
92 readSubject(m_messageData);
93 readBodyAndAttachments(m_messageData);
94 readFolder(m_messageData);
95 readDateTime(m_messageData);
96 readReadStatus(m_messageData);
97 readMessageStatus(m_messageData);
106 // release platform message structure
107 // msg_release_message(&m_messageData);
108 msg_release_struct(&m_messageData);
112 //trying to remove file, return value is skipped
113 if (!m_bodyFilePath.empty()) {
114 LoggerD("remove tmp file=" << m_bodyFilePath);
115 (void) ::remove(m_bodyFilePath.c_str());
119 void Mms::createNewMessage()
122 msg_release_struct(&m_messageData);
123 m_messageData = NULL;
126 char strSubject[MAX_SUBJECT_LEN] = {0,};
128 m_messageData = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
129 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
130 // msg_struct_t option = NULL;
132 // initialize platform message structure
133 msg_set_int_value(m_messageData, MSG_MESSAGE_TYPE_INT, MSG_TYPE_MMS);
134 msg_set_bool_value(sendOpt, MSG_SEND_OPT_SETTING_BOOL, false);
135 msg_set_str_value(m_messageData, MSG_MESSAGE_SUBJECT_STR, strSubject, MAX_SUBJECT_LEN);
137 setMmsType(MULTIPART_MIXED);
138 setReadStatus(false);
139 setMessageStatus(MESSAGE_STATUS_CREATED);
141 msg_release_struct(&sendOpt);
142 LoggerD("Message created successfully, Id: " << getIdRef());
145 void Mms::readExistingMessage()
149 if (getIdRef().empty() || (EMPTY_ID == getIdRef()))
151 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Empty id.");
154 msg_release_struct(&m_messageData);
155 m_messageData = NULL;
156 msg_struct_t sendOpt = NULL;
160 m_messageData = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
161 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
163 // trying to get message from platform
164 if (MSG_SUCCESS != msg_get_message(MsgGetCommonHandle(), convertId(getIdRef()), m_messageData, sendOpt))
166 LoggerE("get message error");
167 Throw(WrtDeviceApis::Commons::PlatformException);
169 LoggerD("message found with msgId=" << getIdRef());
171 // read all mms dat to abstraction layer
172 readConversationId(m_messageData);
173 readRecipientList(m_messageData);
174 readPriority(m_messageData);
175 readSubject(m_messageData);
176 readBodyAndAttachments(m_messageData);
177 readFolder(m_messageData);
178 readDateTime(m_messageData);
179 readReadStatus(m_messageData);
180 readMessageStatus(m_messageData);
182 msg_release_struct(&sendOpt);
184 Catch(WrtDeviceApis::Commons::PlatformException) {
185 LoggerE("exception");
187 msg_release_struct(&sendOpt);
191 void Mms::readDateTime(msg_struct_t& messageData)
193 // tm* time = localtime(msg_get_time(messageData));
194 // tm dateT = getDateTime();
196 msg_get_int_value(messageData, MSG_MESSAGE_DISPLAY_TIME_INT, &tempInt);
198 LoggerE("readDateTime : " <<tempInt);
200 tm* time = localtime((time_t*)&tempInt);
202 LoggerE("localtime failed");
203 Throw(WrtDeviceApis::Commons::PlatformException);
208 void Mms::readReadStatus(msg_struct_t& messageData)
211 msg_get_bool_value(messageData, MSG_MESSAGE_READ_BOOL, &tempBool);
212 setReadStatus(tempBool);
215 void Mms::readFolder(msg_struct_t& messageData)
218 msg_get_int_value(messageData, MSG_MESSAGE_FOLDER_ID_INT, &tempValue);
222 setFolderType(INBOX);
225 setFolderType(OUTBOX);
228 setFolderType(SENTBOX);
231 setFolderType(DRAFTBOX);
234 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Unsupported folder id.");
238 void Mms::readMessageStatus(msg_struct_t& messageData)
241 msg_get_int_value(messageData, MSG_MESSAGE_FOLDER_ID_INT, &tempValue);
243 LoggerD("readMessageStatus folder : " << tempValue);
247 setMessageStatus(MESSAGE_STATUS_LOADED);
250 setMessageStatus(MESSAGE_STATUS_SENDING);
253 setMessageStatus(MESSAGE_STATUS_SENT);
256 setMessageStatus(MESSAGE_STATUS_DRAFT);
259 setMessageStatus(MESSAGE_STATUS_LOADED);
264 void Mms::readPriority(msg_struct_t& messageData)
266 // switch (msg_get_priority_info(messageData)) {
268 msg_get_int_value(messageData, MSG_MESSAGE_PRIORITY_INT, &tempInt);
270 case MSG_MESSAGE_PRIORITY_LOW:
271 setPriority(MessagePriority::LOW);
273 case MSG_MESSAGE_PRIORITY_NORMAL:
274 setPriority(MessagePriority::NORMAL);
276 case MSG_MESSAGE_PRIORITY_HIGH:
277 setPriority(MessagePriority::HIGH);
280 LoggerE("Wrong priority type");
281 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Wrong priority type");
285 void Mms::readConversationId(msg_struct_t& messageData)
288 msg_get_int_value(messageData, MSG_MESSAGE_THREAD_ID_INT, &tempInt);
289 LoggerD("conversationID : " <<tempInt);
293 void Mms::readRecipientList(msg_struct_t& messageData)
295 std::string phoneNumber;
296 // int recipientCount = msg_get_address_count(messageData);
297 // LoggerD("Recipient count " << recipientCount);
299 msg_struct_list_s *addr_list;
300 msg_get_list_handle(messageData, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
303 char strNumber[MAX_ADDRESS_VAL_LEN] = {0,};
305 int recipientCount = addr_list->nCount;
306 LoggerD("Recipient count " << recipientCount);
308 for (int i = 0; i < recipientCount; ++i)
310 // int type = msg_get_direction_info(messageData);
311 msg_get_int_value(messageData, MSG_MESSAGE_DIRECTION_INT, &tempInt);
313 LoggerD("Direction: " << type);
315 if (MSG_DIRECTION_TYPE_MT == type)
317 msg_struct_t addr_info = addr_list->msg_struct_info[i];
318 memset(strNumber, 0x00, sizeof(MAX_ADDRESS_VAL_LEN));
319 msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, MAX_ADDRESS_VAL_LEN);
320 phoneNumber = strNumber;
322 if (validatePhoneNumber(phoneNumber))
324 setSourceAddress(phoneNumber);
325 setFrom(phoneNumber);
327 LoggerD("MT number: " << phoneNumber);
329 else if (MSG_DIRECTION_TYPE_MO == type)
331 msg_struct_t addr_info = addr_list->msg_struct_info[i];
332 memset(strNumber, 0x00, sizeof(MAX_ADDRESS_VAL_LEN));
333 msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, MAX_ADDRESS_VAL_LEN);
334 msg_get_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, &tempInt);
335 LoggerD("MO number: " << strNumber);
336 LoggerD("Type : " << tempInt);
339 case MSG_RECIPIENTS_TYPE_TO:
340 appendToRecipients(strNumber);
342 case MSG_RECIPIENTS_TYPE_CC:
343 appendCcRecipients(strNumber);
345 case MSG_RECIPIENTS_TYPE_BCC:
346 appendBccRecipients(strNumber);
349 LoggerE("Wrong type of recipient");
354 LoggerE("Wrong type of recipient");
355 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Wrong type of recipient");
360 void Mms::readSubject(msg_struct_t& messageData)
362 char strTemp[MAX_SUBJECT_LEN] = {0};
363 msg_get_str_value(messageData, MSG_MESSAGE_SUBJECT_STR, strTemp, MAX_SUBJECT_LEN);
364 // setSubject(msg_get_subject(messageData));
365 LoggerE("readSubject : " << strTemp);
369 void Mms::readBodyAndAttachments(msg_struct_t& messageData)
372 int pageLen, mediaLen, attachLen, tempInt, ret;
374 msg_struct_t mms_struct = NULL;
376 msg_list_handle_t page_list = NULL;
377 msg_list_handle_t media_list = NULL;
378 msg_list_handle_t attach_list = NULL;
380 msg_struct_t page = NULL;
381 msg_struct_t media = NULL;
382 msg_struct_t attach = NULL;
384 mms_struct = msg_create_struct(MSG_STRUCT_MMS);
385 ret = msg_get_mms_struct(messageData, mms_struct);
387 if (ret != MSG_SUCCESS)
389 LoggerE("cannot get mms struct");
390 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "cannot get mms struct");
393 char szFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
394 char szFileName[MSG_FILENAME_LEN_MAX] = {0,};
396 msg_get_list_handle(mms_struct, MSG_MMS_PAGE_LIST_HND, (void **)&page_list);
397 pageLen = msg_list_length(page_list);
400 setMmsType(MULTIPART_RELATED);
402 setMmsType(MULTIPART_MIXED);
405 LoggerD("page count: " << pageLen);
407 for (int p = 0; p < pageLen; ++p)
409 LoggerD("page " << p);
410 page = (msg_struct_t)msg_list_nth_data(page_list, p);
413 LoggerE("returned page is null, continue");
417 msg_get_list_handle(page, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&media_list);
418 mediaLen = msg_list_length(media_list);
420 for (int m = 0; m < mediaLen; ++m)
422 LoggerD("media file " << m);
423 media = (msg_struct_t)msg_list_nth_data(media_list, m);
426 LoggerE("returned media is null, continue");
430 msg_get_int_value(media, MSG_MMS_MEDIA_TYPE_INT, &tempInt);
432 memset(szFilePath, 0, sizeof(szFilePath));
433 msg_get_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, szFilePath, sizeof(szFilePath));
435 if ((0 == p) && (MMS_SMIL_MEDIA_TEXT == tempInt))
437 //text value on first page goes to body attribute
438 LoggerD("setting body from " << szFilePath);
441 f = fopen(szFilePath, "r");
444 LoggerE("cannot read file with body" << szFilePath);
445 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Cannot read file with body");
447 fseek(f, 0, SEEK_END);
448 long int size = ftell(f);
449 fseek(f, 0, SEEK_SET);
450 char* data = new (nothrow) char[size + 1];
453 memset(data, 0, size + 1);
454 error = fread(data, 1, size, f);
458 LoggerE("body is not set");
460 LoggerD("message body: '" << getBody() << "'");
465 LoggerD("adding attachment " << szFilePath);
467 IAttachmentPtr attachment = appendAttachment(szFilePath, false);
468 //attachment->setMessage(this); //set IMessagePtr
470 memset(szFileName, 0, sizeof(szFileName));
471 msg_get_str_value(media, MSG_MMS_MEDIA_FILENAME_STR, szFileName, sizeof(szFileName));
472 if ((szFileName[0] =! '\0' )&& (strnlen(szFileName, MSG_FILENAME_LEN_MAX) > 0))
474 LoggerD("renaming to " << szFileName);
475 attachment->rename(szFileName);
477 else if (MMS_SMIL_MEDIA_TEXT == tempInt)
479 std::stringstream newName;
480 newName << "body_page_" << p + 1 << ".txt";
481 LoggerD("renaming to " << newName.str());
482 attachment->rename(newName.str());
488 msg_get_list_handle(mms_struct, MSG_MMS_ATTACH_LIST_HND, (void **)&attach_list);
490 attachLen= msg_list_length(attach_list);
492 LoggerD("attachment count: " << attachLen);
493 for (int a = 0; a < attachLen; ++a)
495 std::string tempString;
498 attach = (msg_struct_t)msg_list_nth_data(attach_list, a);
501 LoggerE("attachment is null, continue");
505 memset(szFilePath, 0, sizeof(szFilePath));
506 memset(szFileName, 0, sizeof(szFileName));
508 msg_get_str_value(attach, MSG_MMS_ATTACH_FILEPATH_STR, szFilePath, sizeof(szFilePath));
509 msg_get_str_value(attach, MSG_MMS_ATTACH_FILENAME_STR, szFileName, sizeof(szFileName));
511 msg_get_int_value(attach, MSG_MMS_ATTACH_MIME_TYPE_INT, &tempInt);
512 tempString = indexIntToMimeTypeString((MimeType)tempInt);
514 IAttachmentPtr att = appendAttachment(szFilePath, false);
515 if ((szFileName[0] =! '\0') &&
516 strnlen(szFileName, MSG_FILENAME_LEN_MAX) > 0) {
517 LoggerD("renaming to " << szFileName);
518 att->rename(szFileName);
520 att->setMimeType(tempString);
521 att->setAttachmentID((int)a);
522 att->setDownloaded(true);
524 msg_release_struct(&mms_struct);
527 void Mms::readBody(msg_struct_t& messageData)
530 int pageLen, mediaLen, tempInt, ret;
532 msg_struct_t mms_struct = NULL;
534 msg_list_handle_t page_list = NULL;
535 msg_list_handle_t media_list = NULL;
537 msg_struct_t page = NULL;
538 msg_struct_t media = NULL;
540 mms_struct = msg_create_struct(MSG_STRUCT_MMS);
541 ret = msg_get_mms_struct(messageData, mms_struct);
543 if (ret != MSG_SUCCESS)
545 LoggerE("cannot get mms struct");
546 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "cannot get mms struct");
549 char szFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
550 char szFileName[MSG_FILENAME_LEN_MAX] = {0,};
552 msg_get_list_handle(mms_struct, MSG_MMS_PAGE_LIST_HND, (void **)&page_list);
553 pageLen = msg_list_length(page_list);
556 setMmsType(MULTIPART_RELATED);
558 setMmsType(MULTIPART_MIXED);
561 LoggerD("page count: " << pageLen);
563 for (int p = 0; p < pageLen; ++p)
565 LoggerD("page " << p);
566 page = (msg_struct_t)msg_list_nth_data(page_list, p);
569 LoggerE("returned page is null, continue");
573 msg_get_list_handle(page, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&media_list);
574 mediaLen = msg_list_length(media_list);
576 for (int m = 0; m < mediaLen; ++m)
578 LoggerD("media file " << m);
579 media = (msg_struct_t)msg_list_nth_data(media_list, m);
582 LoggerE("returned media is null, continue");
586 msg_get_int_value(media, MSG_MMS_MEDIA_TYPE_INT, &tempInt);
588 memset(szFilePath, 0, sizeof(szFilePath));
589 msg_get_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, szFilePath, sizeof(szFilePath));
591 if ((0 == p) && (MMS_SMIL_MEDIA_TEXT == tempInt))
593 //text value on first page goes to body attribute
594 LoggerD("setting body from " << szFilePath);
597 f = fopen(szFilePath, "r");
600 LoggerE("cannot read file with body" << szFilePath);
601 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Cannot read file with body");
603 fseek(f, 0, SEEK_END);
604 long int size = ftell(f);
605 fseek(f, 0, SEEK_SET);
606 char* data = new (nothrow) char[size + 1];
609 memset(data, 0, size + 1);
610 error = fread(data, 1, size, f);
614 LoggerE("body is not set");
616 LoggerD("message body: '" << getBody() << "'");
621 LoggerD("adding attachment " << szFilePath);
623 IAttachmentPtr attachment = appendAttachment(szFilePath, false);
624 //attachment->setMessage(this); //set IMessagePtr
626 memset(szFileName, 0, sizeof(szFileName));
627 msg_get_str_value(media, MSG_MMS_MEDIA_FILENAME_STR, szFileName, sizeof(szFileName));
628 if ((szFileName[0] =! '\0' )&& (strnlen(szFileName, MSG_FILENAME_LEN_MAX) > 0))
630 LoggerD("renaming to " << szFileName);
631 attachment->rename(szFileName);
633 else if (MMS_SMIL_MEDIA_TEXT == tempInt)
635 std::stringstream newName;
636 newName << "body_page_" << p + 1 << ".txt";
637 LoggerD("renaming to " << newName.str());
638 attachment->rename(newName.str());
643 msg_release_struct(&mms_struct);
647 bool Mms::hasAttachment()
649 std::size_t attachmentSize = getAttachmentsCount();
650 if ( attachmentSize > 0)
656 void Mms::update(bool draftsOnly)
658 LoggerD("updating m_id=" << getIdRef());
660 if (!m_messageData) {
661 //error if platform message not exists
662 LoggerE("message can not be updated");
663 Throw(WrtDeviceApis::Commons::PlatformException);
666 //update mms data from abstraction
667 if (!draftsOnly || getCurrentFolder() == DRAFTBOX) {
669 updateBodyAndAttachments();
670 updateRecipientList();
676 void Mms::updatePriority()
678 if (isPriorityValid()) {
682 LoggerI("MMS updating priority");
684 //set priority in platform
685 switch (getPriority()) {
686 case MessagePriority::LOW:
687 priority = MSG_MESSAGE_PRIORITY_LOW;
689 case MessagePriority::NORMAL:
690 priority = MSG_MESSAGE_PRIORITY_NORMAL;
692 case MessagePriority::HIGH:
693 priority = MSG_MESSAGE_PRIORITY_HIGH;
696 LoggerE("Wrong priority");
697 Throw(WrtDeviceApis::Commons::PlatformException);
699 LoggerI("priority : " << priority);
702 msg_set_int_value(m_messageData, MSG_MESSAGE_PRIORITY_INT, priority)){
704 LoggerE("Error during setting priority");
705 Throw(WrtDeviceApis::Commons::PlatformException);
709 void Mms::updateRecipientList()
711 // check if abstraction recipient value has been changed
712 if (getToRecipients().isValid() &&
713 getBccRecipients().isValid() &&
714 getCcRecipients().isValid()) {
718 LoggerI("MMS updating platform recipients");
720 // reset addresses in platform structure
721 // msg_reset_address(m_messageData);
722 msg_struct_list_s *addr_list = NULL;
723 msg_get_list_handle(m_messageData, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
725 nToCnt = addr_list->nCount;
727 LoggerI("addr_list->nCount" << addr_list->nCount);
731 for (int i = 0; i < nToCnt; i++) {
732 msg_set_str_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, (char *)"", 0);
733 msg_set_str_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_DISPLAYNAME_STR, (char *)"", 0);
734 msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MSG_ADDRESS_TYPE_PLMN);
735 msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, MSG_RECIPIENTS_TYPE_UNKNOWN);
736 msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_CONTACT_ID_INT, 0);
739 addr_list->nCount = nToCnt;
742 LoggerI("addr_list->nCount" << addr_list->nCount);
744 vector<string> to = getToRecipients().getRecipients();
745 vector<string> cc = getCcRecipients().getRecipients();
746 vector<string> bcc = getBccRecipients().getRecipients();
748 // update addresses in platform structure
751 LoggerI("updating to");
752 for (size_t i = 0; i < to.size(); i++)
754 if (i >= MAX_TO_ADDRESS_CNT)
756 LoggerE("max number of recipient exceeded");
759 LoggerD("adding to[" << i << "]=" << to[i]);
761 msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MSG_ADDRESS_TYPE_PLMN);
763 if (msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT,
764 MSG_RECIPIENTS_TYPE_TO) != MSG_SUCCESS)
766 LoggerE("problem with adding to address");
767 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with adding to address");
770 if(msg_set_str_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR,
771 const_cast<char*>(to[i].c_str()), to[i].size()) != MSG_SUCCESS)
773 LoggerE("problem with adding to address");
774 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with adding to address");
778 addr_list->nCount = nToCnt;
779 LoggerE("nToCnt : " << nToCnt);
780 LoggerE("addr_list->nCount: " <<addr_list->nCount);
784 LoggerI("addr_list->nCount" << addr_list->nCount);
788 LoggerI("updating cc");
789 for (size_t i = 0; i < cc.size(); i++)
791 if (nToCnt >= MAX_TO_ADDRESS_CNT)
793 LoggerE("max number of recipient exceeded");
796 LoggerD("adding cc[" << i << "]=" << cc[i]);
798 msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MSG_ADDRESS_TYPE_PLMN);
800 if (msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT,
801 MSG_RECIPIENTS_TYPE_CC) != MSG_SUCCESS)
803 LoggerE("problem with adding cc address");
804 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with adding cc address");
807 if(msg_set_str_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR,
808 const_cast<char*>(cc[i].c_str()), cc[i].size()) != MSG_SUCCESS)
810 LoggerE("problem with adding cc address");
811 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with adding cc address");
815 addr_list->nCount = nToCnt;
816 LoggerE("nToCnt : " << nToCnt);
817 LoggerE("addr_list->nCount: " <<addr_list->nCount);
820 LoggerI("addr_list->nCount" << addr_list->nCount);
824 LoggerI("updating bcc");
825 for (size_t i = 0; i < bcc.size(); i++)
827 if (nToCnt >= MAX_TO_ADDRESS_CNT)
829 LoggerE("max number of recipient exceeded");
832 LoggerD("adding bcc[" << i << "]=" << bcc[i]);
834 msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MSG_ADDRESS_TYPE_PLMN);
836 if (msg_set_int_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT,
837 MSG_RECIPIENTS_TYPE_BCC) != MSG_SUCCESS)
839 LoggerE("problem with adding bcc address");
840 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with adding bcc address");
843 if(msg_set_str_value(addr_list->msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR,
844 const_cast<char*>(bcc[i].c_str()), bcc[i].size()) != MSG_SUCCESS)
846 LoggerE("problem with adding bcc address");
847 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with adding bcc address");
851 addr_list->nCount = nToCnt;
852 LoggerE("nToCnt : " << nToCnt);
853 LoggerE("addr_list->nCount: " <<addr_list->nCount);
856 LoggerI("addr_list->nCount" << addr_list->nCount);
859 setBccValidity(true);
862 void Mms::updateSubject()
864 // check if abstraction subject value has been changed
865 if (isSubjectValid()) {
868 LoggerI("updating platform subject: " << getSubjectRef());
870 // msg_set_subject(m_messageData, getSubjectRef().c_str())) {
871 msg_set_str_value(m_messageData, MSG_MESSAGE_SUBJECT_STR, const_cast<char*>(getSubjectRef().c_str()), MAX_SUBJECT_LEN)) {
873 LoggerE("problem with setting subject");
874 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with setting subject");
876 setSubjectValidity(true);
879 void Mms::updateBodyAndAttachments()
881 // check if attachment or body source address value has been changed
882 if (isAttachmentsValid() && isBodyValid()) {
886 // MMS_MESSAGE_DATA_S *mmsData = NULL;
887 msg_struct_t mms_struct = NULL;
888 // msg_struct_t old_mms_struct = NULL;// THIS
891 LoggerI("updating platform body and attachment");
895 msg_struct_t region[1];
896 msg_struct_t page[1];
897 msg_struct_t media[1];
898 msg_struct_t smil_text[1];
900 if (getMessageType() != MMS) {
901 LoggerE("Wrong msg type");
902 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Wrong msg type");
904 // mmsData = msg_mms_create_message();
905 mms_struct = msg_create_struct(MSG_STRUCT_MMS);
906 // old_mms_struct = msg_create_struct(MSG_STRUCT_MMS);// THIS
908 // ret = msg_get_mms_struct(m_messageData, old_mms_struct);// THIS
909 // LoggerE("ret " << ret);// THIS
910 // ret = msg_release_struct(&old_mms_struct);// THIS
911 // LoggerE("ret " << ret);// THIS
914 LoggerE("create message body failed");
915 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "create message body failed");
919 if (!getBodyRef().empty()) {
921 f = fopen(m_bodyFilePath.c_str(), "w");
923 LoggerE("cannot create file with body" << m_bodyFilePath);
924 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
925 "cannot create file with body");
927 LoggerD("body file: " << m_bodyFilePath);
928 fwrite(getBodyRef().c_str(), strlen(getBodyRef().c_str()), 1, f);
932 LoggerD("getBodyRef(): " << getBodyRef());
934 msg_set_int_value(mms_struct, MSG_MMS_ROOTLAYOUT_WIDTH_INT, ROOT_LAYOUT_WIDTH);
935 msg_set_int_value(mms_struct, MSG_MMS_ROOTLAYOUT_HEIGHT_INT, ROOT_LAYOUT_HEIGHT);
936 msg_set_int_value(mms_struct, MSG_MMS_ROOTLAYOUT_BGCOLOR_INT, WHITE_COLOR);
937 msg_set_bool_value(mms_struct, MSG_MMS_ROOTLAYOUT_WIDTH_PERCENT_BOOL, true);
938 msg_set_bool_value(mms_struct, MSG_MMS_ROOTLAYOUT_HEIGHT_PERCENT_BOOL, true);
940 msg_mms_add_item(mms_struct, MSG_STRUCT_MMS_REGION, ®ion[0]);
941 msg_set_str_value(region[0], MSG_MMS_REGION_ID_STR, const_cast<char*>(TEXT_AREA), 4);
942 msg_set_int_value(region[0], MSG_MMS_REGION_LENGTH_LEFT_INT, 0);
943 msg_set_int_value(region[0], MSG_MMS_REGION_LENGTH_TOP_INT, 0);
944 msg_set_int_value(region[0], MSG_MMS_REGION_LENGTH_WIDTH_INT, ROOT_LAYOUT_WIDTH);
945 msg_set_int_value(region[0], MSG_MMS_REGION_LENGTH_HEIGHT_INT, ROOT_LAYOUT_HEIGHT);
946 msg_set_int_value(region[0], MSG_MMS_REGION_BGCOLOR_INT, WHITE_COLOR);
948 msg_set_bool_value(region[0], MSG_MMS_REGION_LENGTH_LEFT_PERCENT_BOOL, true);
949 msg_set_bool_value(region[0], MSG_MMS_REGION_LENGTH_TOP_PERCENT_BOOL, true);
950 msg_set_bool_value(region[0], MSG_MMS_REGION_LENGTH_WIDTH_PERCENT_BOOL, true);
951 msg_set_bool_value(region[0], MSG_MMS_REGION_LENGTH_HEIGHT_PERCENT_BOOL, true);
953 msg_mms_add_item(mms_struct, MSG_STRUCT_MMS_PAGE, &page[0]);
954 msg_set_int_value(page[0], MSG_MMS_PAGE_PAGE_DURATION_INT, 0);
956 msg_mms_add_item(page[0], MSG_STRUCT_MMS_MEDIA, &media[0]);
957 msg_set_int_value(media[0], MSG_MMS_MEDIA_TYPE_INT, MMS_SMIL_MEDIA_TEXT);
958 msg_set_str_value(media[0], MSG_MMS_MEDIA_REGION_ID_STR, const_cast<char*>(TEXT_AREA), 4);
960 error = msg_set_str_value(media[0], MSG_MMS_MEDIA_FILEPATH_STR, const_cast<char*>(m_bodyFilePath.c_str()),MSG_FILEPATH_LEN_MAX);
961 LoggerD("bodyFile Path= " << m_bodyFilePath);
962 LoggerD("error= " << error);
963 char szFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
964 memset(szFilePath, 0, sizeof(szFilePath));
965 msg_get_str_value(media[0], MSG_MMS_MEDIA_FILEPATH_STR, szFilePath, sizeof(szFilePath));
966 LoggerD("bodyFile Path= " << m_bodyFilePath);
968 msg_get_struct_handle(media[0], MSG_MMS_MEDIA_SMIL_TEXT_HND, &smil_text[0]);
969 msg_set_int_value(smil_text[0], MSG_MMS_SMIL_TEXT_COLOR_INT, BLACK_COLOR);
970 msg_set_int_value(smil_text[0], MSG_MMS_SMIL_TEXT_SIZE_INT, MMS_SMIL_FONT_SIZE_NORMAL);
971 msg_set_bool_value(smil_text[0], MSG_MMS_SMIL_TEXT_BOLD_BOOL, true);
979 msg_struct_t attachment[20];
981 for (size_t idx = 0; idx < getAttachmentsRef().size(); ++idx) {
982 IAttachmentPtr att = getAttachment(idx);
987 LoggerD("Add attachment=" << att->getFullPath());
989 errnum = stat(att->getFullPath().c_str(), &buffer);
990 LoggerD("errnum=" << errnum);
993 LoggerE("Opening file: " << att->getFullPath().c_str());
994 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
995 "cannot open attachment file");
998 //this function should return valid pointer
999 att->setMessage(SharedFromThis()); // setMessage to setMessageId
1000 att->setAttachmentID((int)idx);
1001 att->setDownloaded(true);
1003 int ret = mimeTypeStringToIndexInt(att->getMimeType());
1005 msg_mms_add_item(mms_struct, MSG_STRUCT_MMS_ATTACH, &attachment[idx]);
1006 msg_set_str_value(attachment[idx], MSG_MMS_ATTACH_FILEPATH_STR, const_cast<char*>(att->getFullPath().c_str()), MSG_FILEPATH_LEN_MAX);
1008 if(ret != MIME_UNKNOWN)
1010 msg_set_int_value(attachment[idx], MSG_MMS_ATTACH_MIME_TYPE_INT, ret);
1013 LoggerD("Attachment added");
1019 if (MSG_SUCCESS !=msg_set_mms_struct(m_messageData, mms_struct))
1021 LoggerE("set message body error");
1022 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "set message body error");
1025 msg_release_struct(&mms_struct);
1027 setAttachmentsValidity(true);
1028 setBodyValidity(true);
1031 Catch(WrtDeviceApis::Commons::PlatformException) {
1032 LoggerE("Platform error");
1033 msg_release_struct(&mms_struct);
1039 void Mms::updateReadStatus()
1041 if (isReadStatusValid()) {
1045 LoggerI("updating platform read status: " << isRead());
1046 // if (MSG_SUCCESS != msg_set_read_status(m_messageData, isRead())) {
1047 if (MSG_SUCCESS != msg_set_bool_value(m_messageData, MSG_MESSAGE_READ_BOOL, isRead())) {
1048 LoggerE("problem with setting subject");
1049 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Problem with setting subject");
1052 setReadStatusValidity(true);
1055 void Mms::updateIsRead()
1057 LoggerD("updating m_id=" << getIdRef());
1059 if (!m_messageData) {
1060 //error if platform message not exists
1061 LoggerE("message can not be updated");
1062 Throw(WrtDeviceApis::Commons::PlatformException);
1065 // check if abstraction from m_isReadChange value has been changed
1066 if (isReadChangeStatusValid()) {
1067 // do not update if not changed
1073 if (this->getIdRef().empty()) {
1074 LoggerE("existing msgId is zero, remove msg not done");
1075 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
1076 "existing msgId is zero, remove msg not done");
1080 msg_update_read_status(MsgGetCommonHandle(), convertId(getIdRef()), isReadChangeStatus()))
1082 LoggerE("Failed to update isRead");
1083 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Failed to update isRead");
1086 Catch(WrtDeviceApis::Commons::PlatformException) {
1087 LoggerE("platform error occurs");
1089 setisReadChangeStatusValidity(true);
1093 void Mms::updateMessage()
1095 LoggerD("updating m_id=" << getIdRef());
1096 msg_error_t err = MSG_SUCCESS;
1099 msg_struct_t msg = NULL;
1100 msg_struct_t sendOpt = NULL;
1102 if (!m_messageData) {
1103 //error if platform message not exists
1104 LoggerE("message can not be updated");
1105 Throw(WrtDeviceApis::Commons::PlatformException);
1111 msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1112 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1114 err = msg_get_message(MsgGetCommonHandle(), convertId(getIdRef()), msg, sendOpt);
1116 if (err != MSG_SUCCESS)
1118 LoggerE("msg_get_message() Failed!");
1119 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Failed to get message for update");
1122 if (this->getIdRef().empty()) {
1123 LoggerE("existing msgId is zero, update msg not done");
1124 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
1125 "existing msgId is zero, update msg not done");
1128 err = msg_get_int_value(msg, MSG_MESSAGE_NETWORK_STATUS_INT, &tempInt);
1129 if(err == MSG_SUCCESS)
1131 msg_set_int_value(m_messageData, MSG_MESSAGE_NETWORK_STATUS_INT, tempInt);
1134 err = msg_get_int_value(msg, MSG_MESSAGE_FOLDER_ID_INT, &tempInt);
1135 if(err == MSG_SUCCESS)
1137 msg_set_int_value(m_messageData, MSG_MESSAGE_FOLDER_ID_INT, tempInt);
1142 if (MSG_SUCCESS != msg_update_message(MsgGetCommonHandle(), m_messageData, sendOpt))
1144 LoggerE("msg_update_message() Failed!");
1145 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Failed to update message");
1147 msg_release_struct(&msg);
1148 msg_release_struct(&sendOpt);
1150 Catch(WrtDeviceApis::Commons::PlatformException) {
1151 msg_release_struct(&msg);
1152 msg_release_struct(&sendOpt);
1153 LoggerE("platform error occurs");
1154 ReThrow(WrtDeviceApis::Commons::PlatformException);
1159 void Mms::createSendMessage()
1161 LoggerD("convert m_id= " << convertId(getIdRef()));
1163 msg_struct_t sendOpt = NULL;
1165 //prepare for add sms to draft folder
1166 if (!m_messageData) {
1167 //error if platform message not exists
1168 LoggerE("message can not be updated");
1169 Throw(WrtDeviceApis::Commons::PlatformException);
1172 //update all mms data
1173 if (getCurrentFolder() == DRAFTBOX) {
1174 LoggerD("update all mms data");
1176 updateBodyAndAttachments();
1177 updateRecipientList();
1184 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1185 // trying to add message
1187 // msg_set_int_value(m_messageData, MSG_MESSAGE_NETWORK_STATUS_INT, MSG_NETWORK_NOT_SEND);
1189 int ret = msg_add_message(MsgGetCommonHandle(), m_messageData, sendOpt);
1190 if (ret < MSG_SUCCESS) {
1191 LoggerE("msg_add_message failed, error code=" << ret);
1192 Throw(WrtDeviceApis::Commons::PlatformException);
1199 LoggerD("Message ID : " << msgId);
1201 msg_set_int_value(m_messageData, MSG_MESSAGE_ID_INT, msgId);
1203 setId(convertId(msgId));
1206 setFolderType(OUTBOX);
1207 setMessageStatus(MESSAGE_STATUS_DRAFT);
1209 msg_release_struct(&sendOpt);
1211 Catch(WrtDeviceApis::Commons::PlatformException) {
1212 LoggerE("remove message error");
1213 msg_release_struct(&sendOpt);
1218 void Mms::addMessageToDraft()
1220 LoggerD("convert m_id= " << convertId(getIdRef()));
1222 msg_struct_t sendOpt = NULL;
1224 //prepare for add sms to draft folder
1225 if (!m_messageData) {
1226 //error if platform message not exists
1227 LoggerE("message can not be updated");
1228 Throw(WrtDeviceApis::Commons::PlatformException);
1231 //update all mms data
1232 if (getCurrentFolder() == DRAFTBOX) {
1234 updateBodyAndAttachments();
1235 updateRecipientList();
1242 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1244 // trying to add message
1245 LoggerD("add message");
1246 int ret = msg_add_message(MsgGetCommonHandle(), m_messageData, sendOpt);
1247 if (ret < MSG_SUCCESS) {
1248 LoggerE("msg_add_message failed, error code=" << ret);
1249 Throw(WrtDeviceApis::Commons::PlatformException);
1256 LoggerD("Message ID : " << msgId);
1259 LoggerD("Message ID is invailded ");
1260 Throw(WrtDeviceApis::Commons::PlatformException);
1263 msg_set_int_value(m_messageData, MSG_MESSAGE_ID_INT, msgId);
1265 setId(convertId(msgId));
1268 msg_release_struct(&sendOpt);
1271 Catch(WrtDeviceApis::Commons::PlatformException) {
1272 LoggerE("add draft message error");
1273 msg_release_struct(&sendOpt);
1279 void Mms::loadDraftMessage()
1283 if (getIdRef().empty() || (EMPTY_ID == getIdRef()))
1285 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Empty id.");
1288 msg_release_struct(&m_messageData);
1289 m_messageData = NULL;
1290 msg_struct_t sendOpt = NULL;
1294 m_messageData = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1295 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1297 // trying to get message from platform
1298 if (MSG_SUCCESS != msg_get_message(MsgGetCommonHandle(), convertId(getIdRef()), m_messageData, sendOpt))
1300 LoggerE("get message error");
1301 Throw(WrtDeviceApis::Commons::PlatformException);
1303 LoggerD("message found with msgId=" << getIdRef());
1305 // read all mms dat to abstraction layer
1306 readConversationId(m_messageData);
1307 readPriority(m_messageData);
1308 readSubject(m_messageData);
1309 readFolder(m_messageData);
1310 readDateTime(m_messageData);
1311 readReadStatus(m_messageData);
1312 readMessageStatus(m_messageData);
1313 readBody(m_messageData);
1315 msg_release_struct(&sendOpt);
1317 Catch(WrtDeviceApis::Commons::PlatformException) {
1318 LoggerE("exception");
1320 msg_release_struct(&sendOpt);
1325 void Mms::readAllData()
1329 if (getIdRef().empty() || (EMPTY_ID == getIdRef()))
1331 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Empty id.");
1334 msg_release_struct(&m_messageData);
1335 m_messageData = NULL;
1336 msg_struct_t sendOpt = NULL;
1340 m_messageData = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1341 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1343 // trying to get message from platform
1344 if (MSG_SUCCESS != msg_get_message(MsgGetCommonHandle(), convertId(getIdRef()), m_messageData, sendOpt))
1346 LoggerE("get message error");
1347 Throw(WrtDeviceApis::Commons::PlatformException);
1349 LoggerD("message found with msgId=" << getIdRef());
1351 // read all mms dat to abstraction layer
1352 readConversationId(m_messageData);
1353 // readRecipientList(m_messageData);
1354 readPriority(m_messageData);
1355 readSubject(m_messageData);
1356 readBodyAndAttachments(m_messageData);
1357 readFolder(m_messageData);
1358 readDateTime(m_messageData);
1359 readReadStatus(m_messageData);
1360 readMessageStatus(m_messageData);
1362 msg_release_struct(&sendOpt);
1364 Catch(WrtDeviceApis::Commons::PlatformException) {
1365 LoggerE("exception");
1367 msg_release_struct(&sendOpt);
1372 void Mms::moveToFolder(const FolderType newFolder)
1379 msg_folder_id_t platfromFolderId = Messaging::convertFolderToPlatform(
1382 if (msg_move_msg_to_folder(MsgGetCommonHandle(), convertId(getId()),
1383 platfromFolderId) != MSG_SUCCESS) {
1384 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Error during movinf message");
1388 Catch(WrtDeviceApis::Commons::PlatformException) {
1389 LoggerE("remove message error");
1395 void Mms::moveToFolder(const string& newFolder)
1402 msg_folder_id_t platfromFolderId = Messaging::convertFolderToPlatform(
1405 if (msg_move_msg_to_folder(MsgGetCommonHandle(), convertId(getId()),
1406 platfromFolderId) != MSG_SUCCESS) {
1407 LoggerE("msg_move_msg_to_folder error");
1408 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "msg_move_msg_to_folder error");
1412 Catch(WrtDeviceApis::Commons::PlatformException) {
1413 LoggerE("remove message error");
1419 void Mms::copyToFolder(const FolderType newFolder)
1424 msg_message_t msg = msg_new_message();
1428 MSG_SENDINGOPT_S option = { false, false, false };
1429 option.option.smsSendOpt.bReplyPath = true;
1431 msg_get_message(MsgGetCommonHandle(), convertId(getIdRef()), msg,
1433 const msg_folder_id_t platfromFolderId =
1434 Messaging::convertFolderToPlatform(newFolder);
1435 msg_set_message_id(msg, 0);
1436 msg_set_folder_id(msg, platfromFolderId);
1438 int error = msg_add_message(MsgGetCommonHandle(), msg, &option);
1439 if (error != MSG_SUCCESS) {
1440 LoggerE("msg_add_message failed, error code=" << error);
1441 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "msg_add_message failed");
1445 msg_release_message(&msg);
1449 Catch(WrtDeviceApis::Commons::PlatformException) {
1450 LoggerE("remove message error");
1452 msg_release_message(&msg);
1459 void Mms::copyToFolder(const string& newFolder)
1464 msg_message_t msg = msg_new_message();
1468 MSG_SENDINGOPT_S option = { false, false, false };
1469 option.option.smsSendOpt.bReplyPath = true;
1471 msg_get_message(MsgGetCommonHandle(), convertId(getIdRef()), msg,
1473 const msg_folder_id_t platfromFolderId =
1474 Messaging::convertFolderToPlatform(newFolder);
1475 msg_set_message_id(msg, 0);
1476 msg_set_folder_id(msg, platfromFolderId);
1478 int error = msg_add_message(MsgGetCommonHandle(), msg, &option);
1479 if (error != MSG_SUCCESS) {
1480 LoggerE("msg_add_message failed, error code=" << error);
1481 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "msg_add_message failed");
1485 msg_release_message(&msg);
1489 Catch(WrtDeviceApis::Commons::PlatformException) {
1490 LoggerE("remove message error");
1492 msg_release_message(&msg);
1501 LoggerD("delete m_id=" << getIdRef());
1505 if (this->getIdRef().empty()) {
1506 LoggerE("existing msgId is zero, remove msg not done");
1507 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
1508 "existing msgId is zero, remove msg not done");
1512 msg_delete_message(MsgGetCommonHandle(),
1513 convertId(getIdRef()))) {
1514 LoggerE("Failed to delete Message");
1515 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Failed to delete Message");
1519 Catch(WrtDeviceApis::Commons::PlatformException) {
1520 LoggerE("platform error occurs");
1526 LoggerD("sending message, id=" << getIdRef());
1527 msg_error_t err = MSG_SUCCESS;
1531 //prepare for sending sms/mms
1534 LoggerD("trying to send mms");
1535 if (!getCellularOn())
1537 err = MSG_ERR_TRANSPORT_ERROR;
1538 LoggerW("MMS send error. No transport possible over network");
1542 err = CallbackMgrSingleton::Instance().registerAndSend(msg_mms_send_message, m_messageData, this);
1545 if (err != MSG_SUCCESS)
1547 LoggerE("Sending Message (submit request) failed!!! err=" << err);
1548 setMessageStatus(MESSAGE_STATUS_FAILED);
1549 Throw(WrtDeviceApis::Commons::PlatformException);
1552 setMessageStatus(MESSAGE_STATUS_SENDING);
1554 LoggerD("Sending Message request is submitted!");
1556 Catch(WrtDeviceApis::Commons::PlatformException) {
1557 LoggerE("message is not send, manually run callback");
1558 ReqReceiverMessage *requestReceiver = getRequestReceiver();
1559 if (requestReceiver) {
1560 LoggerE("send Error");
1561 EventMessagingServicePtr event = getMessagingServiceEvent();
1562 if(err == MSG_ERR_TRANSPORT_ERROR)
1564 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::PlatformWrongStateException);
1568 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
1570 requestReceiver->WrtDeviceApis::Commons::EventRequestReceiver< EventMessagingService>::ManualAnswer(event);
1577 void Mms::sendingCallback(msg_struct_t sent_status)
1579 int status = MSG_NETWORK_SEND_FAIL;
1580 msg_get_int_value(sent_status, MSG_SENT_STATUS_NETWORK_STATUS_INT, &status);
1582 LoggerD("status : " << status);
1584 if (MSG_NETWORK_SEND_SUCCESS == status) {
1585 LoggerD("sending ok");
1586 setSendingStatusOk();
1587 setMessageStatus(MESSAGE_STATUS_SENT);
1589 LoggerE("sending failed: " << static_cast<unsigned int>(status));
1590 setSendingStatusFailed();
1591 setMessageStatus(MESSAGE_STATUS_FAILED);
1595 void Mms::sendCancel(int handle)
1597 LoggerD("sending message, id=" << getIdRef());
1599 LoggerD("handle =" << handle);
1602 void Mms::setSendingStatusOk()
1604 //success callback should be executed here
1605 ReqReceiverMessage *requestReceiver = getRequestReceiver();
1606 msg_struct_list_s *addr_list = NULL;
1607 char strNumber[MAX_ADDRESS_VAL_LEN] = {0,};
1610 if (requestReceiver) {
1611 LoggerI("calling JS success callback");
1612 EventMessagingServicePtr event = getMessagingServiceEvent();
1613 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::None);
1615 msg_get_list_handle(m_messageData, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
1617 nToCnt = addr_list->nCount;
1619 for ( int index=0; index < nToCnt; index++)
1621 msg_get_str_value(addr_list->msg_struct_info[index], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, MAX_ADDRESS_VAL_LEN);
1622 event->m_successRecipients.push_back(strNumber);
1625 requestReceiver->WrtDeviceApis::Commons::EventRequestReceiver< EventMessagingService >::ManualAnswer(event);
1629 void Mms::setSendingStatusFailed()
1631 //error callback should be executed here
1632 EventOnSendingFailedEmitterPtr emitter = getEmitter();
1633 msg_struct_list_s *addr_list = NULL;
1634 char strNumber[MAX_ADDRESS_VAL_LEN] = {0,};
1639 EventOnSendingFailedPtr event(new EventOnSendingFailed);
1640 event->setError(EventOnSendingFailed::UNKNOWN); // TODO error codes
1641 emitter->emit(event);
1645 ReqReceiverMessage *requestReceiver = getRequestReceiver();
1646 EventMessagingServicePtr event = getMessagingServiceEvent();
1647 if (requestReceiver)
1649 LoggerE("calling JS error callback");
1650 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
1651 msg_get_list_handle(m_messageData, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
1652 nToCnt = addr_list->nCount;
1654 LoggerD("nToCnt : " << nToCnt);
1656 for ( int index=0; index < nToCnt; index++)
1658 msg_get_str_value(addr_list->msg_struct_info[index], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, MAX_ADDRESS_VAL_LEN);
1659 event->m_failRecipients.push_back(strNumber);
1662 requestReceiver->WrtDeviceApis::Commons::EventRequestReceiver< EventMessagingService >::ManualAnswer(event);
1667 FolderType Mms::toFolder(const std::string &folder)
1669 if (folder == "INBOX") {
1671 } else if (folder == "OUTBOX") {
1673 } else if (folder == "SENTBOX") {
1675 } else if (folder == "DRAFTBOX") {
1678 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Invalid folder");
1681 bool Mms::getCellularOn()
1683 auto cellularOn = true;
1687 vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &tempInt);
1688 vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &tempbool);
1689 if(tempInt <= VCONFKEY_TELEPHONY_SVCTYPE_SEARCH || tempbool == TRUE)
1691 LoggerE("VCONFKEY_TELEPHONY_SVCTYPE error " << tempInt);
1692 LoggerE("VCONFKEY_TELEPHONY_FLIGHT_MODE error " << tempbool);
1697 vconf_get_bool(VCONFKEY_3G_ENABLE, &tempbool);
1698 vconf_get_int(VCONFKEY_TELEPHONY_SVC_PS, &tempInt);
1699 if(tempbool == FALSE || tempInt != VCONFKEY_TELEPHONY_SVC_PS_ON)
1701 LoggerE("VCONFKEY_3G_ENABLE error " << tempbool);
1702 LoggerE("VCONFKEY_TELEPHONY_SVC_PS_ON error " << tempInt);
1709 MimeType Mms::mimeTypeStringToIndexInt(std::string inputString)
1711 const char* szMimeStr = inputString.c_str();
1712 MimeType retInt = MIME_UNKNOWN;
1714 LoggerD("szMimeStr " << szMimeStr);
1716 for(int idx =0; strcmp(mimeTable[idx].szMIME, "") != 0; idx++)
1718 if (!strcmp(mimeTable[idx].szMIME, szMimeStr)) {
1719 retInt = mimeTable[idx].mime;
1727 std::string Mms::indexIntToMimeTypeString(MimeType inputIndex)
1729 std::string retString;
1731 for (int idx=0; mimeTable[idx].szMIME != NULL; idx++) {
1732 if (inputIndex == mimeTable[idx].mime) {
1733 retString = (char *)mimeTable[idx].szMIME;
1739 msg_struct_t Mms::createNewCopyOfPLatformMsgWithAddressList(const msg_struct_t src) const
1741 int tempInt, nCount, ret;
1743 msg_struct_list_s *addr_list;
1744 msg_struct_list_s *new_addr_list;
1746 msg_struct_t mms_struct = NULL;
1747 msg_struct_t mms_struct_dummy = NULL;
1749 msg_struct_t msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1751 msg_set_int_value(msg, MSG_MESSAGE_TYPE_INT, MSG_TYPE_MMS);
1753 char strSubject[MAX_SUBJECT_LEN] = {0};
1754 msg_get_str_value(src, MSG_MESSAGE_SUBJECT_STR, strSubject, MAX_SUBJECT_LEN);
1755 msg_set_str_value(msg, MSG_MESSAGE_SUBJECT_STR, strSubject, MAX_SUBJECT_LEN);
1757 msg_get_int_value(src, MSG_MESSAGE_STORAGE_ID_INT, &tempInt);
1758 msg_set_int_value(msg, MSG_MESSAGE_STORAGE_ID_INT, tempInt);
1760 msg_get_int_value(src, MSG_MESSAGE_THREAD_ID_INT, &tempInt);
1761 msg_set_int_value(msg, MSG_MESSAGE_THREAD_ID_INT, tempInt);
1763 msg_get_int_value(src, MSG_MESSAGE_FOLDER_ID_INT, &tempInt);
1764 msg_set_int_value(msg, MSG_MESSAGE_FOLDER_ID_INT, tempInt);
1766 // msg_get_int_value(src, MSG_MESSAGE_DATA_SIZE_INT, &tempInt);
1767 // char tempStr[tempInt+1];
1768 // memset(tempStr, 0, tempInt+1);
1770 // msg_get_str_value(src, MSG_MESSAGE_SMS_DATA_STR, tempStr, tempInt);
1771 // msg_set_str_value(msg, MSG_MESSAGE_SMS_DATA_STR, tempStr, strlen(tempStr));
1772 // copy mms body and attachment
1773 mms_struct = msg_create_struct(MSG_STRUCT_MMS);
1774 mms_struct_dummy = msg_create_struct(MSG_STRUCT_MMS);
1775 ret = msg_get_mms_struct(src, mms_struct);
1776 if (ret != MSG_SUCCESS)
1778 LoggerE("cannot get mms struct");
1779 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "cannot get mms struct");
1782 msg_set_mms_struct(src, mms_struct_dummy);
1783 msg_set_mms_struct(msg, mms_struct);
1785 msg_get_int_value(src, MSG_MESSAGE_DISPLAY_TIME_INT, &tempInt);
1786 msg_set_int_value(msg, MSG_MESSAGE_DISPLAY_TIME_INT, tempInt);
1788 // msg_set_network_status(msg, msg_get_network_status(src));
1789 msg_get_int_value(src, MSG_MESSAGE_NETWORK_STATUS_INT, &tempInt);
1790 msg_set_int_value(msg, MSG_MESSAGE_NETWORK_STATUS_INT, tempInt);
1792 // msg_set_encode_type(msg, msg_get_encode_type(src));
1793 msg_get_int_value(src, MSG_MESSAGE_ENCODE_TYPE_INT, &tempInt);
1794 msg_set_int_value(msg, MSG_MESSAGE_ENCODE_TYPE_INT, tempInt);
1796 // msg_set_read_status(msg, msg_is_read(src));
1797 msg_get_bool_value(src, MSG_MESSAGE_READ_BOOL, &tempBool);
1798 msg_set_bool_value(msg, MSG_MESSAGE_READ_BOOL, tempBool);
1800 // msg_set_protect_status(msg, msg_is_protected(src));
1801 msg_get_bool_value(src, MSG_MESSAGE_PROTECTED_BOOL, &tempBool);
1802 msg_set_bool_value(msg, MSG_MESSAGE_PROTECTED_BOOL, tempBool);
1804 // msg_set_priority_info(msg, msg_get_priority_info(src));
1805 msg_get_int_value(src, MSG_MESSAGE_PRIORITY_INT, &tempInt);
1806 msg_set_int_value(msg, MSG_MESSAGE_PRIORITY_INT, tempInt);
1808 // msg_set_direction_info(msg, msg_get_direction_info(src));
1809 msg_get_int_value(src, MSG_MESSAGE_DIRECTION_INT, &tempInt);
1810 msg_set_int_value(msg, MSG_MESSAGE_DIRECTION_INT, tempInt);
1812 // msg_set_port(msg, msg_get_dest_port(src), msg_get_src_port(src));
1813 msg_get_int_value(src, MSG_MESSAGE_DEST_PORT_INT, &tempInt);
1814 msg_set_int_value(msg, MSG_MESSAGE_DEST_PORT_INT, tempInt);
1815 msg_get_int_value(src, MSG_MESSAGE_SRC_PORT_INT, &tempInt);
1816 msg_set_int_value(msg, MSG_MESSAGE_SRC_PORT_INT, tempInt);
1819 msg_get_list_handle(src, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
1820 msg_get_list_handle(msg, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&new_addr_list);
1822 new_addr_list->nCount = addr_list->nCount;
1824 for(int i=0; i<addr_list->nCount; i++)
1826 msg_struct_t addr_info = NULL;
1827 msg_struct_t new_addr_info = NULL;
1828 char addr_value[MAX_ADDRESS_VAL_LEN] = {0,};
1830 //get original address
1831 addr_info = addr_list->msg_struct_info[i];
1832 msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, addr_value, MAX_ADDRESS_VAL_LEN);
1833 msg_get_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, &tempInt);
1835 //copy original address
1836 new_addr_info = new_addr_list->msg_struct_info[i];
1837 msg_set_str_value(new_addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, addr_value, MAX_ADDRESS_VAL_LEN);
1838 msg_set_int_value(new_addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, tempInt);
1841 msg_release_struct(&mms_struct_dummy);
1842 msg_release_struct(&mms_struct);