2 * Copyright 2012-2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
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.
20 #include <security-server.h>
23 #include "MsgCppTypes.h"
24 #include "MsgException.h"
25 #include "MsgUtilFile.h"
26 #include "MsgGconfWrapper.h"
27 #include "MsgProxyListener.h"
28 #include "MsgHandle.h"
30 /*==================================================================================================
31 IMPLEMENTATION OF MsgHandle - Control Member Functions
32 ==================================================================================================*/
33 MsgHandle::MsgHandle() : mCounter(0), mClientSock()
35 memset(mConnectionId, 0x00, sizeof(mConnectionId));
36 memset(mCookie, 0x00, sizeof(mCookie));
40 MsgHandle::~MsgHandle()
46 void MsgHandle::openHandle()
53 // server is currently booting and service is not available until the end of booting
54 MsgSettingGetBool(VCONFKEY_MSG_SERVER_READY, &bReady);
56 if (bReady == false) {
57 THROW(MsgException::SERVER_READY_ERROR, "Msg Server is not ready !!!!!");
59 MSG_DEBUG("Msg Server is ready !!!!!");
63 // cookieSize = security_server_get_cookie_size();
65 // MSG_DEBUG("cookie size : [%d]", cookieSize);
68 // ret = security_server_request_cookie(mCookie, cookieSize);
71 // MSG_DEBUG("security_server_request_cookie() error!! [%d]", ret);
80 void MsgHandle::closeHandle(MsgHandle* pHandle)
84 //Remove CB List of closing Handle
85 MsgProxyListener* eventListener = MsgProxyListener::instance();
87 eventListener->clearListOfClosedHandle(pHandle);
88 //eventListener->stop();
97 void MsgHandle::connectSocket()
99 mClientSock.connect(MSG_SOCKET_PATH);
103 void MsgHandle::disconnectSocket()
109 void MsgHandle::write(const char *pCmdData, int cmdSize, char **ppEvent)
111 if (pCmdData == NULL || ppEvent == NULL) {
112 THROW(MsgException::INVALID_PARAM, "Param is NULL");
117 // Send Command to MSG FW
118 ret = mClientSock.write(pCmdData, cmdSize);
120 THROW(MsgException::IPC_ERROR, "IPC write error");
122 // Receive Result from MSG FW
125 if (*ppEvent == NULL) {
126 THROW(MsgException::INVALID_RESULT, "event is NULL");
132 void MsgHandle::read(char **ppEvent)
134 unsigned int dataSize = 0;
136 dataSize = mClientSock.read(ppEvent, &dataSize);
139 THROW(MsgException::IPC_ERROR, "Server closed connection");
144 void MsgHandle::convertMsgStruct(const MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_INFO_S *pDest)
148 pDest->msgId = pSrc->msgId;
149 pDest->threadId = pSrc->threadId;
150 pDest->folderId = pSrc->folderId;
151 pDest->msgType.mainType = pSrc->mainType;
152 pDest->msgType.subType = pSrc->subType;
153 pDest->msgType.classType= pSrc->classType;
154 pDest->storageId = pSrc->storageId;
156 msg_struct_list_s *addr_info_s = pSrc->addr_list;
159 msg_struct_s *addr_info = NULL;
160 MSG_ADDRESS_INFO_S *address = NULL;
162 pDest->nAddressCnt = addr_info_s->nCount;
164 for (int i = 0; i < addr_info_s->nCount; i++)
166 addr_info = (msg_struct_s *)addr_info_s->msg_struct_info[i];
167 address = (MSG_ADDRESS_INFO_S *)addr_info->data;
169 pDest->addressList[i].addressType = address->addressType;
170 pDest->addressList[i].recipientType = address->recipientType;
171 pDest->addressList[i].contactId = address->contactId;
172 strncpy(pDest->addressList[i].addressVal, address->addressVal, MAX_ADDRESS_VAL_LEN);
173 strncpy(pDest->addressList[i].displayName, address->displayName, MAX_DISPLAY_NAME_LEN);
174 pDest->addressList[i].displayName[MAX_DISPLAY_NAME_LEN] = '\0';
178 strncpy(pDest->replyAddress, pSrc->replyAddress, MAX_PHONE_NUMBER_LEN);
179 strncpy(pDest->subject, pSrc->subject, MAX_SUBJECT_LEN);
181 pDest->displayTime = pSrc->displayTime;
182 pDest->networkStatus = pSrc->networkStatus;
183 pDest->encodeType = pSrc->encodeType;
184 pDest->bRead = pSrc->bRead;
185 pDest->bProtected = pSrc->bProtected;
186 pDest->bBackup = pSrc->bBackup;
187 pDest->priority = pSrc->priority;
188 pDest->direction = pSrc->direction;
191 pDest->msgPort.valid = pSrc->bPortValid;
193 if (pDest->msgPort.valid == true) {
194 pDest->msgPort.dstPort = pSrc->dstPort;
195 pDest->msgPort.srcPort = pSrc->srcPort;
198 MSG_DEBUG("nSize = %d", pSrc->dataSize);
200 if (pSrc->mainType == MSG_SMS_TYPE){
201 pDest->bTextSms = true;
202 pDest->dataSize = pSrc->dataSize;
204 memset(pDest->msgText, 0x00, sizeof(pDest->msgText));
206 if (pSrc->dataSize > MAX_MSG_TEXT_LEN) {
207 // Save Message Data into File
208 char fileName[MSG_FILENAME_LEN_MAX+1];
209 memset(fileName, 0x00, sizeof(fileName));
211 if(MsgCreateFileName(fileName) == false)
212 THROW(MsgException::FILE_ERROR, "MsgCreateFileName error");
214 MSG_DEBUG("Save pSrc->pData into file : size[%d] name[%s]", pDest->dataSize, fileName);
216 if (MsgWriteIpcFile(fileName, (char*)pSrc->pData, pSrc->dataSize) == false)
217 THROW(MsgException::FILE_ERROR, "MsgWriteIpcFile error");
219 memset(pDest->msgData, 0x00, sizeof(pDest->msgData));
220 strncpy(pDest->msgData, fileName, MAX_MSG_DATA_LEN);
222 pDest->bTextSms = false;
225 if (pDest->encodeType == MSG_ENCODE_8BIT)
226 memcpy(pDest->msgText, pSrc->pData, pSrc->dataSize);
228 strncpy(pDest->msgText, (char*)pSrc->pData, pSrc->dataSize);
231 MSG_DEBUG("pData = %s", pSrc->pData);
232 MSG_DEBUG("msgText = %s", pDest->msgText);
233 } else if (pSrc->mainType == MSG_MMS_TYPE) {
235 pDest->bTextSms = false;
236 pDest->dataSize = pSrc->dataSize;
238 if(pSrc->subType == MSG_READREPLY_MMS) {
239 memset(pDest->msgData, 0x00, sizeof(pDest->msgData));
240 memcpy(pDest->msgData, pSrc->pMmsData, pSrc->dataSize);
242 // Save Message Data into File
243 char fileName[MSG_FILENAME_LEN_MAX+1];
244 memset(fileName, 0x00, sizeof(fileName));
246 if(MsgCreateFileName(fileName) == false)
247 THROW(MsgException::FILE_ERROR, "MsgCreateFileName error");
249 // change file extension in case of java MMS msg
250 if (pSrc->subType == MSG_SENDREQ_JAVA_MMS) {
252 pFileNameExt = strstr(fileName,"DATA");
253 strncpy(pFileNameExt,"JAVA", MSG_FILENAME_LEN_MAX);
256 MSG_DEBUG("Save Message Data into file : size[%d] name[%s]", pDest->dataSize, fileName);
258 if (MsgWriteIpcFile(fileName, (char*)pSrc->pMmsData, pSrc->dataSize) == false)
259 THROW(MsgException::FILE_ERROR, "MsgWriteIpcFile error");
261 memset(pDest->msgData, 0x00, sizeof(pDest->msgData));
262 strncpy(pDest->msgData, fileName, MAX_MSG_DATA_LEN);
264 strncpy(pDest->msgText, (char*)pSrc->pData, MAX_MSG_TEXT_LEN);
267 if (strlen(pSrc->thumbPath) > 0) {
268 memset(pDest->thumbPath, 0x00, sizeof(pDest->thumbPath));
269 memcpy(pDest->thumbPath, pSrc->thumbPath, sizeof(pDest->thumbPath));
278 void MsgHandle::convertMsgStruct(const MSG_MESSAGE_INFO_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDest)
282 pDest->msgId = pSrc->msgId;
283 pDest->threadId = pSrc->threadId;
284 pDest->folderId = pSrc->folderId;
285 pDest->mainType = pSrc->msgType.mainType;
286 pDest->subType = pSrc->msgType.subType;
287 pDest->storageId = pSrc->storageId;
289 strncpy(pDest->replyAddress, pSrc->replyAddress, MAX_PHONE_NUMBER_LEN);
290 strncpy(pDest->subject, pSrc->subject, MAX_SUBJECT_LEN);
292 pDest->displayTime = pSrc->displayTime;
293 pDest->networkStatus = pSrc->networkStatus;
294 pDest->encodeType = pSrc->encodeType;
295 pDest->bRead = pSrc->bRead;
296 pDest->bProtected = pSrc->bProtected;
297 pDest->bBackup = pSrc->bBackup;
298 pDest->priority = pSrc->priority;
299 pDest->direction = pSrc->direction;
302 pDest->bPortValid = pSrc->msgPort.valid;
304 if (pDest->bPortValid == true) {
305 pDest->dstPort = pSrc->msgPort.dstPort;
306 pDest->srcPort = pSrc->msgPort.srcPort;
309 if(pSrc->thumbPath[0] != '\0')
310 strncpy(pDest->thumbPath, pSrc->thumbPath, MSG_FILEPATH_LEN_MAX);
312 pDest->addr_list->nCount = pSrc->nAddressCnt;
314 msg_struct_s *addr_info_s = NULL;
315 MSG_ADDRESS_INFO_S *addr_info = NULL;
317 for (int i = 0; i < pDest->addr_list->nCount; i++)
319 addr_info_s = (msg_struct_s *)pDest->addr_list->msg_struct_info[i];
320 addr_info = (MSG_ADDRESS_INFO_S *)addr_info_s->data;
322 addr_info->addressType = pSrc->addressList[i].addressType;
323 addr_info->recipientType = pSrc->addressList[i].recipientType;
324 addr_info->contactId = pSrc->addressList[i].contactId;
325 strncpy(addr_info->addressVal, pSrc->addressList[i].addressVal, MAX_ADDRESS_VAL_LEN);
326 strncpy(addr_info->displayName, pSrc->addressList[i].displayName, MAX_DISPLAY_NAME_LEN);
327 addr_info->displayName[MAX_DISPLAY_NAME_LEN] = '\0';
331 if (pSrc->bTextSms == false) {
334 char* pFileData = NULL;
335 AutoPtr<char> buf(&pFileData);
337 pDest->dataSize = pSrc->dataSize;
339 // Get Message Data from File
340 if (pSrc->networkStatus != MSG_NETWORK_RETRIEVE_FAIL) {
341 MSG_DEBUG("Get Message Data from file : size[%d] name[%s]\n", pDest->dataSize, pSrc->msgData);
342 if (MsgOpenAndReadFile(pSrc->msgData, &pFileData, &fileSize) == false)
343 THROW(MsgException::FILE_ERROR, "MsgOpenAndReadFile error");
345 if (pSrc->msgType.mainType == MSG_SMS_TYPE) {
346 if (pDest->encodeType == MSG_ENCODE_8BIT) {
347 pDest->pData = (void*)new char[fileSize];
348 memset(pDest->pData, 0x00, fileSize);
349 memcpy(pDest->pData, pFileData, fileSize);
351 pDest->pData = (void*)new char[fileSize+1];
352 memset(pDest->pData, 0x00, fileSize+1);
353 strncpy((char*)pDest->pData, pFileData, fileSize);
356 if (pSrc->msgText[0] != '\0') {
357 pDest->pData = (void*)new char[strlen(pSrc->msgText)+1];
358 memset(pDest->pData, 0x00, strlen(pSrc->msgText)+1);
359 strncpy((char*)pDest->pData, pSrc->msgText, strlen(pSrc->msgText));
361 pDest->pMmsData = (void*)new char[fileSize];
362 memset(pDest->pMmsData, 0x00, fileSize);
363 memcpy(pDest->pMmsData, pFileData, fileSize);
367 pDest->dataSize = pSrc->dataSize;
369 if (pSrc->msgType.mainType == MSG_SMS_TYPE) {
370 if (pDest->encodeType == MSG_ENCODE_8BIT || pSrc->msgType.subType == MSG_ETWS_SMS) {
371 pDest->pData = (void*)new char[pDest->dataSize];
372 memset(pDest->pData, 0x00, pDest->dataSize);
373 memcpy(pDest->pData, pSrc->msgText, pDest->dataSize);
375 pDest->pData = (void*)new char[pDest->dataSize+1];
376 memset(pDest->pData, 0x00, pDest->dataSize+1);
377 strncpy((char*)pDest->pData, pSrc->msgText, pDest->dataSize);
380 if (pSrc->msgText[0] != '\0') {
381 pDest->pData = (void*)new char[strlen(pSrc->msgText)+1];
382 memset(pDest->pData, 0x00, strlen(pSrc->msgText)+1);
383 strncpy((char*)pDest->pData, pSrc->msgText, strlen(pSrc->msgText));
386 pDest->pMmsData = (void*)new char[pDest->dataSize];
387 memset(pDest->pMmsData, 0x00, pDest->dataSize);
388 memcpy(pDest->pMmsData, pSrc->msgData, pDest->dataSize);
396 void MsgHandle::convertSendOptStruct(const MSG_SENDINGOPT_S* pSrc, MSG_SENDINGOPT_INFO_S* pDest, MSG_MESSAGE_TYPE_S msgType)
400 pDest->bSetting = pSrc->bSetting;
402 if (pSrc->bSetting == false) {
403 MSG_DEBUG("No Sending Option");
407 pDest->bDeliverReq = pSrc->bDeliverReq;
408 pDest->bKeepCopy = pSrc->bKeepCopy;
410 MSG_DEBUG("pDest->bSetting = %d", pDest->bSetting);
411 MSG_DEBUG("pDest->bDeliverReq = %d", pDest->bDeliverReq);
412 MSG_DEBUG("pDest->bKeepCopy = %d", pDest->bKeepCopy);
414 if (msgType.mainType == MSG_SMS_TYPE) {
415 msg_struct_s *pStruct = (msg_struct_s *)pSrc->smsSendOpt;
418 SMS_SENDINGOPT_S *pSms = (SMS_SENDINGOPT_S *)pStruct->data;
421 pDest->option.smsSendOptInfo.bReplyPath = pSms->bReplyPath;
424 } else if (msgType.mainType == MSG_MMS_TYPE) {
425 msg_struct_s *pStruct = (msg_struct_s *)pSrc->mmsSendOpt;
428 MMS_SENDINGOPT_S *pMms = (MMS_SENDINGOPT_S *)pStruct->data;
431 pDest->option.mmsSendOptInfo.priority = pMms->priority;
432 pDest->option.mmsSendOptInfo.bReadReq = pMms->bReadReq;
434 MSG_DEBUG("pDest->option.mmsSendOpt.priority = %d", pMms->priority);
435 MSG_DEBUG("pDest->option.mmsSendOpt.bReadReq = %d", pMms->bReadReq);
437 if (pMms->expiryTime == 0) {
438 pDest->option.mmsSendOptInfo.expiryTime.type = MMS_TIMETYPE_NONE;
439 pDest->option.mmsSendOptInfo.expiryTime.time = pMms->expiryTime;
441 pDest->option.mmsSendOptInfo.expiryTime.type = MMS_TIMETYPE_RELATIVE;
442 pDest->option.mmsSendOptInfo.expiryTime.time = pMms->expiryTime;
445 if (pMms->bUseDeliveryCustomTime == true) {
446 pDest->option.mmsSendOptInfo.bUseDeliveryCustomTime = true;
448 pDest->option.mmsSendOptInfo.bUseDeliveryCustomTime = false;
450 pDest->option.mmsSendOptInfo.deliveryTime.type = MMS_TIMETYPE_RELATIVE;
451 pDest->option.mmsSendOptInfo.deliveryTime.time = pMms->deliveryTime;
453 MSG_DEBUG("pDest->option.mmsSendOpt.expiryTime = %d", pDest->option.mmsSendOptInfo.expiryTime.time);
462 void MsgHandle::convertSendOptStruct(const MSG_SENDINGOPT_INFO_S* pSrc, MSG_SENDINGOPT_S* pDest, MSG_MESSAGE_TYPE_S msgType)
466 pDest->bDeliverReq = pSrc->bDeliverReq;
467 pDest->bKeepCopy = pSrc->bKeepCopy;
469 MSG_DEBUG("pDest->bDeliverReq = %d", pDest->bDeliverReq);
470 MSG_DEBUG("pDest->bKeepCopy = %d", pDest->bKeepCopy);
472 if (msgType.mainType == MSG_SMS_TYPE) {
473 msg_struct_s *pStruct = (msg_struct_s *)pDest->smsSendOpt;
474 SMS_SENDINGOPT_S *pSms = (SMS_SENDINGOPT_S *)pStruct->data;
475 pSms->bReplyPath = pSrc->option.smsSendOptInfo.bReplyPath;
476 } else if (msgType.mainType == MSG_MMS_TYPE) {
477 msg_struct_s *pStruct = (msg_struct_s *)pDest->mmsSendOpt;
478 MMS_SENDINGOPT_S *pMms = (MMS_SENDINGOPT_S *)pStruct->data;
479 pMms->priority = pSrc->option.mmsSendOptInfo.priority;
480 pMms->bReadReq = pSrc->option.mmsSendOptInfo.bReadReq;
481 pMms->expiryTime = pSrc->option.mmsSendOptInfo.expiryTime.time;
482 pMms->deliveryTime = pSrc->option.mmsSendOptInfo.deliveryTime.time;
484 MSG_DEBUG("pDest->option.mmsSendOpt.priority = %d", pMms->priority);
485 MSG_DEBUG("pDest->option.mmsSendOpt.bReadReq = %d", pMms->bReadReq);
486 MSG_DEBUG("pDest->option.mmsSendOpt.expiryTime = %d", pMms->expiryTime);
493 int MsgHandle::getSettingCmdSize(MSG_OPTION_TYPE_T optionType)
495 int cmdSize = sizeof(MSG_CMD_S) + sizeof(MSG_OPTION_TYPE_T);
499 case MSG_GENERAL_OPT :
500 cmdSize += sizeof(MSG_GENERAL_OPT_S);
502 case MSG_SMS_SENDOPT :
503 cmdSize += sizeof(MSG_SMS_SENDOPT_S);
506 cmdSize += sizeof(MSG_SMSC_LIST_S);
508 case MSG_MMS_SENDOPT :
509 cmdSize += sizeof(MSG_MMS_SENDOPT_S);
511 case MSG_MMS_RECVOPT :
512 cmdSize += sizeof(MSG_MMS_RECVOPT_S);
514 case MSG_MMS_STYLEOPT :
515 cmdSize += sizeof(MSG_MMS_STYLEOPT_S);
517 case MSG_PUSHMSG_OPT :
518 cmdSize += sizeof(MSG_PUSHMSG_OPT_S);
521 cmdSize += sizeof(MSG_CBMSG_OPT_S);
523 case MSG_VOICEMAIL_OPT :
524 cmdSize += sizeof(MSG_VOICEMAIL_OPT_S);
526 case MSG_MSGSIZE_OPT :
527 cmdSize += sizeof(MSG_MSGSIZE_OPT_S);
535 bool MsgHandle::CheckEventData(char *pEventData)
537 MSG_EVENT_S* pEvent = (MSG_EVENT_S*)pEventData;
539 switch (pEvent->eventType)
541 case MSG_EVENT_PLG_SENT_STATUS_CNF :
542 case MSG_EVENT_PLG_INCOMING_MSG_IND :
543 case MSG_EVENT_PLG_INCOMING_MMS_CONF :
544 case MSG_EVENT_PLG_INCOMING_SYNCML_MSG_IND :
545 case MSG_EVENT_PLG_INCOMING_LBS_MSG_IND :
546 case MSG_EVENT_SYNCML_OPERATION :
547 case MSG_EVENT_PLG_STORAGE_CHANGE_IND :
548 case MSG_EVENT_PLG_INCOMING_CB_MSG_IND :
549 case MSG_EVENT_PLG_INCOMING_PUSH_MSG_IND :