2 // Open Service Platform
3 // Copyright (c) 2012-2013 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 * @file FMsg_SmsManagerImpl.cpp
19 * @brief This is the implementation file for the %_SmsManagerImpl class.
21 * This file contains the implementation of the %_SmsManagerImpl class.
25 #include <unique_ptr.h>
27 #include <msg_transport.h>
28 #include <msg_storage.h>
29 #include <dbus/dbus.h>
30 #include <email-api.h>
31 #include <FMsgSmsManager.h>
32 #include <FBaseSysLog.h>
33 #include <FBase_StringConverter.h>
34 #include "FMsg_SmsManagerImpl.h"
35 #include "FMsg_SmsMessageImpl.h"
36 #include "FMsg_SmsEvent.h"
37 #include "FMsg_MsgUtil.h"
38 #include "FMsg_RecipientListImpl.h"
39 #include "FMsg_SmsMmsCallbackHandler.h"
40 #include "FMsg_CbsChannelImpl.h"
41 #include "FMsg_MessagingIpcProxy.h"
45 using namespace Tizen::Base;
46 using namespace Tizen::Messaging;
47 using namespace Tizen::Base::Collection;
49 namespace Tizen { namespace Messaging
52 _SmsManagerImpl::_SmsManagerImpl(void)
53 : __isConstructed(false)
54 , __isCbsSaveEnabled(true)
56 , __pSmsReceiveEvent(null)
57 , __pCbsReceiveEvent(null)
58 , __pEtwsReceiveEvent(null)
59 , __pSmsTriggerEventList(null)
61 , __pCbsListener(null)
62 , __pEtwsListener(null)
67 _SmsManagerImpl::~_SmsManagerImpl(void)
70 if (__pSmsReceiveEvent)
72 delete __pSmsReceiveEvent;
73 __pSmsReceiveEvent = null;
76 if (__pCbsReceiveEvent)
78 delete __pCbsReceiveEvent;
79 __pCbsReceiveEvent = null;
82 if (__pEtwsReceiveEvent)
84 delete __pEtwsReceiveEvent;
85 __pEtwsReceiveEvent = null;
88 if (__pSmsTriggerEventList)
90 if (__pSmsTriggerEventList->GetCount() > 0)
92 __pSmsTriggerEventList->RemoveAll(true);
94 delete __pSmsTriggerEventList;
95 __pSmsTriggerEventList = null;
98 if (_SmsMmsCallbackHandler::GetInstance())
100 _SmsMmsCallbackHandler::GetInstance()->CloseMessageHandle();
103 __isConstructed = false;
107 _SmsManagerImpl::Construct(const ISmsListener& listener)
109 // method return code
110 result r = E_SUCCESS;
111 int err = MSG_SUCCESS;
113 SysAssertf(__isConstructed == false, "_SmsManagerImpl instance is already constructed.");
116 unique_ptr<_SmsEvent> pSmsEvent(new (std::nothrow) _SmsEvent());
117 SysTryReturn(NID_MSG, pSmsEvent != null, E_OUT_OF_MEMORY, r = E_OUT_OF_MEMORY, "memory allocation failed.");
119 // event construction
120 r = pSmsEvent->Construct(_SMS_EVENT_TYPE_SMS_SEND_RESULT);
121 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to construct an instance");
124 r = pSmsEvent->AddListener(listener, true);
125 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to add a listener");
127 SysTryReturnResult(NID_MSG, _SmsMmsCallbackHandler::GetInstance() != NULL, E_SYSTEM, "Failed to constructSmsMmsCallbackHandler.");
129 // open message handle
130 err = _SmsMmsCallbackHandler::GetInstance()->OpenMessageHandle(__msgHandle);
131 SysLog(NID_MSG, "value of __msgHandle is [%d]", __msgHandle);
133 r = ConvertException(err);
134 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to open messageHandle.");
136 // check value of msg handle
137 SysTryReturnResult(NID_MSG, __msgHandle > 0, E_SYSTEM, "msgHandle is invalid.");
139 // register sent status callback
140 err = _SmsMmsCallbackHandler::GetInstance()->RegisterMessageCallback();
142 r = ConvertException(err);
143 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to register sms,mms callback.");
145 SysTryReturnResult(NID_MSG, _MessagingProxy::GetInstance()!= null, E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
146 r = _MessagingProxy::GetInstance()->OpenMsgHandle();
147 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to open messageHandle.");
148 r = _MessagingProxy::GetInstance()->OpenCbsHandle();
149 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to open cbs Settings Handle");
150 __isOpenCbsHandle = true;
153 __pSmsEvent = move(pSmsEvent);
154 __isConstructed = true;
160 _SmsManagerImpl::AddSmsEventListener(int port, ISmsEventListener& eventListener)
162 // checking conditions
163 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
164 SysAssertf(__msgHandle > 0, "message handle is invalid.");
166 result r = E_SUCCESS;
167 _SmsEvent* pSmsTriggerEvent = null;
169 // check duplications
170 if (__pSmsTriggerEventList)
172 int listSize = __pSmsTriggerEventList->GetCount();
173 for (int i = 0; i < listSize; i++)
175 _SmsEvent* pItem = static_cast <_SmsEvent*>(__pSmsTriggerEventList->GetAt(i));
176 if (pItem->GetPort() == port)
178 r = E_OBJ_ALREADY_EXIST;
179 SysLogException(NID_MSG, r, "[%s] The specific port [%d] is already registered.", GetErrorMessage(r), port);
185 // make an sms trigger event
186 pSmsTriggerEvent = new (std::nothrow) _SmsEvent();
187 SysTryReturn(NID_MSG, pSmsTriggerEvent != null, E_OUT_OF_MEMORY, r = E_OUT_OF_MEMORY, "memory allocation failed");
189 // construct an sms trigger event
190 r = pSmsTriggerEvent->Construct(port);
191 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to construct an instance.", GetErrorMessage(r));
193 // add corresponding listener to the event
194 r = pSmsTriggerEvent->AddListener(eventListener, true);
195 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to add a listener.", GetErrorMessage(r));
197 // make a list for events
198 if (!__pSmsTriggerEventList)
200 __pSmsTriggerEventList = new (std::nothrow) ArrayList();
201 SysTryReturnResult(NID_MSG, __pSmsTriggerEventList != null, E_OUT_OF_MEMORY, "memory allocation failed.");
203 r = __pSmsTriggerEventList->Construct();
204 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to construct an instance.", GetErrorMessage(r));
206 // add an event to the list
207 r = __pSmsTriggerEventList->Add(*pSmsTriggerEvent);
208 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to add a listener.", GetErrorMessage(r));
210 SysTryCatch(NID_MSG, _MessagingProxy::GetInstance()!= null, ,E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
211 r = _MessagingProxy::GetInstance()->AddSmsEventListener(port, __pSmsTriggerEventList);
212 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to add a listener.", GetErrorMessage(r));
217 if (pSmsTriggerEvent)
219 __pSmsTriggerEventList->Remove(*pSmsTriggerEvent);
220 delete pSmsTriggerEvent;
227 _SmsManagerImpl::RemoveSmsEventListener(int port, ISmsEventListener& eventListener)
229 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
230 SysAssertf(__msgHandle > 0, "message handle is invalid.");
232 result r = E_SUCCESS;
235 bool isFound = false;
237 // find the SmsTriggerEvent using port
238 if (__pSmsTriggerEventList)
240 listSize = __pSmsTriggerEventList->GetCount();
241 for (int i = 0; i < listSize; i++)
243 _SmsEvent* pItem = static_cast <_SmsEvent*>(__pSmsTriggerEventList->GetAt(i));
244 if (pItem->GetPort() == port)
254 SysTryReturn(NID_MSG, isFound, E_OBJ_NOT_FOUND, r = E_OBJ_NOT_FOUND, "Failed to find the SMS event listener");
256 // remove corresponding event from the list
257 r = __pSmsTriggerEventList->RemoveAt(index, true);
259 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "Failed to remove the event listener");
265 _SmsManagerImpl::AddSmsMessageEventListener(const ISmsMessageEventListener& eventListener)
267 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
268 SysAssertf(__msgHandle > 0, "message handle is invalid.");
270 result r = E_SUCCESS;
271 int err = MSG_SUCCESS;
274 if (!__pSmsReceiveEvent)
276 __pSmsReceiveEvent = new (std::nothrow) _SmsEvent();
277 SysTryReturn(NID_MSG, __pSmsReceiveEvent != null, E_OUT_OF_MEMORY, r = E_OUT_OF_MEMORY, "memory allocation failed");
279 r = __pSmsReceiveEvent->Construct(_SMS_EVENT_TYPE_SMS_RECEIVE_RESULT);
280 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "Failed to construct an instance");
284 r = __pSmsReceiveEvent->AddListener(eventListener, true);
285 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "Failed to add a listener");
287 err = _SmsMmsCallbackHandler::GetInstance()->RegisterIncomingMessageCallback(__pSmsReceiveEvent);
289 r = ConvertException(err);
290 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[%s] Failed to register for incoming sms callback.", GetErrorMessage(r));
292 if (_SmsMmsCallbackHandler::GetInstance())
294 _SmsMmsCallbackHandler::GetInstance()->SetInComingSmsCallback(true);
300 if (__pSmsReceiveEvent)
302 delete __pSmsReceiveEvent;
303 __pSmsReceiveEvent = null;
310 _SmsManagerImpl::RemoveSmsMessageEventListener(const ISmsMessageEventListener& eventListener)
312 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
313 SysAssertf(__msgHandle > 0, "message handle is invalid.");
315 result r = E_SUCCESS;
317 SysTryReturnResult(NID_MSG, __pSmsReceiveEvent != NULL, E_OBJ_NOT_FOUND, "Failed to remove a listener");
319 r = __pSmsReceiveEvent->RemoveListener(eventListener);
320 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to remove a listener..", GetErrorMessage(r));
322 if (_SmsMmsCallbackHandler::GetInstance())
324 _SmsMmsCallbackHandler::GetInstance()->SetInComingSmsCallback(false);
327 if (__pSmsReceiveEvent)
329 delete __pSmsReceiveEvent;
330 __pSmsReceiveEvent = null;
340 _SmsManagerImpl::GetTotalMessageCount(SmsMessageBoxType type) const
342 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
343 SysAssertf(__msgHandle > 0, "message handle is invalid.");
346 msg_struct_t countInfo = NULL;
347 int err = MSG_SUCCESS;
348 _MSG_FOLDER_ID_E folderType = MSG_ALLBOX_ID;
349 result r = E_SUCCESS;
355 case SMS_MESSAGE_BOX_TYPE_INBOX:
356 folderType = MSG_INBOX_ID;
358 case SMS_MESSAGE_BOX_TYPE_SENTBOX:
359 folderType = MSG_SENTBOX_ID;
361 case SMS_MESSAGE_BOX_TYPE_OUTBOX:
362 folderType = MSG_OUTBOX_ID;
364 case SMS_MESSAGE_BOX_TYPE_ALL:
371 countInfo = msg_create_struct(MSG_STRUCT_COUNT_INFO);
373 err = msg_count_message(__msgHandle, MSG_INBOX_ID , countInfo);
374 r = ConvertException(err);
375 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to get the message count of the message box (%d)", GetErrorMessage(r), (int) type);
376 msg_get_int_value(countInfo, MSG_COUNT_INFO_SMS_INT, &inbox);
378 err = msg_count_message(__msgHandle, MSG_OUTBOX_ID , countInfo);
379 r = ConvertException(err);
380 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to get the message count of the message box (%d)", GetErrorMessage(r), (int) type);
381 msg_get_int_value(countInfo, MSG_COUNT_INFO_SMS_INT, &outbox);
383 err = msg_count_message(__msgHandle, MSG_SENTBOX_ID , countInfo);
384 r = ConvertException(err);
385 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to get the message count of the message box (%d)", GetErrorMessage(r), (int) type);
386 msg_get_int_value(countInfo, MSG_COUNT_INFO_SMS_INT, &sentbox);
388 msg_release_struct(&countInfo);
390 msgCount = inbox + outbox + sentbox;
391 SysLog(NID_MSG, "Total count of messages is [%d] , inbox[%d], outbox[%d], sentbox[%d]",msgCount, inbox, outbox, sentbox);
396 case SMS_MESSAGE_BOX_TYPE_NONE: // impossible case
402 // get the count of corresponding message box
403 countInfo = msg_create_struct(MSG_STRUCT_COUNT_INFO);
404 err = msg_count_message(__msgHandle, folderType, countInfo);
405 r = ConvertException(err);
406 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to get the message count of the message box (%d)", GetErrorMessage(r), (int) type);
408 msg_get_int_value(countInfo, MSG_COUNT_INFO_SMS_INT, &msgCount);
409 msg_release_struct(&countInfo);
410 SysLog(NID_MSG, "Total count of messages is [%d]", msgCount);
417 msg_release_struct(&countInfo);
422 Tizen::Base::Collection::IList*
423 _SmsManagerImpl::SearchInboxN(const Tizen::Base::String* pKeyword, const Tizen::Base::String* pSenderAddress, int startIndex,
425 int& totalResultCount) const
427 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
428 SysAssertf(__msgHandle > 0, "message handle is invalid.");
430 char* pSearchString = NULL;
431 char* pSenderAddressTemp = NULL;
432 ArrayList* pList = null;
433 int err = MSG_SUCCESS;
434 result r = E_SUCCESS;
435 msg_struct_list_s msgList = {0};
436 msg_struct_t searchCon = NULL;
440 pList = new (std::nothrow) ArrayList();
441 SysTryCatch(NID_MSG, pList != null, r = E_OUT_OF_MEMORY, r, "memory allocation failed");
444 r = pList->Construct();
445 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "Failed to construct an ArrayList");
448 searchCon = msg_create_struct(MSG_STRUCT_SEARCH_CONDITION);
449 msg_set_int_value(searchCon, MSG_SEARCH_CONDITION_FOLDERID_INT, MSG_INBOX_ID);
450 msg_set_int_value(searchCon, MSG_SEARCH_CONDITION_MSGTYPE_INT, MSG_TYPE_SMS);
455 pSearchString = _StringConverter::CopyToCharArrayN(*pKeyword);
456 SysTryCatch(NID_MSG, pSearchString != null, r = E_OUT_OF_MEMORY, r, "Memory allocation failed.");
457 msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_SEARCH_VALUE_STR, pSearchString, strlen(pSearchString));
463 pSenderAddressTemp = _StringConverter::CopyToCharArrayN(*pSenderAddress);
464 SysTryCatch(NID_MSG, pSenderAddressTemp != null, r = E_OUT_OF_MEMORY, r, "Memory allocation failed.");
465 msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_ADDRESS_VALUE_STR, pSenderAddressTemp, strlen(pSenderAddressTemp));
469 err = msg_search_message(__msgHandle, searchCon, startIndex, count, &msgList);
471 r = ConvertException(err);
472 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] msg_search_message call failed.", GetErrorMessage(r));
474 totalResultCount = msgList.nCount;
476 SysLog(NID_MSG, "Total Search count of messages is [%d]", totalResultCount);
478 for (int index = 0; index < totalResultCount; index++)
480 // get SmsMessage instance
481 SmsMessage* pSmsMessage = _MsgUtil::ConvertSmsMessageN(SMS_MESSAGE_BOX_TYPE_INBOX, msgList.msg_struct_info[index]);
483 pList->Add(*pSmsMessage);
488 delete[] pSearchString;
489 pSearchString = NULL;
492 if (pSenderAddressTemp)
494 delete[] pSenderAddressTemp;
495 pSenderAddressTemp = NULL;
498 msg_release_struct(&searchCon);
499 msg_release_list_struct(&msgList);
506 delete[] pSearchString;
507 pSearchString = NULL;
510 if (pSenderAddressTemp)
512 delete[] pSenderAddressTemp;
513 pSenderAddressTemp = NULL;
518 if (pList->GetCount() > 0)
520 pList->RemoveAll(true);
526 msg_release_struct(&searchCon);
527 msg_release_list_struct(&msgList);
532 Tizen::Base::Collection::IList*
533 _SmsManagerImpl::SearchMessageBoxN(SmsMessageBoxType type, const Tizen::Base::String* pKeyword, int startIndex, int count,
534 int& totalResultCount) const
536 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
537 SysAssertf(__msgHandle > 0, "message handle is invalid.");
539 result r = E_SUCCESS;
540 int err = MSG_SUCCESS;
541 char* pSearchString = NULL;
542 int folderId = MSG_ALLBOX_ID;
543 ArrayList* pList = NULL;
544 msg_struct_list_s msgList = {0};
545 msg_struct_t searchCon = NULL;
549 pList = new (std::nothrow) ArrayList();
550 SysTryCatch(NID_MSG, pList != null, r = E_OUT_OF_MEMORY, r, "memory allocation failed");
553 r = pList->Construct();
554 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "Failed to construct an ArrayList");
557 folderId = _MsgUtil::GetMsgFolderId(type);
558 SysLog(NID_MSG, "box type [%d]", (int)type);
561 searchCon = msg_create_struct(MSG_STRUCT_SEARCH_CONDITION);
562 msg_set_int_value(searchCon, MSG_SEARCH_CONDITION_FOLDERID_INT, folderId);
563 msg_set_int_value(searchCon, MSG_SEARCH_CONDITION_MSGTYPE_INT, MSG_TYPE_SMS);
568 pSearchString = _StringConverter::CopyToCharArrayN(*pKeyword);
569 SysTryCatch(NID_MSG, pSearchString != null, r = E_OUT_OF_MEMORY, r, "Memory allocation failed.");
570 msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_SEARCH_VALUE_STR, pSearchString, strlen(pSearchString));
574 err = msg_search_message(__msgHandle, searchCon, startIndex, count, &msgList);
576 r = ConvertException(err);
577 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] msg_search_message call failed.", GetErrorMessage(r));
580 for (int index = 0; index < msgList.nCount; index++)
582 SmsMessage* pSmsMessage = null;
585 if (type == SMS_MESSAGE_BOX_TYPE_ALL)
587 err = msg_get_int_value(msgList.msg_struct_info[index], MSG_MESSAGE_FOLDER_ID_INT, &folderId);
588 SysLog(NID_MSG, "Folder [%d]", folderId);
593 pSmsMessage = _MsgUtil::ConvertSmsMessageN(SMS_MESSAGE_BOX_TYPE_INBOX, msgList.msg_struct_info[index]);
597 pSmsMessage = _MsgUtil::ConvertSmsMessageN(SMS_MESSAGE_BOX_TYPE_OUTBOX, msgList.msg_struct_info[index]);
601 pSmsMessage = _MsgUtil::ConvertSmsMessageN(SMS_MESSAGE_BOX_TYPE_SENTBOX, msgList.msg_struct_info[index]);
611 pList->Add(*pSmsMessage);
616 pSmsMessage = _MsgUtil::ConvertSmsMessageN(type, msgList.msg_struct_info[index]);
620 pList->Add(*pSmsMessage);
625 totalResultCount = tempCount;
626 SysLog(NID_MSG, "Total Search count of messages is [%d] original [%d]", totalResultCount , msgList.nCount );
630 delete[] pSearchString;
631 pSearchString = NULL;
634 msg_release_struct(&searchCon);
635 msg_release_list_struct(&msgList);
642 if (pList->GetCount() > 0)
644 pList->RemoveAll(true);
652 delete[] pSearchString;
653 pSearchString = NULL;
656 msg_release_struct(&searchCon);
657 msg_release_list_struct(&msgList);
658 totalResultCount = 0;
664 _SmsManagerImpl::GetFullText(int messageId) const
666 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
667 SysAssertf(__msgHandle > 0, "message handle is invalid.");
669 result r = E_SUCCESS;
671 msg_struct_t smsMsg = null;
672 msg_struct_t sendOpt = null;
673 int err = MSG_SUCCESS;
674 char msgText[MAX_MSG_TEXT_LEN];
679 smsMsg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
680 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
681 err = msg_get_message(__msgHandle, messageId, smsMsg, sendOpt);
683 r = ConvertException(err);
686 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] msg_get_message by messageid failed.", GetErrorMessage(r));
689 err = msg_get_str_value(smsMsg, MSG_MESSAGE_SMS_DATA_STR, msgText, MAX_MSG_TEXT_LEN);
690 SysTryCatch(NID_MSG, err == MSG_SUCCESS, r = E_SYSTEM, r, "sms get message body failed");
694 SysLog(NID_MSG, "Returned Full Text : [%ls]", fullText.GetPointer());
696 msg_release_struct(&sendOpt);
697 msg_release_struct(&smsMsg);
702 msg_release_struct(&sendOpt);
703 msg_release_struct(&smsMsg);
709 _SmsManagerImpl::Send(const SmsMessage& message, const RecipientList& recipientList, bool saveToSentbox)
711 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
712 SysAssertf(__msgHandle > 0, "message handle is invalid.");
714 result r = E_SUCCESS;
715 int err = MSG_SUCCESS;
717 bool saveMsgToSentbox = saveToSentbox;
719 SysLog(NID_MSG, "sending an sms message");
721 msg_struct_t msgReq = msg_create_struct(MSG_STRUCT_REQUEST_INFO);
722 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);;
723 msg_struct_t msgSendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
725 msg_set_bool_value(msgSendOpt, MSG_SEND_OPT_SETTING_BOOL, true);
726 msg_set_bool_value(msgSendOpt, MSG_SEND_OPT_DELIVER_REQ_BOOL, false);
727 msg_set_bool_value(msgSendOpt, MSG_SEND_OPT_KEEPCOPY_BOOL, saveMsgToSentbox);
729 err = _MsgUtil::GetSmsMessage(msgInfo, message, recipientList);
731 r = ConvertException(err);
732 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to generate the SMS message.", GetErrorMessage(r));
734 msg_set_struct_handle(msgReq, MSG_REQUEST_MESSAGE_HND, msgInfo);
735 msg_set_struct_handle(msgReq, MSG_REQUEST_SENDOPT_HND, msgSendOpt);
737 if (err == MSG_SUCCESS)
739 err = msg_sms_send_message(__msgHandle, msgReq);
742 r = ConvertException(err);
746 if (_SmsMmsCallbackHandler::GetInstance())
748 msg_get_int_value(msgReq, MSG_REQUEST_REQUESTID_INT, &msgReqId);
749 r = _SmsMmsCallbackHandler::GetInstance()->AddToMessageMap(msgReqId, _MSG_SMS, __pSmsEvent.get());
757 SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "[%s] Failed to send the SMS message.", GetErrorMessage(r));
760 msg_release_struct(&msgReq);
761 SysLog(NID_MSG, "sending an sms message success");
766 msg_release_struct(&msgReq);
771 _SmsManagerImpl::SetCbsMessageEventListener(ICbsMessageEventListener* pListener)
773 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
774 SysAssertf(__msgHandle > 0, "message handle is invalid.");
776 result r = E_SUCCESS;
780 if (__pCbsReceiveEvent)
782 r = __pCbsReceiveEvent->RemoveListener(*__pCbsListener);
783 SysTryReturnResult(NID_MSG, r == E_SUCCESS, E_SYSTEM, "Failed to reset the cbs message event listener.");
785 __pCbsListener = null;
791 __pCbsListener = pListener;
794 if (!__pCbsReceiveEvent)
796 __pCbsReceiveEvent = new (std::nothrow) _SmsEvent();
797 SysTryCatch(NID_MSG, __pCbsReceiveEvent != null, r = E_OUT_OF_MEMORY, r, "memory allocation failed");
799 r = __pCbsReceiveEvent->Construct(_SMS_EVENT_TYPE_CBS_RECEIVE_RESULT);
800 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Failed to construct an cbs listener instance");
804 r = __pCbsReceiveEvent->AddListener(*__pCbsListener, true);
805 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Failed to add cbs listner");
807 SysTryCatch(NID_MSG, _MessagingProxy::GetInstance()!= null, r = E_OUT_OF_MEMORY,E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
808 r = _MessagingProxy::GetInstance()->AddCbsEtwsEventListener(__isCbsSaveEnabled);
810 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Failed to set cbs incoming callback");
814 _MessagingProxy::GetInstance()->SetCbsAndEtwsUserEvent(_MSG_CBS, __pCbsReceiveEvent);
824 if (__pCbsReceiveEvent)
826 delete __pCbsReceiveEvent;
827 __pCbsReceiveEvent = null;
829 __pCbsListener = null;
835 _SmsManagerImpl::SetEtwsPrimaryNotificationEventListener(IEtwsPrimaryNotificationEventListener* pListener)
837 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
838 SysAssertf(__msgHandle > 0, "message handle is invalid.");
840 result r = E_SUCCESS;
844 if (__pEtwsReceiveEvent)
846 r = __pEtwsReceiveEvent->RemoveListener(*__pEtwsListener);
847 SysTryReturnResult(NID_MSG, r == E_SUCCESS, E_SYSTEM, "Failed to reset the etws primary notification event listener.");
849 __pEtwsListener = null;
855 __pEtwsListener = pListener;
858 if (!__pEtwsReceiveEvent)
860 __pEtwsReceiveEvent = new (std::nothrow) _SmsEvent();
861 SysTryCatch(NID_MSG, __pEtwsReceiveEvent != null, r = E_OUT_OF_MEMORY, r, "memory allocation failed");
863 r = __pEtwsReceiveEvent->Construct(_SMS_EVENT_TYPE_ETWS_RECEIVE_RESULT);
864 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM,
865 "Failed to construct an etws primary notification event listener instance");
869 r = __pEtwsReceiveEvent->AddListener(*__pEtwsListener, true);
870 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Failed to add an etws primary notification event listener.");
872 SysTryCatch(NID_MSG, _MessagingProxy::GetInstance()!= null, r = E_OUT_OF_MEMORY,E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
873 r = _MessagingProxy::GetInstance()->AddCbsEtwsEventListener(__isCbsSaveEnabled);
874 SysTryCatch(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM,"Failed to add an etws primary notification event listener.");
878 _MessagingProxy::GetInstance()->SetCbsAndEtwsUserEvent(_MSG_ETWS, __pEtwsReceiveEvent);
889 if (__pEtwsReceiveEvent)
891 delete __pEtwsReceiveEvent;
892 __pEtwsReceiveEvent = null;
894 __pEtwsListener = null;
900 _SmsManagerImpl::SetSavingToCbsBoxEnabled(bool enable)
902 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
903 SysAssertf(__msgHandle > 0, "message handle is invalid.");
904 result r = E_SUCCESS;
905 SysTryReturnResult(NID_MSG, __isOpenCbsHandle == true, E_SYSTEM, "Cb handle is null");
907 SysTryReturnResult(NID_MSG, _MessagingProxy::GetInstance()!= null, E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
908 r = _MessagingProxy::GetInstance()->SetSavingToCbsBoxEnabled(enable);
909 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "[%s] Setting of CbsBoxEnabled Failed", GetErrorMessage(r));
911 __isCbsSaveEnabled = enable;
917 _SmsManagerImpl::IsCbsEnabled(void) const
919 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
920 SysAssertf(__msgHandle > 0, "message handle is invalid.");
921 SysTryReturn(NID_MSG, __isOpenCbsHandle != false, false, E_SYSTEM, "Cb handle is null");
923 bool isCbsEnabled = false;
924 result r = E_SUCCESS;
926 SysTryReturnResult(NID_MSG, _MessagingProxy::GetInstance()!= null, false, "Failed to get msg proxy instance");
927 r = _MessagingProxy::GetInstance()->IsCbsEnabled(&isCbsEnabled);
928 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "[%s] Geting the Cbs Status Failed ", GetErrorMessage(r));
934 _SmsManagerImpl::SetCbsEnabled(bool enable)
936 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
937 SysAssertf(__msgHandle > 0, "message handle is invalid.");
938 result r = E_SUCCESS;
939 SysTryReturnResult(NID_MSG, __isOpenCbsHandle != false, E_SYSTEM, "Cb handle is null");
941 SysTryReturnResult(NID_MSG, _MessagingProxy::GetInstance()!= null, E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
942 r = _MessagingProxy::GetInstance()->SetCbsEnabled(enable);
943 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "[%s] Set status failed", GetErrorMessage(r));
950 _SmsManagerImpl::AddCbsChannel(int from, int to, Tizen::Base::String& name, bool activate)
952 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
953 SysAssertf(__msgHandle > 0, "message handle is invalid.");
954 result r = E_SUCCESS;
955 SysTryReturnResult(NID_MSG, __isOpenCbsHandle != false, E_SYSTEM, "Cb handle is null");
957 SysTryReturnResult(NID_MSG, _MessagingProxy::GetInstance()!= null, E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
958 r = _MessagingProxy::GetInstance()->AddCbsChannel(from, to, name, activate);
959 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "[%s] adding channel Failed", GetErrorMessage(r));
965 _SmsManagerImpl::RemoveCbsChannel(int from, int to)
967 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
968 SysAssertf(__msgHandle > 0, "message handle is invalid.");
969 SysTryReturnResult(NID_MSG, __isOpenCbsHandle != false, E_SYSTEM, "Cb handle is null");
971 result r = E_SUCCESS;
973 SysTryReturnResult(NID_MSG, _MessagingProxy::GetInstance()!= null, E_OUT_OF_MEMORY, "Failed to get msg proxy instance");
974 r = _MessagingProxy::GetInstance()->RemoveCbsChannel(from, to);
975 SysTryReturn(NID_MSG, r == E_SUCCESS, r, r, "[%s] To remove channel Failed", GetErrorMessage(r));
982 _SmsManagerImpl::GetCbsChannelN(int from, int to) const
984 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
985 SysAssertf(__msgHandle > 0, "message handle is invalid.");
986 SysTryReturn(NID_MSG, __isOpenCbsHandle != null, null, E_SYSTEM, "Cb handle is null.");
988 result r = E_SUCCESS;
989 bool isActive = false;
991 std::unique_ptr<CbsChannel> pCbsChannel;
993 SysTryReturn(NID_MSG, _MessagingProxy::GetInstance()!= null, null, E_OUT_OF_MEMORY,"Failed to get msg proxy instance");
994 r = _MessagingProxy::GetInstance()->GetCbsChannelN(from, to, isActive, channelName);
995 SysTryReturn(NID_MSG, r == E_SUCCESS, null, r, "Failed to get msg proxy instance");
998 pCbsChannel.reset(_CbsChannelImpl::GetCbsChannelN(from, to, channelName));
1002 _CbsChannelImpl::GetInstance(*pCbsChannel.get())->SetCbsChannelState(true);
1006 return pCbsChannel.release();
1009 Tizen::Base::Collection::IList*
1010 _SmsManagerImpl::GetCbsChannelListN(void)
1012 SysAssertf(__isConstructed == true, "_SmsManagerImpl instance is not constructed yet.");
1013 SysAssertf(__msgHandle > 0, "message handle is invalid.");
1014 SysTryReturn(NID_MSG, __isOpenCbsHandle != null, null, E_SYSTEM, "Cb handle is null.");
1016 result r = E_SUCCESS;
1017 unique_ptr<ArrayList, AllElementsDeleter> pList;
1018 int cbChannelCount = 0;
1021 int isActive = false;
1023 std::unique_ptr<CbsChannel> pCbsChannel;
1024 Tizen::Base::Collection::ArrayList pCbsList;
1028 pList.reset(new (std::nothrow) ArrayList(SingleObjectDeleter));
1029 SysTryReturn(NID_MSG, pList != null, null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1032 r = pList->Construct();
1033 SysTryReturn(NID_MSG, r == E_SUCCESS, null, r, "Failed to construct array list.");
1036 SysTryReturn(NID_MSG, _MessagingProxy::GetInstance()!= null, null, E_OUT_OF_MEMORY,"Failed to get msg proxy instance");
1037 r = _MessagingProxy::GetInstance()->GetCbsChannelListN(pCbsList);
1038 SysTryReturn(NID_MSG, r == E_SUCCESS, null, r, "Failed to get msg proxy instance");
1041 cbChannelCount = pCbsList.GetCount();
1042 for (int index = 0; index < cbChannelCount; )
1045 Integer::Parse(*static_cast <String*>(pCbsList.GetAt(index++)), fromId);
1046 Integer::Parse(*static_cast <String*>(pCbsList.GetAt(index++)), toId);
1047 channelName = *static_cast <String*>(pCbsList.GetAt(index++));
1048 Integer::Parse(*static_cast <String*>(pCbsList.GetAt(index++)),isActive);
1049 SysLog(NID_MSG, "cbs %d, %d, %ls, %d",fromId, toId, channelName.GetPointer(),(bool)isActive);
1051 pCbsChannel.reset(_CbsChannelImpl::GetCbsChannelN(fromId, toId, channelName));
1054 _CbsChannelImpl::GetInstance(*pCbsChannel.get())->SetCbsChannelState((bool)isActive);
1057 pList->Add(*pCbsChannel.release());
1059 pCbsList.RemoveAll();
1061 return pList.release();
1065 _SmsManagerImpl::GetInstance(SmsManager& smsManager)
1067 return smsManager.__pImpl;
1070 const _SmsManagerImpl*
1071 _SmsManagerImpl::GetInstance(const SmsManager& smsManager)
1073 return smsManager.__pImpl;
1077 _SmsManagerImpl::ConvertException(int err) const
1079 result r = E_SUCCESS;
1087 case MSG_ERR_INVALID_PARAMETER:
1088 case MSG_ERR_INVALID_MESSAGE:
1089 case MSG_ERR_NULL_POINTER:
1090 case MSG_ERR_NULL_MESSAGE:
1094 case MSG_ERR_MEMORY_ERROR:
1095 r = E_OUT_OF_MEMORY;
1098 case MSG_ERR_STORAGE_ERROR:
1102 case MSG_ERR_DB_STEP:
1103 r = E_OBJ_NOT_FOUND;
1106 case MSG_ERR_SERVER_NOT_READY:
1107 case MSG_ERR_TRANSPORT_ERROR:
1108 case MSG_ERR_COMMUNICATION_ERROR:
1109 r = E_NETWORK_UNAVAILABLE;
1112 case MSG_ERR_NO_SIM:
1113 r = E_DEVICE_UNAVAILABLE;
1116 case MSG_ERR_PLUGIN_TAPI_FAILED:
1128 } } // Tizen::Messaging