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.
18 #include <email-types.h>
19 #include <email-api.h>
21 #include <Commons/Exception.h>
22 #include <Commons/StringUtils.h>
23 #include <dpl/log/log.h>
24 #include <dpl/scoped_free.h>
25 #include "Messaging.h"
28 #include "BinarySms.h"
30 #include "EmailConverter.h"
36 #include "StorageChangesMessageFilterValidatorFactory.h"
37 #include "StorageChangesConversationFilterValidatorFactory.h"
38 #include "StorageChangesFolderFilterValidatorFactory.h"
39 #include "MessageQueryGenerator.h"
41 #include "ConversationQueryGenerator.h"
42 #include "FolderQueryGenerator.h"
44 #include "messageDB/MessageStorageReader.h"
47 #include <msg_storage.h>
49 #include <msg_transport.h>
52 #include <Commons/ThreadPool.h>
53 #include "Conversation.h"
54 #include "MessageFolder.h"
55 #include <dpl/singleton_safe_impl.h>
57 IMPLEMENT_SAFE_SINGLETON(DeviceAPI::Messaging::MsgServiceHandle)
60 #define LOG_ENTER LogDebug("---> ENTER");
61 #define LOG_EXIT LogDebug("---> EXIT");
65 using namespace DeviceAPI::Tizen;
66 using namespace WrtDeviceApis::Commons;
69 const char* DBUS_INTERFACE_EMAIL_RECEIVED = "User.Email.StorageChange";
70 const char* DBUS_FILTER_EMAIL_RECEIVED =
71 "type='signal',interface='User.Email.StorageChange'";
73 const int MESSAGE_FIND_LIMIT = 100;
79 int Messaging::m_currentEmailAccountId = 0;
80 DPL::Atomic Messaging::m_objCounter;
82 Messaging& Messaging::getInstance()
84 static Messaging instance;
88 Messaging::Messaging() :
89 m_onMessageReceivedHandleMgr(NULL),
90 m_dbusConnection(new DBus::Connection()),
91 m_dbusWorkerThread(new DPL::Thread())
95 const vector<EmailAccountInfo> accounts = getEmailAccounts();
96 LogDebug("Number of emails account=" << accounts.size());
97 if (accounts.size() > 0) {
98 // set default email account - first from the list
99 setCurrentEmailAccount(accounts[0]);
101 LogError("no default email account set");
105 Catch(WrtDeviceApis::Commons::PlatformException) {
106 LogError("No email accounts available");
109 Catch(WrtDeviceApis::Commons::InvalidArgumentException) {
110 LogError("No email accounts available");
111 //current email not configured, skipped
114 Catch(WrtDeviceApis::Commons::UnknownException) {
115 LogError("unknown error");
118 // Begin service for email management ?? pmi question if it should be added before email actions
119 if (0 == m_objCounter) {
120 int error = email_service_begin();
121 if (EMAIL_ERROR_NONE != error) {
122 LogError("email_service_begin() returned error " << error);
124 LogInfo("email_service_begin() executed without error");
129 m_dbusWorkerThread->Run();
130 m_dbusConnection->setWorkerThread(m_dbusWorkerThread);
131 m_dbusConnection->addFilter(DBUS_FILTER_EMAIL_RECEIVED);
132 m_dbusConnection->AddListener(this);
135 Messaging::~Messaging()
137 // Endservice for email management
138 m_dbusConnection->RemoveListener(this);
139 // m_dbusConnection->setWorkerThread(NULL);
140 m_dbusWorkerThread->Quit();
141 delete m_dbusWorkerThread;
143 if (!--m_objCounter) {
144 int error = email_service_end();
145 if (EMAIL_ERROR_NONE != error) {
146 LogError("email_service_end() returned error " << error);
148 LogDebug("email_service_end() executed without error");
154 void Messaging::getNumberOfMessages(MessageType msgType,
159 if (NULL == readed ||
161 LogError("output pointers are NULL");
162 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
166 if (SMS == msgType) {
167 getNumberOfSms(folder, readed, unReaded);
168 } else if (MMS == msgType) {
169 getNumberOfMms(folder, readed, unReaded);
170 } else if (EMAIL == msgType) {
171 getNumberOfEmails(folder, readed, unReaded);
173 LogError("wrong message type");
174 Throw(WrtDeviceApis::Commons::PlatformException);
178 vector<IMessagePtr> Messaging::findMessages(const vector<MessageType>& msgTypes,
179 const string &folder,
180 const DeviceAPI::Tizen::FilterPtr& filter)
183 vector<IMessagePtr> retVal;
184 back_insert_iterator< vector<IMessagePtr> > biit(retVal);
185 vector<MessageType>::const_iterator it = msgTypes.begin();
186 for (; it != msgTypes.end(); ++it) {
187 LogDebug("Finding messages (" << *it << ") in folder: " << folder);
188 vector<IMessagePtr> result;
193 FolderType folderEnum = Sms::toFolder(folder);
194 result = findSms(folderEnum, filter);
199 FolderType folderEnum = Mms::toFolder(folder);
200 result = findMms(folderEnum, filter);
205 result = findEmail(folder, filter);
209 LogError("message type unknown");
210 Throw(WrtDeviceApis::Commons::PlatformException);
212 LogDebug("Found: " << result.size());
213 copy(result.begin(), result.end(), biit);
219 std::string Messaging::generateFilterSql(const DeviceAPI::Tizen::FilterPtr& filter){
221 std::string filterSql;
223 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator());
224 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
225 filter->travel(filterVisitor, 0);
226 filterSql = queryGenerator->getQuery();
228 LogDebug(">>> filterSql:[" << filterSql << "]");
233 vector<IMessagePtr> Messaging::findMessages(const vector<MessageType>& msgTypes, FolderType folder,
234 const DeviceAPI::Tizen::FilterPtr& filter)
237 vector<IMessagePtr> retVal;
238 back_insert_iterator< vector<IMessagePtr> > biit(retVal);
240 std::string filterSql = generateFilterSql(filter);
244 vector<MessageType>::const_iterator it = msgTypes.begin();
245 for (; it != msgTypes.end(); ++it) {
246 LogDebug("Finding messages (" << *it << ") in folder: " << folder);
247 vector<IMessagePtr>(Messaging::*findFnPtr)(FolderType folder, const DeviceAPI::Tizen::FilterPtr& filter) = NULL;
252 findFnPtr = &Messaging::findSms;
257 findFnPtr = &Messaging::findMms;
262 findFnPtr = &Messaging::findEmail;
266 LogError("message type unknown");
267 Throw(WrtDeviceApis::Commons::PlatformException);
270 vector<IMessagePtr> result = (this->*findFnPtr)(folder, filter);
271 LogDebug("Found: " << result.size());
272 copy(result.begin(), result.end(), biit);
278 void Messaging::printErrorMessage(int errorCode){
280 case EMAIL_ERROR_MAIL_NOT_FOUND:{
281 LogDebug("EMAIL_ERROR_MAIL_NOT_FOUND");
284 case EMAIL_ERROR_DB_FAILURE:{
285 LogDebug("EMAIL_ERROR_DB_FAILURE");
289 LogDebug("other error message:" << errorCode);
294 vector<IMessagePtr> Messaging::createVectorFromeMessageList(const msg_struct_list_s &message_list){
295 // vector<IMessagePtr> Messaging::createVectorFromeMessageList(const msg_struct_list_s message_list){
298 vector<IMessagePtr> retVal;
301 MessageType webApiMsgType;
303 LogDebug("message_list.nCount:" << message_list.nCount);
304 for (int i = 0; i < message_list.nCount; i++) {
305 int err = msg_get_int_value(message_list.msg_struct_info[i], MSG_MESSAGE_TYPE_INT, &tempInt);
306 if(err != MSG_SUCCESS)
308 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "get message type fail");
310 LogDebug("Message type : " << tempInt);
322 LogError("[ERROR]invalid message type:" << tempInt);
327 // int l_msgId = msg_get_message_id(message_list.msgInfo[i]);
328 err = msg_get_int_value(message_list.msg_struct_info[i], MSG_MESSAGE_ID_INT, &tempInt);
329 LogDebug("Message Id : " << tempInt);
330 if(err != MSG_SUCCESS)
332 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "get message id fail");
336 msg = MessageFactory::createMessage(webApiMsgType, tempInt);
337 retVal.push_back(msg);
344 std::vector<IConversationPtr> Messaging::createVectorFromeThreadViewList(const msg_struct_list_s& threadViewList){
345 vector<IConversationPtr> recVec;
347 if (threadViewList.nCount <= 0) {
348 LogDebug("Empty...");
350 for (int i = 0; i < threadViewList.nCount; i++) {
351 // IConversationPtr convPtr(new Conversation(i));
352 IConversationPtr convPtr(new Conversation(threadViewList.msg_struct_info[i]));
354 recVec.push_back(convPtr);
361 vector<IMessagePtr> Messaging::querySmsMmsMessages(const std::string& queryString){
362 LogDebug("<<< queryString:[" << queryString <<"]");
364 vector<IMessagePtr> retVal;
365 std::string tempString = "";
366 // MSG_LIST_S message_list = {0, NULL};
367 msg_struct_list_s message_list = {0,};
370 msg_error_t res = MSG_ERR_UNKNOWN;
372 MessageStorageReader reader;
373 reader.MsgStoConnectDB();
374 res = reader.queryMessage(queryString, tempString, &message_list);
376 if (MSG_SUCCESS != res) {
377 LogError("msg_get_folder_view_list failed " << res);
378 Throw(WrtDeviceApis::Commons::PlatformException);
380 reader.MsgStoDisconnectDB();
382 retVal = createVectorFromeMessageList(message_list);
383 msg_release_list_struct(&message_list);
384 }Catch(WrtDeviceApis::Commons::PlatformException) {
385 LogError("Problem with message creation, cleaning");
386 if (message_list.nCount) {
387 msg_release_list_struct(&message_list);
396 vector<IMessagePtr> Messaging::querySmsMmsMessages(const std::string& queryString, const std::string& orderLimitString){
397 LogDebug("<<< queryString:[" << queryString <<"]");
398 LogDebug("<<< orderLimitString:[" << orderLimitString <<"]");
400 vector<IMessagePtr> retVal;
401 // MSG_LIST_S message_list = {0, NULL};
402 msg_struct_list_s message_list = {0,};
405 msg_error_t res = MSG_ERR_UNKNOWN;
407 MessageStorageReader reader;
408 reader.MsgStoConnectDB();
409 res = reader.queryMessage(queryString, orderLimitString, &message_list);
411 if (MSG_SUCCESS != res) {
412 LogError("msg_get_folder_view_list failed " << res);
413 Throw(WrtDeviceApis::Commons::PlatformException);
415 reader.MsgStoDisconnectDB();
417 retVal = createVectorFromeMessageList(message_list);
418 LogDebug("<<< message_list.nCount:[" << message_list.nCount <<"]");
420 msg_release_list_struct(&message_list);
421 }Catch(WrtDeviceApis::Commons::PlatformException) {
422 LogError("Problem with message creation, cleaning");
423 if (message_list.nCount) {
424 msg_release_list_struct(&message_list);
433 vector<IConversationPtr> Messaging::querySmsMmsConversation(const std::string& sqlWhereClause, const std::string& orderLimitString){
434 LogDebug("sqlWhereClause:[" << sqlWhereClause << "]");
435 LogDebug("<<< orderLimitString:[" << orderLimitString <<"]");
437 std::vector<IConversationPtr> recVec;
438 // MSG_THREAD_VIEW_LIST_S threadViewList;
439 msg_struct_list_s threadViewList;
441 msg_error_t res = MSG_ERR_UNKNOWN;
443 MessageStorageReader reader;
444 reader.MsgStoConnectDB();
445 res = reader.queryConversation(sqlWhereClause, orderLimitString, &threadViewList);
447 if (MSG_SUCCESS != res) {
448 LogError("queryConversation failed:" << res);
449 Throw(WrtDeviceApis::Commons::PlatformException);
451 reader.MsgStoDisconnectDB();
453 recVec = createVectorFromeThreadViewList(threadViewList);
455 msg_release_list_struct(&threadViewList);
461 vector<IConversationPtr> Messaging::queryEmailConversation(const std::string& sqlWhereClause){
462 LogDebug("sqlWhereClause:[" << sqlWhereClause << "]");
464 std::vector<IConversationPtr> emailResultVector;
465 email_mail_list_item_t* mailList = NULL;
466 int mailListCount = 0;
468 errCode = email_query_mail_list(const_cast<char*>(sqlWhereClause.c_str()), &mailList, &mailListCount);
470 if(errCode != EMAIL_ERROR_NONE){
471 LogError("[ERROR]email_query_mail_list failed:" << errCode);
472 printErrorMessage(errCode);
474 LogDebug("message found mailListCount:" << mailListCount);
475 std::map<int, int> checkUnique;
477 for(int i=0; i<mailListCount; i++){
478 if (checkUnique.find(mailList[i].thread_id) == checkUnique.end()){
479 checkUnique[mailList[i].thread_id] = mailList[i].thread_id;
480 IConversationPtr convPtr(new Conversation(mailList[i].thread_id, EMAIL));
483 LogDebug("mailList[i].thread_id:[" << mailList[i].thread_id << "]");
484 LogDebug("mailList[i].full_address_from:[" << mailList[i].full_address_from << "]");
485 LogDebug("mailList[i].email_address_sender : [" << mailList[i].email_address_sender <<"]");
486 LogDebug("mailList[i].subject:[" << mailList[i].subject << "]");
487 LogDebug("mailList[i].preview_text:[" << mailList[i].preview_text << "]");
488 LogDebug("mailList[i].flags_seen_field:[" << mailList[i].flags_seen_field << "]");
489 LogDebug("mailList[i].priority:[" << mailList[i].priority<< "]");
491 if (convPtr->getResult() == true)
493 emailResultVector.push_back(convPtr);
499 if (mailList != NULL){
504 return emailResultVector;
507 vector<IMessagePtr> Messaging::queryEmailMessage(const std::string& sqlWhereClause){
508 LogDebug("sqlWhereClause:[" << sqlWhereClause << "]");
510 vector<IMessagePtr> emailResultVector;
512 email_mail_list_item_t* mailList = NULL;
513 int mailListCount = 0;
515 errCode = email_query_mail_list(const_cast<char*>(sqlWhereClause.c_str()), &mailList, &mailListCount);
517 if(errCode != EMAIL_ERROR_NONE){
518 LogError("[ERROR]email_query_mail_list failed:" << errCode);
519 printErrorMessage(errCode);
521 LogDebug("message found mailListCount:" << mailListCount);
523 for(int i=0; i<mailListCount; i++){
524 //IMessagePtr msg = MessageFactory::createMessage(EMAIL, mailList[i].mail_id);
525 IMessagePtr msg = MessageFactory::createEmailMessage(mailList[i].account_id, mailList[i].mail_id);
528 LogDebug("mailList[i].full_address_from:[" << mailList[i].full_address_from << "]");
529 LogDebug("mailList[i].email_address_sender : [" << mailList[i].email_address_sender <<"]");
530 //LogDebug("mailList[i].datetime:[" << mailList[i].datetime << "]");
531 LogDebug("mailList[i].subject:[" << mailList[i].subject << "]");
532 // LogDebug("mailList[i].mailbox_name:[" << mailList[i].mailbox_name << "]");
533 LogDebug("mailList[i].preview_text:[" << mailList[i].preview_text << "]");
534 LogDebug("mailList[i].flags_seen_field:[" << mailList[i].flags_seen_field << "]");
535 LogDebug("mailList[i].priority:[" << mailList[i].priority<< "]");
537 emailResultVector.push_back(msg);
541 if (mailList != NULL) {
546 return emailResultVector;
549 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter){
552 vector<IMessagePtr> retVal;
553 std::string filterSql;
555 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator());
557 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
558 filter->travel(filterVisitor, 0);
559 filterSql = queryGenerator->getQuery();
560 LogDebug("filterSql:[" << filterSql <<"]");
562 int messageType = queryGenerator->getMessageType();
565 LogDebug("message type is EMAIL:[" << messageType <<"]");
566 retVal = queryEmailMessage(filterSql);
571 LogDebug("message type is SMS or MMS:[" << messageType <<"]");
572 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
573 filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
574 filter->travel(filterVisitor);
575 filterSql = queryGenerator->getQuery();
576 retVal = querySmsMmsMessages(filterSql);
580 LogError("[ERROR] >>> invlid message type:[" << messageType <<"]");
590 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter, const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset)
594 vector<IMessagePtr> retVal;
595 std::string filterSql;
597 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator(sortMode, limit, offset));
599 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
600 filter->travel(filterVisitor, 0);
601 filterSql = queryGenerator->getQuery();
602 LogDebug("filterSql:[" << filterSql <<"]");
604 int messageType = queryGenerator->getMessageType();
607 LogDebug("message type is EMAIL:[" << messageType <<"]");
608 retVal = queryEmailMessage(filterSql);
613 LogDebug("message type is SMS or MMS:[" << messageType <<"]");
614 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
615 filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
616 filter->travel(filterVisitor);
617 filterSql = queryGenerator->getQuery();
618 retVal = querySmsMmsMessages(filterSql);
622 MsgLogError("[ERROR] >>> invlid message type:[" << messageType <<"]");
630 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter, const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset, const int type)
634 vector<IMessagePtr> retVal;
635 std::string filterSql;
636 std::string orderLimitSql ="";
637 std::string emailFilterSql;
638 std::string typeAndString = "AND A.MAIN_TYPE=";
639 std::string typeString = "A.MAIN_TYPE=";
641 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator(sortMode, limit, offset, type));
643 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
644 filter->travel(filterVisitor, 0);
645 filterSql = queryGenerator->getQuery();
646 orderLimitSql = queryGenerator->getOrderLimit();
647 LogDebug("filterSql:[" << filterSql <<"]");
648 LogDebug("orderLimitSql:[" << orderLimitSql <<"]");
650 int messageType = queryGenerator->getMessageType();
651 if(messageType != -1)
653 if(messageType != type)
655 LogDebug("filter messageType and service msg type is diff");
656 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
661 LogDebug("message type is EMAIL:[" << messageType <<"]");
662 emailFilterSql = filterSql + orderLimitSql;
663 LogDebug("filterSql:[" << emailFilterSql <<"]");
664 retVal = queryEmailMessage(emailFilterSql);
668 LogDebug("message type is SMS :[" << messageType <<"]");
669 typeString.append("1");
670 typeAndString.append("1");
671 if(filterSql.length() == 0)
673 filterSql.append(typeString);
674 LogDebug("filterSql:[" << filterSql <<"]");
678 filterSql.append(typeAndString);
679 LogDebug("filterSql:[" << filterSql <<"]");
681 LogDebug("filterSql:[" << filterSql <<"]");
682 LogDebug("orderLimitSql.length():[" << orderLimitSql.length() <<"]");
683 retVal = querySmsMmsMessages(filterSql, orderLimitSql);
684 LogDebug("filterSql:[" << filterSql <<"]");
687 LogDebug("message type is MMS:[" << messageType <<"]");
688 typeString.append("2");
689 typeAndString.append("2");
690 if(filterSql.length() == 0)
692 filterSql.append(typeString);
693 LogDebug("filterSql:[" << filterSql <<"]");
697 filterSql.append(typeAndString);
698 LogDebug("filterSql:[" << filterSql <<"]");
700 LogDebug("filterSql:[" << filterSql <<"]");
701 LogDebug("orderLimitSql.length():[" << orderLimitSql.length() <<"]");
702 retVal = querySmsMmsMessages(filterSql, orderLimitSql);
703 LogDebug("filterSql:[" << filterSql <<"]");
707 MsgLogError("[ERROR] >>> invlid message type:[" << messageType <<"]");
716 vector<string> Messaging::getMessageIds(MessageType msgType,
721 return getSmsIds(folder);
723 return getMmsIds(folder);
725 return getEmailIds(folder);
727 LogError("not supported message type");
728 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
732 vector<string> Messaging::getSmsIds(FolderType folder)
734 vector<string> retVal;
735 msg_message_t msg = msg_new_message();
736 MSG_LIST_S folder_list_view = { 0, NULL };
740 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
741 msg_error_t res = MSG_ERR_UNKNOWN;
742 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
743 res = msg_get_folder_view_list(
744 MsgGetCommonHandle(), platformFolder, &sort_rules,
747 if (MSG_SUCCESS != res) {
748 LogError("msg_Get_folder_view_list failed" << res);
749 Throw(WrtDeviceApis::Commons::PlatformException);
752 for (int i = 0; i < folder_list_view.nCount; i++) {
754 msg_get_message_type(folder_list_view.
756 int l_msgId = msg_get_message_id(
757 folder_list_view.msgInfo[i]);
758 ostringstream stream;
760 retVal.push_back(stream.str());
764 msg_release_list_struct(&folder_list_view);
767 Catch(WrtDeviceApis::Commons::PlatformException) {
768 LogError("Problem with message creation, cleaning");
769 if (folder_list_view.nCount) {
770 msg_release_list_struct(&folder_list_view);
773 msg_release_message(&msg);
781 vector<string> Messaging::getMmsIds(FolderType folder)
783 vector<string> retVal;
784 msg_message_t msg = msg_new_message();
785 MSG_LIST_S folder_list_view = { 0, NULL };
789 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
790 msg_error_t res = MSG_ERR_UNKNOWN;
791 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
792 res = msg_get_folder_view_list(
793 MsgGetCommonHandle(), platformFolder, &sort_rules,
796 if (MSG_SUCCESS != res) {
797 LogError("msg_Get_folder_view_list failed" << res);
798 Throw(WrtDeviceApis::Commons::PlatformException);
801 for (int i = 0; i < folder_list_view.nCount; i++) {
803 msg_get_message_type(folder_list_view.
805 int l_msgId = msg_get_message_id(
806 folder_list_view.msgInfo[i]);
807 ostringstream stream;
809 retVal.push_back(stream.str());
813 msg_release_list_struct(&folder_list_view);
816 Catch(WrtDeviceApis::Commons::PlatformException) {
817 LogError("Problem with message creation, cleaning");
818 if (folder_list_view.nCount) {
819 msg_release_list_struct(&folder_list_view);
822 msg_release_message(&msg);
830 vector<string> Messaging::getEmailIds(FolderType folder)
832 vector<string> retVal;
836 Throw(WrtDeviceApis::Commons::UnknownException);
841 vector<EmailAccountInfo> Messaging::getEmailAccounts() const
844 email_account_t* accounts = NULL;
847 if (!email_get_account_list(&accounts, &count)) {
848 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Couldn't get e-mail accounts.");
851 LogError( "count : " << count);
854 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "No e-mail account found.");
857 vector<EmailAccountInfo> result;
858 for (int i = 0; i < count; ++i)
860 if(accounts[i].incoming_server_user_name != NULL)
862 LogError("server user name is NULL");
863 EmailAccountInfo account(accounts[i].account_id,
864 accounts[i].incoming_server_user_name,
865 accounts[i].user_email_address);
866 result.push_back(account);
870 LogError("normal case");
871 std::string Unknown = "UNKNOWN";
872 EmailAccountInfo account(accounts[i].account_id,
874 accounts[i].user_email_address);
875 result.push_back(account);
879 if (accounts != NULL) {
880 email_free_account(&accounts, count);
885 Catch(WrtDeviceApis::Commons::PlatformException) {
886 if (accounts != NULL) {
887 email_free_account(&accounts, count);
889 LogError("PlatformException");
890 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "No e-mail account found.");
892 Catch(WrtDeviceApis::Commons::UnknownException) {
893 if (accounts != NULL) {
894 email_free_account(&accounts, count);
896 LogError("UnknownException");
897 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Couldn't convert e-mail account id");
901 int Messaging::getEmailAccountId(const std::string& account)
904 string tmpAccount = account;
905 email_account_t *pAccountArray = NULL;
910 if (account.empty()) {
911 tmpAccount = getCurrentEmailAccount().getAddress();
912 if (tmpAccount.empty()) {
914 "current email account is not set, possible that no account created");
915 Throw(WrtDeviceApis::Commons::PlatformException);
919 if (!email_get_account_list(&pAccountArray, &iCount)) {
920 LogError("email_get_account_list error");
921 Throw(WrtDeviceApis::Commons::PlatformException);
925 LogError("no email account exist");
926 Throw(WrtDeviceApis::Commons::PlatformException);
929 for (int i = 0; i < iCount; i++) {
930 string tmp = pAccountArray[i].user_email_address;
931 if (tmp == tmpAccount) {
932 m_currentEmailAccountId = pAccountArray[i].account_id;
933 retVal = m_currentEmailAccountId;
938 if (0 == m_currentEmailAccountId) {
939 LogError("wrong email account ID");
940 Throw(WrtDeviceApis::Commons::PlatformException);
943 if (pAccountArray != NULL) {
944 LogDebug("free account, ptr=" << pAccountArray);
945 email_free_account(&pAccountArray, iCount);
949 LogError("no email account created");
950 Throw(WrtDeviceApis::Commons::PlatformException);
954 Catch(WrtDeviceApis::Commons::PlatformException) {
955 LogError("exception catch, platform exception");
956 if (pAccountArray != NULL) {
957 email_free_account(&pAccountArray, iCount);
965 void Messaging::fetchEmailHeaders()
968 email_mailbox_t *mailbox = NULL;
971 mailbox = static_cast<email_mailbox_t*>(calloc(sizeof (email_mailbox_t), 1));
973 LogError("calloc failed");
976 mailbox->account_id = m_currentEmailAccountId;
977 mailbox->mailbox_name = strdup(EMAIL_INBOX_NAME);
978 // if (EMAIL_ERROR_NONE != email_sync_header(mailbox, &handle)) {
979 if (EMAIL_ERROR_NONE != email_sync_header(mailbox->account_id, 0, &handle)) {
980 LogError("email_sync_header failed");
982 error = email_free_mailbox(&mailbox, 1);
983 LogError("email_free_mailbox : " << error);
987 int Messaging::convertFolderToPlatform(const FolderType folder)
989 msg_folder_id_t platfromFolderId;
992 platfromFolderId = MSG_INBOX_ID;
995 platfromFolderId = MSG_DRAFT_ID;
998 platfromFolderId = MSG_OUTBOX_ID;
1001 platfromFolderId = MSG_SENTBOX_ID;
1004 // intentionally not break in platform is no spambox
1006 LogError("Invalid folder: " << folder);
1007 Throw(WrtDeviceApis::Commons::PlatformException);
1010 return platfromFolderId;
1013 int Messaging::convertFolderToPlatform(const std::string &folder)
1015 // MSG_FOLDER_LIST_S folderList = { 0, NULL };
1022 msg_get_folder_list(MsgGetCommonHandle(), &folderList)) {
1023 LogError("msg_get_folder_list error");
1024 Throw(WrtDeviceApis::Commons::PlatformException);
1026 for (int i = 0; i < folderList.nCount; ++i) {
1027 if (MSG_FOLDER_TYPE_USER_DEF ==
1028 folderList.folderInfo[i].folderType &&
1029 NULL != folderList.folderInfo[i].folderName &&
1030 folder == folderList.folderInfo[i].folderName) {
1031 result = folderList.folderInfo[i].folderId;
1036 Catch(WrtDeviceApis::Commons::PlatformException) {
1037 if (folderList.nCount) {
1038 msg_release_folder_list(&folderList);
1042 if (folderList.nCount) {
1043 msg_release_folder_list(&folderList);
1049 void Messaging::addOnMessageReceived(
1050 const EmitterMessageReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1058 LogDebug("funtionIndex = " << funtionIndex);
1059 bool isValidFilter = validateFilter(filter, funtionIndex);
1060 if(isValidFilter == false){
1061 LogError("[ERROR]this filter is invalid");
1062 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1065 Catch(WrtDeviceApis::Commons::PlatformException) {
1070 LogDebug("filter is NULL");
1074 m_onMessageReceived.attach(emitter);
1075 EmittersMessageReceived::LockType lock = m_onMessageReceived.getLock();
1076 if ((m_onMessageReceived.size() == 1)&&((m_onConversationReceived.size() + m_onFolderReceived.size()) == 0)) {
1077 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1078 new MsgServiceHandleMgr());
1081 err = msg_reg_storage_change_callback(
1082 m_onMessageReceivedHandleMgr->getHandle(),
1083 onMessageStorageChanged,
1086 Catch(WrtDeviceApis::Commons::PlatformException){
1087 LogDebug("addOnMessageReceived failed");
1088 Throw(WrtDeviceApis::Commons::PlatformException);
1091 if (err != MSG_SUCCESS) {
1092 LogError("Couldn't register on MMS received callback, err=" << err);
1095 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1099 void Messaging::addOnMessageReceived(
1100 const EmitterConversationReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1108 LogDebug("funtionIndex = " << funtionIndex);
1109 bool isValidFilter = validateFilter(filter, funtionIndex);
1110 if(isValidFilter == false){
1111 LogError("[ERROR]this filter is invalid");
1112 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1115 Catch(WrtDeviceApis::Commons::PlatformException) {
1120 LogDebug("filter is NULL");
1124 m_onConversationReceived.attach(emitter);
1125 EmittersConversationReceived::LockType lock = m_onConversationReceived.getLock();
1126 if ((m_onConversationReceived.size() == 1)&&((m_onMessageReceived.size() + m_onFolderReceived.size()) == 0)) {
1127 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1128 new MsgServiceHandleMgr());
1131 err = msg_reg_storage_change_callback(
1132 m_onMessageReceivedHandleMgr->getHandle(),
1133 onMessageStorageChanged,
1136 Catch(WrtDeviceApis::Commons::PlatformException){
1137 LogDebug("addOnMessageReceived failed");
1138 Throw(WrtDeviceApis::Commons::PlatformException);
1141 if (err != MSG_SUCCESS) {
1142 LogError("Couldn't register on MMS received callback, err=" << err);
1145 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1149 void Messaging::addOnMessageReceived(
1150 const EmitterFolderReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1158 LogDebug("funtionIndex = " << funtionIndex);
1159 bool isValidFilter = validateFilter(filter, funtionIndex);
1160 if(isValidFilter == false){
1161 LogError("[ERROR]this filter is invalid");
1162 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1165 Catch(WrtDeviceApis::Commons::PlatformException) {
1170 LogDebug("filter is NULL");
1174 m_onFolderReceived.attach(emitter);
1175 EmittersFolderReceived::LockType lock = m_onFolderReceived.getLock();
1176 if ((m_onFolderReceived.size() == 1)&&((m_onMessageReceived.size() + m_onConversationReceived.size()) == 0)) {
1177 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1178 new MsgServiceHandleMgr());
1183 err = msg_reg_storage_change_callback(
1184 m_onMessageReceivedHandleMgr->getHandle(),
1185 onMessageStorageChanged,
1188 Catch(WrtDeviceApis::Commons::PlatformException){
1189 LogDebug("addOnMessageReceived failed");
1190 Throw(WrtDeviceApis::Commons::PlatformException);
1193 if (err != MSG_SUCCESS) {
1194 LogError("Couldn't register on MMS received callback, err=" << err);
1195 // Throw(WrtDeviceApis::Commons::UnknownException);
1198 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1202 bool Messaging::validateFilter(const DeviceAPI::Tizen::FilterPtr& filter, const int funtionIndex){
1205 bool retBool = false;
1206 LogDebug("funtionIndex = " << funtionIndex);
1209 if(funtionIndex == 0)
1211 StorageChangesMessageFilterValidatorPtr validatorMsg =
1212 StorageChangesMessageFilterValidatorFactory::getStorageChangesMessageFilterValidator();
1214 FilterValidatorPtr filterValidatorMsg = DPL::StaticPointerCast<FilterValidator>(validatorMsg);
1215 retBool = filter->validate(filterValidatorMsg);
1216 }else if(funtionIndex == 1)
1218 StorageChangesConversationFilterValidatorPtr validatorConv =
1219 StorageChangesConversationFilterValidatorFactory::getStorageChangesConversationFilterValidator();
1221 FilterValidatorPtr filterValidatorConv = DPL::StaticPointerCast<FilterValidator>(validatorConv);
1222 retBool = filter->validate(filterValidatorConv);
1223 }else if(funtionIndex == 2)
1225 StorageChangesFolderFilterValidatorPtr validatorFolder =
1226 StorageChangesFolderFilterValidatorFactory::getStorageChangesFolderFilterValidator();
1228 FilterValidatorPtr filterValidatorFolder = DPL::StaticPointerCast<FilterValidator>(validatorFolder);
1229 retBool = filter->validate(filterValidatorFolder);
1232 if(retBool == false){
1233 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1236 LogDebug("filter is NULL");
1240 LogDebug(">>> retBool:" << retBool);
1246 void Messaging::removeOnMessageMsgReceived(EmitterMessageReceived::IdType id)
1249 m_onMessageReceived.detach(id);
1250 EmittersMessageReceived::LockType lock = m_onMessageReceived.getLock();
1251 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1252 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1253 m_dbusConnection->close();
1257 void Messaging::removeOnMessageConvReceived(EmitterConversationReceived::IdType id)
1260 m_onConversationReceived.detach(id);
1261 EmittersConversationReceived::LockType lock = m_onConversationReceived.getLock();
1262 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1263 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1264 m_dbusConnection->close();
1268 void Messaging::removeOnMessageFolderReceived(EmitterFolderReceived::IdType id)
1271 m_onFolderReceived.detach(id);
1272 EmittersFolderReceived::LockType lock = m_onFolderReceived.getLock();
1273 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1274 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1275 m_dbusConnection->close();
1279 void Messaging::OnEventReceived(const DBus::MessageEvent& event)
1282 EventMessageReceivedPtr jsEvent(new EventMessageReceived());
1283 DBus::MessagePtr message = event.GetArg0();
1287 jsEvent->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::PlatformException);
1288 m_onMessageReceived.emit(jsEvent);
1292 if (message->getInterface() == DBUS_INTERFACE_EMAIL_RECEIVED)
1294 int account_id = 0, mail_id = 0, thread_id = 0, status = 0;
1296 email_mailbox_t m_mailboxes;
1298 DBus::Message::ReadIterator it = message->getReadIterator();
1299 for (int i = 0; it->isValid(); it->next(), ++i)
1301 if ((i == 0) && (it->getArgType() == DBUS_TYPE_INT32))
1303 status = it->getInt();
1304 LogInfo("status: " << status);
1306 else if ((i == 1) && (it->getArgType() == DBUS_TYPE_INT32))
1308 account_id = it->getInt();
1309 LogInfo("account_id: " << account_id);
1311 else if ((i == 2) && (it->getArgType() == DBUS_TYPE_INT32))
1313 mail_id = it->getInt();
1314 LogInfo("mail_id: " << mail_id);
1316 else if ((i == 3) && (it->getArgType() == DBUS_TYPE_STRING))
1318 name = it->getString();
1319 LogInfo("name: " << name);
1321 else if ((i == 4) && (it->getArgType() == DBUS_TYPE_INT32))
1323 thread_id = it->getInt();
1324 LogInfo("thread_id: " << thread_id);
1328 if ((mail_id > 0) && (NOTI_MAIL_ADD == status))
1329 { // TODO also RECEIVE_THREAD_ITEM?
1330 LogInfo("Email received. mail_id: " << mail_id);
1332 IMessagePtr msg = MessageFactory::createMessage(EMAIL, mail_id);
1333 IConversationPtr conversation(new Conversation(thread_id, EMAIL));
1335 // TODO Temporary fix: ignore messages from OUTBOX, SENTBOX & DRAFTBOX -> most probably we added them
1336 FolderType folder = msg->getCurrentFolder();
1337 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1339 LogInfo("Added message is in folder: " << folder);
1341 jsEvent->setMessage(msg);
1342 jsEvent->setConversation(conversation);
1344 if(m_onMessageReceived.size() > 0){
1345 m_onMessageReceived.emit(jsEvent);
1348 if(m_onConversationReceived.size() > 0){
1349 m_onConversationReceived.emit(jsEvent);
1352 if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1354 jsEvent->setMessage(msg);
1355 jsEvent->setConversation(conversation);
1357 if(m_onMessageReceived.size() > 0){
1358 m_onMessageReceived.emit(jsEvent);
1361 if(m_onConversationReceived.size() > 0){
1362 m_onConversationReceived.emit(jsEvent);
1366 LogWarning("New email message in ignored folder: " << folder);
1370 else if ((mail_id > 0) && (NOTI_MAIL_DELETE == status))
1371 { // TODO also RECEIVE_THREAD_ITEM?
1372 LogInfo("Email received. delete type: " << mail_id);
1374 std::vector<std::string> strIds = String::split(name, ',');
1376 std::stringstream stream;
1377 for (std::vector<std::string>::iterator it = strIds.begin(); it != strIds.end(); ++it)
1379 LogDebug("ID is :" << *it);
1381 if ( (*it).length() > 0 ) //vaild id
1387 IMessagePtr msg = MessageFactory::createMessage(EMPTY_MESSAGE, id);
1388 IConversationPtr conversation(new Conversation());
1390 FolderType folder = msg->getCurrentFolder();
1391 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1393 if (true) { // if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1394 jsEvent->setMessage(msg);
1395 jsEvent->setConversation(conversation);
1396 if(m_onMessageReceived.size() > 0){
1397 m_onMessageReceived.emit(jsEvent);
1401 LogWarning("New email message in ignored folder: " << folder);
1409 else if ((mail_id > 0) && (NOTI_MAIL_UPDATE == status))
1410 { // TODO also RECEIVE_THREAD_ITEM?
1411 LogInfo("Email received. mail_id: " << mail_id);
1413 IMessagePtr msg = MessageFactory::createMessage(EMAIL, mail_id);
1414 IConversationPtr conversation(new Conversation(thread_id, EMAIL));
1416 FolderType folder = msg->getCurrentFolder();
1417 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1419 if (true) { // if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1420 jsEvent->setMessage(msg);
1421 jsEvent->setConversation(conversation);
1422 if(m_onMessageReceived.size() > 0)
1423 m_onMessageReceived.emit(jsEvent);
1424 if(m_onConversationReceived.size() > 0)
1425 m_onConversationReceived.emit(jsEvent);
1427 LogWarning("New email message in ignored folder: " << folder);
1430 else if ((mail_id > 0) && (NOTI_THREAD_DELETE == status))
1431 { // TODO also RECEIVE_THREAD_ITEM?
1432 LogInfo("Email received. delete thread Id : " << mail_id);
1434 IConversationPtr conversation(new Conversation());
1435 conversation->setConvId(mail_id);
1436 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1437 jsEvent->setConversation(conversation);
1439 if(m_onConversationReceived.size() > 0){
1440 m_onConversationReceived.emit(jsEvent);
1443 else if (NOTI_MAILBOX_ADD == status)
1445 LogInfo("Emailbox received. account Id: " << account_id);
1446 LogInfo("name Id: " << name);
1447 LogInfo("mailBox Id: " << mail_id);
1449 email_mailbox_t* mail_box = NULL;
1451 if (EMAIL_ERROR_NONE != email_get_mailbox_by_mailbox_id(mail_id, &mail_box)) {
1452 LogError("Couldn't retrieve message or it has been malformed.");
1455 if(mail_box != NULL)
1457 m_mailboxes = *mail_box;
1458 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1459 jsEvent->setMessageFolder(folderPtr);
1460 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1461 if(m_onFolderReceived.size() > 0)
1463 m_onFolderReceived.emit(jsEvent);
1470 if( EMAIL_ERROR_NONE != email_free_mailbox( &mail_box , 1) )
1471 LogDebug("fail to email_free_mailbox - err ");
1475 else if (NOTI_MAILBOX_UPDATE == status)
1477 LogInfo("Emailbox received. account Id: " << account_id);
1478 LogInfo("name Id: " << name);
1479 LogInfo("mailBox Id: " << mail_id);
1481 email_mailbox_t* mail_box = NULL;
1483 if (EMAIL_ERROR_NONE != email_get_mailbox_by_mailbox_id(mail_id, &mail_box)) {
1484 LogError("Couldn't retrieve message or it has been malformed.");
1487 if(mail_box != NULL)
1489 m_mailboxes = *mail_box;
1491 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1492 jsEvent->setMessageFolder(folderPtr);
1493 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1495 if(m_onFolderReceived.size() > 0)
1497 m_onFolderReceived.emit(jsEvent);
1503 if( EMAIL_ERROR_NONE != email_free_mailbox( &mail_box , 1) )
1504 LogDebug("fail to email_free_mailbox - err ");
1507 else if (NOTI_MAILBOX_DELETE == status)
1509 LogInfo("Emailbox received. account Id: " << account_id);
1510 LogInfo("name Id: " << name);
1511 LogInfo("mailBox Id: " << mail_id);
1513 // make empty mailbox
1514 m_mailboxes.mailbox_id = mail_id;
1515 m_mailboxes.account_id = account_id;
1516 m_mailboxes.alias = (char *)"";
1517 m_mailboxes.mailbox_name = (char *)"";
1519 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1520 jsEvent->setMessageFolder(folderPtr);
1521 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1523 if(m_onFolderReceived.size() > 0)
1525 m_onFolderReceived.emit(jsEvent);
1530 LogError("Couldn't retrieve message or it has been malformed.");
1533 else // DBUS_INTERFACE_EMAIL_RECEIVED
1535 LogDebug("Wrong DBus interface, skipping it.");
1540 void Messaging::onMessageStorageChanged(msg_handle_t handle,
1541 msg_storage_change_type_t storageChangeType,
1542 msg_id_list_s *pMsgIdList,
1548 msg_error_t err = MSG_SUCCESS;
1550 if(storageChangeType == MSG_STORAGE_CHANGE_CONTACT)
1552 LogDebug("storageChangeType is MSG_STORAGE_CHANGE_CONTACT");
1556 Messaging* this_ = static_cast<Messaging*>(data);
1560 int msgCount = pMsgIdList->nCount;
1561 LogDebug("msgCount = "<< msgCount);
1563 for(int index = 0; index < msgCount; index++)
1566 LogDebug("storageChangeType = "<< storageChangeType);
1568 if(storageChangeType == MSG_STORAGE_CHANGE_DELETE)
1570 IMessagePtr message = MessageFactory::createMessage(EMPTY_MESSAGE, pMsgIdList->msgIdList[index]);
1571 IConversationPtr conversation(new Conversation());
1572 EventMessageReceivedPtr event(new EventMessageReceived());
1573 event->setMessage(message);
1574 event->setConversation(conversation);
1575 event->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1577 if(this_->m_onMessageReceived.size() > 0){
1578 this_->m_onMessageReceived.emit(event);
1580 if(this_->m_onConversationReceived.size() > 0){
1581 this_->m_onConversationReceived.emit(event);
1586 msg_struct_t msg = NULL;
1587 msg_struct_t sendOpt = NULL;
1588 msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1589 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1591 err = msg_get_message(handle, pMsgIdList->msgIdList[index], msg, sendOpt);
1593 if (err != MSG_SUCCESS)
1595 LogDebug("Get Message Failed!");
1596 LogDebug("err" << err);
1597 msg_release_struct(&msg);
1598 msg_release_struct(&sendOpt);
1604 msg_get_int_value(msg, MSG_MESSAGE_TYPE_INT, &msgType);
1605 LogDebug("msgType : " << msgType);
1606 if((msgType > MSG_TYPE_INVALID) && ( msgType <= MSG_TYPE_SMS_REJECT))
1608 if(msgType != MSG_TYPE_MMS_NOTI)
1611 msg_get_int_value(msg, MSG_MESSAGE_ID_INT, &msgId);
1612 IMessagePtr message = MessageFactory::createMessage(
1617 ISmsPtr sms = MessageFactory::convertToSms(message);
1618 IConversationPtr conversation(new Conversation(message->getId(), SMS));
1619 EventMessageReceivedPtr event(new EventMessageReceived());
1620 event->setMessage(message);
1621 event->setConversation(conversation);
1623 if(storageChangeType == MSG_STORAGE_CHANGE_INSERT)
1625 LogDebug("MSG_STORAGE_CHANGE_INSERT");
1626 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1628 else if(storageChangeType == MSG_STORAGE_CHANGE_UPDATE)
1630 LogDebug("MSG_STORAGE_CHANGE_UPDATE");
1631 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1634 if(this_->m_onMessageReceived.size() > 0){
1635 this_->m_onMessageReceived.emit(event);
1637 if(this_->m_onConversationReceived.size() > 0){
1638 this_->m_onConversationReceived.emit(event);
1643 LogError("Ignore this sms, this is mms noti.");
1646 else if((msgType >= MSG_TYPE_MMS) && (msgType <= MSG_TYPE_MMS_NOTI))
1648 if(msgType != MSG_TYPE_MMS_NOTI)
1651 msg_get_int_value(msg, MSG_MESSAGE_ID_INT, &msgId);
1652 IMessagePtr message = MessageFactory::createMessage(
1654 // msg_get_message_id(
1658 IMmsPtr mms = MessageFactory::convertToMms(message);
1659 IConversationPtr conversation(new Conversation(message->getId(), MMS));
1660 EventMessageReceivedPtr event(new EventMessageReceived());
1661 event->setMessage(message);
1662 event->setConversation(conversation);
1664 if(storageChangeType == MSG_STORAGE_CHANGE_INSERT)
1666 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1668 else if(storageChangeType == MSG_STORAGE_CHANGE_UPDATE)
1670 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1672 // else if(storageChangeType == MSG_STORAGE_CHANGE_DELETE)
1674 // event->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1677 if(this_->m_onMessageReceived.size() > 0){
1678 this_->m_onMessageReceived.emit(event);
1680 if(this_->m_onConversationReceived.size() > 0){
1681 this_->m_onConversationReceived.emit(event);
1686 LogError("Ignore this mms, this is mms noti.");
1692 LogError("release msg : " << msg);
1693 msg_release_struct(&msg);
1695 msg_release_struct(&sendOpt);
1699 Catch(WrtDeviceApis::Commons::ConversionException) {
1700 LogError("Couldn't convert message to sms.");
1702 Catch(WrtDeviceApis::Commons::PlatformException) {
1703 LogError("onMessageStorageChanged platform exception");
1709 void Messaging::onSmsReceived(MSG_HANDLE_T handle,
1714 Messaging* this_ = static_cast<Messaging*>(data);
1717 if(msg_get_message_type(msg) != MSG_TYPE_MMS_NOTI)
1719 IMessagePtr message = MessageFactory::createMessage(
1723 ISmsPtr sms = MessageFactory::convertToSms(message);
1724 IConversationPtr conversation(new Conversation(message->getId(), SMS));
1726 EventMessageReceivedPtr event(new EventMessageReceived());
1727 event->setMessage(message);
1728 event->setConversation(conversation);
1729 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1730 this_->m_onMessageReceived.emit(event);
1734 LogError("Ignore this sms, this is mms noti.");
1737 Catch(WrtDeviceApis::Commons::ConversionException) {
1738 LogError("Couldn't convert message to sms.");
1743 void Messaging::onMmsReceived(MSG_HANDLE_T handle,
1748 Messaging* this_ = static_cast<Messaging*>(data);
1751 IMessagePtr message = MessageFactory::createMessage(
1755 IMmsPtr mms = MessageFactory::convertToMms(message);
1756 IConversationPtr conversation(new Conversation(message->getId(), MMS));
1757 EventMessageReceivedPtr event(new EventMessageReceived());
1758 event->setMessage(message);
1759 event->setConversation(conversation);
1760 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1761 this_->m_onMessageReceived.emit(event);
1763 Catch(WrtDeviceApis::Commons::ConversionException) {
1764 LogError("Couldn't convert message to mms.");
1769 void Messaging::getNumberOfEmails(FolderType folder,
1775 email_mailbox_t mailbox = {};
1776 mailbox.account_id = 0; // means for all accounts
1777 mailbox.name = String::strdup(
1778 EmailConverter::toMailboxName(folder)
1781 int error = email_count_mail(&mailbox, read, unread);
1784 if (EMAIL_ERROR_NONE != error) {
1785 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
1786 "Couldn't get number of emails. [" << error << "]");
1792 void Messaging::getNumberOfSms(FolderType folder,
1796 getNumberOfSmsMms(folder, read, unread, SMS);
1799 void Messaging::getNumberOfMms(FolderType folder,
1803 getNumberOfSmsMms(folder, read, unread, MMS);
1806 void Messaging::getNumberOfSmsMms(FolderType folder,
1809 MessageType msgType)
1811 MSG_LIST_S folderListView = { 0, NULL };
1818 MSG_MESSAGE_TYPE_T msgTypePlatform;
1819 if (SMS == msgType) {
1820 msgTypePlatform = MSG_TYPE_SMS;
1821 } else if (MMS == msgType) {
1822 msgTypePlatform = MSG_TYPE_MMS;
1824 LogError("no supported message type in this method");
1825 Throw(WrtDeviceApis::Commons::PlatformException);
1828 msg_folder_id_t msgFolderId;
1831 msgFolderId = MSG_INBOX_ID;
1834 msgFolderId = MSG_OUTBOX_ID;
1837 msgFolderId = MSG_SENTBOX_ID;
1840 msgFolderId = MSG_DRAFT_ID;
1843 LogError("wrong folder type");
1844 Throw(WrtDeviceApis::Commons::PlatformException);
1848 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
1849 if (msg_get_folder_view_list(MsgGetCommonHandle(), msgFolderId,
1851 &folderListView) != MSG_SUCCESS) {
1853 "msg_get_folder_view_list empty or failed, msgFolderId=" <<
1855 Throw(WrtDeviceApis::Commons::PlatformException);
1857 // go thtough all message to check type of message
1858 LogDebug("msgCount=" << (int) folderListView.nCount);
1859 for (int msg_cnt = 0; msg_cnt < folderListView.nCount; msg_cnt++) {
1860 LogDebug("msgMainType=" <<
1861 (int) msg_get_message_type(folderListView.
1864 ", searching for = " << (int) msgTypePlatform);
1865 if (msgTypePlatform ==
1866 msg_get_message_type(folderListView.msgInfo[
1868 if (msg_is_read(folderListView.msgInfo[msg_cnt]))
1876 msg_release_list_struct(&folderListView);
1878 LogDebug("readed=" << *read << ", unReaded=" << *unread);
1881 Catch(WrtDeviceApis::Commons::PlatformException) {
1882 if (folderListView.nCount) {
1883 msg_release_list_struct(&folderListView);
1889 vector<IMessagePtr> Messaging::findSms(FolderType folder, const DeviceAPI::Tizen::FilterPtr& filter)
1893 vector<IMessagePtr> retVal;
1894 msg_message_t msg = msg_new_message();
1895 MSG_LIST_S folder_list_view = {0, NULL};
1898 const MSG_SORT_RULE_S sort_rules = {MSG_SORT_BY_DISPLAY_TIME, true};
1899 msg_error_t res = MSG_ERR_UNKNOWN;
1900 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
1901 res = msg_get_folder_view_list(MsgGetCommonHandle(), platformFolder, &sort_rules, &folder_list_view);
1903 if (MSG_SUCCESS != res) {
1904 LogError("msg_get_folder_view_list failed " << res);
1905 Throw(WrtDeviceApis::Commons::PlatformException);
1908 for (int i = 0; i < folder_list_view.nCount; i++) {
1909 if (MSG_TYPE_SMS == msg_get_message_type(folder_list_view.msgInfo[i])) {
1910 int l_msgId = msg_get_message_id(folder_list_view.msgInfo[i]);
1911 IMessagePtr msg = MessageFactory::createMessage(SMS, l_msgId);
1913 // if (!filter || !filter->isValid() ||
1914 // filter->compare(MessageFactory::convertToSms(msg))) {
1915 retVal.push_back(msg);
1920 msg_release_list_struct(&folder_list_view);
1921 }Catch(WrtDeviceApis::Commons::PlatformException) {
1922 LogError("Problem with message creation, cleaning");
1923 if (folder_list_view.nCount) {
1924 msg_release_list_struct(&folder_list_view);
1927 msg_release_message(&msg);
1936 vector<IMessagePtr> Messaging::findMms(FolderType folder,
1937 const DeviceAPI::Tizen::FilterPtr& filter)
1939 vector<IMessagePtr> retVal;
1940 msg_message_t msg = msg_new_message();
1941 MSG_LIST_S folder_list_view = {0, NULL};
1945 const MSG_SORT_RULE_S sort_rules = {MSG_SORT_BY_DISPLAY_TIME, true};
1946 msg_error_t res = MSG_ERR_UNKNOWN;
1947 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
1948 res = msg_get_folder_view_list(
1949 MsgGetCommonHandle(), platformFolder, &sort_rules,
1952 if (MSG_SUCCESS != res) {
1953 LogError("msg_Get_folder_view_list failed" << res);
1954 Throw(WrtDeviceApis::Commons::PlatformException);
1957 for (int i = 0; i < folder_list_view.nCount; i++) {
1959 msg_get_message_type(folder_list_view.
1961 int l_msgId = msg_get_message_id(
1962 folder_list_view.msgInfo[i]);
1963 IMessagePtr msg = MessageFactory::createMessage(MMS, l_msgId);
1967 msg_release_list_struct(&folder_list_view);
1970 Catch(WrtDeviceApis::Commons::PlatformException) {
1971 LogError("Problem with message creation, cleaning");
1972 if (folder_list_view.nCount) {
1973 msg_release_list_struct(&folder_list_view);
1976 msg_release_message(&msg);
1984 void Messaging::createFolder(MessageType msgType,
1985 const string& userFolder)
1990 createMsgServiceFolder(userFolder);
1993 createEmailFolder(userFolder);
1996 LogError("msg not supported");
1997 Throw(WrtDeviceApis::Commons::UnknownException);
2001 void Messaging::createMsgServiceFolder(const std::string& userFolder)
2004 if (userFolder.length() > MAX_FOLDER_NAME_SIZE) {
2005 LogError("folder name to long");
2006 Throw(WrtDeviceApis::Commons::PlatformException);
2009 MSG_FOLDER_INFO_S folderInfo;
2011 folderInfo.folderId = 0;
2012 strncpy(folderInfo.folderName, userFolder.c_str(), userFolder.length());
2014 folderInfo.folderType = MSG_FOLDER_TYPE_USER_DEF;
2016 if (msg_add_folder(MsgGetCommonHandle(), &folderInfo) != MSG_SUCCESS) {
2017 LogError("msg_add_folder failed");
2018 Throw(WrtDeviceApis::Commons::PlatformException);
2023 void Messaging::createEmailFolder(const std::string& userFolder)
2027 Throw(WrtDeviceApis::Commons::UnknownException);
2030 void Messaging::deleteFolder(MessageType msgType,
2031 const string& userFolder)
2036 deleteMsgServiceFolder(userFolder);
2039 deleteEmailFolder(userFolder);
2042 LogError("msg not supported");
2043 Throw(WrtDeviceApis::Commons::UnknownException);
2047 void Messaging::deleteMsgServiceFolder(const string& userFolder)
2052 int platformFolderId = convertFolderToPlatform(userFolder);
2054 msg_delete_folder(MsgGetCommonHandle(), platformFolderId)) {
2055 LogError("msg_get_folder_list failed");
2056 Throw(WrtDeviceApis::Commons::PlatformException);
2059 Catch(WrtDeviceApis::Commons::PlatformException) {
2065 void Messaging::deleteEmailFolder(const string& userFolder)
2069 Throw(WrtDeviceApis::Commons::UnknownException);
2072 vector<string> Messaging::getFolderNames(MessageType msgType)
2077 return getFolderNamesMsgService();
2079 return getFolderNamesEmail();
2081 LogError("msg not supported");
2082 Throw(WrtDeviceApis::Commons::UnknownException);
2086 vector<string> Messaging::getFolderNamesMsgService()
2088 vector<string> retVal;
2089 // MSG_FOLDER_LIST_S msgFolderList = { 0, NULL }; // output data
2091 msg_struct_list_s msgFolderList = {0,};
2095 if (msg_get_folder_list(MsgGetCommonHandle(),
2096 &msgFolderList) != MSG_SUCCESS) {
2097 LogError("msg_get_folder_list failed");
2098 Throw(WrtDeviceApis::Commons::PlatformException);
2101 LogDebug("number of folder=" << msgFolderList.nCount);
2102 for (int i = 0; i < msgFolderList.nCount; i++) {
2103 LogDebug("folderName=" << msgFolderList.folderInfo[i].folderName);
2104 LogDebug("folderId=" << (int) msgFolderList.folderInfo[i].folderId);
2107 (int) msgFolderList.folderInfo[i].folderType);
2108 retVal.push_back(msgFolderList.folderInfo[i].folderName);
2110 (void) msg_release_folder_list(&msgFolderList);
2113 Catch(WrtDeviceApis::Commons::PlatformException) {
2114 if (msgFolderList.nCount) {
2115 (void) msg_release_folder_list(&msgFolderList);
2123 vector<string> Messaging::getFolderNamesEmail()
2125 vector<string> retVal;
2128 email_mailbox_t* mailboxes = NULL;
2130 string emailAccountName;
2131 EmailAccountInfo account = getCurrentEmailAccount();
2135 if (!email_get_mailbox_list(account.getIntId(), -1, &mailboxes,
2136 &mailboxesCount) || !mailboxes) {
2137 LogError("error during get mailboxes");
2139 if(mailboxes == NULL)
2141 LogError("error during get mailboxes");
2142 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2143 "Couldn't get mailboxes");
2145 for (int i = 0; i < mailboxesCount; i++) {
2146 retVal.push_back(mailboxes->mailbox_name);
2147 LogDebug("mailbox found, name=" << mailboxes->mailbox_name);
2150 if(mailboxes != NULL)
2152 if( EMAIL_ERROR_NONE != email_free_mailbox( &mailboxes , mailboxesCount) )
2153 LogDebug("fail to email_free_mailbox - err ");
2157 Catch(WrtDeviceApis::Commons::PlatformException) {
2158 // nothing to clean, re-throw exception
2165 vector<IMessagePtr> Messaging::findEmail(const std::string &folder,
2166 const DeviceAPI::Tizen::FilterPtr& filter)
2168 vector<IMessagePtr> retVal;
2170 EmailAccountInfo account = getCurrentEmailAccount();
2171 if (account.getId().empty()) {
2172 LogWarning("No valid email accounts. Skipping");
2176 int accountId = account.getIntId();
2178 // number of found emails
2184 email_mail_list_item_t* results = NULL;
2185 int err = email_get_mail_list(accountId,
2187 EMAIL_LIST_TYPE_NORMAL,
2190 EMAIL_SORT_DATETIME_HIGH,
2193 DPL::ScopedFree<email_mail_list_item_t> autoFree(results);
2195 if (EMAIL_ERROR_MAIL_NOT_FOUND == err || results == NULL) {
2196 LogWarning("No emails found in mailbox: " << folder);
2198 } else if (EMAIL_ERROR_NONE != err) {
2200 "Unable to get mail list for mailbox: " << folder <<
2201 ", Error: " << err);
2202 Throw(WrtDeviceApis::Commons::PlatformException);
2206 for (int i = 0; i < count; ++i) {
2207 IMessagePtr msg = MessageFactory::createMessage(EMAIL, results[i].mail_id);
2211 // || filter->compare(MessageFactory::convertToEmail(msg)) //TODO implemnet compare in filter
2213 retVal.push_back(msg);
2217 startIndex += count;
2219 while (count >= MESSAGE_FIND_LIMIT);
2224 vector<IMessagePtr> Messaging::findEmail(FolderType folder,
2225 const DeviceAPI::Tizen::FilterPtr& filter)
2227 vector<IMessagePtr> result;
2229 EmailAccountInfo account = getCurrentEmailAccount();
2230 if (account.getId().empty()) {
2231 LogWarning("No valid email accounts.");
2237 name = EmailConverter::toMailboxName(folder);
2239 catch (const WrtDeviceApis::Commons::PlatformException& ex) {
2240 LogWarning(ex.DumpToString());
2244 int accountId = account.getIntId();
2248 email_mail_list_item_t* messages = NULL;
2249 int error = email_get_mail_list(accountId,
2251 EMAIL_LIST_TYPE_NORMAL,
2254 EMAIL_SORT_DATETIME_HIGH,
2257 DPL::ScopedFree<email_mail_list_item_t> freeGuard(messages);
2258 if ((EMAIL_ERROR_MAIL_NOT_FOUND == error) || (NULL == messages)) {
2259 LogWarning("No emails found in mailbox: " << name);
2261 } else if (EMAIL_ERROR_NONE != error) {
2262 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2263 "Couldn't get mail list from mailbox: " << name <<
2264 ". [" << error << "]");
2267 for (int i = 0; i < count; ++i) {
2269 MessageFactory::createMessage(EMAIL, messages[i].mail_id);
2271 // ||filter->compare(MessageFactory::convertToEmail(msg)) //TODO implement compare in filter
2273 result.push_back(msg);
2277 startIndex += count;
2279 while (count >= MESSAGE_FIND_LIMIT);
2284 int Messaging::getConversationId(const int& msgId, const MessageType& msgtype)
2292 int index = 0, count = 0;
2293 // char *mailBox = NULL;
2294 email_mail_list_item_t *mailList = NULL;
2295 email_mail_data_t* result = NULL;
2297 LogDebug("Current Account " << m_currentEmailAccountId);
2302 if (EMAIL_ERROR_NONE != email_get_mail_data(msgId, &result)) {
2303 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2304 "Couldn't get conversatino Id " << msgId );
2307 if (email_get_mail_list(m_currentEmailAccountId, result->mailbox_id, EMAIL_LIST_TYPE_NORMAL, 0, MESSAGE_FIND_LIMIT,
2308 EMAIL_SORT_DATETIME_HIGH, &mailList, &count) != EMAIL_ERROR_NONE)
2310 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get email list fail" );
2313 email_free_mail_data(&result,1);
2315 for (index = 0; index < count; index++)
2317 if (mailList[index].mail_id == (int)msgId)
2319 return mailList[index].thread_id;
2322 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "can not find msg" );
2324 catch (const WrtDeviceApis::Commons::Exception& ex)
2328 email_free_mail_data(&result,1);
2329 LogError("Exception: " << ex.GetMessage());
2332 return MSG_ERR_INVALID_MSG_TYPE;
2338 msg_struct_t msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
2339 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
2340 msg_handle_t handle = MsgGetCommonHandle();
2341 msg_error_t err = MSG_SUCCESS;
2343 err = msg_get_message(handle, msgId, msg, sendOpt);
2345 if( err < MSG_SUCCESS )
2347 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2348 "can not find msg id(" << msgId << ")");
2352 err = msg_get_int_value(msg, MSG_MESSAGE_THREAD_ID_INT, &threadId);
2356 if( err < MSG_SUCCESS )
2358 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2359 "can not find thread with msg id(" << msgId << ")");
2361 msg_release_struct(&msg);
2362 msg_release_struct(&sendOpt);
2368 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2369 "Wrong Type (" << msgId << ")");
2370 return MSG_ERR_INVALID_MSG_TYPE;
2375 std::vector<IConversationPtr> Messaging::queryConversations(const DeviceAPI::Tizen::SortModePtr& sortMode,
2376 const DeviceAPI::Tizen::FilterPtr& filter, long limit, long offset)
2380 std::vector<IConversationPtr> result;
2381 std::string filterSql;
2382 std::string orderLimitSql ="";
2384 ConversationQueryGeneratorPtr queryGenerator(new ConversationQueryGenerator(sortMode, limit, offset));
2385 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2386 filter->travel(filterVisitor, 0);
2388 LogDebug("filterSql:[" << filterSql <<"]");
2390 int conversationType = queryGenerator->getMessageType();
2391 switch(conversationType){
2393 LogDebug("type is EMAIL:[" << conversationType <<"]");
2394 queryGenerator->reset(MessageQueryGenerator::MODE_EMAIL);
2395 filter->travel(filterVisitor, 0);
2396 filterSql = queryGenerator->getQuery();
2397 result = queryEmailConversation(filterSql);
2402 LogDebug("type is SMS:[" << conversationType <<"]");
2403 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
2404 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2405 filter->travel(filterVisitor, 0);
2406 filterSql = queryGenerator->getQuery();
2407 LogDebug("filterSql:[" << filterSql <<"]");
2408 LogDebug("orderLimitSql:[" << orderLimitSql <<"]");
2409 result = querySmsMmsConversation(filterSql, orderLimitSql);
2414 LogDebug("type is MMS:[" << conversationType <<"]");
2415 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
2416 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2417 filter->travel(filterVisitor, 0);
2418 filterSql = queryGenerator->getQuery();
2419 LogDebug("filterSql:[" << filterSql <<"]");
2420 LogDebug("orderLimitSql:[" << orderLimitSql <<"]");
2421 result = querySmsMmsConversation(filterSql, orderLimitSql);
2426 LogError("[ERROR] >>> invlid type:[" << conversationType <<"]");
2434 std::vector<IConversationPtr> Messaging::queryConversations(const DeviceAPI::Tizen::FilterPtr& filter,
2435 const DeviceAPI::Tizen::SortModePtr& sortMode, int type, long limit, long offset)
2439 std::vector<IConversationPtr> result;
2440 std::string filterSql;
2441 std::string orderLimitSql ="";
2443 ConversationQueryGeneratorPtr queryGenerator(new ConversationQueryGenerator(sortMode, limit, offset, type));
2444 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2445 filter->travel(filterVisitor, 0);
2447 LogDebug("filterSql:[" << filterSql <<"]");
2448 int conversationType = queryGenerator->getMessageType();
2449 if(conversationType != -1)
2451 if(conversationType != type)
2453 LogDebug("filter conversationType and service msg type is diff");
2454 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
2459 LogDebug("type is EMAIL:[" << conversationType <<"]");
2460 queryGenerator->reset(MessageQueryGenerator::MODE_EMAIL);
2461 filter->travel(filterVisitor, 0);
2462 filterSql = queryGenerator->getQuery();
2463 LogDebug("filterSql:[" << filterSql <<"]");
2464 result = queryEmailConversation(filterSql);
2469 LogDebug("type is SMS:[" << conversationType <<"]");
2470 queryGenerator->reset(MessageQueryGenerator::MODE_SMS);
2471 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2472 filter->travel(filterVisitor, 0);
2473 filterSql = queryGenerator->getQuery();
2474 orderLimitSql = queryGenerator->getOrderLimit();
2475 LogDebug("filterSql:[" << filterSql <<"]");
2476 LogDebug("orderLimitSql:[" << orderLimitSql <<"]");
2477 result = querySmsMmsConversation(filterSql, orderLimitSql);
2482 LogDebug("type is MMS:[" << conversationType <<"]");
2483 queryGenerator->reset(MessageQueryGenerator::MODE_MMS);
2484 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2485 filter->travel(filterVisitor, 0);
2486 filterSql = queryGenerator->getQuery();
2487 orderLimitSql = queryGenerator->getOrderLimit();
2488 LogDebug("filterSql:[" << filterSql <<"]");
2489 LogDebug("orderLimitSql:[" << orderLimitSql <<"]");
2490 result = querySmsMmsConversation(filterSql, orderLimitSql);
2495 LogError("[ERROR] >>> invlid type:[" << conversationType <<"]");
2503 bool Messaging::deleteConversations(const DeviceAPI::Tizen::SortModePtr& sortMode, const DeviceAPI::Tizen::FilterPtr& filter)
2507 std::vector<IConversationPtr> conversationsToDelete = queryConversations(sortMode, filter);
2508 return deleteConversations(conversationsToDelete);
2511 bool Messaging::deleteConversations(const std::vector<IConversationPtr>& conversations)
2515 if (conversations.size() == 0)
2518 if (conversations[0]->getType() == EMAIL)
2520 LogDebug("Enter-Email");
2523 for (std::size_t i = 0; i < conversations.size(); ++i)
2525 threadId = conversations[i]->getConvId();
2527 if (email_delete_thread(threadId, false) != EMAIL_ERROR_NONE)
2535 LogDebug("Enter-Msg");
2536 msg_thread_id_t threadId = 0;
2537 msg_handle_t handle = MsgGetCommonHandle();
2539 for (std::size_t i = 0; i < conversations.size(); ++i)
2541 threadId = conversations[i]->getConvId();
2542 if (msg_delete_thread_message_list(handle, threadId, FALSE) != MSG_SUCCESS)
2551 std::vector<IMessageFolderPtr> Messaging::queryFolders(const DeviceAPI::Tizen::FilterPtr& filter)
2555 email_mailbox_t* mailboxes = NULL;
2556 email_mailbox_t* mailboxes_org = NULL;
2557 email_mailbox_t m_mailboxes;
2561 std::vector<IMessageFolderPtr> result;
2562 std::string folderName;
2565 EmailAccountInfo account = getCurrentEmailAccount();
2567 if (account.getId().empty()) {
2568 LogWarning("No valid email accounts. Skipping");
2572 const vector<EmailAccountInfo> accounts = getEmailAccounts();
2574 FolderQueryGeneratorPtr queryGenerator(new FolderQueryGenerator());
2576 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2577 queryGenerator->reset();
2578 filter->travel(filterVisitor, 0);
2579 accountId = queryGenerator->getAccountId();
2583 LogWarning("No valid email accounts. accountId : 0");
2587 if(queryGenerator->isFolderPathExist() == 1){
2589 folderName = queryGenerator->getFolderPath();
2591 if(email_get_mailbox_by_name(accountId, folderName.c_str(), &mailboxes) != 1)
2593 LogError("error during get mailboxes");
2597 m_mailboxes = *mailboxes;
2598 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
2599 result.push_back(folderPtr);
2603 if (!email_get_mailbox_list(accountId, -1, &mailboxes, &mailboxesCount) || !mailboxes)
2605 LogError("error during get mailboxes");
2609 mailboxes_org = mailboxes;
2611 if (mailboxesCount <= 0)
2613 LogDebug("Empty...");
2617 LogDebug("found mailboxs : " << mailboxesCount);
2618 for (int i = 0; i < mailboxesCount; i++)
2621 m_mailboxes = *mailboxes;
2622 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
2623 result.push_back(folderPtr);
2628 mailboxes = mailboxes_org;
2630 if(mailboxes != NULL)
2632 error = email_free_mailbox(&mailboxes,mailboxesCount);
2633 LogError("email_free_mailbox : " << error);