2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @file ReqReceiverMessage.cpp
19 * @author Pawel Misiak (p.misiak@samsung.com)
24 #include <Commons/Exception.h>
25 #include "ReqReceiverMessage.h"
26 #include "IMessaging.h"
29 #include "MessageFilterValidatorFactory.h"
30 #include "ConversationFilterValidatorFactory.h"
31 #include "FolderFilterValidatorFactory.h"
34 #include <email-types.h>
35 #include <email-api.h>
39 using namespace TizenApis::Api::Tizen;
40 using namespace TizenApis::Platform::Messaging;
41 using namespace WrtDeviceApis::Commons;
48 ReqReceiverMessage::ReqReceiverMessage() :
49 EventAddDraftMessageReqReceiver(ThreadEnum::MESSAGING_THREAD),
50 EventSendMessageReqReceiver(ThreadEnum::MESSAGING_THREAD),
51 EventUpdateMessageReqReceiver(ThreadEnum::MESSAGING_THREAD),
52 EventDeleteMessageReqReceiver(ThreadEnum::MESSAGING_THREAD),
53 EventDeleteMessagesReqReceiver(ThreadEnum::MESSAGING_THREAD),
54 EventUpdateMessagesReqReceiver(ThreadEnum::MESSAGING_THREAD),
55 EventQueryMessagesReqReceiver(ThreadEnum::MESSAGING_THREAD),
56 EventGetConversationIdReqReceiver(ThreadEnum::MESSAGING_THREAD),
57 EventQueryConversationsReqReceiver(ThreadEnum::MESSAGING_THREAD),
58 EventDeleteConversationsReqReceiver(ThreadEnum::MESSAGING_THREAD),
59 EventQueryFoldersReqReceiver(ThreadEnum::MESSAGING_THREAD),
60 EventMessagingServiceReqReceiver(ThreadEnum::MESSAGING_THREAD)
62 LogDebug("create receiver for messaging");
65 ReqReceiverMessage::~ReqReceiverMessage()
69 void ReqReceiverMessage::addDraftMessage(const EventAddDraftMessagePtr& event)
72 EventAddDraftMessageReqReceiver::PostRequest(event);
75 void ReqReceiverMessage::sendMessage(const EventSendMessagePtr& event)
78 EventSendMessageReqReceiver::PostRequest(event);
81 void ReqReceiverMessage::sendMessage(const EventMessagingServicePtr& event)
84 EventMessagingServiceReqReceiver::PostRequest(event);
87 void ReqReceiverMessage::updateMessage(const EventUpdateMessagePtr& event)
90 EventUpdateMessageReqReceiver::PostRequest(event);
93 void ReqReceiverMessage::deleteMessage(const EventDeleteMessagePtr& event)
96 EventDeleteMessageReqReceiver::PostRequest(event);
99 void ReqReceiverMessage::deleteMessages(const EventDeleteMessagesPtr& event)
102 EventDeleteMessagesReqReceiver::PostRequest(event);
105 void ReqReceiverMessage::updateMessages(const EventUpdateMessagesPtr& event)
108 EventUpdateMessagesReqReceiver::PostRequest(event);
111 void ReqReceiverMessage::queryMessages(const EventQueryMessagesPtr& event)
114 EventQueryMessagesReqReceiver::PostRequest(event);
118 void ReqReceiverMessage::getConversationId(const EventGetConversationIdPtr& event)
121 EventGetConversationIdReqReceiver::PostRequest(event);
124 void ReqReceiverMessage::queryConversations(const EventQueryConversationsPtr& event)
127 EventQueryConversationsReqReceiver::PostRequest(event);
130 void ReqReceiverMessage::deleteConversations(const EventDeleteConversationsPtr& event)
133 EventDeleteConversationsReqReceiver::PostRequest(event);
136 void ReqReceiverMessage::queryFolders(const EventQueryFoldersPtr& event)
139 EventQueryFoldersReqReceiver::PostRequest(event);
142 void ReqReceiverMessage::loadMessageBody(const EventMessagingServicePtr& event)
145 EventMessagingServiceReqReceiver::PostRequest(event);
148 void ReqReceiverMessage::loadMessageAttachment(const EventMessagingServicePtr& event)
151 EventMessagingServiceReqReceiver::PostRequest(event);
154 void ReqReceiverMessage::sync(const EventMessagingServicePtr& event)
157 EventMessagingServiceReqReceiver::PostRequest(event);
160 void ReqReceiverMessage::syncFolder(const EventMessagingServicePtr& event)
164 if (event && event->m_messagingService && event->m_messagingService->getAccountID() > 0)
167 emf_account_t* accounts = NULL;
168 if (email_get_account( event->m_messagingService->getAccountID(), GET_FULL_DATA, &accounts))
170 LogDebug("accounts[0].receiving_server_type = " << accounts[0].receiving_server_type);
171 LogDebug("m_folder_name = " << event->m_folder_name);
172 if ( accounts[0].receiving_server_type == EMF_SERVER_TYPE_POP3 && event->m_folder_name != "INBOX" )
174 LogDebug("Can't Sync Folder because POP3 spec.");
175 ThrowMsg(WrtDeviceApis::Commons::UnsupportedException, "Operation Type is mismatched");
178 if (accounts != NULL)
180 email_free_account(&accounts, 1);
185 EventMessagingServiceReqReceiver::PostRequest(event);
188 void ReqReceiverMessage::OnRequestReceived(const EventAddDraftMessagePtr& event)
193 IMessagePtr msg = event->msg;
194 if (!event->checkCancelled()) {
195 event->setCancelAllowed(false);
196 emf_account_t* accounts = NULL;
198 if (msg->getMessageType() == Api::Messaging::EMAIL )
200 Api::Messaging::IEmailPtr email = Api::Messaging::MessageFactory::convertToEmail(msg);
203 if (email_get_account_list(&accounts, &count)) {
206 int index = (int)event->getIndex();
207 Api::Messaging::EmailAccountInfo account(accounts[index-1].account_id,
208 accounts[index-1].user_name,
209 accounts[index-1].email_addr );
210 email->setEmailAccount(account);
212 if (accounts != NULL) {
213 email_free_account(&accounts, count);
218 Catch(WrtDeviceApis::Commons::PlatformException) {
219 if (accounts != NULL) {
220 email_free_account(&accounts, count);
222 MsgLogError("platform exception");
223 Throw(WrtDeviceApis::Commons::PlatformException);
229 msg->addMessageToDraft();
231 event->setCancelAllowed(true);
234 Catch(WrtDeviceApis::Commons::PlatformException) {
235 MsgLogError("platform exception");
236 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
241 void ReqReceiverMessage::OnRequestReceived(const EventSendMessagePtr& event)
246 IMessagePtr msg = event->msg;
247 //this prevents calling BONDI, Tizen callback immidiately after leaving this function
248 //callback will be called after receving platform callback.
249 msg->setRequestReceiver(this);
250 msg->setSendMessageEvent(event);
251 if (!event->checkCancelled()) {
252 event->setCancelAllowed(false);
253 event->switchToManualAnswer();
254 if (msg->getMessageStatus() == Api::Messaging::MESSAGE_STATUS_CREATED ) //create message.
257 if (msg->getMessageType() == Api::Messaging::EMAIL )
259 Api::Messaging::IEmailPtr email = Api::Messaging::MessageFactory::convertToEmail(msg);
260 email->setEmailAccount(event->m_messagingService->getCurrentEmailAccount());
263 msg->addMessageToDraft(); //save
265 LogDebug("Message Status = " << msg->getMessageStatus());
266 LogDebug("Message ID = " << msg->getId());
269 int handle = msg->send();
270 LogDebug("handle : " << handle);
271 if (event->opId && event->m_messagingService)
273 event->m_messagingService->setHandleToOpId(event->opId, handle);
276 event->setCancelAllowed(true);
279 Catch(WrtDeviceApis::Commons::PlatformException) {
280 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
281 WrtDeviceApis::Commons::EventRequestReceiver<EventSendMessage>::ManualAnswer(event);
285 void ReqReceiverMessage::OnRequestReceived(const EventUpdateMessagePtr& event)
290 IMessagePtr msg = event->msg;
291 if (!event->checkCancelled()) {
292 event->setCancelAllowed(false);
295 event->setCancelAllowed(true);
298 Catch(WrtDeviceApis::Commons::PlatformException) {
299 MsgLogError("platform exception");
300 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
304 void ReqReceiverMessage::OnRequestReceived(const EventDeleteMessagePtr& event)
309 IMessagePtr msg = event->msg;
312 Catch(WrtDeviceApis::Commons::PlatformException) {
313 MsgLogError("platform exception");
314 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
318 bool ReqReceiverMessage::validateFilter(const Tizen::FilterPtr& filter){
321 bool retBool = false;
324 MessageFilterValidatorPtr validator =
325 MessageFilterValidatorFactory::getMessageFilterValidator();
327 FilterValidatorPtr filterValidator = DPL::StaticPointerCast<FilterValidator>(validator);
328 retBool = filter->validate(filterValidator);
329 LogDebug("retBool:" << retBool);
330 if(retBool == false){
331 MsgLogError(">>> Validate FAIL InvalidArgumentException");
332 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
335 LogDebug("filter is NULL");
339 LogDebug(">>> retBool:" << retBool);
344 void ReqReceiverMessage::OnRequestReceived(const EventDeleteMessagesPtr& event)
349 Tizen::FilterPtr filter = event->getFilter();
351 bool isValidFilter = validateFilter(filter);
352 if(isValidFilter == false){
353 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
356 event->msgArray = IMessaging::getInstance().findMessages(event->getFilter());
359 std::vector<Api::Messaging::IMessagePtr> msg = event->msgArray;
360 LogDebug("msg.size()" << msg.size());
362 int vecSize = msg.size();
363 for(int i=0; i < vecSize; i++){
364 int type = msg[i]->getMessageType();
365 std::string id = msg[i]->getId();
366 MsgLogError("type :"<<type);
367 MsgLogError("id :"<<id);
368 MsgLogError("body" << msg[i]->getBody());
371 }Catch(WrtDeviceApis::Commons::PlatformException) {
372 MsgLogError("platform exception");
373 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
377 void ReqReceiverMessage::OnRequestReceived(const EventUpdateMessagesPtr& event)
382 std::vector<Api::Messaging::IMessagePtr> msg = event->msgArray;
383 LogDebug("msg.size()" << msg.size());
384 int vecSize = msg.size();
385 for(int i=0; i < vecSize; i++)
387 // int type = msg[i]->getMessageType();
388 std::string id = msg[i]->getId();
389 msg[i]->updateMessage();
390 // msg[i]->updateIsRead();
393 Catch(WrtDeviceApis::Commons::PlatformException) {
394 MsgLogError("platform exception");
395 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
399 void ReqReceiverMessage::OnRequestReceived(const EventQueryMessagesPtr& event)
405 vector<IMessagePtr> msgs;
406 vector<IMessagePtr> tmp;
408 //check filter validation
409 Tizen::FilterPtr filter = event->getFilter();
410 bool isValidFilter = validateFilter(filter);
411 if(isValidFilter == false){
412 MsgLogError("[ERROR]this filter is invalid");
413 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
417 LogDebug("event->getType() = " << event->getType());
418 if(event->getType() > Api::Messaging::UNKNOWN)
421 tmp = IMessaging::getInstance().findMessages(event->getFilter(), event->getSortMode(), event->getLimit(), event->getOffset(), event->getType());
426 tmp = IMessaging::getInstance().findMessages(event->getFilter(), event->getSortMode(), event->getLimit(), event->getOffset());
428 msgs.insert(msgs.end(), tmp.begin(), tmp.end());
431 }Catch(WrtDeviceApis::Commons::PlatformException) {
432 MsgLogError("platform exception");
433 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
434 }Catch(WrtDeviceApis::Commons::InvalidArgumentException){
435 MsgLogError("InvalidArgumentException");
436 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
440 void ReqReceiverMessage::OnRequestReceived(const EventGetConversationIdPtr& event)
445 Api::Messaging::IMessagePtr msg = event->getConversationMsgPtr();
446 Api::Messaging::MessageType msgType = msg->getMessageType();
447 unsigned int msgId = 0;
449 if (msgType == EMAIL)
451 Api::Messaging::IEmailPtr email = Api::Messaging::MessageFactory::convertToEmail(msg);
452 msgId = email->getUID();
457 msgId = msg->convertId(msg->getId());
460 int conversationId = IMessaging::getInstance().getConversationId(msgId, msgType);
461 LogDebug("Cond Id:" << conversationId);
462 event->setConversationId(conversationId);
464 Catch(WrtDeviceApis::Commons::PlatformException) {
465 MsgLogError("platform exception");
466 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
470 void ReqReceiverMessage::OnRequestReceived(const EventQueryConversationsPtr& event)
476 //check filter validation
477 Tizen::FilterPtr filter = event->getFilter();
478 vector<IConversationPtr> tmp;
480 ConversationFilterValidatorPtr validator =
481 ConversationFilterValidatorFactory::getConversationFilterValidator();
483 FilterValidatorPtr filterValidator = DPL::StaticPointerCast<FilterValidator>(validator);
484 bool isValidFilter = filter->validate(filterValidator);
485 if(isValidFilter == false){
486 MsgLogError("[ERROR]Filter is Invalid");
487 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
490 LogDebug("event->getType() = "<<event->getType());
491 if(event->getType() > Api::Messaging::UNKNOWN)
494 tmp = IMessaging::getInstance().queryConversations(event->getFilter(), event->getSortMode(), event->getType(), event->getLimit(), event->getOffset());
499 tmp = IMessaging::getInstance().queryConversations(event->getSortMode(), event->getFilter(), event->getLimit(), event->getOffset());
501 event->addConversations(tmp);
504 Catch(WrtDeviceApis::Commons::PlatformException)
506 MsgLogError("platform exception");
507 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
509 Catch(WrtDeviceApis::Commons::InvalidArgumentException)
511 MsgLogError("InvalidArgumentException");
512 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
516 void ReqReceiverMessage::OnRequestReceived(const EventMessagingServicePtr& event)
518 LogDebug("enter : EventMessagingServicePtr");
521 LogDebug("event type :" << event->getEventType() );
522 int MessagingServiceEventType = event->getEventType();
524 if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_LOAD_MESSAGE_BODY)
526 if (!event->checkCancelled()) {
527 IMessagePtr msg = event->m_message;
531 msg->setRequestReceiver(this);
532 msg->setMessagingServiceEvent(event);
534 int type = msg->getMessageType();
535 LogDebug("message type :" << type);
536 if ( msg->getMessageType() == Api::Messaging::EMAIL )
538 IEmailPtr email = MessageFactory::convertToEmail(msg);
539 event->switchToManualAnswer(); //switch to manual answer;
540 int handle = email->downloadBody();
541 LogDebug("Load Message Body handle : " << handle);
542 if (event->opId && event->m_messagingService)
544 event->m_messagingService->setHandleToOpId(event->opId, handle);
548 event->setHandle(handle); //set handle
553 LogDebug(" invaild message. ");
554 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
560 LogDebug(" Cancel ");
561 event->setCancelAllowed(true);
565 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_LOAD_MESSAGE_ATTACHMENT)
567 if (!event->checkCancelled()) {
568 IMessagePtr msg = event->m_message;
571 msg->setRequestReceiver(this);
572 msg->setMessagingServiceEvent(event);
574 int type = msg->getMessageType();
575 LogDebug("message type :" << type);
576 if ( msg->getMessageType() == Api::Messaging::EMAIL )
578 IEmailPtr email = MessageFactory::convertToEmail(msg);
579 event->switchToManualAnswer(); //switch to manual answer;
580 int handle = email->downloadAttachment(event->m_attachment);
581 LogDebug("Load Message Attachment handle : " << handle);
582 if (event->opId && event->m_messagingService)
584 event->m_messagingService->setHandleToOpId(event->opId, handle);
588 event->setHandle(handle); //set handle
593 LogDebug(" invaild message. ");
594 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
600 LogDebug(" cancel. ");
601 event->setCancelAllowed(true);
606 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_SYNC)
608 if (event->m_messagingService)
610 if (!event->checkCancelled()) {
611 int type = event->m_messagingService->getType();
612 LogDebug("messaging service type :" << type);
614 event->m_messagingService->setRequestReceiver(this);
615 event->m_messagingService->setMessagingServiceEvent(event); //
617 if (type == Api::Messaging::EMAIL)
619 event->switchToManualAnswer(); //switch to manual answer;
620 LogDebug("privateData->getAccountId() :" << event->m_messagingService->getAccountID());
622 if ( event->m_messagingService->getAccountID() > 0)
624 int handle = event->m_messagingService->sync( event->m_messagingService, event->m_sync_limit );
625 LogDebug("Sync handle : " << handle);
626 if (event->opId && event->m_messagingService)
628 event->m_messagingService->setHandleToOpId(event->opId, handle);
632 event->setHandle(handle); //set handle
637 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
641 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
646 LogDebug(" cancel. ");
647 event->setCancelAllowed(true);
652 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_SYNC_FOLDER)
654 if (event->m_messagingService)
656 if (!event->checkCancelled()) {
657 int type = event->m_messagingService->getType();
658 LogDebug("messaging service type :" << type);
660 event->m_messagingService->setRequestReceiver(this);
661 event->m_messagingService->setMessagingServiceEvent(event);
662 if (type == Api::Messaging::EMAIL)
664 event->switchToManualAnswer(); //switch to manual answer;
665 LogDebug("privateData->getAccountId() :" << event->m_messagingService->getAccountID());
667 if ( event->m_messagingService->getAccountID() > 0)
669 int handle = event->m_messagingService->syncFolder( event->m_messagingService, event->m_folder_name, event->m_sync_limit);
670 LogDebug("Sync Folder handle : " << handle);
671 if (event->opId && event->m_messagingService)
673 event->m_messagingService->setHandleToOpId(event->opId, handle);
677 event->setHandle(handle); //set handle
681 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
685 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
690 LogDebug(" cancel. ");
691 event->setCancelAllowed(true);
695 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_SEND_MESSAGE)
697 IMessagePtr msg = event->m_message;
698 msg->setRequestReceiver(this);
699 msg->setMessagingServiceEvent(event);
700 if (!event->checkCancelled())
702 event->switchToManualAnswer();
703 if (msg->getMessageStatus() == Api::Messaging::MESSAGE_STATUS_CREATED ) //create message.
706 if (msg->getMessageType() == Api::Messaging::EMAIL )
708 Api::Messaging::IEmailPtr email = Api::Messaging::MessageFactory::convertToEmail(msg);
709 email->setEmailAccount(event->m_messagingService->getCurrentEmailAccount());
712 msg->addMessageToDraft(); //save
714 LogDebug("Message Status = " << msg->getMessageStatus());
715 LogDebug("Message ID = " << msg->getId());
718 int handle = msg->send();
719 LogDebug("handle : " << handle);
720 if (event->opId && event->m_messagingService)
722 event->m_messagingService->setHandleToOpId(event->opId, handle);
727 event->setHandle(handle); //set handle
735 LogDebug(" Cancel ");
736 event->setCancelAllowed(true);
740 Catch (WrtDeviceApis::Commons::PlatformException) {
741 MsgLogError("platform exception");
742 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
747 void ReqReceiverMessage::OnRequestReceived(const EventDeleteConversationsPtr& event)
753 if (event->isFilterUsing())
755 LogDebug("filter use");
757 //check filter validation
758 FilterPtr filter = event->getFilter();
761 ConversationFilterValidatorPtr validator =
762 ConversationFilterValidatorFactory::getConversationFilterValidator();
765 FilterValidatorPtr filterValidator = DPL::StaticPointerCast<FilterValidator>(validator);
766 bool isValidFilter = filter->validate(filterValidator);
768 if(isValidFilter == false)
770 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
774 if (IMessaging::getInstance().deleteConversations(event->getSortMode(), event->getFilter()) == false)
776 Throw(WrtDeviceApis::Commons::PlatformException);
778 //.queryConversations(event->getSortMode(), event->getFilter());
782 LogDebug("no filter");
784 if (IMessaging::getInstance().deleteConversations(event->getConversations()) == false)
786 Throw(WrtDeviceApis::Commons::PlatformException);
790 Catch(WrtDeviceApis::Commons::PlatformException)
792 MsgLogError("platform exception");
793 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
795 Catch(WrtDeviceApis::Commons::InvalidArgumentException)
797 MsgLogError("InvalidArgumentException");
798 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);
802 void ReqReceiverMessage::OnRequestReceived(const EventQueryFoldersPtr& event)
809 //check filter validation
810 Tizen::FilterPtr filter = event->getFilter();
812 FolderFilterValidatorPtr validator =
813 FolderFilterValidatorFactory::getFolderFilterValidator();
815 FilterValidatorPtr filterValidator = DPL::StaticPointerCast<FilterValidator>(validator);
817 bool isValidFilter = filter->validate(filterValidator);
818 if(isValidFilter == false){
819 MsgLogError("[ERROR]Filter is Invalid");
820 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
825 vector<IMessageFolderPtr> tmp = IMessaging::getInstance().queryFolders(event->getFilter());
826 event->addFolders(tmp);
828 Catch(WrtDeviceApis::Commons::PlatformException)
830 MsgLogError("platform exception");
831 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::UnknownException);
833 Catch(WrtDeviceApis::Commons::InvalidArgumentException)
835 MsgLogError("InvalidArgumentException");
836 event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException);