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>
22 #include <Commons/Exception.h>
23 #include <Commons/StringUtils.h>
24 #include <dpl/scoped_free.h>
25 #include "Messaging.h"
28 #include "BinarySms.h"
30 #include "EmailConverter.h"
32 #include "StorageChangesMessageFilterValidatorFactory.h"
33 #include "StorageChangesConversationFilterValidatorFactory.h"
34 #include "StorageChangesFolderFilterValidatorFactory.h"
35 #include "MessageQueryGenerator.h"
36 #include "ConversationQueryGenerator.h"
37 #include "FolderQueryGenerator.h"
38 #include "messageDB/MessageStorageReader.h"
41 #include <msg_storage.h>
43 #include <msg_transport.h>
46 #include <Commons/ThreadPool.h>
47 #include "Conversation.h"
48 #include "MessageFolder.h"
49 #include <dpl/singleton_safe_impl.h>
52 IMPLEMENT_SAFE_SINGLETON(DeviceAPI::Messaging::MsgServiceHandle)
55 #define LOG_ENTER LoggerD("---> ENTER");
56 #define LOG_EXIT LoggerD("---> EXIT");
60 using namespace DeviceAPI::Tizen;
61 using namespace WrtDeviceApis::Commons;
64 const char* DBUS_INTERFACE_EMAIL_RECEIVED = "User.Email.StorageChange";
65 const char* DBUS_FILTER_EMAIL_RECEIVED =
66 "type='signal',interface='User.Email.StorageChange'";
68 const int MESSAGE_FIND_LIMIT = 100;
74 int Messaging::m_currentEmailAccountId = 0;
75 DPL::Atomic Messaging::m_objCounter;
77 Messaging& Messaging::getInstance()
79 static Messaging instance;
83 Messaging::Messaging() :
84 m_onMessageReceivedHandleMgr(NULL),
85 m_dbusConnection(new DBus::Connection()),
86 m_dbusWorkerThread(new DPL::Thread())
90 const vector<EmailAccountInfo> accounts = getEmailAccounts();
91 LoggerD("Number of emails account=" << accounts.size());
92 if (accounts.size() > 0) {
93 // set default email account - first from the list
94 setCurrentEmailAccount(accounts[0]);
96 LoggerE("no default email account set");
100 Catch(WrtDeviceApis::Commons::PlatformException) {
101 LoggerE("No email accounts available");
104 Catch(WrtDeviceApis::Commons::InvalidArgumentException) {
105 LoggerE("No email accounts available");
106 //current email not configured, skipped
109 Catch(WrtDeviceApis::Commons::UnknownException) {
110 LoggerE("unknown error");
113 // Begin service for email management ?? pmi question if it should be added before email actions
114 if (0 == m_objCounter) {
115 int error = email_service_begin();
116 if (EMAIL_ERROR_NONE != error) {
117 LoggerE("email_service_begin() returned error " << error);
119 LoggerI("email_service_begin() executed without error");
124 m_dbusWorkerThread->Run();
125 m_dbusConnection->setWorkerThread(m_dbusWorkerThread);
126 m_dbusConnection->addFilter(DBUS_FILTER_EMAIL_RECEIVED);
127 m_dbusConnection->AddListener(this);
130 Messaging::~Messaging()
132 // Endservice for email management
133 m_dbusConnection->RemoveListener(this);
134 // m_dbusConnection->setWorkerThread(NULL);
135 m_dbusWorkerThread->Quit();
136 delete m_dbusWorkerThread;
138 if (!--m_objCounter) {
139 int error = email_service_end();
140 if (EMAIL_ERROR_NONE != error) {
141 LoggerE("email_service_end() returned error " << error);
143 LoggerD("email_service_end() executed without error");
149 void Messaging::getNumberOfMessages(MessageType msgType,
154 if (NULL == readed ||
156 LoggerE("output pointers are NULL");
157 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
161 if (SMS == msgType) {
162 getNumberOfSms(folder, readed, unReaded);
163 } else if (MMS == msgType) {
164 getNumberOfMms(folder, readed, unReaded);
165 } else if (EMAIL == msgType) {
166 getNumberOfEmails(folder, readed, unReaded);
168 LoggerE("wrong message type");
169 Throw(WrtDeviceApis::Commons::PlatformException);
173 vector<IMessagePtr> Messaging::findMessages(const vector<MessageType>& msgTypes,
174 const string &folder,
175 const DeviceAPI::Tizen::FilterPtr& filter)
178 vector<IMessagePtr> retVal;
179 back_insert_iterator< vector<IMessagePtr> > biit(retVal);
180 vector<MessageType>::const_iterator it = msgTypes.begin();
181 for (; it != msgTypes.end(); ++it) {
182 LoggerD("Finding messages (" << *it << ") in folder: " << folder);
183 vector<IMessagePtr> result;
188 FolderType folderEnum = Sms::toFolder(folder);
189 result = findSms(folderEnum, filter);
194 FolderType folderEnum = Mms::toFolder(folder);
195 result = findMms(folderEnum, filter);
200 result = findEmail(folder, filter);
204 LoggerE("message type unknown");
205 Throw(WrtDeviceApis::Commons::PlatformException);
207 LoggerD("Found: " << result.size());
208 copy(result.begin(), result.end(), biit);
214 std::string Messaging::generateFilterSql(const DeviceAPI::Tizen::FilterPtr& filter){
216 std::string filterSql;
218 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator());
219 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
220 filter->travel(filterVisitor, 0);
221 filterSql = queryGenerator->getQuery();
223 // LOGD(">>> filterSql:[%s]", filterSql.c_str());
228 vector<IMessagePtr> Messaging::findMessages(const vector<MessageType>& msgTypes, FolderType folder,
229 const DeviceAPI::Tizen::FilterPtr& filter)
232 vector<IMessagePtr> retVal;
233 back_insert_iterator< vector<IMessagePtr> > biit(retVal);
235 std::string filterSql = generateFilterSql(filter);
239 vector<MessageType>::const_iterator it = msgTypes.begin();
240 for (; it != msgTypes.end(); ++it) {
241 LoggerD("Finding messages (" << *it << ") in folder: " << folder);
242 vector<IMessagePtr>(Messaging::*findFnPtr)(FolderType folder, const DeviceAPI::Tizen::FilterPtr& filter) = NULL;
247 findFnPtr = &Messaging::findSms;
252 findFnPtr = &Messaging::findMms;
257 findFnPtr = &Messaging::findEmail;
261 LoggerE("message type unknown");
262 Throw(WrtDeviceApis::Commons::PlatformException);
265 vector<IMessagePtr> result = (this->*findFnPtr)(folder, filter);
266 LoggerD("Found: " << result.size());
267 copy(result.begin(), result.end(), biit);
273 void Messaging::printErrorMessage(int errorCode){
275 case EMAIL_ERROR_MAIL_NOT_FOUND:{
276 LoggerD("EMAIL_ERROR_MAIL_NOT_FOUND");
279 case EMAIL_ERROR_DB_FAILURE:{
280 LoggerD("EMAIL_ERROR_DB_FAILURE");
284 LoggerD("other error message:" << errorCode);
289 vector<IMessagePtr> Messaging::createVectorFromeMessageList(const msg_struct_list_s &message_list){
290 // vector<IMessagePtr> Messaging::createVectorFromeMessageList(const msg_struct_list_s message_list){
293 vector<IMessagePtr> retVal;
295 set<int> alreadyCreated;
297 MessageType webApiMsgType;
299 LoggerD("message_list.nCount:" << message_list.nCount);
300 for (int i = 0; i < message_list.nCount; i++) {
301 int err = msg_get_int_value(message_list.msg_struct_info[i], MSG_MESSAGE_TYPE_INT, &tempInt);
302 if(err != MSG_SUCCESS)
304 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "get message type fail");
306 LoggerD("Message type : " << tempInt);
318 LoggerE("[ERROR]invalid message type:" << tempInt);
323 // int l_msgId = msg_get_message_id(message_list.msgInfo[i]);
324 err = msg_get_int_value(message_list.msg_struct_info[i], MSG_MESSAGE_ID_INT, &tempInt);
325 LoggerD("Message Id : " << tempInt);
326 if(err != MSG_SUCCESS)
328 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "get message id fail");
330 if(alreadyCreated.find(tempInt) == alreadyCreated.end())
333 msg = MessageFactory::createMessage(webApiMsgType, tempInt);
334 alreadyCreated.insert(tempInt);
335 retVal.push_back(msg);
343 std::vector<IConversationPtr> Messaging::createVectorFromeThreadViewList(const msg_struct_list_s& threadViewList){
344 vector<IConversationPtr> recVec;
346 if (threadViewList.nCount <= 0) {
349 for (int i = 0; i < threadViewList.nCount; i++) {
350 // IConversationPtr convPtr(new Conversation(i));
351 IConversationPtr convPtr(new Conversation(threadViewList.msg_struct_info[i]));
353 recVec.push_back(convPtr);
360 vector<IMessagePtr> Messaging::querySmsMmsMessages(const std::string& queryString){
361 // LOGD("<<< queryString:[%s]" ,queryString.c_str());
363 vector<IMessagePtr> retVal;
364 std::string tempString = "";
365 // MSG_LIST_S message_list = {0, NULL};
366 msg_struct_list_s message_list = {0,};
367 MessageStorageReader reader;
370 msg_error_t res = MSG_ERR_UNKNOWN;
372 reader.MsgStoConnectDB();
373 res = reader.queryMessage(queryString, tempString, &message_list);
375 if (MSG_SUCCESS != res) {
376 LoggerE("msg_get_folder_view_list failed " << res);
377 Throw(WrtDeviceApis::Commons::PlatformException);
379 reader.MsgStoDisconnectDB();
381 retVal = createVectorFromeMessageList(message_list);
382 reader.msg_release_list_struct_private(&message_list);
383 }Catch(WrtDeviceApis::Commons::PlatformException) {
384 LoggerE("Problem with message creation, cleaning");
385 if (message_list.nCount) {
386 reader.msg_release_list_struct_private(&message_list);
394 vector<IMessagePtr> Messaging::querySmsMmsMessages(const std::string& queryString, const std::string& orderLimitString){
395 // LOGD("<<< queryString:[%s]", queryString.c_str());
396 // LOGD("<<< orderLimitString:[%s]", orderLimitString.c_str());
398 vector<IMessagePtr> retVal;
399 // MSG_LIST_S message_list = {0, NULL};
400 msg_struct_list_s message_list = {0,};
401 MessageStorageReader reader;
404 msg_error_t res = MSG_ERR_UNKNOWN;
406 reader.MsgStoConnectDB();
407 res = reader.queryMessage(queryString, orderLimitString, &message_list);
409 if (MSG_SUCCESS != res) {
410 LoggerE("msg_get_folder_view_list failed " << res);
411 Throw(WrtDeviceApis::Commons::PlatformException);
413 reader.MsgStoDisconnectDB();
415 retVal = createVectorFromeMessageList(message_list);
416 LoggerD("<<< message_list.nCount:[" << message_list.nCount <<"]");
418 reader.msg_release_list_struct_private(&message_list);
419 }Catch(WrtDeviceApis::Commons::PlatformException) {
420 LoggerE("Problem with message creation, cleaning");
421 if (message_list.nCount) {
422 reader.msg_release_list_struct_private(&message_list);
431 vector<IConversationPtr> Messaging::querySmsMmsConversation(const std::string& sqlWhereClause, const std::string& orderLimitString){
432 // LOGD("sqlWhereClause:[%s]", sqlWhereClause.c_str());
433 // LOGD("<<< orderLimitString:[%s]", orderLimitString.c_str());
435 std::vector<IConversationPtr> recVec;
436 // MSG_THREAD_VIEW_LIST_S threadViewList;
437 msg_struct_list_s threadViewList;
439 msg_error_t res = MSG_ERR_UNKNOWN;
441 MessageStorageReader reader;
442 reader.MsgStoConnectDB();
443 res = reader.queryConversation(sqlWhereClause, orderLimitString, &threadViewList);
445 if (MSG_SUCCESS != res) {
446 LoggerE("queryConversation failed:" << res);
447 Throw(WrtDeviceApis::Commons::PlatformException);
449 reader.MsgStoDisconnectDB();
451 recVec = createVectorFromeThreadViewList(threadViewList);
453 reader.msg_release_list_struct_private(&threadViewList);
459 vector<IConversationPtr> Messaging::queryEmailConversation(const std::string& sqlWhereClause){
460 // LOGD("sqlWhereClause:[%s]",sqlWhereClause.c_str());
462 std::vector<IConversationPtr> emailResultVector;
463 email_mail_list_item_t* mailList = NULL;
464 int mailListCount = 0;
466 errCode = email_query_mail_list(const_cast<char*>(sqlWhereClause.c_str()), &mailList, &mailListCount);
468 if(errCode != EMAIL_ERROR_NONE){
469 LoggerE("[ERROR]email_query_mail_list failed:" << errCode);
470 printErrorMessage(errCode);
472 LoggerD("message found mailListCount:" << mailListCount);
473 std::set<int> checkUnique;
475 for(int i=0; i<mailListCount; i++){
476 if(mailList[i].mail_id != mailList[i].thread_id)
478 LoggerD("skip mail");
479 LoggerD("mailList[i].mail_id: " << mailList[i].mail_id);
480 LoggerD("mailList[i].thread_id:" << mailList[i].thread_id);
483 if (checkUnique.find(mailList[i].thread_id) == checkUnique.end()){
484 checkUnique.insert(mailList[i].thread_id);
485 IConversationPtr convPtr(new Conversation(mailList[i].thread_id, EMAIL));
488 LoggerD("mailList[i].thread_id:[" << mailList[i].thread_id << "]");
489 LoggerD("mailList[i].full_address_from:[" << mailList[i].full_address_from << "]");
490 LoggerD("mailList[i].email_address_sender : [" << mailList[i].email_address_sender <<"]");
491 LoggerD("mailList[i].subject:[" << mailList[i].subject << "]");
492 LoggerD("mailList[i].preview_text:[" << mailList[i].preview_text << "]");
493 LoggerD("mailList[i].flags_seen_field:[" << mailList[i].flags_seen_field << "]");
494 LoggerD("mailList[i].priority:[" << mailList[i].priority<< "]");
496 if (convPtr->getResult() == true)
498 emailResultVector.push_back(convPtr);
504 if (mailList != NULL){
509 return emailResultVector;
512 vector<IMessagePtr> Messaging::queryEmailMessage(const std::string& sqlWhereClause){
513 // LOGD("sqlWhereClause:[%s]", sqlWhereClause.c_str());
515 vector<IMessagePtr> emailResultVector;
517 email_mail_list_item_t* mailList = NULL;
518 int mailListCount = 0;
520 errCode = email_query_mail_list(const_cast<char*>(sqlWhereClause.c_str()), &mailList, &mailListCount);
522 if(errCode != EMAIL_ERROR_NONE){
523 LoggerE("[ERROR]email_query_mail_list failed:" << errCode);
524 printErrorMessage(errCode);
526 LoggerD("message found mailListCount:" << mailListCount);
528 for(int i=0; i<mailListCount; i++){
529 //IMessagePtr msg = MessageFactory::createMessage(EMAIL, mailList[i].mail_id);
530 IMessagePtr msg = MessageFactory::createEmailMessage(mailList[i].account_id, mailList[i].mail_id);
533 LoggerD("mailList[i].full_address_from:[" << mailList[i].full_address_from << "]");
534 LoggerD("mailList[i].email_address_sender : [" << mailList[i].email_address_sender <<"]");
535 //LoggerD("mailList[i].datetime:[" << mailList[i].datetime << "]");
536 LoggerD("mailList[i].subject:[" << mailList[i].subject << "]");
537 // LoggerD("mailList[i].mailbox_name:[" << mailList[i].mailbox_name << "]");
538 LoggerD("mailList[i].preview_text:[" << mailList[i].preview_text << "]");
539 LoggerD("mailList[i].flags_seen_field:[" << mailList[i].flags_seen_field << "]");
540 LoggerD("mailList[i].priority:[" << mailList[i].priority<< "]");
542 emailResultVector.push_back(msg);
546 if (mailList != NULL) {
551 return emailResultVector;
554 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter){
557 vector<IMessagePtr> retVal;
558 std::string filterSql;
560 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator());
562 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
563 filter->travel(filterVisitor, 0);
564 filterSql = queryGenerator->getQuery();
565 // LOGD("filterSql:[%s]", filterSql.c_str());
567 int messageType = queryGenerator->getMessageType();
570 LoggerD("message type is EMAIL:[" << messageType <<"]");
571 retVal = queryEmailMessage(filterSql);
576 LoggerD("message type is SMS or MMS:[" << messageType <<"]");
577 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
578 filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
579 filter->travel(filterVisitor);
580 filterSql = queryGenerator->getQuery();
581 retVal = querySmsMmsMessages(filterSql);
585 LoggerE("[ERROR] >>> invlid message type:[" << messageType <<"]");
595 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter, const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset)
599 vector<IMessagePtr> retVal;
600 std::string filterSql;
602 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator(sortMode, limit, offset));
604 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
605 filter->travel(filterVisitor, 0);
606 filterSql = queryGenerator->getQuery();
607 // LOGD("filterSql:[%s]", filterSql.c_str());
609 int messageType = queryGenerator->getMessageType();
612 LoggerD("message type is EMAIL:[" << messageType <<"]");
613 retVal = queryEmailMessage(filterSql);
618 LoggerD("message type is SMS or MMS:[" << messageType <<"]");
619 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
620 filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
621 filter->travel(filterVisitor);
622 filterSql = queryGenerator->getQuery();
623 retVal = querySmsMmsMessages(filterSql);
627 MsgLoggerE("[ERROR] >>> invlid message type:[" << messageType <<"]");
635 vector<IMessagePtr> Messaging::findMessages(const DeviceAPI::Tizen::FilterPtr& filter, const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset, const int type)
639 vector<IMessagePtr> retVal;
640 std::string filterSql;
641 std::string orderLimitSql ="";
642 std::string emailFilterSql;
643 std::string typeAndString = "AND A.MAIN_TYPE=";
644 std::string typeString = "A.MAIN_TYPE=";
646 MessageQueryGeneratorPtr queryGenerator(new MessageQueryGenerator(sortMode, limit, offset, type));
648 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
649 filter->travel(filterVisitor, 0);
650 filterSql = queryGenerator->getQuery();
651 orderLimitSql = queryGenerator->getOrderLimit();
652 // //LOGD("filterSql:[%s]", filterSql.c_str());
653 // LOGD("filterSql:[%s]", filterSql.c_str());
654 // LOGD("orderLimitSql:[%s]", orderLimitSql.c_str());
656 int messageType = queryGenerator->getMessageType();
657 if(messageType != -1)
659 if(messageType != type)
661 LoggerD("filter messageType and service msg type is diff");
662 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
667 LoggerD("message type is EMAIL:[" << messageType <<"]");
668 emailFilterSql = filterSql + orderLimitSql;
669 // LOGD("filterSql:[%s]", emailFilterSql.c_str());
670 retVal = queryEmailMessage(emailFilterSql);
674 LoggerD("message type is SMS :[" << messageType <<"]");
675 typeString.append("1");
676 typeAndString.append("1");
677 if(filterSql.length() == 0)
679 filterSql.append(typeString);
680 // LOGD("filterSql:[%s]", filterSql.c_str());
684 filterSql.append(typeAndString);
685 // LOGD("filterSql:[%s]", filterSql.c_str());
687 // LOGD("filterSql:[%s]", filterSql.c_str());
688 LoggerD("orderLimitSql.length():[" << orderLimitSql.length() <<"]");
689 retVal = querySmsMmsMessages(filterSql, orderLimitSql);
690 // LOGD("filterSql:[%s]", filterSql.c_str());
693 LoggerD("message type is MMS:[" << messageType <<"]");
694 typeString.append("2");
695 typeAndString.append("2");
696 if(filterSql.length() == 0)
698 filterSql.append(typeString);
699 // LOGD("filterSql:[%s]", filterSql.c_str());
703 filterSql.append(typeAndString);
704 // LOGD("filterSql:[%s]", filterSql.c_str());
706 // LOGD("filterSql:[%s]", filterSql.c_str());
707 LoggerD("orderLimitSql.length():[" << orderLimitSql.length() <<"]");
708 retVal = querySmsMmsMessages(filterSql, orderLimitSql);
709 // LOGD("filterSql:[%s]", filterSql.c_str());
713 MsgLoggerE("[ERROR] >>> invlid message type:[" << messageType <<"]");
722 vector<string> Messaging::getMessageIds(MessageType msgType,
727 return getSmsIds(folder);
729 return getMmsIds(folder);
731 return getEmailIds(folder);
733 LoggerE("not supported message type");
734 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
738 vector<string> Messaging::getSmsIds(FolderType folder)
740 vector<string> retVal;
741 msg_message_t msg = msg_new_message();
742 MSG_LIST_S folder_list_view = { 0, NULL };
746 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
747 msg_error_t res = MSG_ERR_UNKNOWN;
748 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
749 res = msg_get_folder_view_list(
750 MsgGetCommonHandle(), platformFolder, &sort_rules,
753 if (MSG_SUCCESS != res) {
754 LoggerE("msg_Get_folder_view_list failed" << res);
755 Throw(WrtDeviceApis::Commons::PlatformException);
758 for (int i = 0; i < folder_list_view.nCount; i++) {
760 msg_get_message_type(folder_list_view.
762 int l_msgId = msg_get_message_id(
763 folder_list_view.msgInfo[i]);
764 ostringstream stream;
766 retVal.push_back(stream.str());
770 msg_release_list_struct(&folder_list_view);
773 Catch(WrtDeviceApis::Commons::PlatformException) {
774 LoggerE("Problem with message creation, cleaning");
775 if (folder_list_view.nCount) {
776 msg_release_list_struct(&folder_list_view);
779 msg_release_message(&msg);
787 vector<string> Messaging::getMmsIds(FolderType folder)
789 vector<string> retVal;
790 msg_message_t msg = msg_new_message();
791 MSG_LIST_S folder_list_view = { 0, NULL };
795 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
796 msg_error_t res = MSG_ERR_UNKNOWN;
797 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
798 res = msg_get_folder_view_list(
799 MsgGetCommonHandle(), platformFolder, &sort_rules,
802 if (MSG_SUCCESS != res) {
803 LoggerE("msg_Get_folder_view_list failed" << res);
804 Throw(WrtDeviceApis::Commons::PlatformException);
807 for (int i = 0; i < folder_list_view.nCount; i++) {
809 msg_get_message_type(folder_list_view.
811 int l_msgId = msg_get_message_id(
812 folder_list_view.msgInfo[i]);
813 ostringstream stream;
815 retVal.push_back(stream.str());
819 msg_release_list_struct(&folder_list_view);
822 Catch(WrtDeviceApis::Commons::PlatformException) {
823 LoggerE("Problem with message creation, cleaning");
824 if (folder_list_view.nCount) {
825 msg_release_list_struct(&folder_list_view);
828 msg_release_message(&msg);
836 vector<string> Messaging::getEmailIds(FolderType folder)
838 vector<string> retVal;
842 Throw(WrtDeviceApis::Commons::UnknownException);
847 vector<EmailAccountInfo> Messaging::getEmailAccounts() const
850 email_account_t* accounts = NULL;
853 if (!email_get_account_list(&accounts, &count)) {
854 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Couldn't get e-mail accounts.");
857 LoggerE( "count : " << count);
860 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "No e-mail account found.");
863 vector<EmailAccountInfo> result;
864 for (int i = 0; i < count; ++i)
866 if(accounts[i].user_display_name != NULL)
868 LoggerE("server user name is NULL");
869 EmailAccountInfo account(accounts[i].account_id,
870 accounts[i].user_display_name,
871 accounts[i].user_email_address);
872 result.push_back(account);
876 LoggerE("normal case");
877 std::string Unknown = "UNKNOWN";
878 EmailAccountInfo account(accounts[i].account_id,
880 accounts[i].user_email_address);
881 result.push_back(account);
885 if (accounts != NULL) {
886 email_free_account(&accounts, count);
891 Catch(WrtDeviceApis::Commons::PlatformException) {
892 if (accounts != NULL) {
893 email_free_account(&accounts, count);
895 LoggerE("PlatformException");
896 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "No e-mail account found.");
898 Catch(WrtDeviceApis::Commons::UnknownException) {
899 if (accounts != NULL) {
900 email_free_account(&accounts, count);
902 LoggerE("UnknownException");
903 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Couldn't convert e-mail account id");
907 int Messaging::getEmailAccountId(const std::string& account)
910 string tmpAccount = account;
911 email_account_t *pAccountArray = NULL;
916 if (account.empty()) {
917 tmpAccount = getCurrentEmailAccount().getAddress();
918 if (tmpAccount.empty()) {
920 "current email account is not set, possible that no account created");
921 Throw(WrtDeviceApis::Commons::PlatformException);
925 if (!email_get_account_list(&pAccountArray, &iCount)) {
926 LoggerE("email_get_account_list error");
927 Throw(WrtDeviceApis::Commons::PlatformException);
931 LoggerE("no email account exist");
932 Throw(WrtDeviceApis::Commons::PlatformException);
935 for (int i = 0; i < iCount; i++) {
936 string tmp = pAccountArray[i].user_email_address;
937 if (tmp == tmpAccount) {
938 m_currentEmailAccountId = pAccountArray[i].account_id;
939 retVal = m_currentEmailAccountId;
944 if (0 == m_currentEmailAccountId) {
945 LoggerE("wrong email account ID");
946 Throw(WrtDeviceApis::Commons::PlatformException);
949 if (pAccountArray != NULL) {
950 LoggerD("free account, ptr=" << pAccountArray);
951 email_free_account(&pAccountArray, iCount);
955 LoggerE("no email account created");
956 Throw(WrtDeviceApis::Commons::PlatformException);
960 Catch(WrtDeviceApis::Commons::PlatformException) {
961 LoggerE("exception catch, platform exception");
962 if (pAccountArray != NULL) {
963 email_free_account(&pAccountArray, iCount);
971 void Messaging::fetchEmailHeaders()
974 email_mailbox_t *mailbox = NULL;
977 mailbox = static_cast<email_mailbox_t*>(calloc(sizeof (email_mailbox_t), 1));
979 LoggerE("calloc failed");
982 mailbox->account_id = m_currentEmailAccountId;
983 mailbox->mailbox_name = strdup(EMAIL_INBOX_NAME);
984 // if (EMAIL_ERROR_NONE != email_sync_header(mailbox, &handle)) {
985 if (EMAIL_ERROR_NONE != email_sync_header(mailbox->account_id, 0, &handle)) {
986 LoggerE("email_sync_header failed");
988 error = email_free_mailbox(&mailbox, 1);
989 LoggerE("email_free_mailbox : " << error);
993 int Messaging::convertFolderToPlatform(const FolderType folder)
995 msg_folder_id_t platfromFolderId;
998 platfromFolderId = MSG_INBOX_ID;
1001 platfromFolderId = MSG_DRAFT_ID;
1004 platfromFolderId = MSG_OUTBOX_ID;
1007 platfromFolderId = MSG_SENTBOX_ID;
1010 // intentionally not break in platform is no spambox
1012 LoggerE("Invalid folder: " << folder);
1013 Throw(WrtDeviceApis::Commons::PlatformException);
1016 return platfromFolderId;
1019 int Messaging::convertFolderToPlatform(const std::string &folder)
1021 // MSG_FOLDER_LIST_S folderList = { 0, NULL };
1028 msg_get_folder_list(MsgGetCommonHandle(), &folderList)) {
1029 LoggerE("msg_get_folder_list error");
1030 Throw(WrtDeviceApis::Commons::PlatformException);
1032 for (int i = 0; i < folderList.nCount; ++i) {
1033 if (MSG_FOLDER_TYPE_USER_DEF ==
1034 folderList.folderInfo[i].folderType &&
1035 NULL != folderList.folderInfo[i].folderName &&
1036 folder == folderList.folderInfo[i].folderName) {
1037 result = folderList.folderInfo[i].folderId;
1042 Catch(WrtDeviceApis::Commons::PlatformException) {
1043 if (folderList.nCount) {
1044 msg_release_folder_list(&folderList);
1048 if (folderList.nCount) {
1049 msg_release_folder_list(&folderList);
1055 void Messaging::addOnMessageReceived(
1056 const EmitterMessageReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1064 LoggerD("funtionIndex = " << funtionIndex);
1065 bool isValidFilter = validateFilter(filter, funtionIndex);
1066 if(isValidFilter == false){
1067 LoggerE("[ERROR]this filter is invalid");
1068 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1071 Catch(WrtDeviceApis::Commons::PlatformException) {
1076 LoggerD("filter is NULL");
1080 m_onMessageReceived.attach(emitter);
1081 EmittersMessageReceived::LockType lock = m_onMessageReceived.getLock();
1082 if ((m_onMessageReceived.size() == 1)&&((m_onConversationReceived.size() + m_onFolderReceived.size()) == 0)) {
1083 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1084 new MsgServiceHandleMgr());
1087 err = msg_reg_storage_change_callback(
1088 m_onMessageReceivedHandleMgr->getHandle(),
1089 onMessageStorageChanged,
1092 Catch(WrtDeviceApis::Commons::PlatformException){
1093 LoggerD("addOnMessageReceived failed");
1094 Throw(WrtDeviceApis::Commons::PlatformException);
1097 if (err != MSG_SUCCESS) {
1098 LoggerE("Couldn't register on MMS received callback, err=" << err);
1101 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1105 void Messaging::addOnMessageReceived(
1106 const EmitterConversationReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1114 LoggerD("funtionIndex = " << funtionIndex);
1115 bool isValidFilter = validateFilter(filter, funtionIndex);
1116 if(isValidFilter == false){
1117 LoggerE("[ERROR]this filter is invalid");
1118 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1121 Catch(WrtDeviceApis::Commons::PlatformException) {
1126 LoggerD("filter is NULL");
1130 m_onConversationReceived.attach(emitter);
1131 EmittersConversationReceived::LockType lock = m_onConversationReceived.getLock();
1132 if ((m_onConversationReceived.size() == 1)&&((m_onMessageReceived.size() + m_onFolderReceived.size()) == 0)) {
1133 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1134 new MsgServiceHandleMgr());
1137 err = msg_reg_storage_change_callback(
1138 m_onMessageReceivedHandleMgr->getHandle(),
1139 onMessageStorageChanged,
1142 Catch(WrtDeviceApis::Commons::PlatformException){
1143 LoggerD("addOnMessageReceived failed");
1144 Throw(WrtDeviceApis::Commons::PlatformException);
1147 if (err != MSG_SUCCESS) {
1148 LoggerE("Couldn't register on MMS received callback, err=" << err);
1151 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1155 void Messaging::addOnMessageReceived(
1156 const EmitterFolderReceivedPtr& emitter, const DeviceAPI::Tizen::FilterPtr& filter, int funtionIndex)
1164 LoggerD("funtionIndex = " << funtionIndex);
1165 bool isValidFilter = validateFilter(filter, funtionIndex);
1166 if(isValidFilter == false){
1167 LoggerE("[ERROR]this filter is invalid");
1168 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1171 Catch(WrtDeviceApis::Commons::PlatformException) {
1176 LoggerD("filter is NULL");
1180 m_onFolderReceived.attach(emitter);
1181 EmittersFolderReceived::LockType lock = m_onFolderReceived.getLock();
1182 if ((m_onFolderReceived.size() == 1)&&((m_onMessageReceived.size() + m_onConversationReceived.size()) == 0)) {
1183 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(
1184 new MsgServiceHandleMgr());
1189 err = msg_reg_storage_change_callback(
1190 m_onMessageReceivedHandleMgr->getHandle(),
1191 onMessageStorageChanged,
1194 Catch(WrtDeviceApis::Commons::PlatformException){
1195 LoggerD("addOnMessageReceived failed");
1196 Throw(WrtDeviceApis::Commons::PlatformException);
1199 if (err != MSG_SUCCESS) {
1200 LoggerE("Couldn't register on MMS received callback, err=" << err);
1201 // Throw(WrtDeviceApis::Commons::UnknownException);
1204 m_dbusConnection->open(DBUS_BUS_SYSTEM);
1208 bool Messaging::validateFilter(const DeviceAPI::Tizen::FilterPtr& filter, const int funtionIndex){
1211 bool retBool = false;
1212 LoggerD("funtionIndex = " << funtionIndex);
1215 if(funtionIndex == 0)
1217 StorageChangesMessageFilterValidatorPtr validatorMsg =
1218 StorageChangesMessageFilterValidatorFactory::getStorageChangesMessageFilterValidator();
1220 FilterValidatorPtr filterValidatorMsg = DPL::StaticPointerCast<FilterValidator>(validatorMsg);
1221 retBool = filter->validate(filterValidatorMsg);
1222 }else if(funtionIndex == 1)
1224 StorageChangesConversationFilterValidatorPtr validatorConv =
1225 StorageChangesConversationFilterValidatorFactory::getStorageChangesConversationFilterValidator();
1227 FilterValidatorPtr filterValidatorConv = DPL::StaticPointerCast<FilterValidator>(validatorConv);
1228 retBool = filter->validate(filterValidatorConv);
1229 }else if(funtionIndex == 2)
1231 StorageChangesFolderFilterValidatorPtr validatorFolder =
1232 StorageChangesFolderFilterValidatorFactory::getStorageChangesFolderFilterValidator();
1234 FilterValidatorPtr filterValidatorFolder = DPL::StaticPointerCast<FilterValidator>(validatorFolder);
1235 retBool = filter->validate(filterValidatorFolder);
1238 if(retBool == false){
1239 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
1242 LoggerD("filter is NULL");
1246 LoggerD(">>> retBool:" << retBool);
1252 void Messaging::removeOnMessageMsgReceived(EmitterMessageReceived::IdType id)
1255 m_onMessageReceived.detach(id);
1256 EmittersMessageReceived::LockType lock = m_onMessageReceived.getLock();
1257 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1258 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1259 m_dbusConnection->close();
1263 void Messaging::removeOnMessageConvReceived(EmitterConversationReceived::IdType id)
1266 m_onConversationReceived.detach(id);
1267 EmittersConversationReceived::LockType lock = m_onConversationReceived.getLock();
1268 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1269 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1270 m_dbusConnection->close();
1274 void Messaging::removeOnMessageFolderReceived(EmitterFolderReceived::IdType id)
1277 m_onFolderReceived.detach(id);
1278 EmittersFolderReceived::LockType lock = m_onFolderReceived.getLock();
1279 if ((m_onMessageReceived.size()+m_onConversationReceived.size()+m_onFolderReceived.size()) == 0) {
1280 m_onMessageReceivedHandleMgr = MsgServiceHandleMgrPtr(NULL);
1281 m_dbusConnection->close();
1285 void Messaging::OnEventReceived(const DBus::MessageEvent& event)
1288 EventMessageReceivedPtr jsEvent(new EventMessageReceived());
1289 DBus::MessagePtr message = event.GetArg0();
1293 jsEvent->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::PlatformException);
1294 m_onMessageReceived.emit(jsEvent);
1298 if (message->getInterface() == DBUS_INTERFACE_EMAIL_RECEIVED)
1300 int account_id = 0, mail_id = 0, thread_id = 0, status = 0;
1302 email_mailbox_t m_mailboxes;
1304 DBus::Message::ReadIterator it = message->getReadIterator();
1305 for (int i = 0; it->isValid(); it->next(), ++i)
1307 if ((i == 0) && (it->getArgType() == DBUS_TYPE_INT32))
1309 status = it->getInt();
1310 LoggerI("status: " << status);
1312 else if ((i == 1) && (it->getArgType() == DBUS_TYPE_INT32))
1314 account_id = it->getInt();
1315 LoggerI("account_id: " << account_id);
1317 else if ((i == 2) && (it->getArgType() == DBUS_TYPE_INT32))
1319 mail_id = it->getInt();
1320 LoggerI("mail_id: " << mail_id);
1322 else if ((i == 3) && (it->getArgType() == DBUS_TYPE_STRING))
1324 name = it->getString();
1325 LoggerI("name: " << name);
1327 else if ((i == 4) && (it->getArgType() == DBUS_TYPE_INT32))
1329 thread_id = it->getInt();
1330 LoggerI("thread_id: " << thread_id);
1334 jsEvent->setMsg_Type(EMAIL);
1335 jsEvent->setAccount_Id(account_id);
1337 if ((mail_id > 0) && (NOTI_MAIL_ADD == status))
1338 { // TODO also RECEIVE_THREAD_ITEM?
1339 LoggerI("Email received. mail_id: " << mail_id);
1341 IMessagePtr msg = MessageFactory::createMessage(EMAIL, mail_id);
1342 IConversationPtr conversation(new Conversation(thread_id, EMAIL));
1344 // TODO Temporary fix: ignore messages from OUTBOX, SENTBOX & DRAFTBOX -> most probably we added them
1345 FolderType folder = msg->getCurrentFolder();
1346 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1348 LoggerI("Added message is in folder: " << folder);
1350 jsEvent->setMessage(msg);
1351 jsEvent->setConversation(conversation);
1353 if(m_onMessageReceived.size() > 0){
1354 m_onMessageReceived.emit(jsEvent);
1357 if(m_onConversationReceived.size() > 0){
1358 if(mail_id != thread_id)
1360 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1362 m_onConversationReceived.emit(jsEvent);
1365 else if ((name.size() > 0) && (NOTI_MAIL_DELETE == status))
1366 { // TODO also RECEIVE_THREAD_ITEM?
1367 LoggerI("name.size(): " << name.size());
1369 unsigned foundLocation = name.rfind(0x01);
1370 LoggerI("foundLocation: " << foundLocation);
1371 if(foundLocation != std::string::npos)
1373 LoggerI("name: " << name);
1374 name = name.substr(foundLocation+1);
1375 LoggerI("name: " << name);
1378 std::vector<std::string> strIds = String::split(name, ',');
1380 std::stringstream stream;
1381 for (std::vector<std::string>::iterator it = strIds.begin(); it != strIds.end(); ++it)
1383 LoggerD("ID is :" << *it);
1385 if ( (*it).length() > 0 ) //vaild id
1391 IMessagePtr msg = MessageFactory::createMessage(EMPTY_MESSAGE, id);
1392 IConversationPtr conversation(new Conversation(mail_id, EMPTY_EMAIL_CONVERSATION));
1394 FolderType folder = msg->getCurrentFolder();
1395 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1397 if (true) { // if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1398 jsEvent->setMessage(msg);
1399 jsEvent->setConversation(conversation);
1400 if(m_onMessageReceived.size() > 0){
1401 m_onMessageReceived.emit(jsEvent);
1405 LoggerW("New email message in ignored folder: " << folder);
1413 else if ((mail_id > 0) && (NOTI_MAIL_UPDATE == status))
1414 { // TODO also RECEIVE_THREAD_ITEM?
1415 LoggerI("Email received. mail_id: " << mail_id);
1417 IMessagePtr msg = MessageFactory::createMessage(EMAIL, mail_id);
1418 IConversationPtr conversation(new Conversation(mail_id, EMAIL));
1420 FolderType folder = msg->getCurrentFolder();
1421 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1423 if (true) { // if (OUTBOX != folder && SENTBOX != folder && DRAFTBOX != folder)
1424 jsEvent->setMessage(msg);
1425 jsEvent->setConversation(conversation);
1426 if(m_onMessageReceived.size() > 0)
1427 m_onMessageReceived.emit(jsEvent);
1428 if(m_onConversationReceived.size() > 0)
1429 m_onConversationReceived.emit(jsEvent);
1431 LoggerW("New email message in ignored folder: " << folder);
1434 else if ((mail_id > 0) && (NOTI_THREAD_DELETE == status))
1435 { // TODO also RECEIVE_THREAD_ITEM?
1436 LoggerI("Email received. delete thread Id : " << mail_id);
1438 IConversationPtr conversation(new Conversation(mail_id, EMPTY_EMAIL_CONVERSATION));
1439 conversation->setConvId(mail_id);
1440 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1441 jsEvent->setConversation(conversation);
1443 if(m_onConversationReceived.size() > 0){
1444 m_onConversationReceived.emit(jsEvent);
1447 else if (NOTI_MAILBOX_ADD == status)
1449 LoggerI("Emailbox received. account Id: " << account_id);
1450 LoggerI("name Id: " << name);
1451 LoggerI("mailBox Id: " << mail_id);
1453 email_mailbox_t* mail_box = NULL;
1455 if (EMAIL_ERROR_NONE != email_get_mailbox_by_mailbox_id(mail_id, &mail_box)) {
1456 LoggerE("Couldn't retrieve message or it has been malformed.");
1459 if(mail_box != NULL)
1461 m_mailboxes = *mail_box;
1462 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1463 jsEvent->setMessageFolder(folderPtr);
1464 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1465 if(m_onFolderReceived.size() > 0)
1467 m_onFolderReceived.emit(jsEvent);
1474 if( EMAIL_ERROR_NONE != email_free_mailbox( &mail_box , 1) )
1475 LoggerD("fail to email_free_mailbox - err ");
1479 else if ((NOTI_MAILBOX_UPDATE == status) || (NOTI_MAILBOX_FIELD_UPDATE == status) || (NOTI_MAILBOX_RENAME == status))
1481 LoggerI("Emailbox received. account Id: " << account_id);
1482 LoggerI("name Id: " << name);
1483 LoggerI("mailBox Id: " << mail_id);
1485 email_mailbox_t* mail_box = NULL;
1487 if (EMAIL_ERROR_NONE != email_get_mailbox_by_mailbox_id(mail_id, &mail_box)) {
1488 LoggerE("Couldn't retrieve message or it has been malformed.");
1491 if(mail_box != NULL)
1493 m_mailboxes = *mail_box;
1495 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1496 jsEvent->setMessageFolder(folderPtr);
1497 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1499 if(m_onFolderReceived.size() > 0)
1501 m_onFolderReceived.emit(jsEvent);
1507 if( EMAIL_ERROR_NONE != email_free_mailbox( &mail_box , 1) )
1508 LoggerD("fail to email_free_mailbox - err ");
1511 else if (NOTI_MAILBOX_DELETE == status)
1513 LoggerI("Emailbox received. account Id: " << account_id);
1514 LoggerI("name Id: " << name);
1515 LoggerI("mailBox Id: " << mail_id);
1517 // make empty mailbox
1518 m_mailboxes.mailbox_id = mail_id;
1519 m_mailboxes.account_id = account_id;
1520 m_mailboxes.alias = (char *)"";
1521 m_mailboxes.mailbox_name = (char *)"";
1523 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
1524 jsEvent->setMessageFolder(folderPtr);
1525 jsEvent->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1527 if(m_onFolderReceived.size() > 0)
1529 m_onFolderReceived.emit(jsEvent);
1534 LoggerE("Couldn't retrieve message or it has been malformed.");
1537 else // DBUS_INTERFACE_EMAIL_RECEIVED
1539 LoggerD("Wrong DBus interface, skipping it.");
1544 void Messaging::onMessageStorageChanged(msg_handle_t handle,
1545 msg_storage_change_type_t storageChangeType,
1546 msg_id_list_s *pMsgIdList,
1552 msg_error_t err = MSG_SUCCESS;
1553 msg_struct_t msg = NULL;
1554 msg_struct_t sendOpt = NULL;
1556 if(storageChangeType == MSG_STORAGE_CHANGE_CONTACT)
1558 LoggerD("storageChangeType is MSG_STORAGE_CHANGE_CONTACT");
1562 Messaging* this_ = static_cast<Messaging*>(data);
1566 int msgCount = pMsgIdList->nCount;
1567 LoggerD("msgCount = "<< msgCount);
1569 for(int index = 0; index < msgCount; index++)
1572 LoggerD("storageChangeType = "<< storageChangeType);
1574 if(storageChangeType == MSG_STORAGE_CHANGE_DELETE)
1576 IMessagePtr message = MessageFactory::createMessage(EMPTY_MESSAGE, pMsgIdList->msgIdList[index]);
1577 IConversationPtr conversation(new Conversation());
1578 EventMessageReceivedPtr event(new EventMessageReceived());
1579 event->setMessage(message);
1580 event->setConversation(conversation);
1581 event->setMsg_Event_Type(EventMessageReceived::MSG_DELETED);
1582 event->setMsg_Type(EMPTY_MESSAGE);
1584 if(this_->m_onMessageReceived.size() > 0){
1585 this_->m_onMessageReceived.emit(event);
1587 if(this_->m_onConversationReceived.size() > 0){
1588 this_->m_onConversationReceived.emit(event);
1593 msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1594 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1596 err = msg_get_message(handle, pMsgIdList->msgIdList[index], msg, sendOpt);
1598 if (err != MSG_SUCCESS)
1600 LoggerD("Get Message Failed!");
1601 LoggerD("err" << err);
1602 msg_release_struct(&msg);
1603 msg_release_struct(&sendOpt);
1609 msg_get_int_value(msg, MSG_MESSAGE_TYPE_INT, &msgType);
1610 LoggerD("msgType : " << msgType);
1611 if((msgType > MSG_TYPE_INVALID) && ( msgType <= MSG_TYPE_SMS_REJECT))
1613 if(msgType != MSG_TYPE_MMS_NOTI)
1616 msg_get_int_value(msg, MSG_MESSAGE_ID_INT, &msgId);
1617 IMessagePtr message = MessageFactory::createMessage(
1622 ISmsPtr sms = MessageFactory::convertToSms(message);
1623 IConversationPtr conversation(new Conversation(message->getId(), SMS));
1624 EventMessageReceivedPtr event(new EventMessageReceived());
1625 event->setMessage(message);
1626 event->setConversation(conversation);
1627 event->setMsg_Type(SMS);
1629 if(this_->m_onMessageReceived.size() > 0){
1630 if(storageChangeType == MSG_STORAGE_CHANGE_INSERT)
1632 LoggerD("MSG_STORAGE_CHANGE_INSERT");
1633 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1635 else if(storageChangeType == MSG_STORAGE_CHANGE_UPDATE)
1637 LoggerD("MSG_STORAGE_CHANGE_UPDATE");
1638 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1640 this_->m_onMessageReceived.emit(event);
1642 if(this_->m_onConversationReceived.size() > 0){
1644 LoggerD("Message Status = " << message->getMessageStatus());
1645 if((conversation->getMessageCount() == 1) && (storageChangeType == MSG_STORAGE_CHANGE_INSERT))
1648 LoggerD("MSG_STORAGE_CHANGE_INSERT");
1649 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1650 this_->m_onConversationReceived.emit(event);
1652 if(emitCheck == 0 && (message->getMessageStatus()!=MESSAGE_STATUS_SENT))
1654 LoggerD("MSG_STORAGE_CHANGE_INSERT, Conversation Count > 1 or MSG_STORAGE_CHANGE_UPDATE");
1655 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1656 this_->m_onConversationReceived.emit(event);
1662 LoggerE("Ignore this sms, this is mms noti.");
1665 else if((msgType >= MSG_TYPE_MMS) && (msgType <= MSG_TYPE_MMS_NOTI))
1667 if(msgType != MSG_TYPE_MMS_NOTI)
1670 int mmsDirection = 0;
1671 msg_get_int_value(msg, MSG_MESSAGE_ID_INT, &msgId);
1672 msg_get_int_value(msg, MSG_MESSAGE_DIRECTION_INT, &mmsDirection);
1673 IMessagePtr message = MessageFactory::createMessage(
1678 IMmsPtr mms = MessageFactory::convertToMms(message);
1679 IConversationPtr conversation(new Conversation(message->getId(), MMS));
1680 EventMessageReceivedPtr event(new EventMessageReceived());
1681 event->setMessage(message);
1682 event->setConversation(conversation);
1683 event->setMsg_Type(MMS);
1685 if(this_->m_onMessageReceived.size() > 0){
1686 if(storageChangeType == MSG_STORAGE_CHANGE_INSERT)
1688 LoggerD("MSG_STORAGE_CHANGE_INSERT");
1689 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1691 else if(storageChangeType == MSG_STORAGE_CHANGE_UPDATE)
1693 LoggerD("MSG_STORAGE_CHANGE_UPDATE");
1694 if(mmsDirection == 1) // check incomming mms
1696 LoggerD("mmsDirection == 1");
1697 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1701 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1704 this_->m_onMessageReceived.emit(event);
1706 if(this_->m_onConversationReceived.size() > 0){
1708 LoggerD("Message Status = " << message->getMessageStatus());
1709 if((conversation->getMessageCount() == 1) && (storageChangeType == MSG_STORAGE_CHANGE_INSERT))
1712 LoggerD("MSG_STORAGE_CHANGE_INSERT");
1713 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1714 this_->m_onConversationReceived.emit(event);
1716 if(emitCheck == 0 && (message->getMessageStatus()!=MESSAGE_STATUS_SENT))
1718 LoggerD("MSG_STORAGE_CHANGE_INSERT, Conversation Count > 1 or MSG_STORAGE_CHANGE_UPDATE");
1719 event->setMsg_Event_Type(EventMessageReceived::MSG_UPDATED);
1720 this_->m_onConversationReceived.emit(event);
1726 LoggerE("Ignore this mms, this is mms noti.");
1731 LoggerE("release sendOpt");
1732 msg_release_struct(&sendOpt);
1737 Catch(WrtDeviceApis::Commons::ConversionException) {
1738 LoggerE("Couldn't convert message to sms.");
1741 LoggerE("release msg : " << msg);
1742 msg_release_struct(&msg);
1746 LoggerE("release sendOpt");
1747 msg_release_struct(&sendOpt);
1750 Catch(WrtDeviceApis::Commons::PlatformException) {
1751 LoggerE("onMessageStorageChanged platform exception");
1754 LoggerE("release msg : " << msg);
1755 msg_release_struct(&msg);
1759 LoggerE("release sendOpt");
1760 msg_release_struct(&sendOpt);
1763 Catch(WrtDeviceApis::Commons::Exception) {
1764 LoggerE("onMessageStorageChanged Exception");
1767 LoggerE("release msg : " << msg);
1768 msg_release_struct(&msg);
1772 LoggerE("release sendOpt");
1773 msg_release_struct(&sendOpt);
1780 void Messaging::onSmsReceived(MSG_HANDLE_T handle,
1785 Messaging* this_ = static_cast<Messaging*>(data);
1788 if(msg_get_message_type(msg) != MSG_TYPE_MMS_NOTI)
1790 IMessagePtr message = MessageFactory::createMessage(
1794 ISmsPtr sms = MessageFactory::convertToSms(message);
1795 IConversationPtr conversation(new Conversation(message->getId(), SMS));
1797 EventMessageReceivedPtr event(new EventMessageReceived());
1798 event->setMessage(message);
1799 event->setConversation(conversation);
1800 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1801 this_->m_onMessageReceived.emit(event);
1805 LoggerE("Ignore this sms, this is mms noti.");
1808 Catch(WrtDeviceApis::Commons::ConversionException) {
1809 LoggerE("Couldn't convert message to sms.");
1814 void Messaging::onMmsReceived(MSG_HANDLE_T handle,
1819 Messaging* this_ = static_cast<Messaging*>(data);
1822 IMessagePtr message = MessageFactory::createMessage(
1826 IMmsPtr mms = MessageFactory::convertToMms(message);
1827 IConversationPtr conversation(new Conversation(message->getId(), MMS));
1828 EventMessageReceivedPtr event(new EventMessageReceived());
1829 event->setMessage(message);
1830 event->setConversation(conversation);
1831 event->setMsg_Event_Type(EventMessageReceived::MSG_ADDED);
1832 this_->m_onMessageReceived.emit(event);
1834 Catch(WrtDeviceApis::Commons::ConversionException) {
1835 LoggerE("Couldn't convert message to mms.");
1840 void Messaging::getNumberOfEmails(FolderType folder,
1846 email_mailbox_t mailbox = {};
1847 mailbox.account_id = 0; // means for all accounts
1848 mailbox.name = String::strdup(
1849 EmailConverter::toMailboxName(folder)
1852 int error = email_count_mail(&mailbox, read, unread);
1855 if (EMAIL_ERROR_NONE != error) {
1856 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
1857 "Couldn't get number of emails. [" << error << "]");
1863 void Messaging::getNumberOfSms(FolderType folder,
1867 getNumberOfSmsMms(folder, read, unread, SMS);
1870 void Messaging::getNumberOfMms(FolderType folder,
1874 getNumberOfSmsMms(folder, read, unread, MMS);
1877 void Messaging::getNumberOfSmsMms(FolderType folder,
1880 MessageType msgType)
1882 MSG_LIST_S folderListView = { 0, NULL };
1889 MSG_MESSAGE_TYPE_T msgTypePlatform;
1890 if (SMS == msgType) {
1891 msgTypePlatform = MSG_TYPE_SMS;
1892 } else if (MMS == msgType) {
1893 msgTypePlatform = MSG_TYPE_MMS;
1895 LoggerE("no supported message type in this method");
1896 Throw(WrtDeviceApis::Commons::PlatformException);
1899 msg_folder_id_t msgFolderId;
1902 msgFolderId = MSG_INBOX_ID;
1905 msgFolderId = MSG_OUTBOX_ID;
1908 msgFolderId = MSG_SENTBOX_ID;
1911 msgFolderId = MSG_DRAFT_ID;
1914 LoggerE("wrong folder type");
1915 Throw(WrtDeviceApis::Commons::PlatformException);
1919 const MSG_SORT_RULE_S sort_rules = { MSG_SORT_BY_DISPLAY_TIME, true };
1920 if (msg_get_folder_view_list(MsgGetCommonHandle(), msgFolderId,
1922 &folderListView) != MSG_SUCCESS) {
1924 "msg_get_folder_view_list empty or failed, msgFolderId=" <<
1926 Throw(WrtDeviceApis::Commons::PlatformException);
1928 // go thtough all message to check type of message
1929 LoggerD("msgCount=" << (int) folderListView.nCount);
1930 for (int msg_cnt = 0; msg_cnt < folderListView.nCount; msg_cnt++) {
1931 LoggerD("msgMainType=" <<
1932 (int) msg_get_message_type(folderListView.
1935 ", searching for = " << (int) msgTypePlatform);
1936 if (msgTypePlatform ==
1937 msg_get_message_type(folderListView.msgInfo[
1939 if (msg_is_read(folderListView.msgInfo[msg_cnt]))
1947 msg_release_list_struct(&folderListView);
1949 LoggerD("readed=" << *read << ", unReaded=" << *unread);
1952 Catch(WrtDeviceApis::Commons::PlatformException) {
1953 if (folderListView.nCount) {
1954 msg_release_list_struct(&folderListView);
1960 vector<IMessagePtr> Messaging::findSms(FolderType folder, const DeviceAPI::Tizen::FilterPtr& filter)
1964 vector<IMessagePtr> retVal;
1965 msg_message_t msg = msg_new_message();
1966 MSG_LIST_S folder_list_view = {0, NULL};
1969 const MSG_SORT_RULE_S sort_rules = {MSG_SORT_BY_DISPLAY_TIME, true};
1970 msg_error_t res = MSG_ERR_UNKNOWN;
1971 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
1972 res = msg_get_folder_view_list(MsgGetCommonHandle(), platformFolder, &sort_rules, &folder_list_view);
1974 if (MSG_SUCCESS != res) {
1975 LoggerE("msg_get_folder_view_list failed " << res);
1976 Throw(WrtDeviceApis::Commons::PlatformException);
1979 for (int i = 0; i < folder_list_view.nCount; i++) {
1980 if (MSG_TYPE_SMS == msg_get_message_type(folder_list_view.msgInfo[i])) {
1981 int l_msgId = msg_get_message_id(folder_list_view.msgInfo[i]);
1982 IMessagePtr msg = MessageFactory::createMessage(SMS, l_msgId);
1984 // if (!filter || !filter->isValid() ||
1985 // filter->compare(MessageFactory::convertToSms(msg))) {
1986 retVal.push_back(msg);
1991 msg_release_list_struct(&folder_list_view);
1992 }Catch(WrtDeviceApis::Commons::PlatformException) {
1993 LoggerE("Problem with message creation, cleaning");
1994 if (folder_list_view.nCount) {
1995 msg_release_list_struct(&folder_list_view);
1998 msg_release_message(&msg);
2007 vector<IMessagePtr> Messaging::findMms(FolderType folder,
2008 const DeviceAPI::Tizen::FilterPtr& filter)
2010 vector<IMessagePtr> retVal;
2011 msg_message_t msg = msg_new_message();
2012 MSG_LIST_S folder_list_view = {0, NULL};
2016 const MSG_SORT_RULE_S sort_rules = {MSG_SORT_BY_DISPLAY_TIME, true};
2017 msg_error_t res = MSG_ERR_UNKNOWN;
2018 const msg_folder_id_t platformFolder = convertFolderToPlatform(folder);
2019 res = msg_get_folder_view_list(
2020 MsgGetCommonHandle(), platformFolder, &sort_rules,
2023 if (MSG_SUCCESS != res) {
2024 LoggerE("msg_Get_folder_view_list failed" << res);
2025 Throw(WrtDeviceApis::Commons::PlatformException);
2028 for (int i = 0; i < folder_list_view.nCount; i++) {
2030 msg_get_message_type(folder_list_view.
2032 int l_msgId = msg_get_message_id(
2033 folder_list_view.msgInfo[i]);
2034 IMessagePtr msg = MessageFactory::createMessage(MMS, l_msgId);
2038 msg_release_list_struct(&folder_list_view);
2041 Catch(WrtDeviceApis::Commons::PlatformException) {
2042 LoggerE("Problem with message creation, cleaning");
2043 if (folder_list_view.nCount) {
2044 msg_release_list_struct(&folder_list_view);
2047 msg_release_message(&msg);
2055 void Messaging::createFolder(MessageType msgType,
2056 const string& userFolder)
2061 createMsgServiceFolder(userFolder);
2064 createEmailFolder(userFolder);
2067 LoggerE("msg not supported");
2068 Throw(WrtDeviceApis::Commons::UnknownException);
2072 void Messaging::createMsgServiceFolder(const std::string& userFolder)
2075 if (userFolder.length() > MAX_FOLDER_NAME_SIZE) {
2076 LoggerE("folder name to long");
2077 Throw(WrtDeviceApis::Commons::PlatformException);
2080 MSG_FOLDER_INFO_S folderInfo;
2082 folderInfo.folderId = 0;
2083 strncpy(folderInfo.folderName, userFolder.c_str(), userFolder.length());
2085 folderInfo.folderType = MSG_FOLDER_TYPE_USER_DEF;
2087 if (msg_add_folder(MsgGetCommonHandle(), &folderInfo) != MSG_SUCCESS) {
2088 LoggerE("msg_add_folder failed");
2089 Throw(WrtDeviceApis::Commons::PlatformException);
2094 void Messaging::createEmailFolder(const std::string& userFolder)
2098 Throw(WrtDeviceApis::Commons::UnknownException);
2101 void Messaging::deleteFolder(MessageType msgType,
2102 const string& userFolder)
2107 deleteMsgServiceFolder(userFolder);
2110 deleteEmailFolder(userFolder);
2113 LoggerE("msg not supported");
2114 Throw(WrtDeviceApis::Commons::UnknownException);
2118 void Messaging::deleteMsgServiceFolder(const string& userFolder)
2123 int platformFolderId = convertFolderToPlatform(userFolder);
2125 msg_delete_folder(MsgGetCommonHandle(), platformFolderId)) {
2126 LoggerE("msg_get_folder_list failed");
2127 Throw(WrtDeviceApis::Commons::PlatformException);
2130 Catch(WrtDeviceApis::Commons::PlatformException) {
2136 void Messaging::deleteEmailFolder(const string& userFolder)
2140 Throw(WrtDeviceApis::Commons::UnknownException);
2143 vector<string> Messaging::getFolderNames(MessageType msgType)
2148 return getFolderNamesMsgService();
2150 return getFolderNamesEmail();
2152 LoggerE("msg not supported");
2153 Throw(WrtDeviceApis::Commons::UnknownException);
2157 vector<string> Messaging::getFolderNamesMsgService()
2159 vector<string> retVal;
2160 // MSG_FOLDER_LIST_S msgFolderList = { 0, NULL }; // output data
2162 msg_struct_list_s msgFolderList = {0,};
2166 if (msg_get_folder_list(MsgGetCommonHandle(),
2167 &msgFolderList) != MSG_SUCCESS) {
2168 LoggerE("msg_get_folder_list failed");
2169 Throw(WrtDeviceApis::Commons::PlatformException);
2172 LoggerD("number of folder=" << msgFolderList.nCount);
2173 for (int i = 0; i < msgFolderList.nCount; i++) {
2174 LoggerD("folderName=" << msgFolderList.folderInfo[i].folderName);
2175 LoggerD("folderId=" << (int) msgFolderList.folderInfo[i].folderId);
2178 (int) msgFolderList.folderInfo[i].folderType);
2179 retVal.push_back(msgFolderList.folderInfo[i].folderName);
2181 (void) msg_release_folder_list(&msgFolderList);
2184 Catch(WrtDeviceApis::Commons::PlatformException) {
2185 if (msgFolderList.nCount) {
2186 (void) msg_release_folder_list(&msgFolderList);
2194 vector<string> Messaging::getFolderNamesEmail()
2196 vector<string> retVal;
2199 email_mailbox_t* mailboxes = NULL;
2201 string emailAccountName;
2202 EmailAccountInfo account = getCurrentEmailAccount();
2206 if (!email_get_mailbox_list(account.getIntId(), -1, &mailboxes,
2207 &mailboxesCount) || !mailboxes) {
2208 LoggerE("error during get mailboxes");
2210 if(mailboxes == NULL)
2212 LoggerE("error during get mailboxes");
2213 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2214 "Couldn't get mailboxes");
2216 for (int i = 0; i < mailboxesCount; i++) {
2217 retVal.push_back(mailboxes->mailbox_name);
2218 LoggerD("mailbox found, name=" << mailboxes->mailbox_name);
2221 if(mailboxes != NULL)
2223 if( EMAIL_ERROR_NONE != email_free_mailbox( &mailboxes , mailboxesCount) )
2224 LoggerD("fail to email_free_mailbox - err ");
2228 Catch(WrtDeviceApis::Commons::PlatformException) {
2229 // nothing to clean, re-throw exception
2236 vector<IMessagePtr> Messaging::findEmail(const std::string &folder,
2237 const DeviceAPI::Tizen::FilterPtr& filter)
2239 vector<IMessagePtr> retVal;
2241 EmailAccountInfo account = getCurrentEmailAccount();
2242 if (account.getId().empty()) {
2243 LoggerW("No valid email accounts. Skipping");
2247 int accountId = account.getIntId();
2249 // number of found emails
2255 email_mail_list_item_t* results = NULL;
2256 int err = email_get_mail_list(accountId,
2258 EMAIL_LIST_TYPE_NORMAL,
2261 EMAIL_SORT_DATETIME_HIGH,
2264 DPL::ScopedFree<email_mail_list_item_t> autoFree(results);
2266 if (EMAIL_ERROR_MAIL_NOT_FOUND == err || results == NULL) {
2267 LoggerW("No emails found in mailbox: " << folder);
2269 } else if (EMAIL_ERROR_NONE != err) {
2271 "Unable to get mail list for mailbox: " << folder <<
2272 ", Error: " << err);
2273 Throw(WrtDeviceApis::Commons::PlatformException);
2277 for (int i = 0; i < count; ++i) {
2278 IMessagePtr msg = MessageFactory::createMessage(EMAIL, results[i].mail_id);
2282 // || filter->compare(MessageFactory::convertToEmail(msg)) //TODO implemnet compare in filter
2284 retVal.push_back(msg);
2288 startIndex += count;
2290 while (count >= MESSAGE_FIND_LIMIT);
2295 vector<IMessagePtr> Messaging::findEmail(FolderType folder,
2296 const DeviceAPI::Tizen::FilterPtr& filter)
2298 vector<IMessagePtr> result;
2300 EmailAccountInfo account = getCurrentEmailAccount();
2301 if (account.getId().empty()) {
2302 LoggerW("No valid email accounts.");
2308 name = EmailConverter::toMailboxName(folder);
2310 catch (const WrtDeviceApis::Commons::PlatformException& ex) {
2311 LoggerW(ex.DumpToString());
2315 int accountId = account.getIntId();
2319 email_mail_list_item_t* messages = NULL;
2320 int error = email_get_mail_list(accountId,
2322 EMAIL_LIST_TYPE_NORMAL,
2325 EMAIL_SORT_DATETIME_HIGH,
2328 DPL::ScopedFree<email_mail_list_item_t> freeGuard(messages);
2329 if ((EMAIL_ERROR_MAIL_NOT_FOUND == error) || (NULL == messages)) {
2330 LoggerW("No emails found in mailbox: " << name);
2332 } else if (EMAIL_ERROR_NONE != error) {
2333 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2334 "Couldn't get mail list from mailbox: " << name <<
2335 ". [" << error << "]");
2338 for (int i = 0; i < count; ++i) {
2340 MessageFactory::createMessage(EMAIL, messages[i].mail_id);
2342 // ||filter->compare(MessageFactory::convertToEmail(msg)) //TODO implement compare in filter
2344 result.push_back(msg);
2348 startIndex += count;
2350 while (count >= MESSAGE_FIND_LIMIT);
2355 int Messaging::getConversationId(const int& msgId, const MessageType& msgtype)
2363 int index = 0, count = 0;
2364 // char *mailBox = NULL;
2365 email_mail_list_item_t *mailList = NULL;
2366 email_mail_data_t* result = NULL;
2368 LoggerD("Current Account " << m_currentEmailAccountId);
2373 if (EMAIL_ERROR_NONE != email_get_mail_data(msgId, &result)) {
2374 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2375 "Couldn't get conversatino Id " << msgId );
2378 if (email_get_mail_list(m_currentEmailAccountId, result->mailbox_id, EMAIL_LIST_TYPE_NORMAL, 0, MESSAGE_FIND_LIMIT,
2379 EMAIL_SORT_DATETIME_HIGH, &mailList, &count) != EMAIL_ERROR_NONE)
2381 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get email list fail" );
2384 email_free_mail_data(&result,1);
2386 for (index = 0; index < count; index++)
2388 if (mailList[index].mail_id == (int)msgId)
2390 return mailList[index].thread_id;
2393 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "can not find msg" );
2395 catch (const WrtDeviceApis::Commons::Exception& ex)
2399 email_free_mail_data(&result,1);
2400 LoggerE("Exception: " << ex.GetMessage());
2403 return MSG_ERR_INVALID_MSG_TYPE;
2409 msg_struct_t msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
2410 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
2411 msg_handle_t handle = MsgGetCommonHandle();
2412 msg_error_t err = MSG_SUCCESS;
2414 err = msg_get_message(handle, msgId, msg, sendOpt);
2416 if( err < MSG_SUCCESS )
2418 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2419 "can not find msg id(" << msgId << ")");
2423 err = msg_get_int_value(msg, MSG_MESSAGE_THREAD_ID_INT, &threadId);
2427 if( err < MSG_SUCCESS )
2429 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2430 "can not find thread with msg id(" << msgId << ")");
2432 msg_release_struct(&msg);
2433 msg_release_struct(&sendOpt);
2439 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
2440 "Wrong Type (" << msgId << ")");
2441 return MSG_ERR_INVALID_MSG_TYPE;
2446 std::vector<IConversationPtr> Messaging::queryConversations(const DeviceAPI::Tizen::SortModePtr& sortMode,
2447 const DeviceAPI::Tizen::FilterPtr& filter, long limit, long offset)
2451 std::vector<IConversationPtr> result;
2452 std::string filterSql;
2453 std::string orderLimitSql ="";
2455 ConversationQueryGeneratorPtr queryGenerator(new ConversationQueryGenerator(sortMode, limit, offset));
2456 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2457 filter->travel(filterVisitor, 0);
2459 // LOGD("filterSql:[%s]", filterSql.c_str());
2461 int conversationType = queryGenerator->getMessageType();
2462 switch(conversationType){
2464 LoggerD("type is EMAIL:[" << conversationType <<"]");
2465 queryGenerator->reset(MessageQueryGenerator::MODE_EMAIL);
2466 filter->travel(filterVisitor, 0);
2467 filterSql = queryGenerator->getQuery();
2468 result = queryEmailConversation(filterSql);
2473 LoggerD("type is SMS:[" << conversationType <<"]");
2474 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
2475 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2476 filter->travel(filterVisitor, 0);
2477 filterSql = queryGenerator->getQuery();
2478 // LOGD("filterSql:[%s]", filterSql.c_str());
2479 // LOGD("orderLimitSql:[%s]", orderLimitSql.c_str());
2480 result = querySmsMmsConversation(filterSql, orderLimitSql);
2485 LoggerD("type is MMS:[" << conversationType <<"]");
2486 queryGenerator->reset(MessageQueryGenerator::MODE_SMS_MMS);
2487 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2488 filter->travel(filterVisitor, 0);
2489 filterSql = queryGenerator->getQuery();
2490 // LOGD("filterSql:[%s]", filterSql.c_str());
2491 // LOGD("orderLimitSql:[%s]", orderLimitSql.c_str());
2492 result = querySmsMmsConversation(filterSql, orderLimitSql);
2497 LoggerE("[ERROR] >>> invlid type:[" << conversationType <<"]");
2505 std::vector<IConversationPtr> Messaging::queryConversations(const DeviceAPI::Tizen::FilterPtr& filter,
2506 const DeviceAPI::Tizen::SortModePtr& sortMode, int type, long limit, long offset)
2510 std::vector<IConversationPtr> result;
2511 std::string filterSql;
2512 std::string orderLimitSql ="";
2514 ConversationQueryGeneratorPtr queryGenerator(new ConversationQueryGenerator(sortMode, limit, offset, type));
2515 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2516 filter->travel(filterVisitor, 0);
2518 // LOGD("filterSql:[%s]", filterSql.c_str());
2519 int conversationType = queryGenerator->getMessageType();
2520 if(conversationType != -1)
2522 if(conversationType != type)
2524 LoggerD("filter conversationType and service msg type is diff");
2525 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
2530 LoggerD("type is EMAIL:[" << conversationType <<"]");
2531 queryGenerator->reset(MessageQueryGenerator::MODE_EMAIL, limit, offset);
2532 filter->travel(filterVisitor, 0);
2533 filterSql = queryGenerator->getQuery();
2534 orderLimitSql = queryGenerator->getOrderLimit();
2535 filterSql.append(orderLimitSql);
2536 // LOGD("filterSql:[%s]", filterSql.c_str());
2537 result = queryEmailConversation(filterSql);
2542 LoggerD("type is SMS:[" << conversationType <<"]");
2543 queryGenerator->reset(MessageQueryGenerator::MODE_SMS, limit, offset);
2544 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2545 filter->travel(filterVisitor, 0);
2546 filterSql = queryGenerator->getQuery();
2547 orderLimitSql = queryGenerator->getOrderLimit();
2548 // LOGD("filterSql:[%s]", filterSql.c_str());
2549 // LOGD("orderLimitSql:[%s]", orderLimitSql.c_str());
2550 result = querySmsMmsConversation(filterSql, orderLimitSql);
2555 LoggerD("type is MMS:[" << conversationType <<"]");
2556 queryGenerator->reset(MessageQueryGenerator::MODE_MMS, limit, offset);
2557 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2558 filter->travel(filterVisitor, 0);
2559 filterSql = queryGenerator->getQuery();
2560 orderLimitSql = queryGenerator->getOrderLimit();
2561 // LOGD("filterSql:[%s]", filterSql.c_str());
2562 // LOGD("orderLimitSql:[%s]", orderLimitSql.c_str());
2563 result = querySmsMmsConversation(filterSql, orderLimitSql);
2568 LoggerE("[ERROR] >>> invlid type:[" << conversationType <<"]");
2576 bool Messaging::deleteConversations(const DeviceAPI::Tizen::SortModePtr& sortMode, const DeviceAPI::Tizen::FilterPtr& filter)
2580 std::vector<IConversationPtr> conversationsToDelete = queryConversations(sortMode, filter);
2581 return deleteConversations(conversationsToDelete);
2584 bool Messaging::deleteConversations(const std::vector<IConversationPtr>& conversations)
2588 if (conversations.size() == 0)
2591 if (conversations[0]->getType() == EMAIL)
2593 LoggerD("Enter-Email");
2596 for (std::size_t i = 0; i < conversations.size(); ++i)
2598 threadId = conversations[i]->getConvId();
2600 if (email_delete_thread(threadId, false) != EMAIL_ERROR_NONE)
2608 LoggerD("Enter-Msg");
2609 msg_thread_id_t threadId = 0;
2610 msg_handle_t handle = MsgGetCommonHandle();
2612 for (std::size_t i = 0; i < conversations.size(); ++i)
2614 threadId = conversations[i]->getConvId();
2615 if (msg_delete_thread_message_list(handle, threadId, FALSE) != MSG_SUCCESS)
2624 std::vector<IMessageFolderPtr> Messaging::queryFolders(const DeviceAPI::Tizen::FilterPtr& filter)
2628 email_mailbox_t* mailboxes = NULL;
2629 email_mailbox_t* mailboxes_org = NULL;
2630 email_mailbox_t m_mailboxes;
2634 std::vector<IMessageFolderPtr> result;
2635 std::string folderName;
2638 EmailAccountInfo account = getCurrentEmailAccount();
2640 if (account.getId().empty()) {
2641 LoggerW("No valid email accounts. Skipping");
2645 const vector<EmailAccountInfo> accounts = getEmailAccounts();
2647 FolderQueryGeneratorPtr queryGenerator(new FolderQueryGenerator());
2649 IFilterVisitorPtr filterVisitor = DPL::StaticPointerCast<IFilterVisitor>(queryGenerator);
2650 queryGenerator->reset();
2651 filter->travel(filterVisitor, 0);
2652 accountId = queryGenerator->getAccountId();
2656 LoggerW("No valid email accounts. accountId : 0");
2660 if(queryGenerator->isFolderPathExist() == 1){
2662 folderName = queryGenerator->getFolderPath();
2664 if(email_get_mailbox_by_name(accountId, folderName.c_str(), &mailboxes) != 1)
2666 LoggerE("error during get mailboxes");
2670 m_mailboxes = *mailboxes;
2671 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
2672 result.push_back(folderPtr);
2676 if (!email_get_mailbox_list(accountId, -1, &mailboxes, &mailboxesCount) || !mailboxes)
2678 LoggerE("error during get mailboxes");
2682 mailboxes_org = mailboxes;
2684 if (mailboxesCount <= 0)
2686 LoggerD("Empty...");
2690 LoggerD("found mailboxs : " << mailboxesCount);
2691 for (int i = 0; i < mailboxesCount; i++)
2694 m_mailboxes = *mailboxes;
2695 IMessageFolderPtr folderPtr(new MessageFolder(m_mailboxes));
2696 result.push_back(folderPtr);
2701 mailboxes = mailboxes_org;
2703 if(mailboxes != NULL)
2705 error = email_free_mailbox(&mailboxes,mailboxesCount);
2706 LoggerE("email_free_mailbox : " << error);