merge with master
[platform/framework/native/messaging.git] / src / FMsg_SmsMmsCallbackHandler.cpp
index 9d44b41..450a8ab 100644 (file)
  * This file contains the implementation of the %_SmsMmsCallbackHandler class.
  */
 
-#include <messages.h>
-#include <email.h>
+#include <msg.h>
+#include <msg_transport.h>
+#include <msg_storage.h>
+#include <dbus/dbus.h>
+#include <email-api.h>
+#include <FMsgSmsManager.h>
 #include <FBaseInteger.h>
 #include <FBaseSysLog.h>
 #include <FMsgEtwsPrimaryNotification.h>
+#include <FBase_StringConverter.h>
 #include "FMsg_SmsEvent.h"
 #include "FMsg_SmsEventArg.h"
 #include "FMsg_MmsEvent.h"
 #include "FMsg_MmsEventArg.h"
 #include "FMsg_MsgUtil.h"
 #include "FMsg_SmsMmsCallbackHandler.h"
+#include "FMsg_CbsChannelImpl.h"
 
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
@@ -45,39 +51,93 @@ _SmsMmsCallbackHandler* _SmsMmsCallbackHandler::__pMessageCallbackHandler = 0;
 _SmsMmsCallbackHandler::_SmsMmsCallbackHandler(void)
        : __msgHandle(0)
        , __cbsSettingsHandle(0)
+       , __pCbsChannelList(0)
+       , __pTempCbsChannelList(0)
+       , __callbackRegistered(false)
+       , __incomingSmsCallbackRegistered(true)
+       , __pCbsUserEvent(null)
+       , __pEtwsUserEvent(null)
 {
+}
+
+result
+_SmsMmsCallbackHandler::Construct()
+{
+       result r = E_SUCCESS;
+
+       r = __messageMap.Construct();
 
+       if (r == E_SUCCESS)
+       {
+               r = __msgMutex.Create();
+       }
+
+       return r;
 }
 
 _SmsMmsCallbackHandler::~_SmsMmsCallbackHandler(void)
 {
        if (__msgHandle)
        {
-               messages_close_service(__msgHandle);
+               msg_close_msg_handle(&__msgHandle);
                __msgHandle = 0;
        }
 
+       if (__messageMap.GetCount())
+       {
+               __messageMap.RemoveAll(true);
+       }
+
+       if (__cbsSettingsHandle)
+       {
+               msg_release_struct(&__cbsSettingsHandle);
+               __cbsSettingsHandle = 0;
+       }
+
+       if (__pTempCbsChannelList)
+       {
+               if (__pTempCbsChannelList->GetCount() > 0)
+               {
+                       __pTempCbsChannelList->RemoveAll(true);
+               }
+               delete __pTempCbsChannelList;
+               __pTempCbsChannelList = null;
+       }
 }
 
 _SmsMmsCallbackHandler*
 _SmsMmsCallbackHandler::GetInstance(void)
 {
+       result r = E_SUCCESS;
+
        if (!__pMessageCallbackHandler)
        {
                __pMessageCallbackHandler = new (std::nothrow) _SmsMmsCallbackHandler();
+                SysTryReturn(NID_MSG, __pMessageCallbackHandler != NULL, null, E_SYSTEM, "failed to create instance");
+
+               if (__pMessageCallbackHandler)
+               {
+                       r = __pMessageCallbackHandler->Construct();
+
+                       if (r != E_SUCCESS)
+                       {
+                               delete __pMessageCallbackHandler;
+                                __pMessageCallbackHandler = 0;
+                       }
+               }
        }
 
        return __pMessageCallbackHandler;
 }
 
 int
-_SmsMmsCallbackHandler::OpenMessageHandle(messages_service_h& messageHandle)
+_SmsMmsCallbackHandler::OpenMessageHandle(msg_handle_t& messageHandle)
 {
-       int err = MESSAGES_ERROR_NONE;
+       int err = MSG_SUCCESS;
 
        if (!__msgHandle)
        {
-               err = messages_open_service(&__msgHandle);
+               err = msg_open_msg_handle(&__msgHandle);
        }
 
        messageHandle = __msgHandle;
@@ -85,220 +145,706 @@ _SmsMmsCallbackHandler::OpenMessageHandle(messages_service_h& messageHandle)
 }
 
 int
-_SmsMmsCallbackHandler::OpenCbsSettingsHandle(messages_cb_settings_h& cbsSettingsHandle)
+_SmsMmsCallbackHandler::OpenCbsSettingsHandle(msg_struct_t& cbsSettingsHandle)
 {
-       int err = MESSAGES_ERROR_NONE;
+       int err = MSG_SUCCESS;
 
        if (!__cbsSettingsHandle)
        {
-               err = messages_cb_load_settings(__msgHandle, &__cbsSettingsHandle);
+               __cbsSettingsHandle = msg_create_struct(MSG_STRUCT_SETTING_CB_OPT);
+               if (__cbsSettingsHandle && __msgHandle)
+               {
+                       err = msg_get_cb_opt(__msgHandle, __cbsSettingsHandle);
+               }
        }
 
        cbsSettingsHandle = __cbsSettingsHandle;
        return err;
 }
 
-int
-_SmsMmsCallbackHandler::CloseMessageHandle()
+result
+_SmsMmsCallbackHandler::AddCbsChannel(int from, int to, Tizen::Base::String& name, bool activate)
 {
-       int err = MESSAGES_ERROR_NONE;
+       int err = MSG_SUCCESS;
+       result r = E_SUCCESS;
+       CbsChannel* pCbsChannel = NULL;
 
-       if (__msgHandle)
+       pCbsChannel = _CbsChannelImpl::GetCbsChannelN(from, to, name);
+       SysTryReturn(NID_MSG, pCbsChannel != null, r = E_SYSTEM, E_SYSTEM, "Failed to get the channel.");
+
+       if (activate)
        {
-               err = messages_close_service(__msgHandle);
-               __msgHandle = 0;
+               _CbsChannelImpl::GetInstance(*pCbsChannel)->SetCbsChannelState(activate);
        }
 
-       return err;
+       r =__pTempCbsChannelList->Add(*pCbsChannel);
+
+       err = SaveCbsSettings();
+       r = ConvertException(err);
+
+       return r;
 }
 
-void
-_SmsMmsCallbackHandler::SentSmsMessageStatusCallback(messages_sending_result_e status, void* pUserEvent)
+result
+_SmsMmsCallbackHandler::RemoveCbsChannel(int from, int to)
 {
+       int err = MSG_SUCCESS;
        result r = E_SUCCESS;
-       _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(pUserEvent);
-       _SmsEventArg* pSmsEventArg = null;
+       int fromId = 0;
+       int toId = 0;
+       bool channelFound = false;
+       CbsChannel* pCbsChannel = NULL;
+
+       for (int index = 0; index < __pTempCbsChannelList->GetCount(); index++)
+       {
+               pCbsChannel = dynamic_cast< Tizen::Messaging::CbsChannel* >(__pTempCbsChannelList->GetAt(index));
+               SysTryReturn(NID_MSG, pCbsChannel != null, r = E_SYSTEM, E_SYSTEM, "Failed to get the channel.");
+
+               pCbsChannel->GetRange(fromId, toId);
+               if (from == fromId && to == toId)
+               {
+                       channelFound = true;  // found channel to be removed.
+                       __pTempCbsChannelList->RemoveAt(index);
 
-       SysLog(NID_MSG, "SMS message sent status[%d]", status);
+                       err = SaveCbsSettings();
+                       r = ConvertException(err);
+                       delete pCbsChannel;
+                       break;
+               }
+       }
 
-       switch (status)
+        if (!channelFound)
        {
-       case MESSAGES_SENDING_SUCCEEDED:      // Message is sent successfully
-               SysLog(NID_MSG, "MESSAGES_SENDING_SUCCEEDED -> E_SUCCESS");
-               r = E_SUCCESS;
-               break;
+               return E_OBJ_NOT_FOUND;
+       }
 
-       case MESSAGES_SENDING_FAILED:         // Message is not sending
-               SysLog(NID_MSG, "MESSAGES_SENDING_FAILED -> E_FAILURE");
-               r = E_FAILURE;
-               SysLog(NID_MSG, "Failed to send the SMS message. error cause: Message is not sending");
-               break;
+       return r;
+}
 
-       default:
-               SysLog(NID_MSG, "default -> E_FAILURE");
-               r = E_FAILURE;
-               SysLog(NID_MSG, "Failed to send the SMS message. error cause: Unknown");
-               break;
+result
+_SmsMmsCallbackHandler::SearchCbsChannel(int from, int to, int& index)
+{
+       result r = E_SUCCESS;
+       int fromId = 0;
+       int toId = 0;
+       bool channelFound = false;
+       CbsChannel* pCbsChannel = NULL;
+
+       for (int tempIndex = 0; tempIndex < __pTempCbsChannelList->GetCount(); tempIndex++)
+       {
+               pCbsChannel = dynamic_cast< Tizen::Messaging::CbsChannel* >(__pTempCbsChannelList->GetAt(tempIndex));
+               SysTryReturn(NID_MSG, pCbsChannel != null, r = E_SYSTEM, E_SYSTEM, "Failed to get the channel.");
+
+               pCbsChannel->GetRange(fromId, toId);
+               if (from == fromId && to == toId)
+               {
+                       channelFound = true;
+                       index = tempIndex;
+                       break;  // found channel to be searched.
+               }
        }
 
-       if (pSmsEvent)
+        if (!channelFound)
        {
-               pSmsEventArg = new (std::nothrow) _SmsEventArg(r);
-               if (pSmsEventArg)
+               return E_OBJ_NOT_FOUND;
+       }
+
+       return r;
+}
+
+result
+_SmsMmsCallbackHandler::UpdateCbsChannel(int from, int to, Tizen::Base::String name, bool activate)
+{
+       int err = MSG_SUCCESS;
+       result r = E_SUCCESS;
+       int fromId = 0;
+       int toId = 0;
+       bool channelFound = false;
+       CbsChannel* pCbsChannel = NULL;
+
+       for (int index = 0; index < __pTempCbsChannelList->GetCount(); index++)
+       {
+               pCbsChannel = dynamic_cast< Tizen::Messaging::CbsChannel* >(__pTempCbsChannelList->GetAt(index));
+               SysTryReturn(NID_MSG, pCbsChannel != null, r = E_SYSTEM, E_SYSTEM, "Failed to get the channel.");
+
+               pCbsChannel->GetRange(fromId, toId);
+               if (from == fromId && to == toId)
                {
-                       pSmsEvent->Fire(*pSmsEventArg);
+                       channelFound = true;
+                       break;  // found channel to be updated.
+               }
+       }
+
+        if (!channelFound)
+       {
+               return E_OBJ_NOT_FOUND;
+       }
+
+       // set cbs channel name
+       _CbsChannelImpl::GetInstance(*pCbsChannel)->SetCbsChannelName(name);
+
+       if (activate)
+       {
+               _CbsChannelImpl::GetInstance(*pCbsChannel)->SetCbsChannelState(activate);
+       }
+       else
+       {
+               _CbsChannelImpl::GetInstance(*pCbsChannel)->SetCbsChannelState(false);
+       }
+
+       err = SaveCbsSettings();
+       r = ConvertException(err);
+       return r;
+}
+
+result
+_SmsMmsCallbackHandler::GetCbsChannel(int index, int& from, int& to, Tizen::Base::String& name, bool& activate)
+{
+       result r = E_SUCCESS;
+       CbsChannel* pCbsChannel = NULL;
+
+       pCbsChannel = dynamic_cast< Tizen::Messaging::CbsChannel* >(__pTempCbsChannelList->GetAt(index));
+       SysTryReturn(NID_MSG, pCbsChannel != null, r = E_SYSTEM, E_SYSTEM, "Failed to get the channel.");
+
+       pCbsChannel->GetRange(from, to);
+       name = pCbsChannel->GetName();
+       if (pCbsChannel->IsActivated())
+       {
+               activate = true;
+       }
+       else
+       {
+               activate = false;
+       }
+       return r;
+}
+
+result
+_SmsMmsCallbackHandler::GetCbsChannelsCount(int& count)
+{
+       result r = E_SUCCESS;
+
+       if (__pTempCbsChannelList)
+       {
+               count = __pTempCbsChannelList->GetCount();
+       }
+
+       return r;
+}
+
+result
+_SmsMmsCallbackHandler::SaveCbsSettings()
+{
+       int err = MSG_SUCCESS;
+       result r = E_SUCCESS;
+       int fromId = 0;
+       int toId = 0;
+       bool isChannelActive = false;
+       String channelName;
+       char* pTempChannelName = null;
+
+       SysTryReturn(NID_MSG, __pTempCbsChannelList != null, r = E_SYSTEM, E_SYSTEM, "Failed to save the channel.");
+       err = msg_get_list_handle(__cbsSettingsHandle, MSG_CB_CHANNEL_LIST_STRUCT, (void **)&__pCbsChannelList);
+
+       // save Channel List
+       for (int index = 0; index < __pTempCbsChannelList->GetCount(); index++)
+       {
+               Tizen::Messaging::CbsChannel* pCbsChannel = dynamic_cast< Tizen::Messaging::CbsChannel* >(__pTempCbsChannelList->GetAt(index));
+               SysTryReturn(NID_MSG, pCbsChannel != null, r = E_SYSTEM, E_SYSTEM, "Failed to get the channel.");
+               pCbsChannel->GetRange(fromId, toId);
+               channelName = pCbsChannel->GetName();
+               if (pCbsChannel->IsActivated())
+               {
+                       isChannelActive = true;
+               }
+
+               pTempChannelName = _StringConverter::CopyToCharArrayN(channelName);
+               SysTryReturn(NID_MSG, pTempChannelName != null, r = E_OUT_OF_MEMORY, r, "Memory allocation failed.");
+
+               msg_set_bool_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_ACTIVATE_BOOL, isChannelActive);
+               msg_set_int_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_ID_FROM_INT, fromId);
+               msg_set_int_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_ID_TO_INT, toId);
+               msg_set_str_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_NAME_STR,
+                                        pTempChannelName,CB_CHANNEL_NAME_MAX);
+
+               if (pTempChannelName)
+               {
+                       delete[] pTempChannelName;
+                       pTempChannelName = null;
                }
        }
+
+       err = msg_set_cb_opt(__msgHandle, __cbsSettingsHandle);
+       r = ConvertException(err);
+       return r;
 }
 
-void
-_SmsMmsCallbackHandler::SentMmsMessageStatusCallback(messages_sending_result_e status, void* pUserEvent)
+result
+_SmsMmsCallbackHandler::LoadCbsSettings()
 {
+       int err = MSG_SUCCESS;
        result r = E_SUCCESS;
-       _MmsEvent* pMmsEvent = static_cast <_MmsEvent*>(pUserEvent);
-       _MmsEventArg* pMmsEventArg = null;
+       CbsChannel* pCbsChannel = NULL;
+       int fromId = 0;
+       int toId = 0;
+       bool isChannelActive = false;
+       char channelName[CB_CHANNEL_NAME_MAX + 1] = {0,};
 
-       SysLog(NID_MSG, "MMS message sent status[%d]", status);
+       __pTempCbsChannelList = new (std::nothrow) ArrayList();
+       SysTryCatch(NID_MSG, __pTempCbsChannelList != null, r = E_OUT_OF_MEMORY, r, "memory allocation failed");
 
-       switch (status)
+       // make a list
+       r = __pTempCbsChannelList->Construct();
+       SysTryCatch(NID_MSG, r == E_SUCCESS, , r, "Failed to construct an ArrayList");
+
+       if (__cbsSettingsHandle)
        {
-       case MESSAGES_SENDING_SUCCEEDED:      // Message is sent successfully
-               SysLog(NID_MSG, "MESSAGES_SENDING_SUCCEEDED -> E_SUCCESS");
-               r = E_SUCCESS;
-               break;
+               // Load Channel List
+               err = msg_get_list_handle(__cbsSettingsHandle, MSG_CB_CHANNEL_LIST_STRUCT, (void **)&__pCbsChannelList);
+               for (int index = 0; index < __pCbsChannelList->nCount; index++)
+               {
+                       msg_get_bool_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_ACTIVATE_BOOL, &isChannelActive);
+                       msg_get_int_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_ID_FROM_INT, &fromId);
+                       msg_get_int_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_ID_TO_INT, &toId);
+                       msg_get_str_value(__pCbsChannelList->msg_struct_info[index], MSG_CB_CHANNEL_NAME_STR,
+                                                channelName,CB_CHANNEL_NAME_MAX);
+
+                       pCbsChannel = _CbsChannelImpl::GetCbsChannelN(fromId, toId, String(channelName));
+                       SysTryCatch(NID_MSG, pCbsChannel != null, r = E_SYSTEM, r, "Failed to get the channel.");
+                       if (isChannelActive)
+                       {
+                               _CbsChannelImpl::GetInstance(*pCbsChannel)->SetCbsChannelState(isChannelActive);
+                       }
+                       __pTempCbsChannelList->Add(*pCbsChannel);
+               }
+       }
 
-       case MESSAGES_SENDING_FAILED:         // Message is not sending
-               SysLog(NID_MSG, "MESSAGES_SENDING_SUCCEEDED -> E_FAILURE");
-               r = E_FAILURE;
-               break;
+       r = ConvertException(err);
+       return r;
 
-       default:
-               SysLog(NID_MSG, "default -> E_FAILURE");
-               r = E_FAILURE;
-               break;
+CATCH:
+       if (__pTempCbsChannelList)
+       {
+               if (__pTempCbsChannelList->GetCount() > 0)
+               {
+                       __pTempCbsChannelList->RemoveAll(true);
+               }
+               delete __pTempCbsChannelList;
+               __pTempCbsChannelList = null;
+       }
+
+       return r;
+}
+
+int
+_SmsMmsCallbackHandler::RegisterMessageCallback()
+{
+       int err = MSG_SUCCESS;
+
+       if (__msgHandle && !__callbackRegistered)
+       {
+               err = msg_reg_sent_status_callback(__msgHandle, &_SmsMmsCallbackHandler::SentMessageStatusCallback, null);
+               __callbackRegistered = true;
+       }
+
+       return err;
+}
+
+int
+_SmsMmsCallbackHandler::CloseMessageHandle()
+{
+       int err = MSG_SUCCESS;
+
+       if (__msgHandle)
+       {
+               err = msg_close_msg_handle(&__msgHandle);
+               __msgHandle = 0;
+       }
+
+       return err;
+}
+
+int
+_SmsMmsCallbackHandler::CloseCbsSettingsHandle()
+{
+       int err = MSG_SUCCESS;
+
+       if (__cbsSettingsHandle)
+       {
+               err = msg_release_struct(&__cbsSettingsHandle);
+               __cbsSettingsHandle = 0;
        }
 
-       if (pMmsEvent)
+       if (__pTempCbsChannelList)
        {
-               pMmsEventArg = new (std::nothrow) _MmsEventArg(r);
-               if (pMmsEventArg)
+               if (__pTempCbsChannelList->GetCount() > 0)
                {
-                       pMmsEvent->Fire(*pMmsEventArg);
+                       __pTempCbsChannelList->RemoveAll(true);
                }
+               delete __pTempCbsChannelList;
+               __pTempCbsChannelList = null;
        }
+
+       return err;
 }
 
 void
-_SmsMmsCallbackHandler::IncomingSmsMessageCallback(messages_message_h incomingMsg, void* pUserParam)
+_SmsMmsCallbackHandler::SetInComingSmsCallback(bool incomingSmsCallbackRegistered)
 {
-       _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(pUserParam);
-       _SmsEventArg* pSmsEventArg = null;
-       char* pMsgBody = null;
-       char* pMsgAddress = null;
-       time_t tempReceivedTime = 0;
-       int port = 0;
-       DateTime receivedTime;
-       messages_recipient_type_e recipientType = MESSAGES_RECIPIENT_TO;
+       __incomingSmsCallbackRegistered = incomingSmsCallbackRegistered;
+}
+
+void
+_SmsMmsCallbackHandler::SetCbsAndEtwsUserEvent(_MessageType msgType, Tizen::Base::Object* pEvent)
+{
+       if (msgType == _MSG_CBS)
+       {
+               __pCbsUserEvent = pEvent;
+       }
+       else
+       {
+               __pEtwsUserEvent = pEvent;
+       }
+}
 
-       messages_get_text(incomingMsg, &pMsgBody);
-       messages_get_time(incomingMsg, &tempReceivedTime);   // get msg time
-       messages_get_message_port(incomingMsg, &port);   // get port number
-       messages_get_address(incomingMsg, 0, &pMsgAddress, &recipientType);
+result
+_SmsMmsCallbackHandler::AddToMessageMap(int reqId, _MessageType msgType, Tizen::Base::Object* pEvent)
+{
+       result r = E_SUCCESS;
 
-       String message(pMsgBody);       // porting char* to String
-       String senderAddress(pMsgAddress);
+       Integer* pReqId = new (std::nothrow) Integer(reqId);
+       SysTryReturn(NID_MSG, pReqId != null, E_OUT_OF_MEMORY, r = E_OUT_OF_MEMORY, "memory allocation failed.");
+       Integer* pMsgType = new (std::nothrow) Integer(msgType);
+       SysTryReturn(NID_MSG, pMsgType != null, E_OUT_OF_MEMORY, r = E_OUT_OF_MEMORY, "memory allocation failed.");
 
-       receivedTime = _MsgUtil::ConvertTime(&tempReceivedTime);
+       __msgMutex.Acquire();
 
-       SysLog(NID_MSG, "incoming sms msg_body: [%s]", pMsgBody);
-       SysLog(NID_MSG, "incoming sms port: [%d]", port);
-       SysLog(NID_MSG, "incoming sms received time: [%s]", ctime(&tempReceivedTime));
+       r = __messageMap.Add(*pReqId, *pMsgType);
+       r = __messageMap.Add(*pReqId, *pEvent);
 
-       free(pMsgBody);
-       pMsgBody = null;
-       free(pMsgAddress);
-       pMsgAddress = null;
+       __msgMutex.Release();
 
-       if (pSmsEvent)
+       return r;
+}
+
+result
+_SmsMmsCallbackHandler::GetAndRemoveFromMessageMap(int reqId, _MessageType& msgType, Tizen::Base::Object** pUserEvent)
+{
+       result r = E_SUCCESS;
+
+       Integer* pReqId = new (std::nothrow) Integer(reqId);
+       SysTryReturn(NID_MSG, pReqId != null, E_OUT_OF_MEMORY, r = E_OUT_OF_MEMORY, "memory allocation failed.");
+       Integer* pKey = null;
+       Integer* pMsgType = null;
+       Tizen::Base::Object* pEvent = null;
+       IEnumerator* pValueEnum = null;
+       IMapEnumerator* pMapEnum = null;
+
+       __msgMutex.Acquire();
+
+       pValueEnum = __messageMap.GetValuesN(*pReqId);
+
+       if (pValueEnum)
        {
-               if (port == 0)  // normal incoming SMS message case
+               if (pValueEnum->MoveNext() == E_SUCCESS)
                {
-                       pSmsEventArg = new (std::nothrow) _SmsEventArg(message, senderAddress, receivedTime);
-                       SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
+                       pMsgType = static_cast <Integer*>(pValueEnum->GetCurrent());
+
+                       if (pValueEnum->MoveNext() == E_SUCCESS)
+                       {
+                               pEvent = static_cast <Tizen::Base::Object*>(pValueEnum->GetCurrent());
+                       }
                }
-               else                    // SMS trigger message case
+       }
+
+       *pUserEvent = pEvent;
+
+       if (pMsgType)
+       {
+               if (pMsgType->ToInt() == _MSG_SMS)
                {
-                       pSmsEventArg = new (std::nothrow) _SmsEventArg(port, receivedTime, message);
-                       SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
+                       msgType = _MSG_SMS;
                }
+               else
+               {
+                       msgType = _MSG_MMS;
+               }
+       }
 
-               pSmsEvent->Fire(*pSmsEventArg);
+       //Manually getting and deleting the key value
+       pMapEnum = __messageMap.GetMapEnumeratorN();
+
+       if (pMapEnum)
+       {
+               while (pMapEnum->MoveNext() == E_SUCCESS)
+               {
+                       pKey = static_cast <Integer*>(pMapEnum->GetKey());
+                       if (pKey)
+                       {
+                               if (!(pKey->CompareTo(*pReqId)))
+                               {
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       r = __messageMap.Remove(*pReqId, false);
+
+       delete pMapEnum;
+       delete pValueEnum;
+       delete pMsgType;
+       delete pReqId;
+       delete pKey;
+
+       __msgMutex.Release();
+
+       return r;
+}
+
+void
+_SmsMmsCallbackHandler::SentMessageStatusCallback(msg_handle_t hMsgHandle, msg_struct_t msgStatus, void* pUserParam)
+{
+       result r = E_SUCCESS;
+       _MessageType msgType = (_MessageType) -1;
+       Tizen::Base::Object* pUserEvent = null;
+       int status = MSG_NETWORK_SEND_FAIL;
+       int reqId = 0;
+
+       msg_get_int_value(msgStatus, MSG_SENT_STATUS_REQUESTID_INT, &reqId);
+       msg_get_int_value(msgStatus, MSG_SENT_STATUS_NETWORK_STATUS_INT, &status);
+
+       _SmsMmsCallbackHandler::GetInstance()->GetAndRemoveFromMessageMap(reqId, msgType, &pUserEvent);
+
+       SysLog(NID_MSG, "hMsgHandle[%d]", hMsgHandle);
+       SysLog(NID_MSG, "req[%d]", reqId);
+       SysLog(NID_MSG, "msgType[%d]", msgType);
+       SysLog(NID_MSG, "pUserEvent[%d]", pUserEvent);
+
+       if (status == MSG_NETWORK_SEND_SUCCESS)
+       {
+               r = E_SUCCESS;
+               SysLog(NID_MSG, "Message is sent successfully");
+       }
+       else
+       {
+               r = E_FAILURE;
+               SysLog(NID_MSG, "Failed to send the message. error cause: Message is not sending");
+       }
+
+       if (msgType == _MSG_SMS)
+       {
+               _SmsEvent* pSmsEvent = dynamic_cast <_SmsEvent*>(pUserEvent);
+               _SmsEventArg* pSmsEventArg = null;
+
+               if (pSmsEvent)
+               {
+                       pSmsEventArg = new (std::nothrow) _SmsEventArg(r);
+                       if (pSmsEventArg)
+                       {
+                               pSmsEvent->Fire(*pSmsEventArg);
+                       }
+               }
+       }
+       else
+       {
+               if (msgType == _MSG_MMS)
+               {
+                       _MmsEvent* pMmsEvent = dynamic_cast <_MmsEvent*>(pUserEvent);
+                       _MmsEventArg* pMmsEventArg = null;
+
+                               if (pMmsEvent)
+                               {
+                                       pMmsEventArg = new (std::nothrow) _MmsEventArg(r);
+                                               if (pMmsEventArg)
+                                               {
+                                                       pMmsEvent->Fire(*pMmsEventArg);
+                                               }
+                               }
+               }
        }
+
 }
 
 void
-_SmsMmsCallbackHandler::IncomingCbsMessageCallback(messages_cb_message_h incomingMsg, void* pUserParam)
+_SmsMmsCallbackHandler::IncomingSmsMessageCallback(msg_handle_t hMsgHandle, msg_struct_t newMsg, void* pUserParam)
 {
        _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(pUserParam);
        _SmsEventArg* pSmsEventArg = null;
-       char* pMsgBody = null;
-       time_t tempReceivedTime = 0;
+
+       int msgSize = 0;
+       msg_get_int_value(newMsg, MSG_MESSAGE_DATA_SIZE_INT, &msgSize);
+       char msgText[msgSize + 1];
+       memset(msgText, 0, msgSize + 1);
+       msg_get_str_value(newMsg, MSG_MESSAGE_SMS_DATA_STR, msgText, msgSize);
+       String message(msgText);
+
+       int port = -1;
+       msg_get_int_value(newMsg, MSG_MESSAGE_DEST_PORT_INT, &port);
+
+       int displayTime = -1;
+       msg_get_int_value(newMsg, MSG_MESSAGE_DISPLAY_TIME_INT, &displayTime);
+       DateTime receivedTime = _MsgUtil::ConvertTime((time_t *) &displayTime);
+
+       char address[MAX_ADDRESS_VAL_LEN] = {0, };
+       msg_struct_list_s* pAddrList = NULL;
+       msg_struct_t addrInfo = NULL;
+       msg_get_list_handle(newMsg, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&pAddrList);
+       addrInfo = pAddrList->msg_struct_info[0];
+       msg_get_str_value(addrInfo, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, address, MAX_ADDRESS_VAL_LEN);
+       String senderAddress(address);
+
+       SysLog(NID_MSG, "hMsgHandle: [%d]", hMsgHandle);
+       SysLog(NID_MSG, "msg_body: [%s]", msgText);
+       SysLog(NID_MSG, "port: [%d]", port);
+       //SysLog(NID_MSG, "received time: [%s]", ctime(pReceivedTime));
+
+       if (_SmsMmsCallbackHandler::GetInstance()->__incomingSmsCallbackRegistered)
+       {
+               if (pSmsEvent)
+               {
+                       if (port == 0)  // normal incoming SMS message case
+                       {
+                               pSmsEventArg = new (std::nothrow) _SmsEventArg(message, senderAddress, receivedTime);
+                               SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
+                       }
+                       else            // SMS trigger message case
+                       {
+                               pSmsEventArg = new (std::nothrow) _SmsEventArg(port, receivedTime, message, senderAddress);
+                               SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
+                       }
+                       pSmsEvent->Fire(*pSmsEventArg);
+               }
+       }
+}
+
+void
+_SmsMmsCallbackHandler::IncomingCbsMessageCallback(msg_handle_t hMsgHandle, msg_struct_t newMsg, void* pUserParam)
+{
+       _SmsEventArg* pSmsEventArg = null;
+       int tempReceivedTime = 0;
        DateTime receivedTime;
        bool etwsNotifiation = false;
        int messgeId = 0;
        int serialNumber = 0;
        int length = 0;
-       int dataCodingScheme = 0;
-       messages_message_type_e cbsType;
+       int cbsType = -1;
        Tizen::Base::ByteBuffer msgSerialNumber;
 
-       messages_cb_get_text(incomingMsg, &pMsgBody);
-       messages_cb_get_time(incomingMsg, &tempReceivedTime);
-       messages_cb_get_message_id(incomingMsg, &messgeId);
-       messages_cb_get_serial_number(incomingMsg, &serialNumber);
-       messages_cb_get_message_type(incomingMsg, &cbsType);
-       messages_cb_get_dcs(incomingMsg, &dataCodingScheme);
+       msg_get_int_value(newMsg, MSG_CB_MSG_RECV_TIME_INT, &tempReceivedTime);
+       receivedTime = _MsgUtil::ConvertTime((time_t *) &tempReceivedTime);
 
-       Tizen::Base::Integer  serialno(serialNumber);
+       msg_get_int_value(newMsg, MSG_CB_MSG_MSG_ID_INT, &messgeId);
+       msg_get_int_value(newMsg, MSG_CB_MSG_SERIAL_NUM_INT, &serialNumber);
+       msg_get_int_value(newMsg, MSG_CB_MSG_TYPE_INT, &cbsType);
+
+       Tizen::Base::Integer serialno(serialNumber);
        length = serialno.ToString().GetLength();
 
        msgSerialNumber.Construct(length);
        msgSerialNumber.SetInt(0, serialNumber);
        msgSerialNumber.SetPosition(0);
 
-       String message(pMsgBody);       // porting char* to String
+       if (cbsType == MSG_TYPE_SMS_ETWS_PRIMARY || cbsType == MSG_TYPE_SMS_ETWS_SECONDARY)
+       {
+               int etwsWarningType;
+               char etwsWarningInfo[MESSAGES_ETWS_WARNING_INFO_LEN];
+               Tizen::Base::ByteBuffer msgSecurityInfo;
+               Tizen::Base::ByteBuffer etwsMsgWarningType;
+               msg_get_int_value(newMsg, MSG_CB_MSG_ETWS_WARNING_TYPE_INT, &etwsWarningType);
+               msg_get_str_value(newMsg, MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR, etwsWarningInfo, MESSAGES_ETWS_WARNING_INFO_LEN);
+
+               String etwsSecurityInfo(etwsWarningInfo);
+               length = etwsSecurityInfo.GetLength();
+               msgSecurityInfo.Construct(length);
+               msgSecurityInfo.SetArray((byte*) etwsWarningInfo, 0, length);
+               msgSecurityInfo.SetPosition(0);
+
+               Tizen::Base::Integer warningtype(etwsWarningType);
+               length = warningtype.ToString().GetLength();
+
+               etwsMsgWarningType.Construct(length);
+               etwsMsgWarningType.SetInt(0, etwsWarningType);
+               etwsMsgWarningType.SetPosition(0);
 
-       receivedTime = _MsgUtil::ConvertTime(&tempReceivedTime);
+               etwsNotifiation = true;
+               _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(_SmsMmsCallbackHandler::GetInstance()->__pEtwsUserEvent);
 
-       Tizen::Base::Integer dataCodingSchemeTemp(dataCodingScheme);
+               SysLog(NID_MSG, "cbs etwsWarningType: [%d]", etwsWarningType);
 
-       if (cbsType == MESSAGES_TYPE_SMS_ETWS_PRIMARY || cbsType == MESSAGES_TYPE_SMS_ETWS_SECONDARY)
-       {
-               etwsNotifiation = true;
+               if (pSmsEvent)
+               {
+                       pSmsEventArg = new (std::nothrow) _SmsEventArg(receivedTime, msgSerialNumber, msgSecurityInfo, messgeId,
+                                                                        etwsMsgWarningType, _SMS_EVENT_TYPE_ETWS_RECEIVE_RESULT);
+                       SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
+                       pSmsEvent->Fire(*pSmsEventArg);
+               }
        }
-
-       if (pMsgBody)
+       else
        {
-               free(pMsgBody);
-               pMsgBody = null;
+               _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(_SmsMmsCallbackHandler::GetInstance()->__pCbsUserEvent);
+               int dataCodingScheme = 0;
+               int msgSize = 0;
+
+               msg_get_int_value(newMsg, MSG_CB_MSG_CB_TEXT_LEN_INT, &msgSize);
+               char msgBody[msgSize + 1];
+               memset(msgBody, 0, msgSize + 1);
+               msg_get_str_value(newMsg, MSG_CB_MSG_CB_TEXT_STR, msgBody, msgSize + 1);
+               String message(msgBody);       // porting char* to String
+
+               msg_get_int_value(newMsg, MSG_CB_MSG_DCS_INT, &dataCodingScheme);
+               Tizen::Base::Integer dataCodingSchemeTemp(dataCodingScheme);
+
+               //language type of cbs message
+               String messageLanguage(L"");
+               byte higherNibble = dataCodingScheme & 0xf0;
+               byte lowerNibble = dataCodingScheme & 0x0f;
+
+               //check higher nibble
+               // if higher nibble 0000
+               if (higherNibble == 0x00)
+               {               
+                       messageLanguage = GetCbsLanguageType(lowerNibble);
+               }
+               else if (higherNibble == 0x01)
+               {
+                       // if higher nibble is 0001, get language type from framework
+                       int len = 15;
+                       char type[len + 1];
+                       memset(type, 0, len + 1);
+                       msg_get_str_value(newMsg, MSG_CB_MSG_LANGUAGE_TYPE_STR, type, len);
+                       messageLanguage = String(type);
+               }
+               else if (higherNibble == 0x20 && lowerNibble == 0x00)
+               {
+                       // if 0010 0000         
+                       messageLanguage = String(L"CS");                
+               }
+               else
+               {
+                       // use empty string
+               }
+
+               if (pSmsEvent)
+               {
+                       pSmsEventArg = new (std::nothrow) _SmsEventArg(message, msgSerialNumber, receivedTime, messgeId, etwsNotifiation,
+                                        ((byte) dataCodingSchemeTemp.ToChar()),messageLanguage, _SMS_EVENT_TYPE_CBS_RECEIVE_RESULT);
+                       SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
+                       pSmsEvent->Fire(*pSmsEventArg);
+               }
+
+               SysLog(NID_MSG, "cbs msg_body: [%s]", msgBody);
+               SysLog(NID_MSG, "cbs dataCodingScheme: [%d]", dataCodingScheme);
+               SysLog(NID_MSG, "cbs languageType: [%s]", messageLanguage.GetPointer());
        }
-       SysLog(NID_MSG, "cbs msg_body: [%s]", pMsgBody);
+
        SysLog(NID_MSG, "cbs msg_id: [%d]", messgeId);
        SysLog(NID_MSG, "cbs serialNumber: [%d]", serialNumber);
-       SysLog(NID_MSG, "cbs received time: [%s]", ctime(&tempReceivedTime));
        SysLog(NID_MSG, "cbs etwsNotifiation: [%d]", etwsNotifiation);
-       SysLog(NID_MSG, "cbs dataCodingScheme: [%d]", dataCodingScheme);
-
-       if (pSmsEvent)
-       {
-               pSmsEventArg = new (std::nothrow) _SmsEventArg(message, msgSerialNumber, receivedTime, messgeId, etwsNotifiation, ((byte) dataCodingSchemeTemp.ToChar()), _SMS_EVENT_TYPE_CBS_RECEIVE_RESULT);
-               SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
-               pSmsEvent->Fire(*pSmsEventArg);
-       }
 }
 
 void
-_SmsMmsCallbackHandler::IncomingWapPushMessageCallback(const char* pHeader, const char* pBody, int bodyLength, void* pUserParam)
+_SmsMmsCallbackHandler::IncomingWapPushMessageCallback(msg_handle_t hMsgHandle, const char* pHeader, const char* pBody, int bodyLength, void* pUserParam)
 {
        _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(pUserParam);
        _SmsEventArg* pSmsEventArg = null;
@@ -320,56 +866,111 @@ _SmsMmsCallbackHandler::IncomingWapPushMessageCallback(const char* pHeader, cons
        }
 }
 
-void
-_SmsMmsCallbackHandler::IncomingEtwsMessageCallback(messages_cb_message_h incomingMsg, int etwsWarningType, const char* pEtwsSecurityInfo, void* pUserParam)
+Tizen::Base::String
+_SmsMmsCallbackHandler::GetCbsLanguageType(byte codingScheme)
 {
-       _SmsEvent* pSmsEvent = static_cast <_SmsEvent*>(pUserParam);
-       _SmsEventArg* pSmsEventArg = null;
-       time_t tempReceivedTime = 0;
-       DateTime receivedTime;
-       int messgeId = 0;
-       int serialNumber = 0;
-       int length = 0;
-       Tizen::Base::ByteBuffer msgSerialNumber;
-       Tizen::Base::ByteBuffer msgSecurityInfo;
-       Tizen::Base::ByteBuffer etwsMsgWarningType;
+       String languageType(L"");
 
-       messages_cb_get_time(incomingMsg, &tempReceivedTime);
-       messages_cb_get_message_id(incomingMsg, &messgeId);
-       messages_cb_get_serial_number(incomingMsg, &serialNumber);
+       switch(codingScheme)
+       {
+       case 0x00:
+               languageType = String(L"DE");
+               break;
+       case 0x01:
+               languageType = String(L"EN");
+               break;
+       case 0x02:
+               languageType = String(L"IT");
+               break;
+       case 0x03:
+               languageType = String(L"FR");
+               break;
+       case 0x04:
+               languageType = String(L"ES");
+               break;
+       case 0x05:
+               languageType = String(L"NL");
+               break;
+       case 0x06:
+               languageType = String(L"SV");
+               break;
+       case 0x07:
+               languageType = String(L"DA");
+               break;
+       case 0x08:
+               languageType = String(L"PT");
+               break;
+       case 0x09:
+               languageType = String(L"FI");
+               break;
+       case 0x0a:
+               languageType = String(L"NO");
+               break;
+       case 0x0b:
+               languageType = String(L"EL");
+               break;
+       case 0x0c:
+               languageType = String(L"TR");
+               break;
+       case 0x0d:
+               languageType = String(L"HU");
+               break;
+       case 0x0e:
+               languageType = String(L"PL");
+               break;
+       case 0x0f:
+               languageType = String(L"");
+               SysLog(NID_MSG, "Language unspecified.");
+               break;
+       default:
+               break;
+       };
+       
+       return languageType;
+}
 
-       Tizen::Base::Integer  serialno(serialNumber);
-       length = serialno.ToString().GetLength();
+result
+_SmsMmsCallbackHandler::ConvertException(int err) const
+{
+       result r = E_SUCCESS;
 
-       msgSerialNumber.Construct(length);
-       msgSerialNumber.SetInt(0, serialNumber);
-       msgSerialNumber.SetPosition(0);
+       switch (err)
+       {
+       case MSG_SUCCESS:
+               r = E_SUCCESS;
+               break;
 
-       String etwsSecurityInfo(pEtwsSecurityInfo);
-       length = etwsSecurityInfo.GetLength();
-       msgSecurityInfo.Construct(length);
-       msgSecurityInfo.SetArray((byte*) pEtwsSecurityInfo, 0, length);
-       msgSecurityInfo.SetPosition(0);
+       case MSG_ERR_INVALID_PARAMETER:
+       case MSG_ERR_INVALID_MESSAGE:
+       case MSG_ERR_NULL_POINTER:
+       case MSG_ERR_NULL_MESSAGE:
+               r = E_INVALID_ARG;
+               break;
 
-       Tizen::Base::Integer  warningtype(etwsWarningType);
-       length = warningtype.ToString().GetLength();
+       case MSG_ERR_MEMORY_ERROR:
+               r = E_OUT_OF_MEMORY;
+               break;
 
-       etwsMsgWarningType.Construct(length);
-       etwsMsgWarningType.SetInt(0, etwsWarningType);
-       etwsMsgWarningType.SetPosition(0);
+       case MSG_ERR_SERVER_NOT_READY:
+       case MSG_ERR_TRANSPORT_ERROR:
+       case MSG_ERR_COMMUNICATION_ERROR:
+               r = E_NETWORK_UNAVAILABLE;
+               break;
 
-       receivedTime = _MsgUtil::ConvertTime(&tempReceivedTime);
+       case MSG_ERR_NO_SIM:
+               r = E_DEVICE_UNAVAILABLE;
+               break;
 
-       SysLog(NID_MSG, "cbs msg_id: [%d]", messgeId);
-       SysLog(NID_MSG, "cbs received time: [%s]", ctime(&tempReceivedTime));
-       SysLog(NID_MSG, "cbs etwsWarningType: [%d]", etwsWarningType);
+       case MSG_ERR_PLUGIN_TAPI_FAILED:
+               r = E_FAILURE;
+               break;
 
-       if (pSmsEvent)
-       {
-               pSmsEventArg = new (std::nothrow) _SmsEventArg(receivedTime, msgSerialNumber, msgSecurityInfo, messgeId, etwsMsgWarningType, _SMS_EVENT_TYPE_ETWS_RECEIVE_RESULT);
-               SysTryReturnVoidResult(NID_MSG, pSmsEventArg != null, E_OUT_OF_MEMORY, "memory allocation failed.");
-               pSmsEvent->Fire(*pSmsEventArg);
+       default:
+               r = E_SYSTEM;
+               break;
        }
+
+       return r;
 }
 
 } } // Tizen::Messaging