2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
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 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
35 msg_error_t err = MSG_SUCCESS;
37 if (handle == NULL || req == NULL)
38 return MSG_ERR_INVALID_PARAMETER;
40 MsgHandle* pHandle = (MsgHandle*)handle;
42 msg_struct_s *pStruct = (msg_struct_s *)req;
43 MSG_TYPE_CHECK(pStruct->type, MSG_STRUCT_REQUEST_INFO);
46 err = pHandle->submitReq((MSG_REQUEST_S *)pStruct->data);
47 } catch (MsgException& e) {
48 MSG_FATAL("%s", e.what());
49 return MSG_ERR_TRANSPORT_ERROR;
56 EXPORT_API int msg_reg_sent_status_callback(msg_handle_t handle, msg_sent_status_cb cb, void *user_param)
58 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
59 msg_error_t err = MSG_SUCCESS;
61 if (handle == NULL || cb == NULL)
62 return MSG_ERR_INVALID_PARAMETER;
64 MsgHandle* pHandle = (MsgHandle*)handle;
67 err = pHandle->regSentStatusCallback(cb, user_param);
68 } catch (MsgException& e) {
69 MSG_FATAL("%s", e.what());
70 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
71 return MSG_ERR_SERVER_NOT_READY;
72 else if (e.errorCode() == MsgException::SECURITY_ERROR)
73 return MSG_ERR_PERMISSION_DENIED;
75 return MSG_ERR_CALLBACK_ERROR;
82 EXPORT_API int msg_reg_sms_message_callback(msg_handle_t handle, msg_sms_incoming_cb cb, unsigned short port, void *user_param)
84 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
85 msg_error_t err = MSG_SUCCESS;
87 if (handle == NULL || cb == NULL)
88 return MSG_ERR_INVALID_PARAMETER;
90 MsgHandle* pHandle = (MsgHandle*)handle;
93 err = pHandle->regSmsMessageCallback(cb, port, user_param);
94 } catch (MsgException& e) {
95 MSG_FATAL("%s", e.what());
96 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
97 return MSG_ERR_SERVER_NOT_READY;
98 else if (e.errorCode() == MsgException::SECURITY_ERROR)
99 return MSG_ERR_PERMISSION_DENIED;
101 return MSG_ERR_CALLBACK_ERROR;
108 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)
110 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
111 msg_error_t err = MSG_SUCCESS;
113 if (handle == NULL || cb == NULL)
114 return MSG_ERR_INVALID_PARAMETER;
116 if (app_id && strlen(app_id) > MAX_MMS_JAVA_APPID_LEN)
117 return MSG_ERR_INVALID_PARAMETER;
119 MsgHandle* pHandle = (MsgHandle*)handle;
122 err = pHandle->regMmsConfMessageCallback(cb, app_id, user_param);
123 } catch (MsgException& e) {
124 MSG_FATAL("%s", e.what());
125 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
126 return MSG_ERR_SERVER_NOT_READY;
127 else if (e.errorCode() == MsgException::SECURITY_ERROR)
128 return MSG_ERR_PERMISSION_DENIED;
130 return MSG_ERR_CALLBACK_ERROR;
137 EXPORT_API int msg_reg_syncml_message_callback(msg_handle_t handle, msg_syncml_msg_incoming_cb cb, void *user_param)
139 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
140 msg_error_t err = MSG_SUCCESS;
142 if (handle == NULL || cb == NULL)
143 return MSG_ERR_INVALID_PARAMETER;
145 MsgHandle* pHandle = (MsgHandle*)handle;
148 err = pHandle->regSyncMLMessageCallback(cb, user_param);
149 } catch (MsgException& e) {
150 MSG_FATAL("%s", e.what());
151 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
152 return MSG_ERR_SERVER_NOT_READY;
153 else if (e.errorCode() == MsgException::SECURITY_ERROR)
154 return MSG_ERR_PERMISSION_DENIED;
156 return MSG_ERR_CALLBACK_ERROR;
163 EXPORT_API int msg_reg_lbs_message_callback(msg_handle_t handle, msg_lbs_msg_incoming_cb cb, void *user_param)
165 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
166 msg_error_t err = MSG_SUCCESS;
168 if (handle == NULL || cb == NULL)
169 return MSG_ERR_INVALID_PARAMETER;
171 MsgHandle* pHandle = (MsgHandle*)handle;
174 err = pHandle->regLBSMessageCallback(cb, user_param);
175 } catch (MsgException& e) {
176 MSG_FATAL("%s", e.what());
177 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
178 return MSG_ERR_SERVER_NOT_READY;
179 else if (e.errorCode() == MsgException::SECURITY_ERROR)
180 return MSG_ERR_PERMISSION_DENIED;
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 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
192 msg_error_t err = MSG_SUCCESS;
194 if (handle == NULL || cb == NULL)
195 return MSG_ERR_INVALID_PARAMETER;
197 MsgHandle* pHandle = (MsgHandle*)handle;
200 err = pHandle->regSyncMLMessageOperationCallback(cb, user_param);
201 } catch (MsgException& e) {
202 MSG_FATAL("%s", e.what());
203 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
204 return MSG_ERR_SERVER_NOT_READY;
205 else if (e.errorCode() == MsgException::SECURITY_ERROR)
206 return MSG_ERR_PERMISSION_DENIED;
208 return MSG_ERR_CALLBACK_ERROR;
215 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)
217 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
218 msg_error_t err = MSG_SUCCESS;
220 if (handle == NULL || cb == NULL)
221 return MSG_ERR_INVALID_PARAMETER;
223 if (app_id && strlen(app_id) > MAX_WAPPUSH_ID_LEN)
224 return MSG_ERR_INVALID_PARAMETER;
226 MsgHandle* pHandle = (MsgHandle*)handle;
229 err = pHandle->regPushMessageCallback(cb, app_id, user_param);
230 } catch (MsgException& e) {
231 MSG_FATAL("%s", e.what());
232 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
233 return MSG_ERR_SERVER_NOT_READY;
234 else if (e.errorCode() == MsgException::SECURITY_ERROR)
235 return MSG_ERR_PERMISSION_DENIED;
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 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
246 msg_error_t err = MSG_SUCCESS;
248 if (handle == NULL || cb == NULL)
249 return MSG_ERR_INVALID_PARAMETER;
251 MsgHandle* pHandle = (MsgHandle*)handle;
254 err = pHandle->regCBMessageCallback(cb, bsave, user_param);
255 } catch (MsgException& e) {
256 MSG_FATAL("%s", e.what());
257 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
258 return MSG_ERR_SERVER_NOT_READY;
259 else if (e.errorCode() == MsgException::SECURITY_ERROR)
260 return MSG_ERR_PERMISSION_DENIED;
262 return MSG_ERR_CALLBACK_ERROR;
269 EXPORT_API int msg_reg_report_message_callback(msg_handle_t handle, msg_report_msg_incoming_cb cb, void *user_param)
271 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
272 msg_error_t err = MSG_SUCCESS;
274 if (handle == NULL || cb == NULL)
275 return MSG_ERR_INVALID_PARAMETER;
277 MsgHandle* pHandle = (MsgHandle*)handle;
280 err = pHandle->regReportMessageCallback(cb, user_param);
281 } catch (MsgException& e) {
282 MSG_FATAL("%s", e.what());
283 if (e.errorCode() == MsgException::SERVER_READY_ERROR)
284 return MSG_ERR_SERVER_NOT_READY;
285 else if (e.errorCode() == MsgException::SECURITY_ERROR)
286 return MSG_ERR_PERMISSION_DENIED;
288 return MSG_ERR_CALLBACK_ERROR;
295 EXPORT_API int msg_syncml_message_operation(msg_handle_t handle, msg_message_id_t msgId)
297 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
298 msg_error_t err = MSG_SUCCESS;
300 if (handle == NULL || msgId < 1)
301 return MSG_ERR_INVALID_PARAMETER;
303 MsgHandle* pHandle = (MsgHandle*)handle;
306 err = pHandle->operateSyncMLMessage(msgId);
307 } catch (MsgException& e) {
308 MSG_FATAL("%s", e.what());
309 return MSG_ERR_TRANSPORT_ERROR;
316 static msg_handle_t msgHandle = NULL;
317 static msg_simple_sent_status_cb sentStatusCallback = NULL;
320 static void sent_status_cb_func(msg_handle_t handle, msg_struct_t sent_status, void *user_param)
322 /* MSG_DEBUG("Sent Status [%d]", sent_status->status); */
324 msg_simple_sent_status_cb pfunc = sentStatusCallback;
326 pfunc((msg_struct_t)sent_status, user_param);
328 MSG_DEBUG("After entering callback function.");
330 /* Close control handle instance
331 * msg_close_msg_handle(&msgHandle);
333 * MSG_DEBUG("After msg_close_msg_handle.");
338 static int msg_send_single_sms(const char *phone_num, const char *sms_text, msg_simple_sent_status_cb cb, void *user_param)
340 if (phone_num == NULL || sms_text == NULL || cb == NULL) {
341 MSG_SEC_DEBUG("Invalid parameter [%s] [%s] [%p]", phone_num, sms_text, cb);
342 return MSG_ERR_INVALID_PARAMETER;
345 if (strlen(phone_num) > MAX_PHONE_NUMBER_LEN) {
346 MSG_SEC_DEBUG("Phone Number is too long [%s]", phone_num);
347 return MSG_ERR_INVALID_PARAMETER;
350 msg_struct_s req = {0, };
351 MSG_REQUEST_S msgReq = {0};
353 req.type = MSG_STRUCT_REQUEST_INFO;
354 req.data = (void *)&msgReq;
356 msg_error_t retVal = MSG_SUCCESS;
358 /* Open control handle instance */
359 if ((retVal = msg_open_msg_handle(&msgHandle)) != MSG_SUCCESS) {
360 MSG_DEBUG("MsgOpenMsgHandle is failed. Error Code = %d", retVal);
364 MSG_MESSAGE_HIDDEN_S msg_info = {0, };
365 msg_struct_s msg = {0, };
367 msg.type = MSG_STRUCT_MESSAGE_INFO;
368 msg.data = &msg_info;
370 /* when sending SMS */
371 msg_info.mainType = MSG_SMS_TYPE;
372 msg_info.subType = MSG_NORMAL_SMS;
374 msg_info.folderId = MSG_OUTBOX_ID;
375 msg_info.simIndex = MSG_SIM_SLOT_ID_1;
377 /* fill the destination number in msgReq */
378 MSG_ADDRESS_INFO_S address = {0, };
379 memset(&address, 0x00, sizeof(MSG_ADDRESS_INFO_S));
381 address.addressType = MSG_ADDRESS_TYPE_PLMN;
382 address.recipientType = MSG_RECIPIENTS_TYPE_TO;
383 snprintf(address.addressVal, MAX_ADDRESS_VAL_LEN, "%s", phone_num);
385 msg_struct_list_s addr_list = {0, };
387 addr_list.nCount = 1;
388 addr_list.msg_struct_info = (msg_struct_t *)calloc(1, sizeof(msg_struct_t));
389 if (addr_list.msg_struct_info) {
390 addr_list.msg_struct_info[0] = (msg_struct_t)new msg_struct_s;
392 pTmp = (msg_struct_s *)addr_list.msg_struct_info[0];
393 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
394 pTmp->data = &address;
396 MSG_ERR("Memory error");
397 msg_close_msg_handle(&msgHandle);
398 return MSG_ERR_MEMORY_ERROR;
401 msg_info.addr_list = (msg_struct_list_s *)&addr_list;
403 msg_info.bPortValid = false;
405 /* fill the msg text in msgReq */
406 msg_info.dataSize = strlen(sms_text);
407 msg_info.pData = (void*)sms_text;
410 msg_struct_s sendOpt = {0, };
411 MSG_SENDINGOPT_S send_info;
412 memset(&send_info, 0x00, sizeof(MSG_SENDINGOPT_S));
414 sendOpt.type = MSG_STRUCT_SENDOPT;
415 sendOpt.data = (void *)&send_info;
417 msg_struct_s smsSendOpt = {0, };
418 SMS_SENDINGOPT_INFO_S sms_send_opt = {0, };
419 memset(&sms_send_opt, 0x00, sizeof(SMS_SENDINGOPT_INFO_S));
421 smsSendOpt.type = MSG_STRUCT_SMS_SENDOPT;
422 smsSendOpt.data = (void *)&sms_send_opt;
424 send_info.smsSendOpt = (msg_struct_t)&smsSendOpt;
426 sentStatusCallback = cb;
428 /* register sent status callback */
429 retVal = msg_reg_sent_status_callback(msgHandle, sent_status_cb_func, user_param);
431 if (retVal != MSG_SUCCESS) {
432 MSG_DEBUG("msg_reg_sent_status_callback() is failed. Error Code = %d", retVal);
433 msg_close_msg_handle(&msgHandle);
437 /* sending message request */
438 msgReq.msg = (msg_struct_t)&msg;
439 msgReq.sendOpt = (msg_struct_t)&sendOpt;
441 retVal = msg_submit_req(msgHandle, (msg_struct_t)&req);
443 if (addr_list.msg_struct_info) {
444 g_free(addr_list.msg_struct_info);
445 addr_list.msg_struct_info = NULL;
448 if (retVal != MSG_SUCCESS) {
449 MSG_DEBUG("msg_submit_req() is failed. Error Code = %d", retVal);
450 msg_close_msg_handle(&msgHandle);
457 EXPORT_API int msg_sms_send(const char *phone_num_list, const char *sms_text, msg_simple_sent_status_cb cb, void *user_param)
459 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
461 if (phone_num_list == NULL || sms_text == NULL || cb == NULL) {
462 MSG_SEC_DEBUG("Invalid parameter [%s] [%s] [%p]", phone_num_list, sms_text, cb);
463 return MSG_ERR_INVALID_PARAMETER;
466 char trimmed_num[strlen(phone_num_list)+1];
467 bzero(trimmed_num, strlen(phone_num_list)+1);
470 msg_error_t retVal = msg_verify_number(phone_num_list, trimmed_num);
472 if (retVal != MSG_SUCCESS)
475 for (char* cur_num = strtok_r(trimmed_num, ", ", &temp); cur_num ; cur_num = strtok_r(NULL, ", ", &temp)) {
476 if (strlen(cur_num) > MAX_PHONE_NUMBER_LEN) {
477 MSG_SEC_DEBUG("Phone number is too long [%s], and sending is skipped", cur_num);
481 MSG_SEC_DEBUG("phone number: [%s]", cur_num);
482 MSG_SEC_DEBUG("text: [%s]", sms_text);
483 retVal = msg_send_single_sms(cur_num, sms_text, cb, user_param);
485 if (retVal != MSG_SUCCESS)
493 EXPORT_API int msg_sms_send_message(msg_handle_t handle, msg_struct_t req)
495 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_SMS_FEATURE);
496 msg_error_t err = MSG_SUCCESS;
498 if (handle == NULL || req == NULL) {
499 MSG_FATAL("handle or req is NULL");
500 return MSG_ERR_INVALID_PARAMETER;
503 msg_struct_s *req_s = (msg_struct_s *)req;
504 MSG_TYPE_CHECK(req_s->type, MSG_STRUCT_REQUEST_INFO);
506 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
510 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
511 MSG_TYPE_CHECK(msg_s->type, MSG_STRUCT_MESSAGE_INFO);
513 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
515 if (reqmsg->dataSize <= 0) {
516 MSG_FATAL("msg size is invalid : [%zu]", reqmsg->dataSize);
517 return MSG_ERR_INVALID_PARAMETER;
520 if (reqmsg->mainType != MSG_SMS_TYPE) {
521 MSG_FATAL("mainType is not SMS [%d]", reqmsg->mainType);
522 return MSG_ERR_INVALID_PARAMETER;
525 if (reqmsg->subType > MSG_CONCAT_SIM_SMS) {
526 MSG_FATAL("subType is not SMS [%d]", reqmsg->subType);
527 return MSG_ERR_INVALID_PARAMETER;
530 reqmsg->folderId = MSG_OUTBOX_ID; /* outbox fixed */
531 reqmsg->networkStatus = MSG_NETWORK_SENDING;
533 MSG_DEBUG("Coding Scheme From App. = [%d]", reqmsg->encodeType);
535 err = msg_submit_req(handle, req);
537 if (err == MSG_SUCCESS)
538 MSG_DEBUG("Sending Message is OK!");
540 MSG_DEBUG("Sending Message is failed! [%d]", err);
546 EXPORT_API int msg_mms_send_message(msg_handle_t handle, msg_struct_t req)
548 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
549 msg_error_t err = MSG_SUCCESS;
551 if (handle == NULL || req == NULL) {
552 MSG_FATAL("handle or req is NULL");
553 return MSG_ERR_INVALID_PARAMETER;
556 msg_struct_s *req_s = (msg_struct_s *)req;
557 MSG_TYPE_CHECK(req_s->type, MSG_STRUCT_REQUEST_INFO);
559 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
563 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
564 MSG_TYPE_CHECK(msg_s->type, MSG_STRUCT_MESSAGE_INFO);
566 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
568 if (reqmsg->mmsDataSize <= 0) {
569 MSG_FATAL("MMS data size is invalid");
570 return MSG_ERR_INVALID_PARAMETER;
573 reqmsg->mainType = MSG_MMS_TYPE;
574 reqmsg->subType = MSG_SENDREQ_MMS;
575 reqmsg->folderId = MSG_OUTBOX_ID; /* outbox fixed */
576 reqmsg->networkStatus = MSG_NETWORK_SENDING;
578 err = msg_submit_req(handle, req);
580 if (err == MSG_SUCCESS)
581 MSG_DEBUG("Sending Message is OK!");
583 MSG_DEBUG("Sending Message is failed! [%d]", err);
589 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)
591 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
592 msg_error_t err = MSG_SUCCESS;
595 return MSG_ERR_INVALID_PARAMETER;
597 if (mms_read_status < MSG_READ_REPORT_NONE || mms_read_status > MSG_READ_REPORT_REJECT_BY_USER) {
598 MSG_FATAL("unsupported read report status [%d]", mms_read_status);
599 return MSG_ERR_INVALID_PARAMETER;
602 msg_struct_t req_t = msg_create_struct(MSG_STRUCT_REQUEST_INFO);
604 return MSG_ERR_NOT_SUPPORTED;
606 msg_struct_s *req_s = (msg_struct_s *)req_t;
607 MSG_REQUEST_S *req = (MSG_REQUEST_S *)req_s->data;
608 msg_struct_s *msg_s = (msg_struct_s *)req->msg;
609 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S *)msg_s->data;
610 void *read_report_data = NULL;
611 size_t read_report_datasize;
613 read_report_datasize = sizeof(msg_read_report_status_t);
614 read_report_data = (void *)calloc(read_report_datasize, 1);
615 if (read_report_data == NULL) {
616 msg_release_struct(&req_t);
617 return MSG_ERR_MEMORY_ERROR;
620 MSG_DEBUG("mms_read_status [%d]", mms_read_status);
621 memcpy(read_report_data, &mms_read_status, read_report_datasize);
625 reqmsg->bPortValid = false;
626 reqmsg->msgId = msgId;
627 reqmsg->folderId = MSG_OUTBOX_ID; /* outbox fixed */
628 reqmsg->mainType = MSG_MMS_TYPE;
629 reqmsg->subType = MSG_READREPLY_MMS;
631 reqmsg->mmsDataSize = read_report_datasize;
632 reqmsg->pMmsData = read_report_data;
634 err = msg_submit_req(handle, req_t);
635 if (err == MSG_SUCCESS)
636 MSG_DEBUG("Sending Message is OK!");
638 MSG_DEBUG("Sending Message is failed!");
640 free(read_report_data);
641 read_report_data = NULL;
642 reqmsg->pMmsData = NULL;
644 msg_release_struct(&req_t);
650 EXPORT_API int msg_mms_forward_message(msg_handle_t handle, msg_struct_t req)
652 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
653 msg_error_t err = MSG_SUCCESS;
655 if (handle == NULL || req == NULL) {
656 MSG_FATAL("handle or req is NULL");
657 return MSG_ERR_INVALID_PARAMETER;
660 msg_struct_s *req_s = (msg_struct_s *)req;
661 MSG_TYPE_CHECK(req_s->type, MSG_STRUCT_REQUEST_INFO);
663 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
666 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
667 MSG_TYPE_CHECK(msg_s->type, MSG_STRUCT_MESSAGE_INFO);
669 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
671 reqmsg->mainType = MSG_MMS_TYPE;
672 reqmsg->subType = MSG_FORWARD_MMS;
673 reqmsg->folderId = MSG_OUTBOX_ID; /* outbox fixed */
674 reqmsg->networkStatus = MSG_NETWORK_SENDING;
676 err = msg_submit_req(handle, req);
678 if (err == MSG_SUCCESS)
679 MSG_DEBUG("Sending Message is OK!");
681 MSG_DEBUG("Sending Message is failed!");
687 EXPORT_API int msg_mms_retrieve_message(msg_handle_t handle, msg_struct_t req)
689 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
690 msg_error_t err = MSG_SUCCESS;
692 if (handle == NULL || req == NULL) {
693 MSG_FATAL("handle or req is NULL");
694 return MSG_ERR_INVALID_PARAMETER;
697 msg_struct_s *req_s = (msg_struct_s *)req;
698 MSG_TYPE_CHECK(req_s->type, MSG_STRUCT_REQUEST_INFO);
700 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
702 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
703 MSG_TYPE_CHECK(msg_s->type, MSG_STRUCT_MESSAGE_INFO);
705 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
707 reqmsg->mainType = MSG_MMS_TYPE;
708 reqmsg->subType = MSG_RETRIEVE_MMS;
709 reqmsg->folderId = MSG_OUTBOX_ID; /* outbox fixed */
710 reqmsg->networkStatus = MSG_NETWORK_RETRIEVING;
712 err = msg_submit_req(handle, req);
714 if (err == MSG_SUCCESS)
715 MSG_DEBUG("Sending Message is OK!");
717 MSG_DEBUG("Sending Message is failed!");
723 /* reject_msg_support */
724 EXPORT_API int msg_mms_reject_message(msg_handle_t handle, msg_struct_t req)
726 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
727 msg_error_t err = MSG_SUCCESS;
729 if (handle == NULL || req == NULL) {
730 MSG_FATAL("handle or req is NULL");
731 return MSG_ERR_INVALID_PARAMETER;
734 msg_struct_s *req_s = (msg_struct_s *)req;
735 MSG_TYPE_CHECK(req_s->type, MSG_STRUCT_REQUEST_INFO);
737 MSG_REQUEST_S *pReq = (MSG_REQUEST_S *)req_s->data;
739 msg_struct_s *msg_s = (msg_struct_s *)pReq->msg;
740 MSG_TYPE_CHECK(msg_s->type, MSG_STRUCT_MESSAGE_INFO);
742 MSG_MESSAGE_HIDDEN_S *reqmsg = (MSG_MESSAGE_HIDDEN_S*)msg_s->data;
744 reqmsg->mainType = MSG_MMS_TYPE;
745 reqmsg->subType = MSG_NOTIFYRESPIND_MMS;
746 reqmsg->folderId = MSG_OUTBOX_ID; /* outbox fixed */
747 reqmsg->networkStatus = MSG_NETWORK_SENDING;
749 err = msg_submit_req(handle, req);
751 if (err == MSG_SUCCESS)
752 MSG_DEBUG("Sending Message is OK!");
754 MSG_DEBUG("Sending Message is failed!");
758 /* reject_msg_support */
761 int msg_request_get_int(void *request_info, int field, int *value)
764 return MSG_ERR_NULL_POINTER;
766 int ret = MSG_SUCCESS;
768 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)request_info;
771 case MSG_REQUEST_REQUESTID_INT:
772 *value = pRequest->reqId;
775 ret = MSG_ERR_INVALID_PARAMETER;
783 int msg_request_get_struct_handle(msg_struct_s *msg_struct, int field, void **value)
785 msg_error_t err = MSG_SUCCESS;
787 if (!msg_struct || !value)
788 return MSG_ERR_NULL_POINTER;
790 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)msg_struct->data;
792 case MSG_REQUEST_MESSAGE_HND:
793 *value = (void *)pRequest->msg;
795 case MSG_REQUEST_SENDOPT_HND:
796 *value = (void *)pRequest->sendOpt;
799 err = MSG_ERR_UNKNOWN;
806 int msg_request_set_int(void *request_info, int field, int value)
808 msg_error_t err = MSG_SUCCESS;
811 return MSG_ERR_NULL_POINTER;
813 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)request_info;
816 case MSG_REQUEST_REQUESTID_INT:
817 pRequest->reqId = value;
820 err = MSG_ERR_UNKNOWN;
827 int msg_request_set_struct_handle(msg_struct_s *msg_struct, int field, msg_struct_s *value)
829 msg_error_t err = MSG_SUCCESS;
831 if (!msg_struct || !value)
832 return MSG_ERR_NULL_POINTER;
834 MSG_REQUEST_S *pRequest = (MSG_REQUEST_S *)msg_struct->data;
835 msg_struct_s *pTmp = NULL;
839 case MSG_REQUEST_MESSAGE_HND: {
840 pTmp = (msg_struct_s *)pRequest->msg;
841 MSG_MESSAGE_HIDDEN_S *pSrc = (MSG_MESSAGE_HIDDEN_S *)value->data;
842 MSG_MESSAGE_HIDDEN_S *pDst = (MSG_MESSAGE_HIDDEN_S *)pTmp->data;
843 msg_message_copy_message(pSrc, pDst);
846 case MSG_REQUEST_SENDOPT_HND: {
847 pTmp = (msg_struct_s *)pRequest->sendOpt;
848 MSG_SENDINGOPT_S *pSrc = (MSG_SENDINGOPT_S *)value->data;
849 MSG_SENDINGOPT_S *pDst = (MSG_SENDINGOPT_S *)pTmp->data;
850 pDst->bDeliverReq = pSrc->bDeliverReq;
851 pDst->bKeepCopy = pSrc->bKeepCopy;
852 pDst->bSetting = pSrc->bSetting;
854 msg_struct_s *tmpDstMmsSendOpt = (msg_struct_s *)pDst->mmsSendOpt;
855 msg_struct_s *tmpDstSmsSendOpt = (msg_struct_s *)pDst->smsSendOpt;
857 msg_struct_s *tmpSrcMmsSendOpt = (msg_struct_s *)pDst->mmsSendOpt;
858 msg_struct_s *tmpSrcSmsSendOpt = (msg_struct_s *)pDst->smsSendOpt;
860 tmpDstMmsSendOpt->type = tmpSrcMmsSendOpt->type;
861 memcpy(tmpDstMmsSendOpt->data, tmpSrcMmsSendOpt->data, sizeof(MMS_SENDINGOPT_S));
863 tmpDstSmsSendOpt->type = tmpSrcSmsSendOpt->type;
864 memcpy(tmpDstSmsSendOpt->data, tmpSrcSmsSendOpt->data, sizeof(SMS_SENDINGOPT_S));
869 err = MSG_ERR_UNKNOWN;
877 int msg_sent_status_get_int(MSG_SENT_STATUS_S *sent_status_info, int field, int *value)
879 if (!sent_status_info)
880 return MSG_ERR_NULL_POINTER;
882 int ret = MSG_SUCCESS;
885 case MSG_SENT_STATUS_REQUESTID_INT:
886 *value = sent_status_info->reqId;
888 case MSG_SENT_STATUS_NETWORK_STATUS_INT:
889 *value = sent_status_info->status;
892 ret = MSG_ERR_INVALID_PARAMETER;