From 35c618a38fd1024dff8dc4549e85ac402a3a833b Mon Sep 17 00:00:00 2001 From: "jk7744.park" Date: Tue, 8 Sep 2015 22:10:16 +0900 Subject: [PATCH] tizen 2.3.1 release --- CMakeLists.txt | 4 +- LICENSE | 408 ++++++++--------- capi-messaging-messages.manifest | 5 + doc/messages_doc.h | 123 ++++++ include/messages.h | 732 +++++++++++++++++++++++-------- include/messages_error.h | 14 +- include/messages_private.h | 63 ++- include/messages_types.h | 136 ++++-- packaging/capi-messaging-messages.spec | 22 +- src/messages.c | 779 ++++++++++++++++++++++----------- src/messages_push.c | 253 +++++++++++ test/messages_incoming_test.c | 39 +- test/messages_search_test.c | 41 +- test/messages_send_mms_test.c | 36 +- test/messages_send_sms_test.c | 9 +- 15 files changed, 1899 insertions(+), 765 deletions(-) mode change 100755 => 100644 LICENSE create mode 100644 capi-messaging-messages.manifest create mode 100755 doc/messages_doc.h mode change 100644 => 100755 src/messages.c create mode 100644 src/messages_push.c mode change 100644 => 100755 test/messages_incoming_test.c mode change 100644 => 100755 test/messages_search_test.c mode change 100644 => 100755 test/messages_send_mms_test.c mode change 100644 => 100755 test/messages_send_sms_test.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 913d03f..efe3332 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 msg-service capi-base-common") +SET(dependents "dlog glib-2.0 msg-service capi-base-common capi-appfw-application capi-system-info privacy-manager-client") INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) @@ -18,7 +18,7 @@ FOREACH(flag ${${fw_name}_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") IF("${ARCH}" STREQUAL "arm") diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 index 9c13a9b..a06208b --- a/LICENSE +++ b/LICENSE @@ -1,204 +1,204 @@ -Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/capi-messaging-messages.manifest b/capi-messaging-messages.manifest new file mode 100644 index 0000000..75b0fa5 --- /dev/null +++ b/capi-messaging-messages.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/doc/messages_doc.h b/doc/messages_doc.h new file mode 100755 index 0000000..241894d --- /dev/null +++ b/doc/messages_doc.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __TIZEN_MESSAGES_DOC_H__ +#define __TIZEN_MESSAGES_DOC_H__ + +/** + * @defgroup CAPI_MESSAGING_MESSAGES_MODULE Messages + * @brief The @ref CAPI_MESSAGING_MESSAGES_MODULE API provides functions to create, set properties and send a SMS/MMS message. + * @ingroup CAPI_MESSAGING_FRAMEWORK + * + * @addtogroup CAPI_MESSAGING_MESSAGES_MODULE + * + * @section CAPI_MESSAGING_MESSAGES_MODULE_HEADER Required Header + * \#include + * + * @section CAPI_MESSAGING_MESSAGES_MODULE_OVERVIEW Overview + * + * The Messages API provides the following functionalities: + * + * - Creating a message + * - Setting the text of the message + * - Setting the message recipient(s) + * - Sending a message + * - Searching for messages + * - Registering/Unregistering a callback function to check whether a message is sent successfully or not + * - Registering/Unregistering a callback function to receive notifications when an incoming message is received + * + * @section CAPI_MESSAGING_MESSAGES_MODULE_FEATURE Related Features + * This API is related with the following features:\n + * - http://tizen.org/feature/network.telephony\n + * - http://tizen.org/feature/network.telephony.mms\n + * + * It is recommended to design feature related codes in your application for reliability.\n + * + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n + * + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n + * + * More details on featuring your application can be found from Feature Element. + *
+ */ + +/** + * @defgroup CAPI_MESSAGING_MESSAGES_MMS_MODULE MMS + * @brief The MMS API provides functions to manage attachments and subject of the MMS message. + * @ingroup CAPI_MESSAGING_MESSAGES_MODULE + * + * @addtogroup CAPI_MESSAGING_MESSAGES_MMS_MODULE + * + * @section CAPI_MESSAGING_MESSAGES_MMS_MODULE_HEADER Required Header + * \#include + * + * @section CAPI_MESSAGING_MESSAGES_MMS_MODULE_OVERVIEW Overview + * + * The MMS API provides the following functionalities: + * + * - Setting/Getting the subject + * - Attaching the media files(image, video, audio) + * - Retrieving the attachments + * - Deleting all attachments + * + * @section CAPI_MESSAGING_MESSAGES_MMS_MODULE_FEATURE Related Features + * This API is related with the following features:\n + * - http://tizen.org/feature/network.telephony\n + * - http://tizen.org/feature/network.telephony.mms\n + * + * It is recommended to design feature related codes in your application for reliability.\n + * + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n + * + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n + * + * More details on featuring your application can be found from Feature Element. + * + */ + +/** + * @defgroup CAPI_MESSAGING_MESSAGES_PUSH_MODULE WAP Push + * @brief The MMS API provides functions to add/remove incoming callback for WAP Push messages and register current application to push server. + * @ingroup CAPI_MESSAGING_MESSAGES_MODULE + * + * @addtogroup CAPI_MESSAGING_MESSAGES_PUSH_MODULE + * + * @section CAPI_MESSAGING_MESSAGES_PUSH_MODULE_HEADER Required Header + * \#include + * + * @section CAPI_MESSAGING_MESSAGES_PUSH_MODULE_OVERVIEW Overview + * + * The WAP PUSH API provides the following functionalities: + * + * - Adding/Removing incoming callback for WAP Push messages + * - Managing the registration + * + * @section CAPI_MESSAGING_MESSAGES_PUSH_MODULE_FEATURE Related Features + * This API is related with the following features:\n + * - http://tizen.org/feature/network.telephony\n + * + * It is recommended to design feature related codes in your application for reliability.\n + * + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n + * + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n + * + * More details on featuring your application can be found from Feature Element. + * + */ + +#endif /* __TIZEN_MESSAGES_DOC_H__ */ diff --git a/include/messages.h b/include/messages.h index 09e7a96..1256974 100644 --- a/include/messages.h +++ b/include/messages.h @@ -11,7 +11,7 @@ * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ #ifndef __TIZEN_MESSAGING_H__ @@ -40,17 +40,25 @@ extern "C" /** - * @brief Opens a handle for messaging service. + * @brief Opens a handle for the messaging service. * - * @remark @a service must be released with messages_close_service() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * + * @remarks You must release @a service using messages_close_service(). * * @param[out] service The message service handle * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_SERVER_NOT_READY Server is not read + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_SERVER_NOT_READY Server is not read * @retval #MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED Communication with server failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_close_service() */ @@ -58,14 +66,22 @@ int messages_open_service(messages_service_h *service); /** - * @brief Closes a handle for messaging service. + * @brief Closes a handle for the messaging service. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read * * @param[in] service The message service handle * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED Communication with server failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_open_service() */ @@ -75,16 +91,21 @@ int messages_close_service(messages_service_h service); /** * @brief Creates a message handle. * - * @remark @a msg must be released with messages_destroy_message() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @param[in] type A message type (MESSAGES_TYPE_SMS or MESSAGES_TYPE_MMS) \n - * If @a type is #MESSAGES_TYPE_UNKNOWN, #MESSAGES_ERROR_INVALID_PARAMETER occurs. - * @param[out] msg A message handle to be newly created if successful + * @remarks You must release @a msg using messages_destroy_message(). * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @param[in] type The message type (#MESSAGES_TYPE_SMS or #MESSAGES_TYPE_MMS) \n + * If @a type is #MESSAGES_TYPE_UNKNOWN, #MESSAGES_ERROR_INVALID_PARAMETER occurs. + * @param[out] msg The message handle that is newly created if successful + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_destroy_message() */ @@ -92,54 +113,117 @@ int messages_create_message(messages_message_type_e type, messages_message_h *ms /** - * @brief Destroys a message handle and release all its resources. + * @brief Destroys a message handle and releases all its resources. * - * @param[in] msg A message handle to destroy + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @param[in] msg The message handle to destroy + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_create_message() */ int messages_destroy_message(messages_message_h msg); /** - * @brief Gets the message id of the message. + * @brief Gets the message ID of the message. * - * @param[in] msg The message handle - * @param[out] msg_id The message id + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @param[in] msg The message handle + * @param[out] msg_id The message ID + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_search_message_by_id() */ int messages_get_message_id(messages_message_h msg, int *msg_id); + +/** + * @brief Sets the SIM ID of the sending message. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle + * @param[in] sim_id The SIM id to send message + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + * + * @see messages_get_sim_id() + */ +int messages_set_sim_id(messages_message_h msg, int sim_id); + + +/** + * @brief Gets the SIM ID of the message. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle + * @param[out] sim_id The SIM id of message + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + * + * @see messages_set_sim_id() + */ +int messages_get_sim_id(messages_message_h msg, int *sim_id); + + /** * @brief Gets the message box type of the message. * - * @param[in] msg The message handle - * @param[out] mbox The message box type + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @param[in] msg The message handle + * @param[out] mbox The message box type + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported */ int messages_get_mbox_type(messages_message_h msg, messages_message_box_e *mbox); /** * @brief Gets the destination port of the message. * - * @param[in] msg The message handle - * @param[out] port The destination port of the message + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @param[in] msg The message handle + * @param[out] port The destination port of the message + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_add_sms_listening_port() */ @@ -148,12 +232,17 @@ int messages_get_message_port(messages_message_h msg, int *port); /** * @brief Gets the type of the message. * - * @param[in] msg The message handle + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle * @param[out] type The message type * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported */ int messages_get_message_type(messages_message_h msg, messages_message_type_e *type); @@ -162,14 +251,19 @@ int messages_get_message_type(messages_message_h msg, messages_message_type_e *t * @brief Adds an recipient's address(phone number) to the message. * @details The maximum number of recipients per a message is 10. * - * @param[in] msg The message handle - * @param[in] address The recipient's address to receive a message \n - * The maximum length of @a address is 254. - * @param[in] type The recipient's type of the @a address + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @param[in] msg The message handle + * @param[in] address The recipient's address to receive a message \n + * The maximum length of @a address is @c 254. + * @param[in] type The recipient's type of the @a address + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_get_address() * @see messages_remove_all_addresses() @@ -180,12 +274,17 @@ int messages_add_address(messages_message_h msg, const char *address, messages_r /** * @brief Gets the total number of recipients in the message. * - * @param[in] msg The message handle - * @param[out] count The total number of recipients + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @param[in] msg The message handle + * @param[out] count The total number of recipients + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_add_address() * @see messages_remove_all_addresses() @@ -196,17 +295,22 @@ int messages_get_address_count(messages_message_h msg, int *count); /** * @brief Gets a recipient's address with specified index. * - * @remarks @a address must be released with @c free() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @param[in] msg The message handle - * @param[in] index The zero-based index of address to receive a message. - * @param[out] address The recipient's address with specified index - * @param[out] type The recipient's type of the @a address. + * @remarks You must release @a address using free(). * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @param[in] msg The message handle + * @param[in] index The zero-based index of an address to receive a message. + * @param[out] address The recipient's address with specified index + * @param[out] type The recipient's type of the @a address + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_add_address() * @see messages_remove_all_addresses() @@ -217,11 +321,16 @@ int messages_get_address(messages_message_h msg, int index, char **address, mess /** * @brief Removes all recipients in the message. * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * * @param[in] msg The message handle * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_add_address() * @see messages_get_address() @@ -232,14 +341,19 @@ int messages_remove_all_addresses(messages_message_h msg); /** * @brief Sets the text of the message. * - * @param[in] msg The message handle + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle * @param[in] text The text of the message \n - * The maximum length of @a text is 1530. + * The maximum length of @a text is @c 1530. * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_get_text() */ @@ -249,15 +363,20 @@ int messages_set_text(messages_message_h msg, const char *text); /** * @brief Gets the text of the message. * - * @remarks @a text must be released with @c free() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @param[in] msg The message handle - * @param[out] text The text of the message + * @remarks You must release @a text using free(). * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @param[in] msg The message handle + * @param[out] text The text of the message + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_set_text() */ @@ -267,52 +386,72 @@ int messages_get_text(messages_message_h msg, char **text); /** * @brief Gets the time of the message. * - * @param[in] msg The message handle - * @param[out] time The time of the message + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful - * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @param[in] msg The message handle + * @param[out] time The time of the message + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported */ int messages_get_time(messages_message_h msg, time_t *time); /** * @brief Sends the message to all recipients. * - * @remarks In order to check whether sending a message succeeds, - * you should register messages_sent_cb() using messages_set_message_sent_cb(). + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.write * - * @param[in] service The message service handle - * @param[in] msg The message handle - * @param[in] save_to_sentbox Set to true to save the message in the sentbox, else false - * @param[in] callback The callback function - * @param[in] user_data The user data to be passed to the callback function + * @param[in] service The message service handle + * @param[in] msg The message handle + * @param[in] save_to_sentbox Set to @c true to save the message in the sentbox, + * otherwise set to @c false to not save the message in the sentbox + * @param[in] callback The callback function + * @param[in] user_data The user data to be passed to the callback function * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_SENDING_FAILED Sending a message failed - * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_SENDING_FAILED Sending a message failed + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_sent_cb() */ int messages_send_message(messages_service_h service, messages_message_h msg, bool save_to_sentbox, messages_sent_cb callback, void *user_data); /** - * @brief Gets the message count in the specific message box + * @brief Gets the message count in the specific message box. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @param[in] service The message service handle - * @param[in] mbox The message box type - * @param[in] type The message type \n - * If @a type is #MESSAGES_TYPE_UNKNOWN, all sms and mms messages are counted. - * @param[out] count The number of messages + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * + * @param[in] service The message service handle + * @param[in] mbox The message box type + * @param[in] type The message type \n + * If @a type is #MESSAGES_TYPE_UNKNOWN, all SMS and MMS messages are counted. + * @param[out] count The number of messages * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + * */ -int messages_get_message_count(messages_service_h service, +int messages_get_message_count(messages_service_h service, messages_message_box_e mbox, messages_message_type_e type, int *count); @@ -321,27 +460,36 @@ int messages_get_message_count(messages_service_h service, /** * @brief Searches for messages. * - * @details @a message_array must be released with messages_free_message_array() by you. - * - * @param[in] service The message service handle - * @param[in] mbox The message box type - * @param[in] type The message type \n - * If @a type is #MESSAGES_TYPE_UNKNOWN, all sms and mms messages are searched. - * @param[in] keyword The keyword search in text and subject - * @param[in] address The recipient address - * @param[in] offset The start position (base 0) - * @param[in] limit The maximum amount of messages to get (In case of 0, this method passes to the callback all searched messages.) - * @param[out] message_array The array of the message handle - * @param[out] length The number of messages of the message_array - * @param[out] total The count of the messages that have been retrieved as a result without applying @a limit and @a offset. \n - * The value can be used to calculate the total number of page views for the searched messages.\n - * For example, if the count of message search is 50 and the limit is 20, then using this value, you can notice the total page is 3. - * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * + * @remarks You must release @a message_array using messages_free_message_array(). + * + * @param[in] service The message service handle + * @param[in] mbox The message box type + * @param[in] type The message type \n + * If @a type is #MESSAGES_TYPE_UNKNOWN, all SMS and MMS messages are searched. + * @param[in] keyword The keyword search in the text and subject + * @param[in] address The recipient address + * @param[in] offset The start position (base @c 0) + * @param[in] limit The maximum amount of messages to get \n + * In case of @c 0, this method passes to the callback all searched messages. + * @param[out] message_array The array of the message handle + * @param[out] length The number of messages of the @a message_array + * @param[out] total The count of the messages that have been retrieved as a result without applying @a limit and @a offset\ n + * The value can be used to calculate the total number of page views for the searched messages\ n + * For example, if the count of message search is @c 50 and the limit is @c 20, then using this value, you can notice the total page is @c 3. + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory - * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_free_message_array() */ @@ -351,20 +499,28 @@ int messages_search_message(messages_service_h service, const char *keyword, const char *address, int offset, int limit, messages_message_h **message_array, int *length, int *total); - + /** - * @brief Searches a message with the given message id. + * @brief Searches a message with the given message ID. * - * @remark @a msg must be released with messages_destroy_message() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read * - * @param[in] service The message service handle - * @param[in] msg_id The message id - * @param[out] msg A message handle to be newly created if successful + * @remarks You must release @a msg using messages_destroy_message(). + * + * @param[in] service The message service handle + * @param[in] msg_id The message ID + * @param[out] msg The message handle that is newly created if successful * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_get_message_id() */ @@ -372,13 +528,18 @@ int messages_search_message_by_id(messages_service_h service, int msg_id, messag /** - * @brief Frees message array. + * @brief Frees the message array. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * * @param[in] message_array The array of the message handle * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_search_message() */ @@ -388,24 +549,34 @@ int messages_free_message_array(messages_message_h *message_array); /** * @brief Retrieves the searched messages by invoking the given callback function iteratively. * - * @param[in] service The message service handle - * @param[in] mbox The message box type - * @param[in] type The message type \n - * If @a type is #MESSAGES_TYPE_UNKNOWN, all sms and mms messages are searched. - * @param[in] keyword The keyword search in text and subject - * @param[in] address The recipient address - * @param[in] offset The start position (base 0) - * @param[in] limit The maximum amount of messages to get (In case of 0, this method passes to the callback all searched messages.) - * @param[in] callback The callback function to get a message + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * + * @param[in] service The message service handle + * @param[in] mbox The message box type + * @param[in] type The message type \n + * If @a type is #MESSAGES_TYPE_UNKNOWN, all SMS and MMS messages are searched. + * @param[in] keyword The keyword search in the text and subject + * @param[in] address The recipient address + * @param[in] offset The start position (base 0) + * @param[in] limit The maximum amount of messages to get \n + * In case of @c 0, this method passes to the callback all searched messages. + * @param[in] callback The callback function to get a message * @param[in] user_data The user data to be passed to the callback function * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory - * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @post It invokes messages_search_cb(). + * * @see messages_search_cb() */ int messages_foreach_message(messages_service_h service, @@ -418,14 +589,22 @@ int messages_foreach_message(messages_service_h service, /** * @brief Registers a callback to be invoked when an incoming message is received. * - * @param[in] service The message service handle - * @param[in] callback The callback function + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * + * @param[in] service The message service handle + * @param[in] callback The callback function * @param[in] user_data The user data to be passed to the callback function * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @post It will invoke messages_incoming_cb(). * @@ -438,11 +617,19 @@ int messages_set_message_incoming_cb(messages_service_h service, messages_incomi /** * @brief Unregisters the callback function. * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.write + * * @param[in] service The message service handle * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_set_message_incoming_cb() * @see messages_incoming_cb() @@ -452,12 +639,20 @@ int messages_unset_message_incoming_cb(messages_service_h service); /** * @brief Adds an additional listening port for the incoming SMS messages. * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * * @param[in] service The message service handle - * @param[in] port The listening port for the SMS messages + * @param[in] port The listening port for the SMS messages + * + * @return @c 0 on success, + * otherwise a negative error value * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @see messages_set_message_incoming_cb() * @see messages_get_message_port() @@ -471,13 +666,18 @@ int messages_add_sms_listening_port(messages_service_h service, int port); /** * @brief Sets the subject of the message. * - * @param[in] msg The message handle + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle * @param[in] subject The subject of the message \n - * The maximum length of @a subject is 120. + * The maximum length of @a subject is @c 120. + * + * @return @c 0 on success, + * otherwise a negative error value * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @pre @a msg is created as a #MESSAGES_TYPE_MMS. * @@ -489,15 +689,20 @@ int messages_mms_set_subject(messages_message_h msg, const char *subject); /** * @brief Gets the subject of the message. * - * @remarks @a subject must be released with @c free() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @param[in] msg The message handle + * @remarks You must release @a subject using free(). + * + * @param[in] msg The message handle * @param[out] subject The subject of the message * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @pre @a msg is created as a #MESSAGES_TYPE_MMS. * @@ -509,21 +714,26 @@ int messages_mms_get_subject(messages_message_h msg, char **subject); /** * @brief Adds the attachment to the MMS message. * - * @param[in] msg The message handle + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle * @param[in] type The attachment type * @param[in] path The file path to attach \n - * The maximum length of @a path is 1024. + * The maximum length of @a path is @c 1024. + * + * @return @c 0 on success, + * otherwise a negative error value * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @pre @a msg is created as a #MESSAGES_TYPE_MMS. * * @see messages_mms_get_attachment() * @see messages_mms_get_attachment_count() - * @see messages_mms_remove_all_attachments() + * @see messages_mms_remove_all_attachments() */ int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e type, const char *path); @@ -531,23 +741,28 @@ int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e ty /** * @brief Gets the file path of the attachment with the specified index. * - * @remark @a path must be released with @c free() by you. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @param[in] msg The message handle - * @param[in] index The zero-based index of attachment - * @param[out] type The attachment type - * @param[out] path The file path to attach + * @remarks You must release @a path using free(). + * + * @param[in] msg The message handle + * @param[in] index The zero-based index of the attachment + * @param[out] type The attachment type + * @param[out] path The file path to attach + * + * @return @c 0 on success, + * otherwise a negative error value * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @pre @a msg is created as a #MESSAGES_TYPE_MMS. * * @see messages_mms_add_attachment() * @see messages_mms_get_attachment_count() - * @see messages_mms_remove_all_attachments() + * @see messages_mms_remove_all_attachments() */ int messages_mms_get_attachment(messages_message_h msg, int index, messages_media_type_e *type, char **path); @@ -555,18 +770,23 @@ int messages_mms_get_attachment(messages_message_h msg, int index, messages_medi /** * @brief Gets the attachment with the specified index. * - * @param[in] msg The message handle + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] msg The message handle * @param[out] count The total number of attachments * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @pre @a msg is created as a #MESSAGES_TYPE_MMS. * * @see messages_mms_add_attachment() * @see messages_mms_get_attachment() - * @see messages_mms_remove_all_attachments() + * @see messages_mms_remove_all_attachments() */ int messages_mms_get_attachment_count(messages_message_h msg, int *count); @@ -574,17 +794,22 @@ int messages_mms_get_attachment_count(messages_message_h msg, int *count); /** * @brief Removes all attachments to the MMS message. * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * * @param[in] msg The message handle * - * @return 0 on success, otherwise a negative error value. - * @retval #MESSAGES_ERROR_NONE Successful + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported * * @pre @a msg is created as a #MESSAGES_TYPE_MMS. * * @see messages_mms_add_attachment() * @see messages_mms_get_attachment() - * @see messages_mms_get_attachment_count() + * @see messages_mms_get_attachment_count() */ int messages_mms_remove_all_attachments(messages_message_h msg); /** @@ -592,9 +817,130 @@ int messages_mms_remove_all_attachments(messages_message_h msg); */ /** + * @addtogroup CAPI_MESSAGING_MESSAGES_PUSH_MODULE + * @{ + */ + +/** + * @brief Registers a callback to be invoked when an WAP Push message is received. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.read + * + * @param[in] service The message service handle + * @param[in] app_id The "X-WAP-Application-ID" to indicate a destination WAP Push application ID + * @param[in] callback The callback function + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + */ +int messages_push_add_incoming_cb(messages_service_h service, const char *app_id, + messages_push_incoming_cb callback, void *user_data); + + +/** + * @brief Unregisters the WAP push incoming callback function. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] service The message service handle + * @param[in] app_id The "X-WAP-Application-ID" to indicate a destination WAP Push application ID + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + */ +int messages_push_remove_incoming_cb(messages_service_h service, const char *app_id); + + +/** + * @brief Registers an application to the mapping table of the WAP Push service. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.write + * + * @param[in] service The message service handle + * @param[in] content_type The MIME content type of the content + * @param[in] app_id The "X-WAP-Application-ID" to indicate a destination WAP Push application ID + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + */ +int messages_push_register(messages_service_h service, const char *content_type, const char *app_id); + + +/** + * @brief De-registers an application from the mapping table of the WAP Push service. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.write + * + * @param[in] service The message service handle + * @param[in] content_type The MIME content type of the content + * @param[in] app_id The "X-WAP-Application-ID" to indicate a destination WAP Push application ID + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + */ +int messages_push_deregister(messages_service_h service, const char *content_type, const char *app_id); + + +/** + * @brief Re-registers an application to the mapping table of the WAP Push service. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @privlevel public + * @privilege %http://tizen.org/privilege/message.write + * + * @param[in] service The message service handle + * @param[in] content_type An element of the composite key for searching registered entry \n + * The MIME content type of the content. + * @param[in] app_id The composite key for searching mapping information \n + * The "X-WAP-Application-ID" to indicate a destination WAP Push application ID. + * @param[in] dst_content_type The MIME content type of the content + * @param[in] dst_app_id The "X-WAP-Application-ID" to indicate a destination WAP Push application ID + * + * @return @c 0 on success, + * otherwise a negative error value + * + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_PERMISSION_DENIED The application does not have the privilege to call this method + * @retval #MESSAGES_ERROR_NOT_SUPPORTED Not supported + * + */ +int messages_push_reregister(messages_service_h service, const char *content_type, const char *app_id, + const char *dst_content_type, const char *dst_app_id); + +/** * @} */ +/** + * @} + */ #ifdef __cplusplus diff --git a/include/messages_error.h b/include/messages_error.h index 9299113..797954f 100644 --- a/include/messages_error.h +++ b/include/messages_error.h @@ -33,15 +33,21 @@ extern "C" /** * @brief Enumerations of error code for Messaging. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { MESSAGES_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ MESSAGES_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ MESSAGES_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ - MESSAGES_ERROR_SERVER_NOT_READY = TIZEN_ERROR_MESSAGING_CLASS|0x501, /**< Server is not read */ - MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED = TIZEN_ERROR_MESSAGING_CLASS|0x502, /**< Communication with server failed */ - MESSAGES_ERROR_SENDING_FAILED = TIZEN_ERROR_MESSAGING_CLASS|0x504, /**< Sending a message failed */ - MESSAGES_ERROR_OPERATION_FAILED = TIZEN_ERROR_MESSAGING_CLASS|0x505, /**< Messaging operation failed */ + MESSAGES_ERROR_SERVER_NOT_READY = TIZEN_ERROR_MESSAGING_SERVICE|0x501, /**< Server is not read */ + MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED = TIZEN_ERROR_MESSAGING_SERVICE|0x502, /**< Communication with server failed */ + MESSAGES_ERROR_OUT_OF_RANGE = TIZEN_ERROR_MESSAGING_SERVICE|0x503, /**< Index out of range */ + MESSAGES_ERROR_SENDING_FAILED = TIZEN_ERROR_MESSAGING_SERVICE|0x504, /**< Sending a message failed */ + MESSAGES_ERROR_OPERATION_FAILED = TIZEN_ERROR_MESSAGING_SERVICE|0x505, /**< Messaging operation failed */ + MESSAGES_ERROR_NO_SIM_CARD = TIZEN_ERROR_MESSAGING_SERVICE|0x506, /**< No SIM Card */ + MESSAGES_ERROR_NO_DATA = TIZEN_ERROR_MESSAGING_SERVICE|0x507, /**< No data available */ + MESSAGES_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */ + MESSAGES_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */ } messages_error_e; /** diff --git a/include/messages_private.h b/include/messages_private.h index b7f7cd4..53ac983 100644 --- a/include/messages_private.h +++ b/include/messages_private.h @@ -11,7 +11,7 @@ * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ #ifndef __TIZEN_MESSAGING_PRIVATE_H__ @@ -22,31 +22,76 @@ extern "C" { #endif +#include + typedef struct _messages_service_s { msg_handle_t service_h; void* incoming_cb; void* incoming_cb_user_data; bool incoming_cb_enabled; GSList* sent_cb_list; + GSList* push_incoming_cb_list; } messages_service_s; typedef struct _messages_message_s { - msg_struct_t msg_h; - char* text; - GSList* attachment_list; + msg_struct_t msg_h; + char* text; + GSList* attachment_list; } messages_message_s; typedef struct _messages_attachment_s { - int media_type; - char filepath[MSG_FILEPATH_LEN_MAX]; + int media_type; + char filepath[MSG_FILEPATH_LEN_MAX +1]; } messages_attachment_s; typedef struct _messages_sent_callback_s { - int req_id; - void* callback; - void* user_data; + int req_id; + void* callback; + void* user_data; } messages_sent_callback_s; +typedef struct _messages_push_incoming_callback_s { + char* app_id; + void* callback; + void* user_data; +} messages_push_incoming_callback_s; + +#define MESSAGES_PRIVILEGE_READ "http://tizen.org/privilege/message.read" +#define MESSAGES_PRIVILEGE_WRITE "http://tizen.org/privilege/message.write" + +#define MESSAGES_TELEPHONY_FEATURE "http://tizen.org/feature/network.telephony" +#define MESSAGES_TELEPHONY_MMS_FEATURE "http://tizen.org/feature/network.telephony.mms" + +#define ERROR_CONVERT(err) _messages_error_converter(err, __FUNCTION__, __LINE__); +#define CHECK_NULL(p) \ + if (NULL == p) { \ + LOGE("[%s] INVALID_PARAMETER(0x%08x) %s is null.", \ + __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER, #p); \ + return MESSAGES_ERROR_INVALID_PARAMETER; \ + } + +#define IS_SMS(x) ((x & MESSAGES_TYPE_SMS) == MESSAGES_TYPE_SMS) +#define IS_MMS(x) ((x & MESSAGES_TYPE_MMS) == MESSAGES_TYPE_MMS) + +#define CHECK_MESSAGES_SUPPORTED(feature_name) \ + do { \ + bool is_supported = false; \ + if (!system_info_get_platform_bool(feature_name, &is_supported)) { \ + if (is_supported == false) { \ + LOGE("[%s] feature is disabled", feature_name); \ + return MESSAGES_ERROR_NOT_SUPPORTED; \ + } \ + } else { \ + LOGE("Error - Feature getting from System Info"); \ + return MESSAGES_ERROR_OPERATION_FAILED; \ + } \ + } while(0) + +int _messages_convert_mbox_to_fw(messages_message_box_e mbox); +int _messages_convert_msgtype_to_fw(messages_message_type_e type); +int _messages_convert_recipient_to_fw(messages_recipient_type_e type); +int _messages_error_converter(int err, const char *func, int line); + #ifdef __cplusplus } #endif diff --git a/include/messages_types.h b/include/messages_types.h index a25b1f0..bb05563 100644 --- a/include/messages_types.h +++ b/include/messages_types.h @@ -11,7 +11,7 @@ * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ #ifndef __TIZEN_MESSAGING_TYPES_H__ @@ -31,76 +31,96 @@ extern "C" /** * @brief The messaging service handle. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef struct messages_service_s *messages_service_h; /** * @brief The message handle. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef struct messages_message_s *messages_message_h; /** - * @brief The message box type. + * @brief Enumeration for the message box type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { - MESSAGES_MBOX_ALL = 0, /**< All message box type */ - MESSAGES_MBOX_INBOX = 1, /**< Inbox type */ - MESSAGES_MBOX_OUTBOX = 2, /**< Outbox type*/ - MESSAGES_MBOX_SENTBOX = 3, /**< Sentbox type */ - MESSAGES_MBOX_DRAFT = 4, /**< Draft type */ + MESSAGES_MBOX_ALL = 0, /**< All message box type */ + MESSAGES_MBOX_INBOX = 1, /**< Inbox type */ + MESSAGES_MBOX_OUTBOX = 2, /**< Outbox type*/ + MESSAGES_MBOX_SENTBOX = 3, /**< Sentbox type */ + MESSAGES_MBOX_DRAFT = 4, /**< Draft type */ } messages_message_box_e; /** - * @brief The message type. + * @brief Enumeration for the message type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { - MESSAGES_TYPE_UNKNOWN = 0, /**< Unknown type */ - MESSAGES_TYPE_SMS = 1, /**< SMS type */ - MESSAGES_TYPE_MMS = 2, /**< MMS type */ + MESSAGES_TYPE_UNKNOWN = 0, /**< Unknown type */ + MESSAGES_TYPE_SMS = 1, /**< SMS type */ + MESSAGES_TYPE_MMS = 2, /**< MMS type */ + MESSAGES_TYPE_SMS_CB = MESSAGES_TYPE_SMS | 1 << 4, /**< CB(Cell Broadcast) Type */ + MESSAGES_TYPE_SMS_PUSH = MESSAGES_TYPE_SMS | 10 << 4, /**< WAP Push Type */ + MESSAGES_TYPE_SMS_ETWS_PRIMARY = MESSAGES_TYPE_SMS | 21 << 4, /**< ETWS(Earthquake and Tsunami Warning System) Primary Type */ + MESSAGES_TYPE_SMS_ETWS_SECONDARY = MESSAGES_TYPE_SMS | 22 << 4, /**< ETWS(Earthquake and Tsunami Warning System) Secondary Type */ } messages_message_type_e; /** - * @brief The attachment type for MMS messaging. + * @brief Enumeration for the attachment type for MMS messaging. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { - MESSAGES_MEDIA_UNKNOWN = 0, /**< Unknown */ - MESSAGES_MEDIA_IMAGE = 1, /**< The image */ - MESSAGES_MEDIA_AUDIO = 2, /**< The audio */ - MESSAGES_MEDIA_VIDEO = 3, /**< The video */ + MESSAGES_MEDIA_UNKNOWN = 0, /**< Unknown */ + MESSAGES_MEDIA_IMAGE = 1, /**< The image */ + MESSAGES_MEDIA_AUDIO = 2, /**< The audio */ + MESSAGES_MEDIA_VIDEO = 3, /**< The video */ } messages_media_type_e; /** - * @brief The recipient type of a message. + * @brief Enumeration for the recipient type of a message. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { MESSAGES_RECIPIENT_UNKNOWN = 0, /**< Unknown */ - MESSAGES_RECIPIENT_TO = 1, /**< The 'To' recipient */ - MESSAGES_RECIPIENT_CC = 2, /**< The 'Cc' (carbon copy) recipient */ - MESSAGES_RECIPIENT_BCC = 3, /**< The 'Bcc' (blind carbon copy) recipient */ + MESSAGES_RECIPIENT_TO = 1, /**< The 'To' recipient */ + MESSAGES_RECIPIENT_CC = 2, /**< The 'Cc' (carbon copy) recipient */ + MESSAGES_RECIPIENT_BCC = 3, /**< The 'Bcc' (blind carbon copy) recipient */ } messages_recipient_type_e; /** - * @brief The result of sending a message. + * @brief Enumeration for the result of sending a message. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif */ typedef enum { - MESSAGES_SENDING_FAILED = -1, /**< Message sending is failed */ - MESSAGES_SENDING_SUCCEEDED = 0, /**< Message sending is succeeded */ + MESSAGES_SENDING_FAILED = -1, /**< Message sending failed */ + MESSAGES_SENDING_SUCCEEDED = 0, /**< Message sending succeeded */ } messages_sending_result_e; +/** + * @brief Enumeration for the SIM index of a message. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum { + MESSAGES_SIM_INDEX_UNKNOWN = 0, /**< Unknown SIM Index*/ + MESSAGES_SIM_INDEX_1 = 1, /**< SIM Index 1 */ + MESSAGES_SIM_INDEX_2 = 2, /**< SIM Index 2 */ +} messages_sim_index_e; /** - * @brief Called when the process of sending a message to all recipients finishes. + * @brief Called when the process of sending a message to all recipients finishes. * - * @param[in] result The result of message sending. - * @param[in] user_data The user data passed from the callback registration function + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif * - * @pre messages_send_message() will invoke this callback if you register this callback using messages_set_message_sent_cb(). + * @param[in] result The result of message sending + * @param[in] user_data The user data passed from the callback registration function + * + * @pre messages_send_message() will invoke this callback function. * - * @see messages_set_message_sent_cb() - * @see messages_unset_message_sent_cb() * @see messages_send_message() */ typedef void (* messages_sent_cb)(messages_sending_result_e result, void *user_data); @@ -109,8 +129,10 @@ typedef void (* messages_sent_cb)(messages_sending_result_e result, void *user_d /** * @brief Called when an incoming message is received. * - * @param[in] incoming_msg An incoming message - * @param[in] user_data The user data passed from the callback registration function + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] incoming_msg The incoming message + * @param[in] user_data The user data passed from the callback registration function * * @pre You register this callback using messages_set_message_incoming_cb() for getting an incoming message. * @@ -123,18 +145,22 @@ typedef void (* messages_incoming_cb)(messages_message_h incoming_msg, void *use /** * @brief Called when a message is retrieved from a search request. * - * @remark You should not call messages_destroy_message() with @a msg. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @remarks You should not call messages_destroy_message() with @a msg. * - * @param[in] msg The message handle (It can be NULL if nothing is found) - * @param[in] user_data The user data passed from the foreach function - * @param[in] index The index of a message from the messages that have been retrieved as a search result - * @param[in] result_count The count of the messages that have been retrieved as a result applying @a limit and @a offset.\n - * If the search has a @a limit, then this value is always equal or less than the limit. - * @param[in] total_count The count of the messages that have been retrieved as a result without applying @a limit and @a offset. \n - * The value can be used to calculate the total number of page views for the searched meessages.\n - * For example, if the count of message search is 50 and the limit is 20, then using this value, you can notice the total page is 3. + * @param[in] msg The message handle \n + * It can be @c NULL if nothing is found. + * @param[in] user_data The user data passed from the foreach function + * @param[in] index The index of a message from the messages that have been retrieved as a search result + * @param[in] result_count The count of the messages that have been retrieved as a result applying @a limit and @a offset \n + * If the search has a @a limit, then this value is always equal or less than the limit. + * @param[in] total_count The count of the messages that have been retrieved as a result without applying @a limit and @a offset \n + * The value can be used to calculate the total number of page views for the searched messages. \n + * For example, if the count of message search is @c 50 and the limit is @c 20, then using this value, you can notice the total page is @c 3. * - * @return @c true to continue with the next iteration of the loop or return @c false to break out of the loop. + * @return @c true to continue with the next iteration of the loop, + * otherwise return @c false to break out of the loop * * @pre messages_foreach_message() will invoke this callback function. * @@ -143,6 +169,34 @@ typedef void (* messages_incoming_cb)(messages_message_h incoming_msg, void *use typedef bool (* messages_search_cb)(messages_message_h msg, int index, int result_count, int total_count, void *user_data); + /** + * @addtogroup CAPI_MESSAGING_MESSAGES_PUSH_MODULE + * @{ + */ + +/** + * @brief Called when an incoming push message is received. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] header The header of the push message + * @param[in] body The body of the push message \n + * It is not a null-terminated string. + * @param[in] body_length The length of @a body + * @param[in] user_data The user data to be passed to the callback function + * + * @pre You register this callback using messages_push_set_incoming_cb() for getting an incoming message. + * + * @see messages_push_set_incoming_cb() + * @see messages_push_unset_incoming_cb() + */ +typedef void (* messages_push_incoming_cb)(const char *header, const char *body, int body_length, void *user_data); + +/** + * @} + */ + + /** * @} */ diff --git a/packaging/capi-messaging-messages.spec b/packaging/capi-messaging-messages.spec index d8b5526..f13c158 100644 --- a/packaging/capi-messaging-messages.spec +++ b/packaging/capi-messaging-messages.spec @@ -1,14 +1,17 @@ Name: capi-messaging-messages Summary: A SMS/MMS library in Tizen Native API -Version: 0.1.0 -Release: 15 +Version: 0.1.28 +Release: 1 License: Apache-2.0 Source0: %{name}-%{version}.tar.gz -BuildRequires: cmake -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(glib-2.0) -BuildRequires: pkgconfig(msg-service) -BuildRequires: pkgconfig(capi-base-common) +BuildRequires: cmake +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(msg-service) +BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(privacy-manager-client) Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig @@ -40,6 +43,10 @@ make %{?jobs:-j%jobs} %install rm -rf %{buildroot} + +mkdir -p %{buildroot}/usr/share/license +cp LICENSE %{buildroot}/usr/share/license/%{name} + cd cmake_build_tmp %make_install @@ -50,6 +57,7 @@ cd cmake_build_tmp %files %{_libdir}/libcapi-messaging-messages.so.* +%{_datadir}/license/%{name} %files devel %{_includedir}/messaging/*.h diff --git a/src/messages.c b/src/messages.c old mode 100644 new mode 100755 index 8fd9986..2b62a85 --- a/src/messages.c +++ b/src/messages.c @@ -11,7 +11,7 @@ * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ #include @@ -22,7 +22,6 @@ #include #include - #include #include #include @@ -32,6 +31,8 @@ #include #include +#include + #ifdef LOG_TAG #undef LOG_TAG #endif @@ -41,38 +42,27 @@ #define MAX_MESSAGES_TEXT_LEN 1530 /* Private Utility Functions */ -int _messages_error_converter(int err, const char *func, int line); int _messages_get_media_type_from_filepath(const char *filepath); int _messages_save_mms_data(messages_message_s *msg); int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle); int _messages_save_textfile(const char *text, char **filepath); int _messages_load_textfile(const char *filepath, char **text); void _messages_sent_mediator_cb(msg_handle_t handle, msg_struct_t pStatus, void *user_param); - -int _messages_convert_mbox_to_fw(messages_message_box_e mbox); -int _messages_convert_msgtype_to_fw(messages_message_type_e type); -int _messages_convert_recipient_to_fw(messages_recipient_type_e type); - - -#define ERROR_CONVERT(err) _messages_error_converter(err, __FUNCTION__, __LINE__); -#define CHECK_NULL(p) \ - if (NULL == p) { \ - LOGE("[%s] INVALID_PARAMETER(0x%08x) %s is null.", \ - __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER, #p); \ - return MESSAGES_ERROR_INVALID_PARAMETER; \ - } +int _messages_check_feature(char *feature_name); int messages_open_service(messages_service_h *svc) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; messages_service_s *_svc; CHECK_NULL(svc); _svc = (messages_service_s*)calloc(1, sizeof(messages_service_s)); - if (NULL == svc) + if (NULL == _svc) { - LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a 'svc'." + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '_svc'." , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); return MESSAGES_ERROR_OUT_OF_MEMORY; } @@ -80,39 +70,58 @@ int messages_open_service(messages_service_h *svc) _svc->sent_cb_list = NULL; _svc->incoming_cb = NULL; _svc->incoming_cb_enabled = false; + _svc->push_incoming_cb_list = NULL; ret = msg_open_msg_handle(&_svc->service_h); if (MSG_SUCCESS != ret) { free(_svc); return ERROR_CONVERT(ret); } - + ret = msg_reg_sent_status_callback(_svc->service_h, &_messages_sent_mediator_cb, (void*)_svc); if (MSG_SUCCESS != ret) { free(_svc); return ERROR_CONVERT(ret); - } + } *svc = (messages_service_h)_svc; return MESSAGES_ERROR_NONE; } +void _free_push_incoming_cb(messages_push_incoming_callback_s *cb) +{ + if (NULL != cb) { + if (NULL != cb->app_id) { + free(cb->app_id); + } + free(cb); + } +} + int messages_close_service(messages_service_h svc) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; - + messages_service_s *_svc = (messages_service_s *)svc; CHECK_NULL(_svc); ret = msg_close_msg_handle(&_svc->service_h); - - if (_svc->sent_cb_list) { + + if (_svc->sent_cb_list) { g_slist_foreach(_svc->sent_cb_list, (GFunc)g_free, NULL); g_slist_free(_svc->sent_cb_list); _svc->sent_cb_list = NULL; } + if (_svc->push_incoming_cb_list) { + g_slist_foreach(_svc->push_incoming_cb_list, (GFunc)_free_push_incoming_cb, NULL); + g_slist_free(_svc->push_incoming_cb_list); + _svc->push_incoming_cb_list = NULL; + } + free(svc); return ERROR_CONVERT(ret); @@ -120,6 +129,8 @@ int messages_close_service(messages_service_h svc) int messages_create_message(messages_message_type_e type, messages_message_h *msg) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; messages_message_s *_msg = NULL; @@ -132,7 +143,7 @@ int messages_create_message(messages_message_type_e type, messages_message_h *ms , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); return MESSAGES_ERROR_OUT_OF_MEMORY; } - + _msg->msg_h = msg_create_struct(MSG_STRUCT_MESSAGE_INFO); if (NULL == _msg->msg_h) { @@ -157,13 +168,20 @@ int messages_create_message(messages_message_type_e type, messages_message_h *ms } else if (MESSAGES_TYPE_MMS == type) { + ret = _messages_check_feature(MESSAGES_TELEPHONY_MMS_FEATURE); + if (MESSAGES_ERROR_NONE != ret) { + msg_release_struct(&_msg->msg_h); + free(_msg); + return ret; + } + ret = ERROR_CONVERT(msg_set_int_value(_msg->msg_h, MSG_MESSAGE_TYPE_INT, MSG_TYPE_MMS)); if (MESSAGES_ERROR_NONE != ret) { msg_release_struct(&_msg->msg_h); free(_msg); return ret; - } + } } else { @@ -181,10 +199,12 @@ int messages_create_message(messages_message_type_e type, messages_message_h *ms int messages_destroy_message(messages_message_h msg) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; messages_message_s *_msg = (messages_message_s*)msg; - + CHECK_NULL(_msg); messages_mms_remove_all_attachments(msg); @@ -203,6 +223,8 @@ int messages_destroy_message(messages_message_h msg) int messages_get_message_type(messages_message_h msg, messages_message_type_e *type) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int msgType; int ret; @@ -219,10 +241,17 @@ int messages_get_message_type(messages_message_h msg, messages_message_type_e *t switch (msgType) { - case MSG_TYPE_SMS: case MSG_TYPE_SMS_CB: case MSG_TYPE_SMS_JAVACB: + *type = MESSAGES_TYPE_SMS_CB; + break; case MSG_TYPE_SMS_WAPPUSH: + *type = MESSAGES_TYPE_SMS_PUSH; + break; +// case MSG_TYPE_SMS_ETWS: +// *type = MESSAGES_TYPE_SMS_ETWS; +// break; + case MSG_TYPE_SMS: case MSG_TYPE_SMS_MWI: case MSG_TYPE_SMS_SYNCML: case MSG_TYPE_SMS_REJECT: @@ -243,32 +272,31 @@ int messages_get_message_type(messages_message_h msg, messages_message_type_e *t int messages_add_address(messages_message_h msg, const char *address, messages_recipient_type_e type) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; - int msgType; - msg_struct_list_s *addr_list = NULL; + messages_message_type_e msgType; msg_struct_t addr_info; - + messages_message_s *_msg = (messages_message_s*)msg; - + CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(address); - - msg_get_int_value(_msg->msg_h, MSG_MESSAGE_TYPE_INT, (int *)&msgType); - - ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); + + messages_get_message_type(msg, &msgType); + + ret = msg_list_add_item(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_HND, &addr_info); if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - - addr_info = addr_list->msg_struct_info[addr_list->nCount]; - - if (MSG_TYPE_SMS == msgType) + + if (IS_SMS(msgType)) { msg_set_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, MSG_RECIPIENTS_TYPE_TO); } - else if (MSG_TYPE_MMS == msgType) + else if (IS_MMS(msgType)) { if (strchr(address, '@') == NULL) { @@ -291,40 +319,43 @@ int messages_add_address(messages_message_h msg, const char *address, messages_r if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - - addr_list->nCount++; return MESSAGES_ERROR_NONE; } int messages_get_address_count(messages_message_h msg, int *count) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; - msg_struct_list_s *addr_list = NULL; - + msg_list_handle_t addr_list = NULL; + messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(count); - - ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); + + ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_HND, (void **)&addr_list); if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - *count = addr_list->nCount; + *count = msg_list_length(addr_list); return MESSAGES_ERROR_NONE; } int messages_get_address(messages_message_h msg, int index, char **address, messages_recipient_type_e *type) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; - char _address[MAX_ADDRESS_VAL_LEN] = {0, }; + char _address[MAX_ADDRESS_VAL_LEN+1] = {0, }; int _type; - - msg_struct_list_s *addr_list = NULL; + int count; + + msg_list_handle_t addr_list = NULL; msg_struct_t addr_info; messages_message_s *_msg = (messages_message_s*)msg; @@ -332,21 +363,22 @@ int messages_get_address(messages_message_h msg, int index, char **address, mess CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(address); - - ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); + + ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_HND, (void **)&addr_list); if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - - if (index > addr_list->nCount) + + count = msg_list_length(addr_list); + if (index > count) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : index(%d) > addr_list->nCount(%d) " - , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER, index, addr_list->nCount); + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER, index, count); return MESSAGES_ERROR_INVALID_PARAMETER; } - - addr_info = addr_list->msg_struct_info[index]; - + + addr_info = (msg_struct_t)msg_list_nth_data(addr_list, index); + ret = msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, _address, MAX_ADDRESS_VAL_LEN); if (MSG_SUCCESS != ret) { @@ -364,7 +396,7 @@ int messages_get_address(messages_message_h msg, int index, char **address, mess } if (NULL != type) - { + { ret = msg_get_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, &_type); if (MSG_SUCCESS != ret) { @@ -384,7 +416,7 @@ int messages_get_address(messages_message_h msg, int index, char **address, mess break; default: *type = MESSAGES_RECIPIENT_UNKNOWN; - break; + break; } } } @@ -394,19 +426,15 @@ int messages_get_address(messages_message_h msg, int index, char **address, mess int messages_remove_all_addresses(messages_message_h msg) { - int ret; - msg_struct_list_s *addr_list = NULL; + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); - ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); - if (MSG_SUCCESS == ret) - { - addr_list->nCount = 0; - } + ret = msg_list_clear(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_HND); return ERROR_CONVERT(ret); } @@ -419,6 +447,14 @@ void _dump_message(messages_message_h msg) int messages_send_message(messages_service_h svc, messages_message_h msg, bool save_to_sentbox, messages_sent_cb callback, void *user_data) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + /* Privacy check */ + int privacy_ret = privacy_checker_check_by_privilege(MESSAGES_PRIVILEGE_WRITE); + if (privacy_ret == PRIV_MGR_ERROR_USER_NOT_CONSENTED) { + return MESSAGES_ERROR_PERMISSION_DENIED; + } + int ret; int reqId; msg_struct_t req; @@ -428,7 +464,7 @@ int messages_send_message(messages_service_h svc, messages_message_h msg, bool s messages_service_s *_svc = (messages_service_s*)svc; messages_message_s *_msg = (messages_message_s*)msg; - + messages_sent_callback_s *_cb; CHECK_NULL(_svc); @@ -439,23 +475,29 @@ int messages_send_message(messages_service_h svc, messages_message_h msg, bool s sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT); msg_set_bool_value(sendOpt, MSG_SEND_OPT_SETTING_BOOL, true); msg_set_bool_value(sendOpt, MSG_SEND_OPT_DELIVER_REQ_BOOL, false); - msg_set_bool_value(sendOpt, MSG_SEND_OPT_KEEPCOPY_BOOL, save_to_sentbox); + msg_set_bool_value(sendOpt, MSG_SEND_OPT_KEEPCOPY_BOOL, save_to_sentbox); messages_get_message_type(msg, &msgType); - if (MESSAGES_TYPE_SMS == msgType) - { + if (IS_SMS(msgType)) + { req = msg_create_struct(MSG_STRUCT_REQUEST_INFO); msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, _msg->msg_h); - msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt); - + msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt); + ret = msg_sms_send_message(_svc->service_h, req); - + msg_get_int_value(req, MSG_REQUEST_REQUESTID_INT, &reqId); msg_release_struct(&req); } - else if (MESSAGES_TYPE_MMS == msgType) + else if (IS_MMS(msgType)) { + ret = _messages_check_feature(MESSAGES_TELEPHONY_MMS_FEATURE); + if (MESSAGES_ERROR_NONE != ret) { + msg_release_struct(&sendOpt); + return ret; + } + ret = _messages_save_mms_data(_msg); if (MESSAGES_ERROR_NONE == ret) { @@ -463,32 +505,33 @@ int messages_send_message(messages_service_h svc, messages_message_h msg, bool s { _dump_message(msg); } - + req = msg_create_struct(MSG_STRUCT_REQUEST_INFO); msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, _msg->msg_h); - msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt); - + msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt); + msg_get_struct_handle(sendOpt, MSG_SEND_OPT_MMS_OPT_HND, &option); msg_set_bool_value(option, MSG_MMS_SENDOPTION_READ_REQUEST_BOOL, false); msg_set_int_value(option, MSG_MMS_SENDOPTION_PRIORITY_INT, MSG_MESSAGE_PRIORITY_NORMAL); msg_set_int_value(option, MSG_MMS_SENDOPTION_EXPIRY_TIME_INT, MSG_EXPIRY_TIME_MAXIMUM); - msg_set_int_value(option, MSG_MMS_SENDOPTION_DELIVERY_TIME_INT, MSG_DELIVERY_TIME_IMMEDIATLY); - + msg_set_int_value(option, MSG_MMS_SENDOPTION_DELIVERY_TIME_INT, MSG_DELIVERY_TIME_IMMEDIATLY); + ret = msg_mms_send_message(_svc->service_h, req); - + msg_get_int_value(req, MSG_REQUEST_REQUESTID_INT, &reqId); msg_release_struct(&req); } } else { - LOGE("[%s] INVALID_PARAMETER(0x%08x) : Invalid Message Type.", - __FUNCTION__, TIZEN_ERROR_INVALID_PARAMETER); - return TIZEN_ERROR_INVALID_PARAMETER; + LOGE("[%s] INVALID_PARAMETER(0x%08x) : Invalid Message Type.", + __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); + msg_release_struct(&sendOpt); + return MESSAGES_ERROR_INVALID_PARAMETER; } - + msg_release_struct(&sendOpt); - + if (NULL != callback && MSG_SUCCESS == ret) { // Add callback to mapping table @@ -504,26 +547,28 @@ int messages_send_message(messages_service_h svc, messages_message_h msg, bool s return ERROR_CONVERT(ret); } -int messages_get_message_count(messages_service_h service, +int messages_get_message_count(messages_service_h service, messages_message_box_e mbox, messages_message_type_e type, int *count) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; msg_folder_id_t folderId; msg_struct_t countInfo = NULL; int nSms, nMms; - + messages_service_s *_svc = (messages_service_s*)service; - + CHECK_NULL(_svc); CHECK_NULL(count); - + nSms = 0; nMms = 0; - + if (MESSAGES_MBOX_ALL == mbox) { - if (MESSAGES_TYPE_SMS == type || MESSAGES_TYPE_UNKNOWN == type) + if (IS_SMS(type) || MESSAGES_TYPE_UNKNOWN == type) { ret = ERROR_CONVERT(msg_count_msg_by_type(_svc->service_h, MSG_TYPE_SMS, &nSms)); if (MESSAGES_ERROR_NONE != ret) @@ -532,7 +577,7 @@ int messages_get_message_count(messages_service_h service, } } - if (MESSAGES_TYPE_MMS == type || MESSAGES_TYPE_UNKNOWN == type) + if (IS_MMS(type) || MESSAGES_TYPE_UNKNOWN == type) { ret = ERROR_CONVERT(msg_count_msg_by_type(_svc->service_h, MSG_TYPE_MMS, &nMms)); if (MESSAGES_ERROR_NONE != ret) @@ -546,13 +591,20 @@ int messages_get_message_count(messages_service_h service, else { countInfo = msg_create_struct(MSG_STRUCT_COUNT_INFO); + if (NULL == countInfo) { + LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create 'countInfo'." + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + folderId = _messages_convert_mbox_to_fw(mbox); ret = ERROR_CONVERT(msg_count_message(_svc->service_h, folderId, countInfo)); if (MESSAGES_ERROR_NONE != ret) { + msg_release_struct(&countInfo); return ret; } - + msg_get_int_value(countInfo, MSG_COUNT_INFO_SMS_INT, &nSms); msg_get_int_value(countInfo, MSG_COUNT_INFO_MMS_INT, &nMms); @@ -566,7 +618,7 @@ int messages_get_message_count(messages_service_h service, default: *count = 0; break; } } - + return MESSAGES_ERROR_NONE; } @@ -577,105 +629,123 @@ int messages_search_message(messages_service_h service, int offset, int limit, messages_message_h **message_array, int *length, int *total) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int i; int ret; msg_struct_list_s msg_list; - msg_struct_t searchCon; + msg_struct_t listCond; messages_message_type_e _msgType; - + messages_service_s *_svc = (messages_service_s*)service; messages_message_s *_msg = NULL; messages_message_h *_array; - + CHECK_NULL(_svc); CHECK_NULL(message_array); - + // Set Condition - searchCon = msg_create_struct(MSG_STRUCT_SEARCH_CONDITION); - msg_set_int_value(searchCon, MSG_SEARCH_CONDITION_FOLDERID_INT, _messages_convert_mbox_to_fw(mbox)); - msg_set_int_value(searchCon, MSG_SEARCH_CONDITION_MSGTYPE_INT, _messages_convert_msgtype_to_fw(type)); + listCond = msg_create_struct(MSG_STRUCT_MSG_LIST_CONDITION); + if (NULL == listCond) { + LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create 'listCond'." + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + msg_set_int_value(listCond, MSG_LIST_CONDITION_FOLDER_ID_INT, _messages_convert_mbox_to_fw(mbox)); + msg_set_int_value(listCond, MSG_LIST_CONDITION_MSGTYPE_INT, _messages_convert_msgtype_to_fw(type)); + if (NULL != keyword) { - msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_SEARCH_VALUE_STR, strdup(keyword), sizeof(keyword)); + msg_set_str_value(listCond, MSG_LIST_CONDITION_TEXT_VALUE_STR, strdup(keyword), strlen(keyword)); } if (NULL != address) { - msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_ADDRESS_VALUE_STR, strdup(address), sizeof(address)); + msg_set_str_value(listCond, MSG_LIST_CONDITION_ADDRESS_VALUE_STR, strdup(address), strlen(address)); } // Search - ret = msg_search_message(_svc->service_h, searchCon, offset, limit, &msg_list); + msg_set_bool_value(listCond, MSG_LIST_CONDITION_AND_OPERATER_BOOL, true); + msg_set_int_value(listCond, MSG_LIST_CONDITION_OFFSET_INT, offset); + msg_set_int_value(listCond, MSG_LIST_CONDITION_LIMIT_INT, limit); + ret = msg_get_message_list2(_svc->service_h, listCond, &msg_list); + msg_release_struct(&listCond); if (MSG_SUCCESS != ret) { - msg_release_struct(&searchCon); + msg_release_list_struct(&msg_list); return ERROR_CONVERT(ret); } - msg_release_struct(&searchCon); // Result _array = (messages_message_h*)calloc(msg_list.nCount + 1, sizeof(messages_message_h)); if (NULL == _array) { + msg_release_list_struct(&msg_list); LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create '_array'." , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); return MESSAGES_ERROR_OUT_OF_MEMORY; } - + for (i=0; i < msg_list.nCount; i++) { _msg = (messages_message_s*)calloc(1, sizeof(messages_message_s)); - _msg->text = NULL; - _msg->attachment_list = NULL; if (NULL == _msg) { LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create '_msg'." - , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + for (; i > 0; i--) { + free(_array[i-1]); + } free(_array); + msg_release_list_struct(&msg_list); return MESSAGES_ERROR_OUT_OF_MEMORY; } + _msg->text = NULL; + _msg->attachment_list = NULL; _msg->msg_h = msg_list.msg_struct_info[i]; - + messages_get_message_type((messages_message_h)_msg, &_msgType); - if (MESSAGES_TYPE_MMS == _msgType) + if (IS_MMS(_msgType)) { // TODO: Well... performance issue. // Shoud I load mms data at here? _messages_load_mms_data(_msg, _svc->service_h); } - + _array[i] = (messages_message_h)_msg; } - + *message_array = (messages_message_h*)_array; - + if (NULL != length) { *length = msg_list.nCount; } - + if (NULL != total) { *total = -1; // TODO: total count is not supported yet. } - + // TODO: where should I free msg_list? - return MESSAGES_ERROR_NONE; } int messages_free_message_array(messages_message_h *message_array) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; int i=0; messages_message_h* _array = (messages_message_h*)message_array; CHECK_NULL(_array); - + while (_array[i] != NULL) { ret = messages_destroy_message(_array[i]); @@ -684,12 +754,12 @@ int messages_free_message_array(messages_message_h *message_array) LOGW("[%s:%d] messages_destroy_message() is fail. ret = %d" , __FUNCTION__, __LINE__, ret); } - + i++; } - + free(message_array); - + return MESSAGES_ERROR_NONE; } @@ -700,6 +770,14 @@ int messages_foreach_message(messages_service_h svc, int offset, int limit, messages_search_cb callback, void *user_data) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + /* Privacy check */ + int privacy_ret = privacy_checker_check_by_privilege(MESSAGES_PRIVILEGE_READ); + if (privacy_ret == PRIV_MGR_ERROR_USER_NOT_CONSENTED) { + return MESSAGES_ERROR_PERMISSION_DENIED; + } + int i; int ret; bool ret_cb; @@ -707,25 +785,28 @@ int messages_foreach_message(messages_service_h svc, messages_message_h* msg_array; int length; int total; - + ret = messages_search_message(svc, mbox, type, keyword, address, offset, limit, &msg_array, &length, &total); if (MESSAGES_ERROR_NONE != ret) { - return ret; + return ret; } - + for (i=0; i < length; i++) { ret_cb = callback((messages_message_h)msg_array[i], i, length, total, user_data); + if (!ret_cb) { + break; + } } - + ret = messages_free_message_array(msg_array); if (MESSAGES_ERROR_NONE != ret) { - return ret; + return ret; } - + return MESSAGES_ERROR_NONE; } @@ -752,7 +833,7 @@ void _messages_sent_mediator_cb(msg_handle_t handle, msg_struct_t pStatus, void _cb = (messages_sent_callback_s *)g_slist_nth_data(_svc->sent_cb_list, i); if (NULL != _cb && _cb->req_id == reqId) { - ret = (status == MSG_NETWORK_SEND_SUCCESS) ? + ret = (status == MSG_NETWORK_SEND_SUCCESS) ? MESSAGES_SENDING_SUCCEEDED : MESSAGES_SENDING_FAILED; ((messages_sent_cb)_cb->callback)(ret, _cb->user_data); @@ -783,24 +864,32 @@ void _messages_incoming_mediator_cb(msg_handle_t handle, msg_struct_t msg, void , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); return; } - + _msg->msg_h = msg; messages_get_message_type((messages_message_h)_msg, &msgType); - if (MESSAGES_TYPE_MMS == msgType) + if (IS_MMS(msgType)) { + if (MESSAGES_ERROR_NONE != _messages_check_feature(MESSAGES_TELEPHONY_MMS_FEATURE)) { + free(_msg); + return; + } + _messages_load_mms_data(_msg, handle); } ((messages_incoming_cb)_svc->incoming_cb)((messages_message_h)_msg, _svc->incoming_cb_user_data); + messages_mms_remove_all_attachments((messages_message_h)_msg); free(_msg); } } int messages_set_message_incoming_cb(messages_service_h svc, messages_incoming_cb callback, void *user_data) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + int ret; messages_service_s *_svc = (messages_service_s*)svc; @@ -836,29 +925,33 @@ int messages_set_message_incoming_cb(messages_service_h svc, messages_incoming_c int messages_add_sms_listening_port(messages_service_h service, int port) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; messages_service_s *_svc = (messages_service_s*)service; CHECK_NULL(_svc); - + if (port <= 0) { return MESSAGES_ERROR_INVALID_PARAMETER; } - + ret = ERROR_CONVERT( msg_reg_sms_message_callback(_svc->service_h, &_messages_incoming_mediator_cb, port, (void*)_svc) ); - + if (MESSAGES_ERROR_NONE != ret) { return ret; } - + return MESSAGES_ERROR_NONE; } int messages_unset_message_incoming_cb(messages_service_h svc) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + messages_service_s *_svc = (messages_service_s*)svc; CHECK_NULL(_svc); @@ -870,27 +963,31 @@ int messages_unset_message_incoming_cb(messages_service_h svc) int messages_get_message_port(messages_message_h msg, int *port) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; int _port; - + messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(port); - + ret = msg_get_int_value(_msg->msg_h, MSG_MESSAGE_DEST_PORT_INT, &_port); if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - + *port = _port; - + return MESSAGES_ERROR_NONE; } int messages_set_text(messages_message_h msg, const char *text) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; int len; messages_message_type_e type; @@ -905,10 +1002,10 @@ int messages_set_text(messages_message_h msg, const char *text) return ret; } - if (MESSAGES_TYPE_SMS == type) + if (IS_SMS(type)) { len = strlen(text); - if (len > MAX_MESSAGES_TEXT_LEN) + if (len > MAX_MESSAGES_TEXT_LEN) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : the length of body exceeded the max, 1530 ." , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); @@ -916,8 +1013,10 @@ int messages_set_text(messages_message_h msg, const char *text) } ret = ERROR_CONVERT(msg_set_str_value(_msg->msg_h, MSG_MESSAGE_SMS_DATA_STR, (char *)text, len)); } - else if (MESSAGES_TYPE_MMS == type) + else if (IS_MMS(type)) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + if (NULL != _msg->text) { free(_msg->text); @@ -937,7 +1036,7 @@ int messages_set_text(messages_message_h msg, const char *text) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : unknown message type" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); - return MESSAGES_ERROR_INVALID_PARAMETER; + return MESSAGES_ERROR_INVALID_PARAMETER; } return ret; @@ -945,8 +1044,10 @@ int messages_set_text(messages_message_h msg, const char *text) int messages_get_text(messages_message_h msg, char **text) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; - char _text[MAX_MSG_TEXT_LEN]; + char _text[MAX_MSG_TEXT_LEN+1] = {0,}; messages_message_type_e type; messages_message_s *_msg = (messages_message_s*)msg; @@ -959,7 +1060,7 @@ int messages_get_text(messages_message_h msg, char **text) return ret; } - if (MESSAGES_TYPE_SMS == type) + if (IS_SMS(type)) { ret = msg_get_str_value(_msg->msg_h, MSG_MESSAGE_SMS_DATA_STR, _text, MAX_MSG_TEXT_LEN); if (MSG_SUCCESS != ret) @@ -977,7 +1078,7 @@ int messages_get_text(messages_message_h msg, char **text) } } } - else if (MESSAGES_TYPE_MMS == type) + else if (IS_MMS(type)) { if (NULL == _msg->text) { @@ -994,7 +1095,7 @@ int messages_get_text(messages_message_h msg, char **text) } } } - else + else { LOGE("[%s] INVALID_PARAMETER(0x%08x) : unknown message type" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); @@ -1008,14 +1109,16 @@ int messages_get_text(messages_message_h msg, char **text) int messages_get_time(messages_message_h msg, time_t *time) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; int _time; - + messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(time); - + ret = msg_get_int_value(_msg->msg_h, MSG_MESSAGE_DISPLAY_TIME_INT, &_time); if (MSG_SUCCESS != ret) { @@ -1029,27 +1132,76 @@ int messages_get_time(messages_message_h msg, time_t *time) int messages_get_message_id(messages_message_h msg, int *msg_id) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; int _id; - + messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(msg_id); - + ret = msg_get_int_value(_msg->msg_h, MSG_MESSAGE_ID_INT, &_id); if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - + *msg_id = _id; - + + return MESSAGES_ERROR_NONE; +} + + +int messages_set_sim_id(messages_message_h msg, int sim_id) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int ret; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + + ret = msg_set_int_value(_msg->msg_h, MSG_MESSAGE_SIM_INDEX_INT, sim_id); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + return MESSAGES_ERROR_NONE; +} + + +int messages_get_sim_id(messages_message_h msg, int *sim_id) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int ret; + int _id; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(sim_id); + + ret = msg_get_int_value(_msg->msg_h, MSG_MESSAGE_SIM_INDEX_INT, &_id); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + *sim_id = _id; + return MESSAGES_ERROR_NONE; } + int messages_search_message_by_id(messages_service_h service, int msg_id, messages_message_h *msg) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; msg_struct_t new_msg_h; messages_message_type_e _msgType; @@ -1057,66 +1209,92 @@ int messages_search_message_by_id(messages_service_h service, int msg_id, messag messages_service_s *_svc = (messages_service_s*)service; messages_message_s *_msg = NULL; - + CHECK_NULL(_svc); CHECK_NULL(_svc->service_h); CHECK_NULL(msg); - + new_msg_h = msg_create_struct(MSG_STRUCT_MESSAGE_INFO); + if (NULL == new_msg_h) { + LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create 'new_msg_h'." + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT); + if (NULL == sendOpt) { + msg_release_struct(&new_msg_h); + LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create 'sendOpt'." + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + ret = msg_get_message(_svc->service_h, msg_id, new_msg_h, sendOpt); if (MSG_SUCCESS != ret) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_get_message failed.", - __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); - return MESSAGES_ERROR_OPERATION_FAILED; + msg_release_struct(&sendOpt); + msg_release_struct(&new_msg_h); + return ERROR_CONVERT(ret); } - + + msg_release_struct(&sendOpt); + _msg = (messages_message_s*)calloc(1, sizeof(messages_message_s)); - _msg->text = NULL; - _msg->attachment_list = NULL; if (NULL == _msg) { + msg_release_struct(&new_msg_h); LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create '_msg'." , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); return MESSAGES_ERROR_OUT_OF_MEMORY; } - + + _msg->text = NULL; + _msg->attachment_list = NULL; _msg->msg_h = new_msg_h; - - messages_get_message_type((messages_message_h)_msg, &_msgType); - if (MESSAGES_TYPE_MMS == _msgType) + + messages_get_message_type((messages_message_h)_msg, &_msgType); + if (IS_MMS(_msgType)) { + ret = _messages_check_feature(MESSAGES_TELEPHONY_MMS_FEATURE); + if (MESSAGES_ERROR_NONE != ret) { + free(_msg); + msg_release_struct(&new_msg_h); + return ret; + } + ret = _messages_load_mms_data(_msg, _svc->service_h); if (MESSAGES_ERROR_NONE != ret) { free(_msg); + msg_release_struct(&new_msg_h); return ret; } } - + *msg = (messages_message_h)_msg; - + return MESSAGES_ERROR_NONE; } int messages_get_mbox_type(messages_message_h msg, messages_message_box_e *mbox) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + int ret; int folder_id; - + messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); CHECK_NULL(mbox); - + ret = msg_get_int_value(_msg->msg_h, MSG_MESSAGE_FOLDER_ID_INT, &folder_id); if (MSG_SUCCESS != ret) { return ERROR_CONVERT(ret); } - + switch (folder_id) { - case MSG_INBOX_ID: + case MSG_INBOX_ID: *mbox = MESSAGES_MBOX_INBOX; break; case MSG_OUTBOX_ID: @@ -1132,7 +1310,7 @@ int messages_get_mbox_type(messages_message_h msg, messages_message_box_e *mbox) *mbox = MESSAGES_MBOX_ALL; break; } - + return MESSAGES_ERROR_NONE; } @@ -1141,6 +1319,8 @@ int messages_get_mbox_type(messages_message_h msg, messages_message_box_e *mbox) int messages_mms_set_subject(messages_message_h msg, const char *subject) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + int ret; messages_message_type_e type; @@ -1154,13 +1334,13 @@ int messages_mms_set_subject(messages_message_h msg, const char *subject) return ret; } - if (MESSAGES_TYPE_MMS != type) + if (!IS_MMS(type)) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type should be MESSAGES_TYPE_MMS" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); - return MESSAGES_ERROR_INVALID_PARAMETER; + return MESSAGES_ERROR_INVALID_PARAMETER; } - + ret = msg_set_str_value(_msg->msg_h, MSG_MESSAGE_SUBJECT_STR, (char *)subject, strlen(subject)); return ERROR_CONVERT(ret); @@ -1168,8 +1348,10 @@ int messages_mms_set_subject(messages_message_h msg, const char *subject) int messages_mms_get_subject(messages_message_h msg, char **subject) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + int ret; - char _subject[MAX_SUBJECT_LEN]; + char _subject[MAX_SUBJECT_LEN+1] = {0,}; messages_message_type_e type; messages_message_s *_msg = (messages_message_s*)msg; @@ -1182,13 +1364,13 @@ int messages_mms_get_subject(messages_message_h msg, char **subject) return ret; } - if (MESSAGES_TYPE_MMS != type) + if (!IS_MMS(type)) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type should be MESSAGES_TYPE_MMS" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); - return MESSAGES_ERROR_INVALID_PARAMETER; + return MESSAGES_ERROR_INVALID_PARAMETER; } - + ret = msg_get_str_value(_msg->msg_h, MSG_MESSAGE_SUBJECT_STR, _subject, MAX_SUBJECT_LEN); if (MSG_SUCCESS != ret) { @@ -1211,10 +1393,13 @@ int messages_mms_get_subject(messages_message_h msg, char **subject) int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e type, const char *path) { - messages_message_type_e msg_type; + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + + messages_message_type_e msg_type; messages_message_s *_msg = (messages_message_s*)msg; messages_attachment_s *attach; + int input_file_name_length; CHECK_NULL(_msg); CHECK_NULL(_msg->msg_h); @@ -1222,11 +1407,20 @@ int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e ty // Check Message Type messages_get_message_type(msg, &msg_type); - if (MESSAGES_TYPE_MMS != msg_type) + if (!IS_MMS(msg_type)) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type should be MESSAGES_TYPE_MMS" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); - return MESSAGES_ERROR_INVALID_PARAMETER; + return MESSAGES_ERROR_INVALID_PARAMETER; + } + + //CID 350148: Putting a check so that input buffer does not exceed max_size which will cause seg fault. + //CID 358513: Also putting this check before calloc of var attach to prevent memory leak in case of error. + input_file_name_length = strlen(path); + if(input_file_name_length > MSG_FILEPATH_LEN_MAX) { + LOGE("[%s] INVALID_PARAMETER(0x%08x) : maximum length of file_name_path can be %d" + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER, MSG_FILEPATH_LEN_MAX); + return MESSAGES_ERROR_INVALID_PARAMETER; } // New Attach @@ -1235,11 +1429,12 @@ int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e ty { LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a 'attach'." , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); - return MESSAGES_ERROR_OUT_OF_MEMORY; + return MESSAGES_ERROR_OUT_OF_MEMORY; } - attach->media_type = type; - strncpy(attach->filepath, path, strlen(path)); + attach->media_type = type; + + strncpy(attach->filepath, path, input_file_name_length); // Append _msg->attachment_list = g_slist_append(_msg->attachment_list, attach); @@ -1249,6 +1444,8 @@ int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e ty int messages_mms_get_attachment_count(messages_message_h msg, int *count) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + messages_message_type_e type; messages_message_s *_msg = (messages_message_s*)msg; @@ -1259,11 +1456,11 @@ int messages_mms_get_attachment_count(messages_message_h msg, int *count) // Check Message Type messages_get_message_type(msg, &type); - if (MESSAGES_TYPE_MMS != type) + if (!IS_MMS(type)) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type should be MESSAGES_TYPE_MMS" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); - return MESSAGES_ERROR_INVALID_PARAMETER; + return MESSAGES_ERROR_INVALID_PARAMETER; } // Count @@ -1274,6 +1471,8 @@ int messages_mms_get_attachment_count(messages_message_h msg, int *count) int messages_mms_get_attachment(messages_message_h msg, int index, messages_media_type_e *type, char **path) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + messages_attachment_s *_attach; messages_message_type_e msg_type; @@ -1285,11 +1484,11 @@ int messages_mms_get_attachment(messages_message_h msg, int index, messages_medi // Check Message Type messages_get_message_type(msg, &msg_type); - if (MESSAGES_TYPE_MMS != msg_type) + if (!IS_MMS(msg_type)) { LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type should be MESSAGES_TYPE_MMS" , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); - return MESSAGES_ERROR_INVALID_PARAMETER; + return MESSAGES_ERROR_INVALID_PARAMETER; } _attach = (messages_attachment_s *)g_slist_nth_data(_msg->attachment_list, index); @@ -1315,6 +1514,8 @@ int messages_mms_get_attachment(messages_message_h msg, int index, messages_medi int messages_mms_remove_all_attachments(messages_message_h msg) { + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_MMS_FEATURE); + messages_message_s *_msg = (messages_message_s*)msg; CHECK_NULL(_msg); @@ -1337,7 +1538,7 @@ int _messages_save_mms_data(messages_message_s *msg) msg_struct_t mms_data; msg_struct_t region; - + msg_struct_t page; msg_struct_t media; msg_struct_t smil_text; @@ -1350,11 +1551,11 @@ int _messages_save_mms_data(messages_message_s *msg) char *filepath = NULL; CHECK_NULL(msg); - + mms_data = msg_create_struct(MSG_STRUCT_MMS); if (NULL == mms_data) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_mms_create_message failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_mms_create_message failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); return MESSAGES_ERROR_OPERATION_FAILED; } @@ -1397,35 +1598,35 @@ int _messages_save_mms_data(messages_message_s *msg) if (NULL == image) { - msg_mms_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); + msg_list_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); msg_set_str_value(region, MSG_MMS_REGION_ID_STR, (char *)"Text", 4); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_LEFT_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_TOP_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_WIDTH_INT, 100); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_HEIGHT_INT, 100); - msg_set_int_value(region, MSG_MMS_REGION_BGCOLOR_INT, 0xffffff); + msg_set_int_value(region, MSG_MMS_REGION_BGCOLOR_INT, 0xffffff); } else if (NULL == msg->text) { - msg_mms_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); + msg_list_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); msg_set_str_value(region, MSG_MMS_REGION_ID_STR, (char *)"Image", 5); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_LEFT_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_TOP_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_WIDTH_INT, 100); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_HEIGHT_INT, 100); - msg_set_int_value(region, MSG_MMS_REGION_BGCOLOR_INT, 0xffffff); + msg_set_int_value(region, MSG_MMS_REGION_BGCOLOR_INT, 0xffffff); } else { - msg_mms_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); + msg_list_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); msg_set_str_value(region, MSG_MMS_REGION_ID_STR, (char *)"Image", 5); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_LEFT_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_TOP_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_WIDTH_INT, 100); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_HEIGHT_INT, 50); msg_set_int_value(region, MSG_MMS_REGION_BGCOLOR_INT, 0xffffff); - - msg_mms_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); + + msg_list_add_item(mms_data, MSG_STRUCT_MMS_REGION, ®ion); msg_set_str_value(region, MSG_MMS_REGION_ID_STR, (char *)"Text", 4); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_LEFT_INT, 0); msg_set_int_value(region, MSG_MMS_REGION_LENGTH_TOP_INT, 50); @@ -1435,33 +1636,33 @@ int _messages_save_mms_data(messages_message_s *msg) } // Add Media - msg_mms_add_item(mms_data, MSG_STRUCT_MMS_PAGE, &page); + msg_list_add_item(mms_data, MSG_STRUCT_MMS_PAGE, &page); msg_set_int_value(page, MSG_MMS_PAGE_PAGE_DURATION_INT, 5440); if (NULL != image) { if (MESSAGES_MEDIA_IMAGE == image->media_type) { - msg_mms_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); + msg_list_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); msg_set_int_value(media, MSG_MMS_MEDIA_TYPE_INT, MMS_SMIL_MEDIA_IMG); msg_set_str_value(media, MSG_MMS_MEDIA_REGION_ID_STR, (char *)"Image", 5); - msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)image->filepath, MAX_IMAGE_PATH_LEN); + msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)image->filepath, MSG_FILEPATH_LEN_MAX); } else if (MESSAGES_MEDIA_VIDEO == image->media_type) { - msg_mms_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); + msg_list_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); msg_set_int_value(media, MSG_MMS_MEDIA_TYPE_INT, MMS_SMIL_MEDIA_VIDEO); msg_set_str_value(media, MSG_MMS_MEDIA_REGION_ID_STR, (char *)"Image", 5); - msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)image->filepath, MAX_IMAGE_PATH_LEN); + msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)image->filepath, MSG_FILEPATH_LEN_MAX); } } if (NULL != audio) { - msg_mms_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); + msg_list_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); msg_set_int_value(media, MSG_MMS_MEDIA_TYPE_INT, MMS_SMIL_MEDIA_AUDIO); msg_set_str_value(media, MSG_MMS_MEDIA_REGION_ID_STR, (char *)"Audio", 5); - msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)audio->filepath, MAX_IMAGE_PATH_LEN); + msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)audio->filepath, MSG_FILEPATH_LEN_MAX); } if (NULL != msg->text) @@ -1469,11 +1670,11 @@ int _messages_save_mms_data(messages_message_s *msg) ret = _messages_save_textfile(msg->text, &filepath); if (MESSAGES_ERROR_NONE == ret) { - msg_mms_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); + msg_list_add_item(page, MSG_STRUCT_MMS_MEDIA, &media); msg_set_int_value(media, MSG_MMS_MEDIA_TYPE_INT, MMS_SMIL_MEDIA_TEXT); msg_set_str_value(media, MSG_MMS_MEDIA_REGION_ID_STR, (char *)"Text", 4); - msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)filepath, MAX_IMAGE_PATH_LEN); - + msg_set_str_value(media, MSG_MMS_MEDIA_FILEPATH_STR, (char *)filepath, MSG_FILEPATH_LEN_MAX); + msg_get_struct_handle(media, MSG_MMS_MEDIA_SMIL_TEXT_HND, &smil_text); msg_set_int_value(smil_text, MSG_MMS_SMIL_TEXT_COLOR_INT, 0x000000); msg_set_int_value(smil_text, MSG_MMS_SMIL_TEXT_SIZE_INT, MMS_SMIL_FONT_SIZE_NORMAL); @@ -1492,20 +1693,20 @@ int _messages_save_mms_data(messages_message_s *msg) attach = g_slist_nth_data(msg->attachment_list, i); if (image != attach && audio != attach) { - msg_mms_add_item(mms_data, MSG_STRUCT_MMS_ATTACH, &mms_attach); - msg_set_str_value(mms_attach, MSG_MMS_ATTACH_FILEPATH_STR, (char *)attach->filepath, MAX_IMAGE_PATH_LEN); + msg_list_add_item(mms_data, MSG_STRUCT_MMS_ATTACH, &mms_attach); + msg_set_str_value(mms_attach, MSG_MMS_ATTACH_FILEPATH_STR, (char *)attach->filepath, MSG_FILEPATH_LEN_MAX); } } - + ret = msg_set_mms_struct(msg->msg_h, mms_data); if (MSG_SUCCESS != ret) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_set_mms_struct failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_set_mms_struct failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); msg_release_struct(&mms_data); return MESSAGES_ERROR_OPERATION_FAILED; } - + msg_release_struct(&mms_data); return MESSAGES_ERROR_NONE; @@ -1517,23 +1718,23 @@ int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) int ret; int msg_id; int media_type; - char filepath[MAX_IMAGE_PATH_LEN]; - + char filepath[MSG_FILEPATH_LEN_MAX + 1]; + msg_struct_t new_msg_h; msg_struct_t sendOpt; - + msg_struct_t mms_data; - + msg_list_handle_t mms_page_list; msg_list_handle_t mms_media_list; msg_list_handle_t mms_attach_list; - - + + msg_struct_t mms_page; msg_struct_t mms_media; msg_struct_t mms_attach; - - messages_attachment_s *attach; + + messages_attachment_s *attach = NULL; CHECK_NULL(msg); @@ -1541,26 +1742,38 @@ int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) ret = msg_get_int_value(msg->msg_h, MSG_MESSAGE_ID_INT, &msg_id); if (MSG_SUCCESS != ret) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_get_int_value(MSG_MESSAGE_ID_INT) failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_get_int_value(MSG_MESSAGE_ID_INT) failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); - return MESSAGES_ERROR_OPERATION_FAILED; + return MESSAGES_ERROR_OPERATION_FAILED; } // Load MMS_MESSAGE_DATA_S new_msg_h = msg_create_struct(MSG_STRUCT_MESSAGE_INFO); + if (new_msg_h == NULL) { + return MESSAGES_ERROR_OPERATION_FAILED; + } + sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT); + if (sendOpt == NULL) { + msg_release_struct(&new_msg_h); + return MESSAGES_ERROR_OPERATION_FAILED; + } + ret = msg_get_message(handle, msg_id, new_msg_h, sendOpt); if (MSG_SUCCESS != ret) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_get_message failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_get_message failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); - return MESSAGES_ERROR_OPERATION_FAILED; + msg_release_struct(&sendOpt); + msg_release_struct(&new_msg_h); + return MESSAGES_ERROR_OPERATION_FAILED; } + msg_release_struct(&sendOpt); mms_data = msg_create_struct(MSG_STRUCT_MMS); if (NULL == mms_data) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_mms_create_message failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_mms_create_message failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); msg_release_struct(&new_msg_h); return MESSAGES_ERROR_OPERATION_FAILED; @@ -1569,7 +1782,7 @@ int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) ret = msg_get_mms_struct(new_msg_h, mms_data); if (MSG_SUCCESS != ret) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_mms_get_message_body failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : msg_mms_get_message_body failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); msg_release_struct(&mms_data); msg_release_struct(&new_msg_h); @@ -1577,7 +1790,7 @@ int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) } // Load Media, Text - msg_get_list_handle(mms_data, MSG_MMS_PAGE_LIST_HND, (void **)&mms_page_list); + msg_get_list_handle(mms_data, MSG_MMS_PAGE_LIST_HND, (void **)&mms_page_list); for (i=0; i < msg_list_length(mms_page_list); i++) { mms_page = (msg_struct_t)msg_list_nth_data(mms_page_list, i); @@ -1585,34 +1798,34 @@ int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) { continue; } - - msg_get_list_handle(mms_page, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&mms_media_list); + + msg_get_list_handle(mms_page, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&mms_media_list); for (j=0; j < msg_list_length(mms_media_list); j++) { - mms_media = (msg_struct_t)msg_list_nth_data(mms_media_list, i); + mms_media = (msg_struct_t)msg_list_nth_data(mms_media_list, j); if (NULL == mms_media) { continue; } - attach = (messages_attachment_s *)calloc(1, sizeof(messages_attachment_s)); - if (NULL == attach) - { - LOGW("[%s] OUT_OF_MEMORY(0x%08x) fail to create a 'attach'." - , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); - break; - } - msg_get_int_value(mms_media, MSG_MMS_MEDIA_TYPE_INT, &media_type); - msg_get_str_value(mms_media, MSG_MMS_MEDIA_FILEPATH_STR, filepath, MAX_IMAGE_PATH_LEN); - + msg_get_str_value(mms_media, MSG_MMS_MEDIA_FILEPATH_STR, filepath, MSG_FILEPATH_LEN_MAX); + if (MMS_SMIL_MEDIA_TEXT == media_type) { _messages_load_textfile(filepath, &msg->text); } else { - strncpy(attach->filepath, filepath, MAX_IMAGE_PATH_LEN); + attach = (messages_attachment_s *)calloc(1, sizeof(messages_attachment_s)); + if (NULL == attach) + { + LOGW("[%s] OUT_OF_MEMORY(0x%08x) fail to create a 'attach'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + break; + } + + strncpy(attach->filepath, filepath, MSG_FILEPATH_LEN_MAX); switch (media_type) { case MMS_SMIL_MEDIA_IMG: @@ -1650,17 +1863,20 @@ int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); break; } - msg_get_str_value(mms_attach, MSG_MMS_ATTACH_FILEPATH_STR, filepath, MAX_IMAGE_PATH_LEN); - strncpy(attach->filepath, filepath, MAX_IMAGE_PATH_LEN); + msg_get_str_value(mms_attach, MSG_MMS_ATTACH_FILEPATH_STR, filepath, MSG_FILEPATH_LEN_MAX); + strncpy(attach->filepath, filepath, MSG_FILEPATH_LEN_MAX); attach->media_type = _messages_get_media_type_from_filepath(attach->filepath); + + msg->attachment_list = g_slist_append(msg->attachment_list, attach); } + msg_release_struct(&mms_data); msg_release_struct(&new_msg_h); - return MESSAGES_ERROR_NONE; } + int _messages_save_textfile(const char *text, char **filepath) { FILE* file = NULL; @@ -1685,7 +1901,7 @@ int _messages_save_textfile(const char *text, char **filepath) } else { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : opening file for text of message failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : opening file for text of message failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); return MESSAGES_ERROR_OPERATION_FAILED; } @@ -1707,24 +1923,38 @@ int _messages_load_textfile(const char *filepath, char **text) if (NULL == file) { - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : opening file for text of message failed.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : opening file for text of message failed.", __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); return MESSAGES_ERROR_OPERATION_FAILED; } - fstat(fileno(file), &st); + if (fstat(fileno(file), &st) < 0) { + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : opening file for text of message failed. (fstat)", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + fclose(file); + return MESSAGES_ERROR_OPERATION_FAILED; + } + if (NULL == *text) { *text = (char*)calloc(1, st.st_size + 1); + if (*text == NULL) { + fclose(file); + return MESSAGES_ERROR_OPERATION_FAILED; + } pos = *text; } else { len = strlen(*text); + *text = (char*)realloc(*text, len + st.st_size + 2); + if (*text == NULL) { + fclose(file); + return MESSAGES_ERROR_OPERATION_FAILED; + } (*text)[len] = '\n'; - *text = (char*)realloc(*text, len + st.st_size + 1); - pos = *text + len; + pos = *text + len + 1; } while(0 < (nread = fread(buf, 1, 1024, file))) @@ -1734,6 +1964,8 @@ int _messages_load_textfile(const char *filepath, char **text) } pos[0] = '\0'; + fclose(file); + return 0; } @@ -1749,7 +1981,7 @@ int _messages_get_media_type_from_filepath(const char *filepath) } // check the length of filepath len = strlen(filepath); - if (len < 5) + if (len < 5) { return MESSAGES_MEDIA_UNKNOWN; } @@ -1757,7 +1989,7 @@ int _messages_get_media_type_from_filepath(const char *filepath) // check extension of file file_ext = (char *)&filepath[len - 4]; - if(strncmp(file_ext,".jpg",4) !=0 && strncmp(file_ext,".gif",4) !=0 + if(strncmp(file_ext,".jpg",4) !=0 && strncmp(file_ext,".gif",4) !=0 && strncmp(file_ext,".bmp",4) !=0 && strncmp(file_ext,".png",4) !=0) { ret = MESSAGES_MEDIA_IMAGE; @@ -1847,7 +2079,7 @@ int _messages_error_converter(int err, const char *func, int line) switch(err) { case MSG_ERR_NULL_POINTER: - LOGE("[%s:%d] NULL_POINTER(0x%08x) : Error from internal Messaging F/W ret: %d.", + LOGE("[%s:%d] NULL_POINTER(0x%08x) : Error from internal Messaging F/W ret: %d.", func, line, MESSAGES_ERROR_INVALID_PARAMETER, err); return MESSAGES_ERROR_INVALID_PARAMETER; @@ -1857,32 +2089,59 @@ int _messages_error_converter(int err, const char *func, int line) return MESSAGES_ERROR_INVALID_PARAMETER; case -EINVAL: - LOGE("[%s:%d] EINVAL(0x%08x) : Error from internal Messaging F/W ret: %d.", + LOGE("[%s:%d] EINVAL(0x%08x) : Error from internal Messaging F/W ret: %d.", func, line, MESSAGES_ERROR_INVALID_PARAMETER, err); return MESSAGES_ERROR_INVALID_PARAMETER; case MSG_ERR_SERVER_NOT_READY: - LOGE("[%s:%d] SERVER_NOT_READY(0x%08x) : Error from internal Messaging F/W ret: %d.", + LOGE("[%s:%d] SERVER_NOT_READY(0x%08x) : Error from internal Messaging F/W ret: %d.", func, line, MESSAGES_ERROR_SERVER_NOT_READY, err); return MESSAGES_ERROR_SERVER_NOT_READY; case MSG_ERR_COMMUNICATION_ERROR: - LOGE("[%s:%d] OMMUNICATION_ERROR(0x%08x) : Error from internal Messaging F/W ret: %d.", + LOGE("[%s:%d] COMMUNICATION_ERROR(0x%08x) : Error from internal Messaging F/W ret: %d.", func, line, MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED, err); return MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED; case MSG_ERR_TRANSPORT_ERROR: - LOGE("[%s:%d] TRANSPORT_ERROR(0x%08x) : Error from internal Messaging F/W ret: %d.", + LOGE("[%s:%d] TRANSPORT_ERROR(0x%08x) : Error from internal Messaging F/W ret: %d.", func, line, MESSAGES_ERROR_SENDING_FAILED, err); return MESSAGES_ERROR_SENDING_FAILED; + case MSG_ERR_NO_SIM: + LOGE("[%s:%d] NO_SIM_CARD(0x%08x) : Error from internal Messaging F/W ret: %d.", + func, line, MESSAGES_ERROR_NO_SIM_CARD, err); + return MESSAGES_ERROR_NO_SIM_CARD; + + case MSG_ERR_DB_STEP: + LOGE("[%s:%d] NO_DATA(0x%08x) : Error from internal Messaging F/W ret: %d.", + func, line, MESSAGES_ERROR_NO_DATA, err); + return MESSAGES_ERROR_NO_DATA; + + case MSG_ERR_PERMISSION_DENIED: + return MESSAGES_ERROR_PERMISSION_DENIED; + case MSG_SUCCESS: return MESSAGES_ERROR_NONE; default: - LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : Error from internal Messaging F/W ret: %d.", + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : Error from internal Messaging F/W ret: %d.", func, line, MESSAGES_ERROR_OPERATION_FAILED, err); return MESSAGES_ERROR_OPERATION_FAILED; } } + +int _messages_check_feature(char *feature_name) { + bool is_supported = false; + if (!system_info_get_platform_bool(feature_name, &is_supported)) { + if (!is_supported) { + LOGE("[%s] feature is disabled", feature_name); + return MESSAGES_ERROR_NOT_SUPPORTED; + } + } else { + LOGE("Error - Feature getting from System Info"); + return MESSAGES_ERROR_OPERATION_FAILED; + } + return MESSAGES_ERROR_NONE; +} diff --git a/src/messages_push.c b/src/messages_push.c new file mode 100644 index 0000000..fce67f6 --- /dev/null +++ b/src/messages_push.c @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "CAPI_MESSAGING" + + +void _messages_push_incoming_mediator_cb(msg_handle_t handle, const char *push_header, const char *push_body, int push_body_len, void *user_param) +{ + messages_push_incoming_callback_s *_cb = (messages_push_incoming_callback_s *)user_param; + + if (_cb && _cb->callback) + { + ((messages_push_incoming_cb)_cb->callback)(push_header, push_body, push_body_len, _cb->user_data); + } +} + + + +int messages_push_add_incoming_cb(messages_service_h service, const char *app_id, + messages_push_incoming_cb callback, void *user_data) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int ret; + messages_push_incoming_callback_s *_cb; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(app_id); + CHECK_NULL(callback); + + _cb = (messages_push_incoming_callback_s *)malloc(sizeof(messages_push_incoming_callback_s)); + if (NULL == _cb) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '_cb'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + _cb->app_id = strdup(app_id); + _cb->callback = callback; + _cb->user_data = user_data; + + ret = msg_reg_push_message_callback(_svc->service_h, _messages_push_incoming_mediator_cb, app_id, (void*)_cb); + if (MSG_SUCCESS != ret) + { + if (_cb->app_id) { + free(_cb->app_id); + } + free(_cb); + return ERROR_CONVERT(ret); + } + + _svc->push_incoming_cb_list = g_slist_append(_svc->push_incoming_cb_list, _cb); + + return MESSAGES_ERROR_NONE; +} + +int messages_push_remove_incoming_cb(messages_service_h service, const char *app_id) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int i; + messages_push_incoming_callback_s *_cb; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(app_id); + + for (i=0; i < g_slist_length(_svc->push_incoming_cb_list); i++) + { + _cb = (messages_push_incoming_callback_s *)g_slist_nth_data(_svc->push_incoming_cb_list, i); + if (NULL != _cb && NULL != _cb->app_id) + { + if (!strcmp(_cb->app_id, app_id)) { + _cb->callback = NULL; + } + } + } + + return MESSAGES_ERROR_NONE; +} + + +int messages_push_register(messages_service_h service, const char *content_type, const char *app_id) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int ret; + + msg_struct_t push_info; + char *pkg_name; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(content_type); + CHECK_NULL(app_id); + + ret = app_get_id(&pkg_name); + if (APP_ERROR_NONE != ret) { + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_id failed.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)app_id, MAX_WAPPUSH_ID_LEN); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX); + free(pkg_name); + + ret = msg_add_push_event(_svc->service_h, push_info); + msg_release_struct(&push_info); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + return MESSAGES_ERROR_NONE; +} + +int messages_push_deregister(messages_service_h service, const char *content_type, const char *app_id) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int ret; + + msg_struct_t push_info; + char *pkg_name; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(content_type); + CHECK_NULL(app_id); + + ret = app_get_id(&pkg_name); + if (APP_ERROR_NONE != ret) { + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_id failed.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)app_id, MAX_WAPPUSH_ID_LEN); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX); + free(pkg_name); + + ret = msg_delete_push_event(_svc->service_h, push_info); + msg_release_struct(&push_info); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + return MESSAGES_ERROR_NONE; +} + +int messages_push_reregister(messages_service_h service, const char *content_type, const char *app_id, + const char *dst_content_type, const char *dst_app_id) +{ + CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE); + + int ret; + + msg_struct_t push_info; + msg_struct_t dst_push_info; + char *pkg_name; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(content_type); + CHECK_NULL(app_id); + CHECK_NULL(dst_content_type); + CHECK_NULL(dst_app_id); + + ret = app_get_id(&pkg_name); + if (APP_ERROR_NONE != ret) { + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_id failed.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)app_id, MAX_WAPPUSH_ID_LEN); + msg_set_str_value(push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX); + + dst_push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO); + msg_set_str_value(dst_push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)dst_content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN); + msg_set_str_value(dst_push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)dst_app_id, MAX_WAPPUSH_ID_LEN); + msg_set_str_value(dst_push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX); + free(pkg_name); + + ret = msg_update_push_event(_svc->service_h, push_info, dst_push_info); + msg_release_struct(&push_info); + msg_release_struct(&dst_push_info); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + return MESSAGES_ERROR_NONE; +} + + + diff --git a/test/messages_incoming_test.c b/test/messages_incoming_test.c old mode 100644 new mode 100755 index 8339b5f..1df1871 --- a/test/messages_incoming_test.c +++ b/test/messages_incoming_test.c @@ -1,5 +1,6 @@ #include #include +#include #include @@ -7,8 +8,8 @@ #define ERROR_CHECK(ret) \ if (MESSAGES_ERROR_NONE != ret) { \ - printf("%d: error, ret=%d \n", __LINE__, ret); \ - exit(1); \ + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "%d: error, ret=%d \n", __LINE__, ret); \ + return(0); \ } static GMainLoop *mainloop; @@ -29,51 +30,51 @@ void incoming_cb(messages_message_h msg, void *user_data) int i, nAddr; char *addr = NULL; time_t time; - struct tm *ptm; + struct tm ptm; - printf("Incoming Message\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Incoming Message\n"); messages_get_address_count(msg, &nAddr); for (i=0; i < nAddr; i++) { ret = messages_get_address(msg, i, &addr, NULL); if (MESSAGES_ERROR_NONE == ret) { - printf("Address[%d]: %s\n", i, addr); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Address[%d]: %s\n", i, addr); free(addr); } } ret = messages_get_text(msg, &text); if (MESSAGES_ERROR_NONE == ret) { - printf("Text: %s\n", text); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Text: %s\n", text); free(text); } else { - printf("%d: error, ret=%d\n", __LINE__, ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "%d: error, ret=%d\n", __LINE__, ret); } messages_get_message_type(msg, &msgType); switch(msgType) { case MESSAGES_TYPE_SMS: - printf("Type: SMS\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Type: SMS\n"); break; case MESSAGES_TYPE_MMS: - printf("Type: MMS\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Type: MMS\n"); break; default: - printf("Type: Unknown\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Type: Unknown\n"); break; } messages_get_time(msg, &time); - printf("Time: %d, %s", (int)time, ctime(&time)); - - ptm = gmtime(&time); - printf("gmtime test: %d.%d.%d %d:%d:%d \n", - ptm->tm_year, ptm->tm_mon, ptm->tm_mday, - ptm->tm_hour, ptm->tm_min, ptm->tm_sec - ); - - + char buf[50]; + if (ctime_r(&time, buf)) + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Time: %d, %s", (int)time, ctime_r(&time, buf)); + + gmtime_r(&time, &ptm); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "gmtime test: %d.%d.%d %d:%d:%d \n", + ptm.tm_year, ptm.tm_mon, ptm.tm_mday, + ptm.tm_hour, ptm.tm_min, ptm.tm_sec + ); } int main(int argc, char *argv[]) diff --git a/test/messages_search_test.c b/test/messages_search_test.c old mode 100644 new mode 100755 index 5bca8bc..25300fd --- a/test/messages_search_test.c +++ b/test/messages_search_test.c @@ -1,5 +1,6 @@ #include #include +#include #include @@ -9,6 +10,7 @@ bool _search_cb(messages_message_h msg, int index, int result_count, int total_c messages_message_type_e msgType; messages_message_box_e mbox; int ret; + int cnt; char *text; int i, nAddr; char *addr = NULL; @@ -16,41 +18,48 @@ bool _search_cb(messages_message_h msg, int index, int result_count, int total_c messages_get_message_type(msg, &msgType); - printf("=[%d/%d]==================================\n", index + 1, result_count); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "=[%d/%d]==================================\n", index + 1, result_count); messages_get_address_count(msg, &nAddr); for (i=0; i < nAddr; i++) { ret = messages_get_address(msg, i, &addr, NULL); if (MESSAGES_ERROR_NONE == ret) { - printf("Address[%d]: %s\n", i, addr); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Address[%d]: %s\n", i, addr); free(addr); } } ret = messages_get_text(msg, &text); if (MESSAGES_ERROR_NONE == ret) { - printf("Text: %s\n", text); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Text: %s\n", text); free(text); } if (MESSAGES_TYPE_SMS == msgType) { - printf("Type: SMS\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Type: SMS\n"); } else if (MESSAGES_TYPE_MMS == msgType) { - printf("Type: MMS\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Type: MMS\n"); ret = messages_mms_get_subject(msg, &text); if (MESSAGES_ERROR_NONE == ret) { - printf("Subject: %s\n", text); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Subject: %s\n", text); free(text); } + + ret = messages_mms_get_attachment_count(msg, &cnt); + if (MESSAGES_ERROR_NONE == ret) { + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Attachments: %d\n", cnt); + } } else { - printf("Type: Unknown"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Type: Unknown"); } ret = messages_get_time(msg, &time); - printf("Time: %d, %s", (int)time, ctime(&time)); + char buf[50]; + if (ctime_r(&time, buf)) + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Time: %d, %s", (int)time, ctime_r(&time, buf)); ret = messages_get_mbox_type(msg, &mbox); - printf("MBOX: %d\n", mbox); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "MBOX: %d\n", mbox); return true; @@ -66,7 +75,7 @@ int main(int argc, char *argv[]) // open service ret = messages_open_service(&svc); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_open_service() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_open_service() = %d", ret); return 1; } @@ -75,19 +84,19 @@ int main(int argc, char *argv[]) NULL, NULL, 0, 0, _search_cb, NULL); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_foreach_message_from_db() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_foreach_message_from_db() = %d", ret); return 1; } - printf("===============================================\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "===============================================\n"); ret = messages_get_message_count(svc, MESSAGES_MBOX_INBOX, MESSAGES_TYPE_SMS, &count); - printf("INBOX: %d messages\n", count); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "INBOX: %d messages\n", count); ret = messages_get_message_count(svc, MESSAGES_MBOX_SENTBOX, MESSAGES_TYPE_SMS, &count); - printf("SENTBOX: %d messages\n", count); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "SENTBOX: %d messages\n", count); ret = messages_get_message_count(svc, MESSAGES_MBOX_OUTBOX, MESSAGES_TYPE_SMS, &count); - printf("OUTBOX: %d sms messages\n", count); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "OUTBOX: %d sms messages\n", count); ret = messages_get_message_count(svc, MESSAGES_MBOX_OUTBOX, MESSAGES_TYPE_MMS, &count); - printf("OUTBOX: %d mms messages\n", count); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "OUTBOX: %d mms messages\n", count); diff --git a/test/messages_send_mms_test.c b/test/messages_send_mms_test.c old mode 100644 new mode 100755 index 76c0aa8..a2ea509 --- a/test/messages_send_mms_test.c +++ b/test/messages_send_mms_test.c @@ -1,32 +1,52 @@ #include #include +#include + +#include #include -#define TEST_NUMBER "000000000" +//#define TEST_NUMBER "splusa2012@gmail.com" +#define TEST_NUMBER "+491726597478" + +static GMainLoop *mainloop; + +static void sig_quit(int signo) +{ + if(mainloop) + { + g_main_loop_quit(mainloop); + } +} void _sent_cb(messages_sending_result_e result, void *user_data) { + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "sending result=%d\n", (int)result); } int main(int argc, char *argv[]) { int ret; + signal(SIGINT, sig_quit); + signal(SIGTERM, sig_quit); + signal(SIGQUIT, sig_quit); + mainloop = g_main_loop_new(NULL, FALSE); + messages_service_h svc; messages_message_h msg; // open service ret = messages_open_service(&svc); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_open_service() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_open_service() = %d", ret); return 1; } // create message ret = messages_create_message(MESSAGES_TYPE_MMS, &msg); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_create_message() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_create_message() = %d", ret); return 1; } @@ -34,18 +54,22 @@ int main(int argc, char *argv[]) messages_set_text(msg, "This is a multi-media message!"); messages_mms_set_subject(msg, "TEST!"); -// messages_mms_add_attachment(msg, MESSAGES_MEDIA_VIDEO, "/opt/etc/msg-service/V091120_104905.3gp"); +// messages_mms_add_attachment(msg, MESSAGES_MEDIA_AUDIO, "/tmp/test.amr"); // messages_mms_add_attachment(msg, MESSAGES_MEDIA_IMAGE, "/opt/etc/msg-service/P091120_104633.jpg"); + messages_mms_add_attachment(msg, MESSAGES_MEDIA_IMAGE, "/opt/media/Images/image2.jpg"); - printf("Before Sending\n"); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "Before Sending\n"); // send message ret = messages_send_message(svc, msg, true, _sent_cb, NULL); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_send_message() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_send_message() = %d", ret); return 1; } + g_main_loop_run(mainloop); + g_main_loop_unref(mainloop); + // destroy messages_destroy_message(msg); messages_close_service(svc); diff --git a/test/messages_send_sms_test.c b/test/messages_send_sms_test.c old mode 100644 new mode 100755 index d54cc53..6d385d8 --- a/test/messages_send_sms_test.c +++ b/test/messages_send_sms_test.c @@ -1,9 +1,10 @@ #include #include +#include #include -#define TEST_NUMBER "00000000000" +#define TEST_NUMBER "447810507326" void _sent_cb(messages_sending_result_e result, void *user_data) { @@ -19,14 +20,14 @@ int main(int argc, char *argv[]) // open service ret = messages_open_service(&svc); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_open_service() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_open_service() = %d", ret); return 1; } // create message ret = messages_create_message(MESSAGES_TYPE_SMS, &msg); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_create_message() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_create_message() = %d", ret); return 1; } @@ -36,7 +37,7 @@ int main(int argc, char *argv[]) // send message ret = messages_send_message(svc, msg, true, _sent_cb, NULL); if (MESSAGES_ERROR_NONE != ret) { - printf("error: messages_send_message() = %d", ret); + dlog_print(DLOG_DEBUG, "MESSAGE_TEST", "error: messages_send_message() = %d", ret); return 1; } -- 2.7.4