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/scoped_free.h>
24 #include "Messaging.h"
27 #include "BinarySms.h"
29 #include "EmailConverter.h"
31 #include "StorageChangesMessageFilterValidatorFactory.h"
32 #include "StorageChangesConversationFilterValidatorFactory.h"
33 #include "StorageChangesFolderFilterValidatorFactory.h"
34 #include "MessageQueryGenerator.h"
35 #include "ConversationQueryGenerator.h"
36 #include "FolderQueryGenerator.h"
37 #include "messageDB/MessageStorageReader.h"
40 #include <msg_storage.h>
42 #include <msg_transport.h>
45 #include <Commons/ThreadPool.h>
46 #include "Conversation.h"
47 #include "MessageFolder.h"
48 #include <dpl/singleton_safe_impl.h>
51 IMPLEMENT_SAFE_SINGLETON(DeviceAPI::Messaging::MsgServiceHandle)
54 #define LOG_ENTER LoggerD("---> ENTER");
55 #define LOG_EXIT LoggerD("---> EXIT");
59 using namespace DeviceAPI::Tizen;
60 using namespace WrtDeviceApis::Commons;
63 const char* DBUS_INTERFACE_EMAIL_RECEIVED = "User.Email.StorageChange";
64 const char* DBUS_FILTER_EMAIL_RECEIVED =
65 "type='signal',interface='User.Email.StorageChange'";
67 const int MESSAGE_FIND_LIMIT = 100;
73 int Messaging::m_currentEmailAccountId = 0;
74 DPL::Atomic Messaging::m_objCounter;
76 Messaging& Messaging::getInstance()
78 static Messaging instance;
82 Messaging::Messaging() :
83 m_onMessageReceivedHandleMgr(NULL),
84 m_dbusConnection(new DBus::Connection()),
85 m_dbusWorkerThread(new DPL::Thread())
89 const vector<EmailAccountInfo> accounts = getEmailAccounts();
90 LoggerD("Number of emails account=" << accounts.size());
91 if (accounts.size() > 0) {
92 // set default email account - first from the list
93 setCurrentEmailAccount(accounts[0]);
95 LoggerE("no default email account set");
99 Catch(WrtDeviceApis::Commons::PlatformException) {
100 LoggerE("No email accounts available");
103 Catch(WrtDeviceApis::Commons::InvalidArgumentException) {
104 LoggerE("No email accounts available");
105 //current email not configured, skipped
108 Catch(WrtDeviceApis::Commons::UnknownException) {
109 LoggerE("unknown error");
112 // Begin service for email management ?? pmi question if it should be added before email actions
113 if (0 == m_objCounter) {
114 int error = email_service_begin();
115 if (EMAIL_ERROR_NONE != error) {
116 LoggerE("email_service_begin() returned error " << error);
118 LoggerI("email_service_begin() executed without error");
123 m_dbusWorkerThread->Run();
124 m_dbusConnection->setWorkerThread(m_dbusWorkerThread);
125 m_dbusConnection->addFilter(DBUS_FILTER_EMAIL_RECEIVED);
126 m_dbusConnection->AddListener(this);
129 Messaging::~Messaging()
131 // Endservice for email management
132 m_dbusConnection->RemoveListener(this);
133 // m_dbusConnection->setWorkerThread(NULL);
134 m_dbusWorkerThread->Quit();
135 delete m_dbusWorkerThread;
137 if (!--m_objCounter) {
138 int error = email_service_end();
139 if (EMAIL_ERROR_NONE != error) {
140 LoggerE("email_service_end() returned error " << error);
142 LoggerD("email_service_end() executed without error");
148 void Messaging::getNumberOfMessages(MessageType msgType,
153 if (NULL == readed ||
155 LoggerE("output pointers are NULL");
156 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
160 if (SMS == msgType) {
161 getNumberOfSms(folder, readed, unReaded);
162 } else if (MMS == msgType) {
163 getNumberOfMms(folder, readed, unReaded);
164 } else if (EMAIL == msgType) {
165 getNumberOfEmails(folder, readed, unReaded);
167 LoggerE("wrong message type");
168 Throw(WrtDeviceApis::Commons::PlatformException);
172 vector<IMessagePtr> Messaging::findMessages(const vector<MessageType>& msgTypes,
173 const string &folder,
174 const DeviceAPI::Tizen::FilterPtr& filter)
177 vector<IMessagePtr> retVal;
178 back_insert_iterator< vector<IMessagePtr> > biit(retVal);
179 vector<MessageType>::const_iterator it = msgTypes.begin();
180 for (; it != msgTypes.end(); ++it) {
181 LoggerD("Finding messages (" << *it << ") in folder: " << folder);
182 vector<IMessagePtr> result;
187 FolderType folderEnum = Sms::toFolder(folder);
188 result = findSms(folderEnum, filter);
193 FolderType folderEnum = Mms::toFolder(folder);
194 result = findMms(folderEnum, filter);
199 result = findEmail(folder, filter);
203 LoggerE("message type unknown");
204 Throw(WrtDeviceApis::Commons::PlatformException);
206 LoggerD("Found: " << result.size());
207 copy(result.begin(), result.end(), biit);
213 std::string Messaging::generateFilterSql(const DeviceAPI::Tizen::FilterPtr& filter){
215 std::string filterSql;
217 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator());
218 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
219 filter->travel(filterVisitor, 0);
220 filterSql = queryGenerator->getQuery();
222 LoggerD(">>> filterSql:[" << filterSql << "]");
227 vector<IMessagePtr> Messaging::findMessages(const vector<MessageType>& msgTypes, FolderType folder,
228 const DeviceAPI::Tizen::FilterPtr& filter)
231 vector<IMessagePtr> retVal;
232 back_insert_iterator< vector<IMessagePtr> > biit(retVal);
234 std::string filterSql = generateFilterSql(filter);
238 vector<MessageType>::const_iterator it = msgTypes.begin();
239 for (; it != msgTypes.end(); ++it) {
240 LoggerD("Finding messages (" << *it << ") in folder: " << folder);
241 vector<IMessagePtr>(Messaging::*findFnPtr)(FolderType folder, const DeviceAPI::Tizen::FilterPtr& filter) = NULL;
246 findFnPtr = &Messaging::findSms;
251 findFnPtr = &Messaging::findMms;
256 findFnPtr = &Messaging::findEmail;
260 LoggerE("message type unknown");
261 Throw(WrtDeviceApis::Commons::PlatformException);
264 vector<IMessagePtr> result = (this->*findFnPtr)(folder, filter);
265 LoggerD("Found: " << result.size());
266 copy(result.begin(), result.end(), biit);
272 void Messaging::printErrorMessage(int errorCode){
274 case EMAIL_ERROR_MAIL_NOT_FOUND:{
275 LoggerD("EMAIL_ERROR_MAIL_NOT_FOUND");
278 case EMAIL_ERROR_DB_FAILURE:{
279 LoggerD("EMAIL_ERROR_DB_FAILURE");
283 LoggerD("other error message:" << errorCode);
288 vector<IMessagePtr> Messaging::createVectorFromeMessageList(const msg_struct_list_s &message_list){
289 // vector<IMessagePtr> Messaging::createVectorFromeMessageList(const msg_struct_list_s message_list){
292 vector<IMessagePtr> retVal;
295 MessageType webApiMsgType;
297 LoggerD("message_list.nCount:" << message_list.nCount);
298 for (int i = 0; i < message_list.nCount; i++) {
299 int err = msg_get_int_value(message_list.msg_struct_info[i], MSG_MESSAGE_TYPE_INT, &tempInt);
300 if(err != MSG_SUCCESS)
302 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "get message type fail");
304 LoggerD("Message type : " << tempInt);
316 LoggerE("[ERROR]invalid message type:" << tempInt);
321 // int l_msgId = msg_get_message_id(message_list.msgInfo[i]);
322 err = msg_get_int_value(message_list.msg_struct_info[i], MSG_MESSAGE_ID_INT, &tempInt);
323 LoggerD("Message Id : " << tempInt);
324 if(err != MSG_SUCCESS)
326 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "get message id fail");
330 msg = MessageFactory::createMessage(webApiMsgType, tempInt);
331 retVal.push_back(msg);
338 std::vector<IConversationPtr> Messaging::createVectorFromeThreadViewList(const msg_struct_list_s& threadViewList){
339 vector<IConversationPtr> recVec;
341 if (threadViewList.nCount <= 0) {
344 for (int i = 0; i < threadViewList.nCount; i++) {
345 // IConversationPtr convPtr(new Conversation(i));
346 IConversationPtr convPtr(new Conversation(threadViewList.msg_struct_info[i]));
348 recVec.push_back(convPtr);
355 vector<IMessagePtr> Messaging::querySmsMmsMessages(const std::string& queryString){
356 LoggerD("<<< queryString:[" << queryString <<"]");
358 vector<IMessagePtr> retVal;
359 std::string tempString = "";
360 // MSG_LIST_S message_list = {0, NULL};
361 msg_struct_list_s message_list = {0,};
362 MessageStorageReader reader;
365 msg_error_t res = MSG_ERR_UNKNOWN;
367 reader.MsgStoConnectDB();
368 res = reader.queryMessage(queryString, tempString, &message_list);
370 if (MSG_SUCCESS != res) {
371 LoggerE("msg_get_folder_view_list failed " << res);
372 Throw(WrtDeviceApis::Commons::PlatformException);
374 reader.MsgStoDisconnectDB();
376 retVal = createVectorFromeMessageList(message_list);
377 reader.msg_release_list_struct_private(&message_list);
378 }Catch(WrtDeviceApis::Commons::PlatformException) {
379 LoggerE("Problem with message creation, cleaning");
380 if (message_list.nCount) {
381 reader.msg_release_list_struct_private(&message_list);
390 vector<IMessagePtr> Messaging::querySmsMmsMessages(const std::string& queryString, const std::string& orderLimitString){
391 LoggerD("<<< queryString:[" << queryString <<"]");
392 LoggerD("<<< orderLimitString:[" << orderLimitString <<"]");
394 vector<IMessagePtr> retVal;
395 // MSG_LIST_S message_list = {0, NULL};
396 msg_struct_list_s message_list = {0,};
397 MessageStorageReader reader;
400 msg_error_t res = MSG_ERR_UNKNOWN;
402 reader.MsgStoConnectDB();
403 res = reader.queryMessage(queryString, orderLimitString, &message_list);
405 if (MSG_SUCCESS != res) {
406 LoggerE("msg_get_folder_view_list failed " << res);
407 Throw(WrtDeviceApis::Commons::PlatformException);
409 reader.MsgStoDisconnectDB();
411 retVal = createVectorFromeMessageList(message_list);
412 LoggerD("<<< message_list.nCount:[" << message_list.nCount <<"]");
414 reader.msg_release_list_struct_private(&message_list);
415 }Catch(WrtDeviceApis::Commons::PlatformException) {
416 LoggerE("Problem with message creation, cleaning");
417 if (message_list.nCount) {
418 reader.msg_release_list_struct_private(&message_list);
427 vector<IConversationPtr> Messaging::querySmsMmsConversation(const std::string& sqlWhereClause, const std::string& orderLimitString){
428 LoggerD("sqlWhereClause:[" << sqlWhereClause << "]");
429 LoggerD("<<< orderLimitString:[" << orderLimitString <<"]");
431 std::vector<IConversationPtr> recVec;
432 // MSG_THREAD_VIEW_LIST_S threadViewList;
433 msg_struct_list_s threadViewList;
435 msg_error_t res = MSG_ERR_UNKNOWN;
437 MessageStorageReader reader;
438 reader.MsgStoConnectDB();
439 res = reader.queryConversation(sqlWhereClause, orderLimitString, &threadViewList);
441 if (MSG_SUCCESS != res) {
442 LoggerE("queryConversation failed:" << res);
443 Throw(WrtDeviceApis::Commons::PlatformException);
445 reader.MsgStoDisconnectDB();
447 recVec = createVectorFromeThreadViewList(threadViewList);
449 reader.msg_release_list_struct_private(&threadViewList);
455 vector<IConversationPtr> Messaging::queryEmailConversation(const std::string& sqlWhereClause){
456 LoggerD("sqlWhereClause:[" << sqlWhereClause << "]");
458 std::vector<IConversationPtr> emailResultVector;
459 email_mail_list_item_t* mailList = NULL;
460 int mailListCount = 0;
462 errCode = email_query_mail_list(const_cast<char*>(sqlWhereClause.c_str()), &mailList, &mailListCount);
464 if(errCode != EMAIL_ERROR_NONE){
465 LoggerE("[ERROR]email_query_mail_list failed:" << errCode);
466 printErrorMessage(errCode);
468 LoggerD("message found mailListCount:" << mailListCount);
469 std::map<int, int> checkUnique;
471 for(int i=0; i<mailListCount; i++){
472 if (checkUnique.find(mailList[i].thread_id) == checkUnique.end()){
473 checkUnique[mailList[i].thread_id] = mailList[i].thread_id;
474 IConversationPtr convPtr(new Conversation(mailList[i].thread_id, EMAIL));
477 LoggerD("mailList[i].thread_id:[" << mailList[i].thread_id << "]");
478 LoggerD("mailList[i].full_address_from:[" << mailList[i].full_address_from << "]");
479 LoggerD("mailList[i].email_address_sender : [" << mailList[i].email_address_sender <<"]");
480 LoggerD("mailList[i].subject:[" << mailList[i].subject << "]");
481 LoggerD("mailList[i].preview_text:[" << mailList[i].preview_text << "]");
482 LoggerD("mailList[i].flags_seen_field:[" << mailList[i].flags_seen_field << "]");
483 LoggerD("mailList[i].priority:[" << mailList[i].priority<< "]");
485 if (convPtr->getResult() == true)
487 emailResultVector.push_back(convPtr);
493 if (mailList != NULL){
498 return emailResultVector;
501 vector<IMessagePtr> Messaging::queryEmailMessage(const std::string& sqlWhereClause){
502 LoggerD("sqlWhereClause:[" << sqlWhereClause << "]");
504 vector<IMessagePtr> emailResultVector;
506 email_mail_list_item_t* mailList = NULL;
507 int mailListCount = 0;
509 errCode = email_query_mail_list(const_cast<char*>(sqlWhereClause.c_str()), &mailList, &mailListCount);
511 if(errCode != EMAIL_ERROR_NONE){
512 LoggerE("[ERROR]email_query_mail_list failed:" << errCode);
513 printErrorMessage(errCode);
515 LoggerD("message found mailListCount:" << mailListCount);
517 for(int i=0; i<mailListCount; i++){
518 //IMessagePtr msg = MessageFactory::createMessage(EMAIL, mailList[i].mail_id);
519 IMessagePtr msg = MessageFactory::createEmailMessage(mailList[i].account_id, mailList[i].mail_id);
522 LoggerD("mailList[i].full_address_from:[" << mailList[i].full_address_from << "]");
523 LoggerD("mailList[i].email_address_sender : [" << mailList[i].email_address_sender <<"]");
524 //LoggerD("mailList[i].datetime:[" << mailList[i].datetime << "]");
525 LoggerD("mailList[i].subject:[" << mailList[i].subject << "]");
526 // LoggerD("mailList[i].mailbox_name:[" << mailList[i].mailbox_name << "]");
527 LoggerD("mailList[i].preview_text:[" << mailList[i].preview_text << "]");
528 LoggerD("mailList[i].flags_seen_field:[" << mailList[i].flags_seen_field << "]");
529 LoggerD("mailList[i].priority:[" << mailList[i].priority<< "]");
531 emailResultVector.push_back(msg);
535 if (mailList != NULL) {
540 return emailResultVector;
543 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter){
546 vector<IMessagePtr> retVal;
547 std::string filterSql;
549 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator());
551 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
552 filter->travel(filterVisitor, 0);
553 filterSql = queryGenerator->getQuery();
554 LoggerD("filterSql:[" << filterSql <<"]");
556 int messageType = queryGenerator->getMessageType();
559 LoggerD("message type is EMAIL:[" << messageType <<"]");
560 retVal = queryEmailMessage(filterSql);
565 LoggerD("message type is SMS or MMS:[" << messageType <<"]");
566 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
567 filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
568 filter->travel(filterVisitor);
569 filterSql = queryGenerator->getQuery();
570 retVal = querySmsMmsMessages(filterSql);
574 LoggerE("[ERROR] >>> invlid message type:[" << messageType <<"]");
584 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter, const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset)
588 vector<IMessagePtr> retVal;
589 std::string filterSql;
591 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator(sortMode, limit, offset));
593 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
594 filter->travel(filterVisitor, 0);
595 filterSql = queryGenerator->getQuery();
596 LoggerD("filterSql:[" << filterSql <<"]");
598 int messageType = queryGenerator->getMessageType();
601 LoggerD("message type is EMAIL:[" << messageType <<"]");
602 retVal = queryEmailMessage(filterSql);
607 LoggerD("message type is SMS or MMS:[" << messageType <<"]");
608 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
609 filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
610 filter->travel(filterVisitor);
611 filterSql = queryGenerator->getQuery();
612 retVal = querySmsMmsMessages(filterSql);
616 MsgLoggerE("[ERROR] >>> invlid message type:[" << messageType <<"]");
624 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter, const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset, const int type)
628 vector<IMessagePtr> retVal;
629 std::string filterSql;
630 std::string orderLimitSql ="";
631 std::string emailFilterSql;
632 std::string typeAndString = "AND A.MAIN_TYPE=";
633 std::string typeString = "A.MAIN_TYPE=";
635 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator(sortMode, limit, offset, type));
637 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
638 filter->travel(filterVisitor, 0);
639 filterSql = queryGenerator->getQuery();
640 orderLimitSql = queryGenerator->getOrderLimit();
641 LoggerD("filterSql:[" << filterSql <<"]");
642 LoggerD("orderLimitSql:[" << orderLimitSql <<"]");
644 int messageType = queryGenerator->getMessageType();
645 if(messageType != -1)
647 if(messageType != type)
649 LoggerD("filter messageType and service msg type is diff");
650 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
655 LoggerD("message type is EMAIL:[" << messageType <<"]");
656 emailFilterSql = filterSql + orderLimitSql;
657 LoggerD("filterSql:[" << emailFilterSql <<"]");
658 retVal = queryEmailMessage(emailFilterSql);
662 LoggerD("message type is SMS :[" << messageType <<"]");
663 typeString.append("1");
664 typeAndString.append("1");
665 if(filterSql.length() == 0)
667 filterSql.append(typeString);
668 LoggerD("filterSql:[" << filterSql <<"]");
672 filterSql.append(typeAndString);
673 LoggerD("filterSql:[" << filterSql <<"]");
675 LoggerD("filterSql:[" << filterSql <<"]");
676 LoggerD("orderLimitSql.length():[" << orderLimitSql.length() <<"]");
677 retVal = querySmsMmsMessages(filterSql, orderLimitSql);
678 LoggerD("filterSql:[" << filterSql <<"]");
681 LoggerD("message type is MMS:[" << messageType <<"]");
682 typeString.append("2");
683 typeAndString.append("2");
684 if(filterSql.length() == 0)
686 filterSql.append(typeString);
687 LoggerD("filterSql:[" << filterSql <<"]");
691 filterSql.append(typeAndString);
692 LoggerD("filterSql:[" << filterSql <<"]");
694 LoggerD("filterSql:[" << filterSql <<"]");
695 LoggerD("orderLimitSql.length():[" << orderLimitSql.length() <<"]");
696 retVal = querySmsMmsMessages(filterSql, orderLimitSql);
697 LoggerD("filterSql:[" << filterSql <<"]");
701 MsgLoggerE("[ERROR] >>> invlid message type:[" << messageType <<"]");
710 vector<string> Messaging::getMessageIds(MessageType msgType,
715 return getSmsIds(folder);
717 return getMmsIds(folder);
719 return getEmailIds(folder);
721 LoggerE("not supported message type");
722 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
726 vector<string> Messaging::getSmsIds(FolderType folder)
728 vector<string> retVal;
729 msg_message_t msg = msg_new_message();
730 MSG_LIST_S folder_list_view = { 0, NULL };
734 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
735 msg_error_t res = MSG_ERR_UNKNOWN;
736 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
737 res = msg_get_folder_view_list(
738 MsgGetCommonHandle(), platformFolder, &sort_rules,
741 if (MSG_SUCCESS != res) {
742 LoggerE("msg_Get_folder_view_list failed" << res);
743 Throw(WrtDeviceApis::Commons::PlatformException);
746 for (int i = 0; i < folder_list_view.nCount; i++) {
748 msg_get_message_type(folder_list_view.
750 int l_msgId = msg_get_message_id(
751 folder_list_view.msgInfo[i]);
752 ostringstream stream;
754 retVal.push_back(stream.str());
758 msg_release_list_struct(&folder_list_view);
761 Catch(WrtDeviceApis::Commons::PlatformException) {
762 LoggerE("Problem with message creation, cleaning");
763 if (folder_list_view.nCount) {
764 msg_release_list_struct(&folder_list_view);
767 msg_release_message(&msg);
775 vector<string> Messaging::getMmsIds(FolderType folder)
777 vector<string> retVal;
778 msg_message_t msg = msg_new_message();
779 MSG_LIST_S folder_list_view = { 0, NULL };
783 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
784 msg_error_t res = MSG_ERR_UNKNOWN;
785 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
786 res = msg_get_folder_view_list(
787 MsgGetCommonHandle(), platformFolder, &sort_rules,
790 if (MSG_SUCCESS != res) {
791 LoggerE("msg_Get_folder_view_list failed" << res);
792 Throw(WrtDeviceApis::Commons::PlatformException);
795 for (int i = 0; i < folder_list_view.nCount; i++) {
797 msg_get_message_type(folder_list_view.
799 int l_msgId = msg_get_message_id(
800 folder_list_view.msgInfo[i]);
801 ostringstream stream;
803 retVal.push_back(stream.str());
807 msg_release_list_struct(&folder_list_view);
810 Catch(WrtDeviceApis::Commons::PlatformException) {
811 LoggerE("Problem with message creation, cleaning");
812 if (folder_list_view.nCount) {
813 msg_release_list_struct(&folder_list_view);
816 msg_release_message(&msg);
824 vector<string> Messaging::getEmailIds(FolderType folder)
826 vector<string> retVal;
830 Throw(WrtDeviceApis::Commons::UnknownException);
835 vector<EmailAccountInfo> Messaging::getEmailAccounts() const
838 email_account_t* accounts = NULL;
841 if (!email_get_account_list(&accounts, &count)) {
842 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Couldn't get e-mail accounts.");
845 LoggerE( "count : " << count);
848 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "No e-mail account found.");
851 vector<EmailAccountInfo> result;
852 for (int i = 0; i < count; ++i)
854 if(accounts[i].incoming_server_user_name != NULL)
856 LoggerE("server user name is NULL");
857 EmailAccountInfo account(accounts[i].account_id,
858 accounts[i].incoming_server_user_name,
859 accounts[i].user_email_address);
860 result.push_back(account);
864 LoggerE("normal case");
865 std::string Unknown = "UNKNOWN";
866 EmailAccountInfo account(accounts[i].account_id,
868 accounts[i].user_email_address);
869 result.push_back(account);
873 if (accounts != NULL) {
874 email_free_account(&accounts, count);
879 Catch(WrtDeviceApis::Commons::PlatformException) {
880 if (accounts != NULL) {
881 email_free_account(&accounts, count);
883 LoggerE("PlatformException");
884 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "No e-mail account found.");
886 Catch(WrtDeviceApis::Commons::UnknownException) {
887 if (accounts != NULL) {
888 email_free_account(&accounts, count);
890 LoggerE("UnknownException");
891 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Couldn't convert e-mail account id");
895 int Messaging::getEmailAccountId(const std::string& account)
898 string tmpAccount = account;
899 email_account_t *pAccountArray = NULL;
904 if (account.empty()) {
905 tmpAccount = getCurrentEmailAccount().getAddress();
906 if (tmpAccount.empty()) {
908 "current email account is not set, possible that no account created");
909 Throw(WrtDeviceApis::Commons::PlatformException);
913 if (!email_get_account_list(&pAccountArray, &iCount)) {
914 LoggerE("email_get_account_list error");
915 Throw(WrtDeviceApis::Commons::PlatformException);
919 LoggerE("no email account exist");
920 Throw(WrtDeviceApis::Commons::PlatformException);
923 for (int i = 0; i < iCount; i++) {
924 string tmp = pAccountArray[i].user_email_address;
925 if (tmp == tmpAccount) {
926 m_currentEmailAccountId = pAccountArray[i].account_id;
927 retVal = m_currentEmailAccountId;
932 if (0 == m_currentEmailAccountId) {
933 LoggerE("wrong email account ID");
934 Throw(WrtDeviceApis::Commons::PlatformException);
937 if (pAccountArray != NULL) {
938 LoggerD("free account, ptr=" << pAccountArray);
939 email_free_account(&pAccountArray, iCount);
943 LoggerE("no email account created");
944 Throw(WrtDeviceApis::Commons::PlatformException);
948 Catch(WrtDeviceApis::Commons::PlatformException) {
949 LoggerE("exception catch, platform exception");
950 if (pAccountArray != NULL) {
951 email_free_account(&pAccountArray, iCount);
959 void Messaging::fetchEmailHeaders()
962 email_mailbox_t *mailbox = NULL;
965 mailbox = static_cast<email_mailbox_t*>(calloc(sizeof (email_mailbox_t), 1));
967 LoggerE("calloc failed");
970 mailbox->account_id = m_currentEmailAccountId;
971 mailbox->mailbox_name = strdup(EMAIL_INBOX_NAME);
972 // if (EMAIL_ERROR_NONE != email_sync_header(mailbox, &handle)) {
973 if (EMAIL_ERROR_NONE != email_sync_header(mailbox->account_id, 0, &handle)) {
974 LoggerE("email_sync_header failed");
976 error = email_free_mailbox(&mailbox, 1);
977 LoggerE("email_free_mailbox : " << error);
981 int Messaging::convertFolderToPlatform(const FolderType folder)
983 msg_folder_id_t platfromFolderId;
986 platfromFolderId = MSG_INBOX_ID;
989 platfromFolderId = MSG_DRAFT_ID;
992 platfromFolderId = MSG_OUTBOX_ID;
995 platfromFolderId = MSG_SENTBOX_ID;
998 // intentionally not break in platform is no spambox
1000 LoggerE("Invalid folder: " << folder);
1001 Throw(WrtDeviceApis::Commons::PlatformException);
1004 return platfromFolderId;
1007 int Messaging::convertFolderToPlatform(const std::string &folder)
1009 // MSG_FOLDER_LIST_S folderList = { 0, NULL };
1016 msg_get_folder_list(MsgGetCommonHandle(), &folderList)) {
1017 LoggerE("msg_get_folder_list error");
1018 Throw(WrtDeviceApis::Commons::PlatformException);
1020 for (int i = 0; i < folderList.nCount; ++i) {
1021 if (MSG_FOLDER_TYPE_USER_DEF ==
1022 folderList.folderInfo[i].folderType &&
1023 NULL != folderList.folderInfo[i].folderName &&
1024 folder == folderList.folderInfo[i].folderName) {
1025 result = folderList.folderInfo[i].folderId;
1030 Catch(WrtDeviceApis::Commons::PlatformException) {
1031 if (folderList.nCount) {
1032 msg_release_folder_list(&folderList);
1036 if (folderList.nCount) {
1037 msg_release_folder_list(&folderList);
1043 void Messaging::addOnMessageReceived(
1044 const EmitterMessageReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1052 LoggerD("funtionIndex = " << funtionIndex);
1053 bool isValidFilter = validateFilter(filter, funtionIndex);
1054 if(isValidFilter == false){
1055 LoggerE("[ERROR]this filter is invalid");
1056 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1059 Catch(WrtDeviceApis::Commons::PlatformException) {
1064 LoggerD("filter is NULL");
1068 m_onMessageReceived.attach(emitter);
1069 EmittersMessageReceived::LockType lock = m_onMessageReceived.getLock();
1070 if ((m_onMessageReceived.size() == 1)&&((m_onConversationReceived.size() + m_onFolderReceived.size()) == 0)) {
1071 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1072 new MsgServiceHandleMgr());
1075 err = msg_reg_storage_change_callback(
1076 m_onMessageReceivedHandleMgr->getHandle(),
1077 onMessageStorageChanged,
1080 Catch(WrtDeviceApis::Commons::PlatformException){
1081 LoggerD("addOnMessageReceived failed");
1082 Throw(WrtDeviceApis::Commons::PlatformException);
1085 if (err != MSG_SUCCESS) {
1086 LoggerE("Couldn't register on MMS received callback, err=" << err);
1089 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1093 void Messaging::addOnMessageReceived(
1094 const EmitterConversationReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1102 LoggerD("funtionIndex = " << funtionIndex);
1103 bool isValidFilter = validateFilter(filter, funtionIndex);
1104 if(isValidFilter == false){
1105 LoggerE("[ERROR]this filter is invalid");
1106 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1109 Catch(WrtDeviceApis::Commons::PlatformException) {
1114 LoggerD("filter is NULL");
1118 m_onConversationReceived.attach(emitter);
1119 EmittersConversationReceived::LockType lock = m_onConversationReceived.getLock();
1120 if ((m_onConversationReceived.size() == 1)&&((m_onMessageReceived.size() + m_onFolderReceived.size()) == 0)) {
1121 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1122 new MsgServiceHandleMgr());
1125 err = msg_reg_storage_change_callback(
1126 m_onMessageReceivedHandleMgr->getHandle(),
1127 onMessageStorageChanged,
1130 Catch(WrtDeviceApis::Commons::PlatformException){
1131 LoggerD("addOnMessageReceived failed");
1132 Throw(WrtDeviceApis::Commons::PlatformException);
1135 if (err != MSG_SUCCESS) {
1136 LoggerE("Couldn't register on MMS received callback, err=" << err);
1139 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1143 void Messaging::addOnMessageReceived(
1144 const EmitterFolderReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1152 LoggerD("funtionIndex = " << funtionIndex);
1153 bool isValidFilter = validateFilter(filter, funtionIndex);
1154 if(isValidFilter == false){
1155 LoggerE("[ERROR]this filter is invalid");
1156 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1159 Catch(WrtDeviceApis::Commons::PlatformException) {
1164 LoggerD("filter is NULL");
1168 m_onFolderReceived.attach(emitter);
1169 EmittersFolderReceived::LockType lock = m_onFolderReceived.getLock();
1170 if ((m_onFolderReceived.size() == 1)&&((m_onMessageReceived.size() + m_onConversationReceived.size()) == 0)) {
1171 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1172 new MsgServiceHandleMgr());
1177 err = msg_reg_storage_change_callback(
1178 m_onMessageReceivedHandleMgr->getHandle(),
1179 onMessageStorageChanged,
1182 Catch(WrtDeviceApis::Commons::PlatformException){
1183 LoggerD("addOnMessageReceived failed");
1184 Throw(WrtDeviceApis::Commons::PlatformException);
1187 if (err != MSG_SUCCESS) {
1188 LoggerE("Couldn't register on MMS received callback, err=" << err);
1189 // Throw(WrtDeviceApis::Commons::UnknownException);
1192 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1196 bool Messaging::validateFilter(const DeviceAPI::Tizen::FilterPtr& filter, const int funtionIndex){
1199 bool retBool = false;
1200 LoggerD("funtionIndex = " << funtionIndex);
1203 if(funtionIndex == 0)
1205 StorageChangesMessageFilterValidatorPtr validatorMsg =
1206 StorageChangesMessageFilterValidatorFactory::getStorageChangesMessageFilterValidator();
1208 FilterValidatorPtr filterValidatorMsg = DPL::StaticPointerCast<FilterValidator>(validatorMsg);
1209 retBool = filter->validate(filterValidatorMsg);
1210 }else if(funtionIndex == 1)
1212 StorageChangesConversationFilterValidatorPtr validatorConv =
1213 StorageChangesConversationFilterValidatorFactory::getStorageChangesConversationFilterValidator();
1215 FilterValidatorPtr filterValidatorConv = DPL::StaticPointerCast<FilterValidator>(validatorConv);
1216 retBool = filter->validate(filterValidatorConv);
1217 }else if(funtionIndex == 2)
1219 StorageChangesFolderFilterValidatorPtr validatorFolder =
1220 StorageChangesFolderFilterValidatorFactory::getStorageChangesFolderFilterValidator();
1222 FilterValidatorPtr filterValidatorFolder = DPL::StaticPointerCast<FilterValidator>(validatorFolder);
1223 retBool = filter->validate(filterValidatorFolder);
1226 if(retBool == false){
1227 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1230 LoggerD("filter is NULL");
1234 LoggerD(">>> retBool:" << retBool);
1240 void Messaging::removeOnMessageMsgReceived(EmitterMessageReceived::IdType id)
1243 m_onMessageReceived.detach(id);
1244 EmittersMessageReceived::LockType lock = m_onMessageReceived.getLock();
1245 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1246 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1247 m_dbusConnection->close();
1251 void Messaging::removeOnMessageConvReceived(EmitterConversationReceived::IdType id)
1254 m_onConversationReceived.detach(id);
1255 EmittersConversationReceived::LockType lock = m_onConversationReceived.getLock();
1256 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1257 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1258 m_dbusConnection->close();
1262 void Messaging::removeOnMessageFolderReceived(EmitterFolderReceived::IdType id)
1265 m_onFolderReceived.detach(id);
1266 EmittersFolderReceived::LockType lock = m_onFolderReceived.getLock();
1267 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1268 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1269 m_dbusConnection->close();
1273 void Messaging::OnEventReceived(const DBus::MessageEvent& event)
1276 EventMessageReceivedPtr jsEvent(new EventMessageReceived());
1277 DBus::MessagePtr message = event.GetArg0();
1281 jsEvent->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::PlatformException);
1282 m_onMessageReceived.emit(jsEvent);
1286 if (message->getInterface() == DBUS_INTERFACE_EMAIL_RECEIVED)
1288 int account_id = 0, mail_id = 0, thread_id = 0, status = 0;
1290 email_mailbox_t m_mailboxes;
1292 DBus::Message::ReadIterator it = message->getReadIterator();
1293 for (int i = 0; it->isValid(); it->next(), ++i)
1295 if ((i == 0) && (it->getArgType() == DBUS_TYPE_INT32))
1297 status = it->getInt();
1298 LoggerI("status: " << status);
1300 else if ((i == 1) && (it->getArgType() == DBUS_TYPE_INT32))
1302 account_id = it->getInt();
1303 LoggerI("account_id: " << account_id);
1305 else if ((i == 2) && (it->getArgType() == DBUS_TYPE_INT32))
1307 mail_id = it->getInt();
1308 LoggerI("mail_id: " << mail_id);
1310 else if ((i == 3) && (it->getArgType() == DBUS_TYPE_STRING))
1312 name = it->getString();
1313 LoggerI("name: " << name);
1315 else if ((i == 4) && (it->getArgType() == DBUS_TYPE_INT32))
1317 thread_id = it->getInt();
1318 LoggerI("thread_id: " << thread_id);
1322 if ((mail_id > 0) && (NOTI_MAIL_ADD == status))
1323 { // TODO also RECEIVE_THREAD_ITEM?
1324 LoggerI("Email received. mail_id: " << mail_id);
1326 IMessagePtr msg = MessageFactory::createMessage(EMAIL, mail_id);
1327 IConversationPtr conversation(new Conversation(thread_id, EMAIL));
1329 // TODO Temporary fix: ignore messages from OUTBOX, SENTBOX & DRAFTBOX -> most probably we added them
1330 FolderType folder = msg->getCurrentFolder();
1331 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1333 LoggerI("Added message is in folder: " << folder);
1335 jsEvent->setMessage(msg);
1336 jsEvent->setConversation(conversation);
1338 if(m_onMessageReceived.size() > 0){
1339 m_onMessageReceived.emit(jsEvent);
1342 if(m_onConversationReceived.size() > 0){
1343 m_onConversationReceived.emit(jsEvent);
1346 if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1348 jsEvent->setMessage(msg);
1349 jsEvent->setConversation(conversation);
1351 if(m_onMessageReceived.size() > 0){
1352 m_onMessageReceived.emit(jsEvent);
1355 if(m_onConversationReceived.size() > 0){
1356 m_onConversationReceived.emit(jsEvent);
1360 LoggerW("New email message in ignored folder: " << folder);
1364 else if ((mail_id > 0) && (NOTI_MAIL_DELETE == status))
1365 { // TODO also RECEIVE_THREAD_ITEM?
1366 LoggerI("Email received. delete type: " << mail_id);
1368 std::vector<std::string> strIds = String::split(name, ',');
1370 std::stringstream stream;
1371 for (std::vector<std::string>::iterator it = strIds.begin(); it != strIds.end(); ++it)
1373 LoggerD("ID is :" << *it);
1375 if ( (*it).length() > 0 ) //vaild id
1381 IMessagePtr msg = MessageFactory::createMessage(EMPTY_MESSAGE, id);
1382 IConversationPtr conversation(new Conversation());
1384 FolderType folder = msg->getCurrentFolder();
1385 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1387 if (true) { // if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1388 jsEvent->setMessage(msg);
1389 jsEvent->setConversation(conversation);
1390 if(m_onMessageReceived.size() > 0){
1391 m_onMessageReceived.emit(jsEvent);
1395 LoggerW("New email message in ignored folder: " << folder);
1403 else if ((mail_id > 0) && (NOTI_MAIL_UPDATE == status))
1404 { // TODO also RECEIVE_THREAD_ITEM?
1405 LoggerI("Email received. mail_id: " << mail_id);
1407 IMessagePtr msg = MessageFactory::createMessage(EMAIL, mail_id);
1408 IConversationPtr conversation(new Conversation(thread_id, EMAIL));
1410 FolderType folder = msg->getCurrentFolder();
1411 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1413 if (true) { // if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1414 jsEvent->setMessage(msg);
1415 jsEvent->setConversation(conversation);
1416 if(m_onMessageReceived.size() > 0)
1417 m_onMessageReceived.emit(jsEvent);
1418 if(m_onConversationReceived.size() > 0)
1419 m_onConversationReceived.emit(jsEvent);
1421 LoggerW("New email message in ignored folder: " << folder);
1424 else if ((mail_id > 0) && (NOTI_THREAD_DELETE == status))
1425 { // TODO also RECEIVE_THREAD_ITEM?
1426 LoggerI("Email received. delete thread Id : " << mail_id);
1428 IConversationPtr conversation(new Conversation());
1429 conversation->setConvId(mail_id);
1430 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1431 jsEvent->setConversation(conversation);
1433 if(m_onConversationReceived.size() > 0){
1434 m_onConversationReceived.emit(jsEvent);
1437 else if (NOTI_MAILBOX_ADD == status)
1439 LoggerI("Emailbox received. account Id: " << account_id);
1440 LoggerI("name Id: " << name);
1441 LoggerI("mailBox Id: " << mail_id);
1443 email_mailbox_t* mail_box = NULL;
1445 if (EMAIL_ERROR_NONE != email_get_mailbox_by_mailbox_id(mail_id, &mail_box)) {
1446 LoggerE("Couldn't retrieve message or it has been malformed.");
1449 if(mail_box != NULL)
1451 m_mailboxes = *mail_box;
1452 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1453 jsEvent->setMessageFolder(folderPtr);
1454 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1455 if(m_onFolderReceived.size() > 0)
1457 m_onFolderReceived.emit(jsEvent);
1464 if( EMAIL_ERROR_NONE != email_free_mailbox( &mail_box , 1) )
1465 LoggerD("fail to email_free_mailbox - err ");
1469 else if (NOTI_MAILBOX_UPDATE == status)
1471 LoggerI("Emailbox received. account Id: " << account_id);
1472 LoggerI("name Id: " << name);
1473 LoggerI("mailBox Id: " << mail_id);
1475 email_mailbox_t* mail_box = NULL;
1477 if (EMAIL_ERROR_NONE != email_get_mailbox_by_mailbox_id(mail_id, &mail_box)) {
1478 LoggerE("Couldn't retrieve message or it has been malformed.");
1481 if(mail_box != NULL)
1483 m_mailboxes = *mail_box;
1485 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1486 jsEvent->setMessageFolder(folderPtr);
1487 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1489 if(m_onFolderReceived.size() > 0)
1491 m_onFolderReceived.emit(jsEvent);
1497 if( EMAIL_ERROR_NONE != email_free_mailbox( &mail_box , 1) )
1498 LoggerD("fail to email_free_mailbox - err ");
1501 else if (NOTI_MAILBOX_DELETE == status)
1503 LoggerI("Emailbox received. account Id: " << account_id);
1504 LoggerI("name Id: " << name);
1505 LoggerI("mailBox Id: " << mail_id);
1507 // make empty mailbox
1508 m_mailboxes.mailbox_id = mail_id;
1509 m_mailboxes.account_id = account_id;
1510 m_mailboxes.alias = (char *)"";
1511 m_mailboxes.mailbox_name = (char *)"";
1513 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1514 jsEvent->setMessageFolder(folderPtr);
1515 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1517 if(m_onFolderReceived.size() > 0)
1519 m_onFolderReceived.emit(jsEvent);
1524 LoggerE("Couldn't retrieve message or it has been malformed.");
1527 else // DBUS_INTERFACE_EMAIL_RECEIVED
1529 LoggerD("Wrong DBus interface, skipping it.");
1534 void Messaging::onMessageStorageChanged(msg_handle_t handle,
1535 msg_storage_change_type_t storageChangeType,
1536 msg_id_list_s *pMsgIdList,
1542 msg_error_t err = MSG_SUCCESS;
1544 if(storageChangeType == MSG_STORAGE_CHANGE_CONTACT)
1546 LoggerD("storageChangeType is MSG_STORAGE_CHANGE_CONTACT");
1550 Messaging* this_ = static_cast<Messaging*>(data);
1554 int msgCount = pMsgIdList->nCount;
1555 LoggerD("msgCount = "<< msgCount);
1557 for(int index = 0; index < msgCount; index++)
1560 LoggerD("storageChangeType = "<< storageChangeType);
1562 if(storageChangeType == MSG_STORAGE_CHANGE_DELETE)
1564 IMessagePtr message = MessageFactory::createMessage(EMPTY_MESSAGE, pMsgIdList->msgIdList[index]);
1565 IConversationPtr conversation(new Conversation());
1566 EventMessageReceivedPtr event(new EventMessageReceived());
1567 event->setMessage(message);
1568 event->setConversation(conversation);
1569 event->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1571 if(this_->m_onMessageReceived.size() > 0){
1572 this_->m_onMessageReceived.emit(event);
1574 if(this_->m_onConversationReceived.size() > 0){
1575 this_->m_onConversationReceived.emit(event);
1580 msg_struct_t msg = NULL;
1581 msg_struct_t sendOpt = NULL;
1582 msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1583 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1585 err = msg_get_message(handle, pMsgIdList->msgIdList[index], msg, sendOpt);
1587 if (err != MSG_SUCCESS)
1589 LoggerD("Get Message Failed!");
1590 LoggerD("err" << err);
1591 msg_release_struct(&msg);
1592 msg_release_struct(&sendOpt);
1598 msg_get_int_value(msg, MSG_MESSAGE_TYPE_INT, &msgType);
1599 LoggerD("msgType : " << msgType);
1600 if((msgType > MSG_TYPE_INVALID) && ( msgType <= MSG_TYPE_SMS_REJECT))
1602 if(msgType != MSG_TYPE_MMS_NOTI)
1605 msg_get_int_value(msg, MSG_MESSAGE_ID_INT, &msgId);
1606 IMessagePtr message = MessageFactory::createMessage(
1611 ISmsPtr sms = MessageFactory::convertToSms(message);
1612 IConversationPtr conversation(new Conversation(message->getId(), SMS));
1613 EventMessageReceivedPtr event(new EventMessageReceived());
1614 event->setMessage(message);
1615 event->setConversation(conversation);
1617 if(storageChangeType == MSG_STORAGE_CHANGE_INSERT)
1619 LoggerD("MSG_STORAGE_CHANGE_INSERT");
1620 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1622 else if(storageChangeType == MSG_STORAGE_CHANGE_UPDATE)
1624 LoggerD("MSG_STORAGE_CHANGE_UPDATE");
1625 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1628 if(this_->m_onMessageReceived.size() > 0){
1629 this_->m_onMessageReceived.emit(event);
1631 if(this_->m_onConversationReceived.size() > 0){
1632 this_->m_onConversationReceived.emit(event);
1637 LoggerE("Ignore this sms, this is mms noti.");
1640 else if((msgType >= MSG_TYPE_MMS) && (msgType <= MSG_TYPE_MMS_NOTI))
1642 if(msgType != MSG_TYPE_MMS_NOTI)
1645 msg_get_int_value(msg, MSG_MESSAGE_ID_INT, &msgId);
1646 IMessagePtr message = MessageFactory::createMessage(
1648 // msg_get_message_id(
1652 IMmsPtr mms = MessageFactory::convertToMms(message);
1653 IConversationPtr conversation(new Conversation(message->getId(), MMS));
1654 EventMessageReceivedPtr event(new EventMessageReceived());
1655 event->setMessage(message);
1656 event->setConversation(conversation);
1658 if(storageChangeType == MSG_STORAGE_CHANGE_INSERT)
1660 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1662 else if(storageChangeType == MSG_STORAGE_CHANGE_UPDATE)
1664 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1666 // else if(storageChangeType == MSG_STORAGE_CHANGE_DELETE)
1668 // event->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1671 if(this_->m_onMessageReceived.size() > 0){
1672 this_->m_onMessageReceived.emit(event);
1674 if(this_->m_onConversationReceived.size() > 0){
1675 this_->m_onConversationReceived.emit(event);
1680 LoggerE("Ignore this mms, this is mms noti.");
1686 LoggerE("release msg : " << msg);
1687 msg_release_struct(&msg);
1689 msg_release_struct(&sendOpt);
1693 Catch(WrtDeviceApis::Commons::ConversionException) {
1694 LoggerE("Couldn't convert message to sms.");
1696 Catch(WrtDeviceApis::Commons::PlatformException) {
1697 LoggerE("onMessageStorageChanged platform exception");
1703 void Messaging::onSmsReceived(MSG_HANDLE_T handle,
1708 Messaging* this_ = static_cast<Messaging*>(data);
1711 if(msg_get_message_type(msg) != MSG_TYPE_MMS_NOTI)
1713 IMessagePtr message = MessageFactory::createMessage(
1717 ISmsPtr sms = MessageFactory::convertToSms(message);
1718 IConversationPtr conversation(new Conversation(message->getId(), SMS));
1720 EventMessageReceivedPtr event(new EventMessageReceived());
1721 event->setMessage(message);
1722 event->setConversation(conversation);
1723 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1724 this_->m_onMessageReceived.emit(event);
1728 LoggerE("Ignore this sms, this is mms noti.");
1731 Catch(WrtDeviceApis::Commons::ConversionException) {
1732 LoggerE("Couldn't convert message to sms.");
1737 void Messaging::onMmsReceived(MSG_HANDLE_T handle,
1742 Messaging* this_ = static_cast<Messaging*>(data);
1745 IMessagePtr message = MessageFactory::createMessage(
1749 IMmsPtr mms = MessageFactory::convertToMms(message);
1750 IConversationPtr conversation(new Conversation(message->getId(), MMS));
1751 EventMessageReceivedPtr event(new EventMessageReceived());
1752 event->setMessage(message);
1753 event->setConversation(conversation);
1754 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1755 this_->m_onMessageReceived.emit(event);
1757 Catch(WrtDeviceApis::Commons::ConversionException) {
1758 LoggerE("Couldn't convert message to mms.");
1763 void Messaging::getNumberOfEmails(FolderType folder,
1769 email_mailbox_t mailbox = {};
1770 mailbox.account_id = 0; // means for all accounts
1771 mailbox.name = String::strdup(
1772 EmailConverter::toMailboxName(folder)
1775 int error = email_count_mail(&mailbox, read, unread);
1778 if (EMAIL_ERROR_NONE != error) {
1779 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
1780 "Couldn't get number of emails. [" << error << "]");
1786 void Messaging::getNumberOfSms(FolderType folder,
1790 getNumberOfSmsMms(folder, read, unread, SMS);
1793 void Messaging::getNumberOfMms(FolderType folder,
1797 getNumberOfSmsMms(folder, read, unread, MMS);
1800 void Messaging::getNumberOfSmsMms(FolderType folder,
1803 MessageType msgType)
1805 MSG_LIST_S folderListView = { 0, NULL };
1812 MSG_MESSAGE_TYPE_T msgTypePlatform;
1813 if (SMS == msgType) {
1814 msgTypePlatform = MSG_TYPE_SMS;
1815 } else if (MMS == msgType) {
1816 msgTypePlatform = MSG_TYPE_MMS;
1818 LoggerE("no supported message type in this method");
1819 Throw(WrtDeviceApis::Commons::PlatformException);
1822 msg_folder_id_t msgFolderId;
1825 msgFolderId = MSG_INBOX_ID;
1828 msgFolderId = MSG_OUTBOX_ID;
1831 msgFolderId = MSG_SENTBOX_ID;
1834 msgFolderId = MSG_DRAFT_ID;
1837 LoggerE("wrong folder type");
1838 Throw(WrtDeviceApis::Commons::PlatformException);
1842 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
1843 if (msg_get_folder_view_list(MsgGetCommonHandle(), msgFolderId,
1845 &folderListView) != MSG_SUCCESS) {
1847 "msg_get_folder_view_list empty or failed, msgFolderId=" <<
1849 Throw(WrtDeviceApis::Commons::PlatformException);
1851 // go thtough all message to check type of message
1852 LoggerD("msgCount=" << (int) folderListView.nCount);
1853 for (int msg_cnt = 0; msg_cnt < folderListView.nCount; msg_cnt++) {
1854 LoggerD("msgMainType=" <<
1855 (int) msg_get_message_type(folderListView.
1858 ", searching for = " << (int) msgTypePlatform);
1859 if (msgTypePlatform ==
1860 msg_get_message_type(folderListView.msgInfo[
1862 if (msg_is_read(folderListView.msgInfo[msg_cnt]))
1870 msg_release_list_struct(&folderListView);
1872 LoggerD("readed=" << *read << ", unReaded=" << *unread);
1875 Catch(WrtDeviceApis::Commons::PlatformException) {
1876 if (folderListView.nCount) {
1877 msg_release_list_struct(&folderListView);
1883 vector<IMessagePtr> Messaging::findSms(FolderType folder, const DeviceAPI::Tizen::FilterPtr& filter)
1887 vector<IMessagePtr> retVal;
1888 msg_message_t msg = msg_new_message();
1889 MSG_LIST_S folder_list_view = {0, NULL};
1892 const MSG_SORT_RULE_S sort_rules = {MSG_SORT_BY_DISPLAY_TIME, true};
1893 msg_error_t res = MSG_ERR_UNKNOWN;
1894 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
1895 res = msg_get_folder_view_list(MsgGetCommonHandle(), platformFolder, &sort_rules, &folder_list_view);
1897 if (MSG_SUCCESS != res) {
1898 LoggerE("msg_get_folder_view_list failed " << res);
1899 Throw(WrtDeviceApis::Commons::PlatformException);
1902 for (int i = 0; i < folder_list_view.nCount; i++) {
1903 if (MSG_TYPE_SMS == msg_get_message_type(folder_list_view.msgInfo[i])) {
1904 int l_msgId = msg_get_message_id(folder_list_view.msgInfo[i]);
1905 IMessagePtr msg = MessageFactory::createMessage(SMS, l_msgId);
1907 // if (!filter || !filter->isValid() ||
1908 // filter->compare(MessageFactory::convertToSms(msg))) {
1909 retVal.push_back(msg);
1914 msg_release_list_struct(&folder_list_view);
1915 }Catch(WrtDeviceApis::Commons::PlatformException) {
1916 LoggerE("Problem with message creation, cleaning");
1917 if (folder_list_view.nCount) {
1918 msg_release_list_struct(&folder_list_view);
1921 msg_release_message(&msg);
1930 vector<IMessagePtr> Messaging::findMms(FolderType folder,
1931 const DeviceAPI::Tizen::FilterPtr& filter)
1933 vector<IMessagePtr> retVal;
1934 msg_message_t msg = msg_new_message();
1935 MSG_LIST_S folder_list_view = {0, NULL};
1939 const MSG_SORT_RULE_S sort_rules = {MSG_SORT_BY_DISPLAY_TIME, true};
1940 msg_error_t res = MSG_ERR_UNKNOWN;
1941 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
1942 res = msg_get_folder_view_list(
1943 MsgGetCommonHandle(), platformFolder, &sort_rules,
1946 if (MSG_SUCCESS != res) {
1947 LoggerE("msg_Get_folder_view_list failed" << res);
1948 Throw(WrtDeviceApis::Commons::PlatformException);
1951 for (int i = 0; i < folder_list_view.nCount; i++) {
1953 msg_get_message_type(folder_list_view.
1955 int l_msgId = msg_get_message_id(
1956 folder_list_view.msgInfo[i]);
1957 IMessagePtr msg = MessageFactory::createMessage(MMS, l_msgId);
1961 msg_release_list_struct(&folder_list_view);
1964 Catch(WrtDeviceApis::Commons::PlatformException) {
1965 LoggerE("Problem with message creation, cleaning");
1966 if (folder_list_view.nCount) {
1967 msg_release_list_struct(&folder_list_view);
1970 msg_release_message(&msg);
1978 void Messaging::createFolder(MessageType msgType,
1979 const string& userFolder)
1984 createMsgServiceFolder(userFolder);
1987 createEmailFolder(userFolder);
1990 LoggerE("msg not supported");
1991 Throw(WrtDeviceApis::Commons::UnknownException);
1995 void Messaging::createMsgServiceFolder(const std::string& userFolder)
1998 if (userFolder.length() > MAX_FOLDER_NAME_SIZE) {
1999 LoggerE("folder name to long");
2000 Throw(WrtDeviceApis::Commons::PlatformException);
2003 MSG_FOLDER_INFO_S folderInfo;
2005 folderInfo.folderId = 0;
2006 strncpy(folderInfo.folderName, userFolder.c_str(), userFolder.length());
2008 folderInfo.folderType = MSG_FOLDER_TYPE_USER_DEF;
2010 if (msg_add_folder(MsgGetCommonHandle(), &folderInfo) != MSG_SUCCESS) {
2011 LoggerE("msg_add_folder failed");
2012 Throw(WrtDeviceApis::Commons::PlatformException);
2017 void Messaging::createEmailFolder(const std::string& userFolder)
2021 Throw(WrtDeviceApis::Commons::UnknownException);
2024 void Messaging::deleteFolder(MessageType msgType,
2025 const string& userFolder)
2030 deleteMsgServiceFolder(userFolder);
2033 deleteEmailFolder(userFolder);
2036 LoggerE("msg not supported");
2037 Throw(WrtDeviceApis::Commons::UnknownException);
2041 void Messaging::deleteMsgServiceFolder(const string& userFolder)
2046 int platformFolderId = convertFolderToPlatform(userFolder);
2048 msg_delete_folder(MsgGetCommonHandle(), platformFolderId)) {
2049 LoggerE("msg_get_folder_list failed");
2050 Throw(WrtDeviceApis::Commons::PlatformException);
2053 Catch(WrtDeviceApis::Commons::PlatformException) {
2059 void Messaging::deleteEmailFolder(const string& userFolder)
2063 Throw(WrtDeviceApis::Commons::UnknownException);
2066 vector<string> Messaging::getFolderNames(MessageType msgType)
2071 return getFolderNamesMsgService();
2073 return getFolderNamesEmail();
2075 LoggerE("msg not supported");
2076 Throw(WrtDeviceApis::Commons::UnknownException);
2080 vector<string> Messaging::getFolderNamesMsgService()
2082 vector<string> retVal;
2083 // MSG_FOLDER_LIST_S msgFolderList = { 0, NULL }; // output data
2085 msg_struct_list_s msgFolderList = {0,};
2089 if (msg_get_folder_list(MsgGetCommonHandle(),
2090 &msgFolderList) != MSG_SUCCESS) {
2091 LoggerE("msg_get_folder_list failed");
2092 Throw(WrtDeviceApis::Commons::PlatformException);
2095 LoggerD("number of folder=" << msgFolderList.nCount);
2096 for (int i = 0; i < msgFolderList.nCount; i++) {
2097 LoggerD("folderName=" << msgFolderList.folderInfo[i].folderName);
2098 LoggerD("folderId=" << (int) msgFolderList.folderInfo[i].folderId);
2101 (int) msgFolderList.folderInfo[i].folderType);
2102 retVal.push_back(msgFolderList.folderInfo[i].folderName);
2104 (void) msg_release_folder_list(&msgFolderList);
2107 Catch(WrtDeviceApis::Commons::PlatformException) {
2108 if (msgFolderList.nCount) {
2109 (void) msg_release_folder_list(&msgFolderList);
2117 vector<string> Messaging::getFolderNamesEmail()
2119 vector<string> retVal;
2122 email_mailbox_t* mailboxes = NULL;
2124 string emailAccountName;
2125 EmailAccountInfo account = getCurrentEmailAccount();
2129 if (!email_get_mailbox_list(account.getIntId(), -1, &mailboxes,
2130 &mailboxesCount) || !mailboxes) {
2131 LoggerE("error during get mailboxes");
2133 if(mailboxes == NULL)
2135 LoggerE("error during get mailboxes");
2136 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2137 "Couldn't get mailboxes");
2139 for (int i = 0; i < mailboxesCount; i++) {
2140 retVal.push_back(mailboxes->mailbox_name);
2141 LoggerD("mailbox found, name=" << mailboxes->mailbox_name);
2144 if(mailboxes != NULL)
2146 if( EMAIL_ERROR_NONE != email_free_mailbox( &mailboxes , mailboxesCount) )
2147 LoggerD("fail to email_free_mailbox - err ");
2151 Catch(WrtDeviceApis::Commons::PlatformException) {
2152 // nothing to clean, re-throw exception
2159 vector<IMessagePtr> Messaging::findEmail(const std::string &folder,
2160 const DeviceAPI::Tizen::FilterPtr& filter)
2162 vector<IMessagePtr> retVal;
2164 EmailAccountInfo account = getCurrentEmailAccount();
2165 if (account.getId().empty()) {
2166 LoggerW("No valid email accounts. Skipping");
2170 int accountId = account.getIntId();
2172 // number of found emails
2178 email_mail_list_item_t* results = NULL;
2179 int err = email_get_mail_list(accountId,
2181 EMAIL_LIST_TYPE_NORMAL,
2184 EMAIL_SORT_DATETIME_HIGH,
2187 DPL::ScopedFree<email_mail_list_item_t> autoFree(results);
2189 if (EMAIL_ERROR_MAIL_NOT_FOUND == err || results == NULL) {
2190 LoggerW("No emails found in mailbox: " << folder);
2192 } else if (EMAIL_ERROR_NONE != err) {
2194 "Unable to get mail list for mailbox: " << folder <<
2195 ", Error: " << err);
2196 Throw(WrtDeviceApis::Commons::PlatformException);
2200 for (int i = 0; i < count; ++i) {
2201 IMessagePtr msg = MessageFactory::createMessage(EMAIL, results[i].mail_id);
2205 // || filter->compare(MessageFactory::convertToEmail(msg)) //TODO implemnet compare in filter
2207 retVal.push_back(msg);
2211 startIndex += count;
2213 while (count >= MESSAGE_FIND_LIMIT);
2218 vector<IMessagePtr> Messaging::findEmail(FolderType folder,
2219 const DeviceAPI::Tizen::FilterPtr& filter)
2221 vector<IMessagePtr> result;
2223 EmailAccountInfo account = getCurrentEmailAccount();
2224 if (account.getId().empty()) {
2225 LoggerW("No valid email accounts.");
2231 name = EmailConverter::toMailboxName(folder);
2233 catch (const WrtDeviceApis::Commons::PlatformException& ex) {
2234 LoggerW(ex.DumpToString());
2238 int accountId = account.getIntId();
2242 email_mail_list_item_t* messages = NULL;
2243 int error = email_get_mail_list(accountId,
2245 EMAIL_LIST_TYPE_NORMAL,
2248 EMAIL_SORT_DATETIME_HIGH,
2251 DPL::ScopedFree<email_mail_list_item_t> freeGuard(messages);
2252 if ((EMAIL_ERROR_MAIL_NOT_FOUND == error) || (NULL == messages)) {
2253 LoggerW("No emails found in mailbox: " << name);
2255 } else if (EMAIL_ERROR_NONE != error) {
2256 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2257 "Couldn't get mail list from mailbox: " << name <<
2258 ". [" << error << "]");
2261 for (int i = 0; i < count; ++i) {
2263 MessageFactory::createMessage(EMAIL, messages[i].mail_id);
2265 // ||filter->compare(MessageFactory::convertToEmail(msg)) //TODO implement compare in filter
2267 result.push_back(msg);
2271 startIndex += count;
2273 while (count >= MESSAGE_FIND_LIMIT);
2278 int Messaging::getConversationId(const int& msgId, const MessageType& msgtype)
2286 int index = 0, count = 0;
2287 // char *mailBox = NULL;
2288 email_mail_list_item_t *mailList = NULL;
2289 email_mail_data_t* result = NULL;
2291 LoggerD("Current Account " << m_currentEmailAccountId);
2296 if (EMAIL_ERROR_NONE != email_get_mail_data(msgId, &result)) {
2297 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2298 "Couldn't get conversatino Id " << msgId );
2301 if (email_get_mail_list(m_currentEmailAccountId, result->mailbox_id, EMAIL_LIST_TYPE_NORMAL, 0, MESSAGE_FIND_LIMIT,
2302 EMAIL_SORT_DATETIME_HIGH, &mailList, &count) != EMAIL_ERROR_NONE)
2304 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get email list fail" );
2307 email_free_mail_data(&result,1);
2309 for (index = 0; index < count; index++)
2311 if (mailList[index].mail_id == (int)msgId)
2313 return mailList[index].thread_id;
2316 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "can not find msg" );
2318 catch (const WrtDeviceApis::Commons::Exception& ex)
2322 email_free_mail_data(&result,1);
2323 LoggerE("Exception: " << ex.GetMessage());
2326 return MSG_ERR_INVALID_MSG_TYPE;
2332 msg_struct_t msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
2333 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
2334 msg_handle_t handle = MsgGetCommonHandle();
2335 msg_error_t err = MSG_SUCCESS;
2337 err = msg_get_message(handle, msgId, msg, sendOpt);
2339 if( err < MSG_SUCCESS )
2341 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2342 "can not find msg id(" << msgId << ")");
2346 err = msg_get_int_value(msg, MSG_MESSAGE_THREAD_ID_INT, &threadId);
2350 if( err < MSG_SUCCESS )
2352 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2353 "can not find thread with msg id(" << msgId << ")");
2355 msg_release_struct(&msg);
2356 msg_release_struct(&sendOpt);
2362 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2363 "Wrong Type (" << msgId << ")");
2364 return MSG_ERR_INVALID_MSG_TYPE;
2369 std::vector<IConversationPtr> Messaging::queryConversations(const DeviceAPI::Tizen::SortModePtr& sortMode,
2370 const DeviceAPI::Tizen::FilterPtr& filter, long limit, long offset)
2374 std::vector<IConversationPtr> result;
2375 std::string filterSql;
2376 std::string orderLimitSql ="";
2378 ConversationQueryGeneratorPtr queryGenerator(new ConversationQueryGenerator(sortMode, limit, offset));
2379 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2380 filter->travel(filterVisitor, 0);
2382 LoggerD("filterSql:[" << filterSql <<"]");
2384 int conversationType = queryGenerator->getMessageType();
2385 switch(conversationType){
2387 LoggerD("type is EMAIL:[" << conversationType <<"]");
2388 queryGenerator->reset(MessageQueryGenerator::MODE_EMAIL);
2389 filter->travel(filterVisitor, 0);
2390 filterSql = queryGenerator->getQuery();
2391 result = queryEmailConversation(filterSql);
2396 LoggerD("type is SMS:[" << conversationType <<"]");
2397 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
2398 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2399 filter->travel(filterVisitor, 0);
2400 filterSql = queryGenerator->getQuery();
2401 LoggerD("filterSql:[" << filterSql <<"]");
2402 LoggerD("orderLimitSql:[" << orderLimitSql <<"]");
2403 result = querySmsMmsConversation(filterSql, orderLimitSql);
2408 LoggerD("type is MMS:[" << conversationType <<"]");
2409 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
2410 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2411 filter->travel(filterVisitor, 0);
2412 filterSql = queryGenerator->getQuery();
2413 LoggerD("filterSql:[" << filterSql <<"]");
2414 LoggerD("orderLimitSql:[" << orderLimitSql <<"]");
2415 result = querySmsMmsConversation(filterSql, orderLimitSql);
2420 LoggerE("[ERROR] >>> invlid type:[" << conversationType <<"]");
2428 std::vector<IConversationPtr> Messaging::queryConversations(const DeviceAPI::Tizen::FilterPtr& filter,
2429 const DeviceAPI::Tizen::SortModePtr& sortMode, int type, long limit, long offset)
2433 std::vector<IConversationPtr> result;
2434 std::string filterSql;
2435 std::string orderLimitSql ="";
2437 ConversationQueryGeneratorPtr queryGenerator(new ConversationQueryGenerator(sortMode, limit, offset, type));
2438 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2439 filter->travel(filterVisitor, 0);
2441 LoggerD("filterSql:[" << filterSql <<"]");
2442 int conversationType = queryGenerator->getMessageType();
2443 if(conversationType != -1)
2445 if(conversationType != type)
2447 LoggerD("filter conversationType and service msg type is diff");
2448 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
2453 LoggerD("type is EMAIL:[" << conversationType <<"]");
2454 queryGenerator->reset(MessageQueryGenerator::MODE_EMAIL);
2455 filter->travel(filterVisitor, 0);
2456 filterSql = queryGenerator->getQuery();
2457 LoggerD("filterSql:[" << filterSql <<"]");
2458 result = queryEmailConversation(filterSql);
2463 LoggerD("type is SMS:[" << conversationType <<"]");
2464 queryGenerator->reset(MessageQueryGenerator::MODE_SMS);
2465 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2466 filter->travel(filterVisitor, 0);
2467 filterSql = queryGenerator->getQuery();
2468 orderLimitSql = queryGenerator->getOrderLimit();
2469 LoggerD("filterSql:[" << filterSql <<"]");
2470 LoggerD("orderLimitSql:[" << orderLimitSql <<"]");
2471 result = querySmsMmsConversation(filterSql, orderLimitSql);
2476 LoggerD("type is MMS:[" << conversationType <<"]");
2477 queryGenerator->reset(MessageQueryGenerator::MODE_MMS);
2478 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2479 filter->travel(filterVisitor, 0);
2480 filterSql = queryGenerator->getQuery();
2481 orderLimitSql = queryGenerator->getOrderLimit();
2482 LoggerD("filterSql:[" << filterSql <<"]");
2483 LoggerD("orderLimitSql:[" << orderLimitSql <<"]");
2484 result = querySmsMmsConversation(filterSql, orderLimitSql);
2489 LoggerE("[ERROR] >>> invlid type:[" << conversationType <<"]");
2497 bool Messaging::deleteConversations(const DeviceAPI::Tizen::SortModePtr& sortMode, const DeviceAPI::Tizen::FilterPtr& filter)
2501 std::vector<IConversationPtr> conversationsToDelete = queryConversations(sortMode, filter);
2502 return deleteConversations(conversationsToDelete);
2505 bool Messaging::deleteConversations(const std::vector<IConversationPtr>& conversations)
2509 if (conversations.size() == 0)
2512 if (conversations[0]->getType() == EMAIL)
2514 LoggerD("Enter-Email");
2517 for (std::size_t i = 0; i < conversations.size(); ++i)
2519 threadId = conversations[i]->getConvId();
2521 if (email_delete_thread(threadId, false) != EMAIL_ERROR_NONE)
2529 LoggerD("Enter-Msg");
2530 msg_thread_id_t threadId = 0;
2531 msg_handle_t handle = MsgGetCommonHandle();
2533 for (std::size_t i = 0; i < conversations.size(); ++i)
2535 threadId = conversations[i]->getConvId();
2536 if (msg_delete_thread_message_list(handle, threadId, FALSE) != MSG_SUCCESS)
2545 std::vector<IMessageFolderPtr> Messaging::queryFolders(const DeviceAPI::Tizen::FilterPtr& filter)
2549 email_mailbox_t* mailboxes = NULL;
2550 email_mailbox_t* mailboxes_org = NULL;
2551 email_mailbox_t m_mailboxes;
2555 std::vector<IMessageFolderPtr> result;
2556 std::string folderName;
2559 EmailAccountInfo account = getCurrentEmailAccount();
2561 if (account.getId().empty()) {
2562 LoggerW("No valid email accounts. Skipping");
2566 const vector<EmailAccountInfo> accounts = getEmailAccounts();
2568 FolderQueryGeneratorPtr queryGenerator(new FolderQueryGenerator());
2570 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2571 queryGenerator->reset();
2572 filter->travel(filterVisitor, 0);
2573 accountId = queryGenerator->getAccountId();
2577 LoggerW("No valid email accounts. accountId : 0");
2581 if(queryGenerator->isFolderPathExist() == 1){
2583 folderName = queryGenerator->getFolderPath();
2585 if(email_get_mailbox_by_name(accountId, folderName.c_str(), &mailboxes) != 1)
2587 LoggerE("error during get mailboxes");
2591 m_mailboxes = *mailboxes;
2592 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
2593 result.push_back(folderPtr);
2597 if (!email_get_mailbox_list(accountId, -1, &mailboxes, &mailboxesCount) || !mailboxes)
2599 LoggerE("error during get mailboxes");
2603 mailboxes_org = mailboxes;
2605 if (mailboxesCount <= 0)
2607 LoggerD("Empty...");
2611 LoggerD("found mailboxs : " << mailboxesCount);
2612 for (int i = 0; i < mailboxesCount; i++)
2615 m_mailboxes = *mailboxes;
2616 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
2617 result.push_back(folderPtr);
2622 mailboxes = mailboxes_org;
2624 if(mailboxes != NULL)
2626 error = email_free_mailbox(&mailboxes,mailboxesCount);
2627 LoggerE("email_free_mailbox : " << error);