2 * Copyright 2012 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.
19 #include "MsgHandle.h"
21 #include "MsgException.h"
22 #include "MsgUtilFunction.h"
25 #include "msg_private.h"
26 #include "msg_transport.h"
29 /*==================================================================================================
30 FUNCTION IMPLEMENTATION
31 ==================================================================================================*/
32 EXPORT_API int msg_submit_req(msg_handle_t handle, msg_struct_t req)
34 msg_error_t err = MSG_SUCCESS;
36 if (handle == NULL ||req == NULL)
41 MsgHandle* pHandle = (MsgHandle*)handle;
43 msg_struct_s *pStruct = (msg_struct_s *)req;
47 err = pHandle->submitReq((MSG_REQUEST_S *)pStruct->data);
49 catch (MsgException& e)
51 MSG_FATAL("%s", e.what());
52 return MSG_ERR_TRANSPORT_ERROR;
59 EXPORT_API int msg_reg_sent_status_callback(msg_handle_t handle, msg_sent_status_cb cb, void *user_param)
61 msg_error_t err = MSG_SUCCESS;
63 if (handle == NULL || cb == NULL)
68 MsgHandle* pHandle = (MsgHandle*)handle;
72 err = pHandle->regSentStatusCallback(cb, user_param);
74 catch (MsgException& e)
76 MSG_FATAL("%s", e.what());
77 return MSG_ERR_CALLBACK_ERROR;
84 EXPORT_API int msg_reg_sms_message_callback(msg_handle_t handle, msg_sms_incoming_cb cb, unsigned short port, void *user_param)
86 msg_error_t err = MSG_SUCCESS;
88 if (handle == NULL || cb == NULL)
93 MsgHandle* pHandle = (MsgHandle*)handle;
97 err = pHandle->regSmsMessageCallback(cb, port, user_param);
99 catch (MsgException& e)
101 MSG_FATAL("%s", e.what());
102 return MSG_ERR_CALLBACK_ERROR;
109 EXPORT_API int msg_reg_mms_conf_message_callback(msg_handle_t handle, msg_mms_conf_msg_incoming_cb cb, const char *app_id, void *user_param)
111 msg_error_t err = MSG_SUCCESS;
113 if (handle == NULL || cb == NULL)
118 if (app_id && strlen(app_id) > MAX_MMS_JAVA_APPID_LEN)
123 MsgHandle* pHandle = (MsgHandle*)handle;
127 err = pHandle->regMmsConfMessageCallback(cb, app_id, user_param);
129 catch (MsgException& e)
131 MSG_FATAL("%s", e.what());
132 return MSG_ERR_CALLBACK_ERROR;
139 EXPORT_API int msg_reg_syncml_message_callback(msg_handle_t handle, msg_syncml_msg_incoming_cb cb, void *user_param)
141 msg_error_t err = MSG_SUCCESS;
143 if (handle == NULL || cb == NULL)
148 MsgHandle* pHandle = (MsgHandle*)handle;
152 err = pHandle->regSyncMLMessageCallback(cb, user_param);
154 catch (MsgException& e)
156 MSG_FATAL("%s", e.what());
157 return MSG_ERR_CALLBACK_ERROR;
164 EXPORT_API int msg_reg_lbs_message_callback(msg_handle_t handle, msg_lbs_msg_incoming_cb cb, void *user_param)
166 msg_error_t err = MSG_SUCCESS;
168 if (handle == NULL || cb == NULL)
173 MsgHandle* pHandle = (MsgHandle*)handle;
177 err = pHandle->regLBSMessageCallback(cb, user_param);
179 catch (MsgException& e)
181 MSG_FATAL("%s", e.what());
182 return MSG_ERR_CALLBACK_ERROR;
189 EXPORT_API int msg_reg_syncml_message_operation_callback(msg_handle_t handle, msg_syncml_msg_operation_cb cb, void *user_param)
191 msg_error_t err = MSG_SUCCESS;
193 if (handle == NULL || cb == NULL)
198 MsgHandle* pHandle = (MsgHandle*)handle;
202 err = pHandle->regSyncMLMessageOperationCallback(cb, user_param);
204 catch (MsgException& e)
206 MSG_FATAL("%s", e.what());
207 return MSG_ERR_CALLBACK_ERROR;
214 EXPORT_API int msg_reg_push_message_callback(msg_handle_t handle, msg_push_msg_incoming_cb cb, const char *app_id, void *user_param)
216 msg_error_t err = MSG_SUCCESS;
218 if (handle == NULL || cb == NULL)
223 if (app_id && strlen(app_id) > MAX_WAPPUSH_ID_LEN)
228 MsgHandle* pHandle = (MsgHandle*)handle;
232 err = pHandle->regPushMessageCallback(cb, app_id, user_param);
234 catch (MsgException& e)
236 MSG_FATAL("%s", e.what());
237 return MSG_ERR_CALLBACK_ERROR;
243 EXPORT_API int msg_reg_cb_message_callback(msg_handle_t handle, msg_cb_incoming_cb cb, bool bsave, void *user_param)
245 msg_error_t err = MSG_SUCCESS;
247 if (handle == NULL || cb == NULL)
252 MsgHandle* pHandle = (MsgHandle*)handle;
256 err = pHandle->regCBMessageCallback(cb, bsave, user_param);
258 catch (MsgException& e)
260 MSG_FATAL("%s", e.what());
261 return MSG_ERR_CALLBACK_ERROR;
267 EXPORT_API int msg_syncml_message_operation(msg_handle_t handle, msg_message_id_t msgId)
269 msg_error_t err = MSG_SUCCESS;
271 if (handle == NULL || msgId < 1)
276 MsgHandle* pHandle = (MsgHandle*)handle;
280 err = pHandle->operateSyncMLMessage(msgId);
282 catch (MsgException& e)
284 MSG_FATAL("%s", e.what());
285 return MSG_ERR_TRANSPORT_ERROR;
292 static msg_handle_t msgHandle = NULL;
293 static msg_simple_sent_status_cb sentStatusCallback = NULL;
295 static void sent_status_cb_func(msg_handle_t handle, msg_struct_t sent_status, void *user_param)
297 // MSG_DEBUG("Sent Status [%d]", sent_status->status);
299 msg_simple_sent_status_cb pfunc = sentStatusCallback;
301 pfunc((msg_struct_t)sent_status, user_param);
303 MSG_DEBUG("After entering callback function.");
305 // Close control handle instance
306 // msg_close_msg_handle(&msgHandle);
308 // MSG_DEBUG("After msg_close_msg_handle.");
313 static int msg_send_single_sms(const char *phone_num, const char *sms_text, msg_simple_sent_status_cb cb, void *user_param)
315 if (phone_num == NULL || sms_text == NULL || cb == NULL)
317 MSG_DEBUG("Invalid parameter [%s] [%s] [%s]", phone_num, sms_text, cb);
321 if (strlen(phone_num) > MAX_PHONE_NUMBER_LEN)
323 MSG_DEBUG("Phone Number is too long [%s]", phone_num);
327 msg_struct_s req = {0,};
328 MSG_REQUEST_S msgReq = {0};
330 req.type = MSG_STRUCT_REQUEST_INFO;
331 req.data = (void *)&msgReq;
333 msg_error_t retVal = MSG_SUCCESS;
335 // Open control handle instance
336 if ((retVal = msg_open_msg_handle(&msgHandle)) != MSG_SUCCESS)
338 MSG_DEBUG("MsgOpenMsgHandle is failed. Error Code = %d", retVal);
342 //msgReq.msg = msg_new_message();
343 MSG_MESSAGE_HIDDEN_S msg_info = {0,};
344 msg_struct_s msg = {0,};
346 msg.type = MSG_STRUCT_MESSAGE_INFO;
347 msg.data = &msg_info;
349 /* when sending SMS */
350 msg_info.mainType = MSG_SMS_TYPE;
351 msg_info.subType = MSG_NORMAL_SMS;
353 msg_info.folderId = MSG_OUTBOX_ID;
355 /* fill the destination number in msgReq */
356 msg_struct_list_s addr_list = {0,};
358 addr_list.nCount = 1;
360 msg_struct_s addr_info[addr_list.nCount];
361 memset(addr_info, 0, sizeof(msg_struct_s) * addr_list.nCount);
362 addr_list.msg_struct_info = (msg_struct_t *)&addr_info;
364 MSG_ADDRESS_INFO_S address[addr_list.nCount];
365 memset(address, 0, sizeof(MSG_ADDRESS_INFO_S) * addr_list.nCount);
367 for (int i = 0; i < addr_list.nCount; i++) {
368 addr_info[i].type = MSG_STRUCT_ADDRESS_INFO;
369 addr_info[i].data = (void *)&address[i];
371 address[i].addressType = MSG_ADDRESS_TYPE_PLMN;
372 snprintf(address[i].addressVal, MAX_ADDRESS_VAL_LEN+1, "%s", phone_num);
374 address[i].recipientType = MSG_RECIPIENTS_TYPE_TO;
377 msg_info.addr_list = &addr_list;
379 msg_info.bPortValid = false;
381 /* fill the msg text in msgReq */
382 msg_info.dataSize = strlen(sms_text);
383 msg_info.pData = (void*)malloc(msg_info.dataSize+1);
384 strncpy((char *)msg_info.pData, sms_text, msg_info.dataSize);
386 sentStatusCallback = cb;
388 // register sent status callback
389 retVal = msg_reg_sent_status_callback(msgHandle, sent_status_cb_func, user_param);
391 if (retVal != MSG_SUCCESS)
393 MSG_DEBUG("msg_reg_sent_status_callback() is failed. Error Code = %d", retVal);
394 msg_close_msg_handle(&msgHandle);
398 // sending message request
399 msgReq.msg = (msg_struct_t)&msg;
401 retVal = msg_submit_req(msgHandle, (msg_struct_t)&req);
403 if (retVal != MSG_SUCCESS)
405 MSG_DEBUG("msg_submit_req() is failed. Error Code = %d", retVal);
406 msg_close_msg_handle(&msgHandle);
413 EXPORT_API int msg_sms_send(const char *phone_num_list, const char *sms_text, msg_simple_sent_status_cb cb, void *user_param)
415 if (phone_num_list == NULL || sms_text == NULL || cb == NULL)
417 MSG_DEBUG("Invalid parameter [%s] [%s] [%s]", phone_num_list, sms_text, cb);
421 char trimmed_num[strlen(phone_num_list)+1];
422 bzero(trimmed_num, strlen(phone_num_list)+1);
424 msg_error_t retVal = msg_verify_number(phone_num_list, trimmed_num);
426 if ( retVal != MSG_SUCCESS )
429 for( char* cur_num = strtok(trimmed_num,", "); cur_num ; cur_num = strtok(NULL,", "))
431 if (strlen(cur_num) > MAX_PHONE_NUMBER_LEN)
433 MSG_DEBUG("Phone number is too long [%s], and sending is skipped", cur_num);
437 MSG_DEBUG("phone number: [%s]", cur_num);
438 MSG_DEBUG("text: [%s]", sms_text);
439 retVal = msg_send_single_sms(cur_num, sms_text, cb, user_param);
441 if (retVal != MSG_SUCCESS)
449 EXPORT_API int msg_sms_send_message(msg_handle_t handle, msg_struct_t req)
451 msg_error_t err = MSG_SUCCESS;
453 if (handle == NULL || !req) {
454 MSG_FATAL("handle or req is NULL");
455 return MSG_ERR_NULL_POINTER;
458 msg_struct_s *req_s = (msg_struct_s *)req;
459 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
463 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
465 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
467 if (reqmsg->dataSize <= 0) {
468 MSG_FATAL("msg size is invalid : [%d]", reqmsg->dataSize);
469 return MSG_ERR_INVALID_PARAMETER;
472 if (reqmsg->mainType != MSG_SMS_TYPE) {
473 MSG_DEBUG("mainType is not SMS [%d]", reqmsg->mainType);
474 reqmsg->mainType = MSG_SMS_TYPE;
477 if (reqmsg->subType > MSG_CONCAT_SIM_SMS) {
478 MSG_DEBUG("subType is not SMS [%d]", reqmsg->subType);
479 reqmsg->subType = MSG_NORMAL_SMS;
482 reqmsg->folderId = MSG_OUTBOX_ID; // outbox fixed
483 reqmsg->networkStatus = MSG_NETWORK_SENDING;
485 err = msg_submit_req(handle, req);
487 if (err == MSG_SUCCESS)
488 MSG_DEBUG("Sending Message is OK!");
490 MSG_DEBUG("Sending Message is failed! [%d]", err);
496 EXPORT_API int msg_mms_send_message(msg_handle_t handle, msg_struct_t req)
498 msg_error_t err = MSG_SUCCESS;
500 if (handle == NULL || !req)
502 MSG_FATAL("handle or req is NULL");
503 return MSG_ERR_INVALID_PARAMETER;
506 msg_struct_s *req_s = (msg_struct_s *)req;
507 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
511 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
513 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
515 if (reqmsg->dataSize <= 0)
517 MSG_FATAL("MMS data size is invalid");
518 return MSG_ERR_INVALID_PARAMETER;
521 reqmsg->mainType = MSG_MMS_TYPE;
522 reqmsg->subType = MSG_SENDREQ_MMS;
523 reqmsg->folderId = MSG_OUTBOX_ID; // outbox fixed
524 reqmsg->networkStatus = MSG_NETWORK_SENDING;
526 err = msg_submit_req(handle, req);
528 if (err == MSG_SUCCESS)
529 MSG_DEBUG("Sending Message is OK!");
531 MSG_DEBUG("Sending Message is failed! [%d]", err);
537 EXPORT_API int msg_mms_send_read_report(msg_handle_t handle, msg_message_id_t msgId, msg_read_report_status_t mms_read_status)
539 msg_error_t err = MSG_SUCCESS;
543 return MSG_ERR_INVALID_PARAMETER;
546 msg_struct_t req_t = msg_create_struct(MSG_STRUCT_REQUEST_INFO);
548 msg_struct_s *req_s = (msg_struct_s *)req_t;
549 MSG_REQUEST_S *req = (MSG_REQUEST_S *)req_s->data;
550 msg_struct_s *msg_s = (msg_struct_s *)req->msg;
551 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S *)msg_s->data;
552 void *read_report_data = NULL;
553 size_t read_report_datasize;
555 read_report_datasize = sizeof(msg_read_report_status_t);
556 read_report_data = (void *)calloc(read_report_datasize, 1);
557 if(read_report_data == NULL) {
558 msg_release_struct(&req_t);
559 return MSG_ERR_MEMORY_ERROR;
562 MSG_DEBUG("mms_read_status [%d]", mms_read_status);
563 memcpy(read_report_data, &mms_read_status, read_report_datasize);
567 reqmsg->bPortValid = false;
568 reqmsg->msgId = msgId;
569 reqmsg->folderId = MSG_OUTBOX_ID; // outbox fixed
570 reqmsg->mainType = MSG_MMS_TYPE;
571 reqmsg->subType = MSG_READREPLY_MMS;
573 reqmsg->dataSize = read_report_datasize;
574 reqmsg->pMmsData = read_report_data;
576 err = msg_submit_req(handle, req_t);
577 if (err == MSG_SUCCESS)
578 MSG_DEBUG("Sending Message is OK!");
580 MSG_DEBUG("Sending Message is failed!");
582 free(read_report_data);
583 read_report_data = NULL;
584 reqmsg->pMmsData = NULL;
586 msg_release_struct(&req_t);
592 EXPORT_API int msg_mms_forward_message(msg_handle_t handle, msg_struct_t req)
594 msg_error_t err = MSG_SUCCESS;
596 if (handle == NULL || !req )
598 MSG_FATAL("handle or req is NULL");
599 return MSG_ERR_INVALID_PARAMETER;
602 msg_struct_s *req_s = (msg_struct_s *)req;
603 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
607 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
609 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
611 reqmsg->mainType = MSG_MMS_TYPE;
612 reqmsg->subType = MSG_FORWARD_MMS;
613 reqmsg->folderId = MSG_OUTBOX_ID; // outbox fixed
614 reqmsg->networkStatus = MSG_NETWORK_SENDING;
616 err = msg_submit_req(handle, req);
618 if (err == MSG_SUCCESS)
619 MSG_DEBUG("Sending Message is OK!");
621 MSG_DEBUG("Sending Message is failed!");
627 EXPORT_API int msg_mms_retrieve_message(msg_handle_t handle, msg_struct_t req)
629 msg_error_t err = MSG_SUCCESS;
631 if ( handle == NULL|| !req)
633 MSG_FATAL("handle or req is NULL");
634 return MSG_ERR_INVALID_PARAMETER;
637 msg_struct_s *req_s = (msg_struct_s *)req;
638 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
640 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
641 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
643 reqmsg->mainType = MSG_MMS_TYPE;
644 reqmsg->subType = MSG_RETRIEVE_MMS;
645 reqmsg->folderId = MSG_OUTBOX_ID; // outbox fixed
646 reqmsg->networkStatus = MSG_NETWORK_RETRIEVING;
648 err = msg_submit_req(handle, req);
650 if (err == MSG_SUCCESS)
651 MSG_DEBUG("Sending Message is OK!");
653 MSG_DEBUG("Sending Message is failed!");
659 /* reject_msg_support */
660 EXPORT_API int msg_mms_reject_message(msg_handle_t handle, msg_struct_t req)
662 msg_error_t err = MSG_SUCCESS;
664 if (handle == NULL || !req )
666 MSG_FATAL("handle or req is NULL");
667 return MSG_ERR_INVALID_PARAMETER;
670 msg_struct_s *req_s = (msg_struct_s *)req;
671 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
673 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
674 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
676 reqmsg->mainType = MSG_MMS_TYPE;
677 reqmsg->subType = MSG_NOTIFYRESPIND_MMS;
678 reqmsg->folderId = MSG_OUTBOX_ID; // outbox fixed
679 reqmsg->networkStatus = MSG_NETWORK_SENDING;
681 err = msg_submit_req(handle, req);
683 if (err == MSG_SUCCESS)
684 MSG_DEBUG("Sending Message is OK!");
686 MSG_DEBUG("Sending Message is failed!");
690 /* reject_msg_support */
693 int msg_request_get_int(void *request_info, int field)
696 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)request_info;
699 case MSG_REQUEST_REQUESTID_INT:
700 result = pRequest->reqId;
710 int msg_request_get_struct_handle(msg_struct_s *msg_struct, int field, void **value)
712 msg_error_t err = MSG_SUCCESS;
714 if(!msg_struct || !value)
715 return MSG_ERR_NULL_POINTER;
717 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)msg_struct->data;
720 case MSG_REQUEST_MESSAGE_HND:
721 *value = (void *)pRequest->msg;
723 case MSG_REQUEST_SENDOPT_HND:
724 *value = (void *)pRequest->sendOpt;
727 err = MSG_ERR_UNKNOWN;
734 int msg_request_set_int(void *request_info, int field, int value)
736 msg_error_t err = MSG_SUCCESS;
738 return MSG_ERR_NULL_POINTER;
740 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)request_info;
743 case MSG_REQUEST_REQUESTID_INT:
744 pRequest->reqId = value;
747 err = MSG_ERR_UNKNOWN;
754 int msg_request_set_struct_handle(msg_struct_s *msg_struct, int field, msg_struct_s *value)
756 msg_error_t err = MSG_SUCCESS;
757 if(!msg_struct || !value)
758 return MSG_ERR_NULL_POINTER;
760 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)msg_struct->data;
761 msg_struct_s *pTmp = NULL;
766 case MSG_REQUEST_MESSAGE_HND:
768 pTmp = (msg_struct_s *)pRequest->msg;
769 MSG_MESSAGE_HIDDEN_S *pSrc = (MSG_MESSAGE_HIDDEN_S *)value->data;
770 MSG_MESSAGE_HIDDEN_S *pDst = (MSG_MESSAGE_HIDDEN_S *)pTmp->data;
771 msg_message_copy_message(pSrc, pDst);
774 case MSG_REQUEST_SENDOPT_HND:
776 pTmp = (msg_struct_s *)pRequest->sendOpt;
777 MSG_SENDINGOPT_S *pSrc = (MSG_SENDINGOPT_S *)value->data;
778 MSG_SENDINGOPT_S *pDst = (MSG_SENDINGOPT_S *)pTmp->data;
779 pDst->bDeliverReq = pSrc->bDeliverReq;
780 pDst->bKeepCopy = pSrc->bKeepCopy;
781 pDst->bSetting = pSrc->bSetting;
783 msg_struct_s *tmpDstMmsSendOpt = (msg_struct_s *)pDst->mmsSendOpt;
784 msg_struct_s *tmpDstSmsSendOpt = (msg_struct_s *)pDst->smsSendOpt;
786 msg_struct_s *tmpSrcMmsSendOpt = (msg_struct_s *)pDst->mmsSendOpt;
787 msg_struct_s *tmpSrcSmsSendOpt = (msg_struct_s *)pDst->smsSendOpt;
789 tmpDstMmsSendOpt->type = tmpSrcMmsSendOpt->type;
790 memcpy(tmpDstMmsSendOpt->data, tmpSrcMmsSendOpt->data, sizeof(MMS_SENDINGOPT_S));
792 tmpDstSmsSendOpt->type = tmpSrcSmsSendOpt->type;
793 memcpy(tmpDstSmsSendOpt->data, tmpSrcSmsSendOpt->data, sizeof(SMS_SENDINGOPT_S));
798 err = MSG_ERR_UNKNOWN;
805 int msg_sent_status_get_int(MSG_SENT_STATUS_S *sent_status_info, int field)
811 case MSG_SENT_STATUS_REQUESTID_INT:
812 result = sent_status_info->reqId;
814 case MSG_SENT_STATUS_NETWORK_STATUS_INT:
815 result = sent_status_info->status;