diff options
author | HyungKyu Song <hk76.song@samsung.com> | 2013-02-16 00:10:38 +0900 |
---|---|---|
committer | HyungKyu Song <hk76.song@samsung.com> | 2013-02-16 00:10:38 +0900 |
commit | 30371fed42b7003c5e73937f19d5d36e187624a7 (patch) | |
tree | 53c312f4f118844c53581e43f1c939bab4302bca | |
parent | 47b47c73d87667b9f0fa9648ee9573cd4c9ff0f8 (diff) | |
download | messages-tizen_2.0.tar.gz messages-tizen_2.0.tar.bz2 messages-tizen_2.0.zip |
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | CMakeLists.txt | 97 | ||||
-rw-r--r-- | LICENSE | 204 | ||||
-rw-r--r-- | capi-messaging-messages.pc.in | 14 | ||||
-rw-r--r-- | include/messages.h | 1046 | ||||
-rw-r--r-- | include/messages_error.h | 58 | ||||
-rw-r--r-- | include/messages_private.h | 115 | ||||
-rw-r--r-- | include/messages_types.h | 245 | ||||
-rw-r--r-- | packaging/capi-messaging-messages.spec | 65 | ||||
-rw-r--r-- | src/messages.c | 1945 | ||||
-rw-r--r-- | src/messages_cb.c | 711 | ||||
-rw-r--r-- | src/messages_push.c | 243 | ||||
-rw-r--r-- | test/.messages_search_test.c.swp | bin | 0 -> 12288 bytes | |||
-rwxr-xr-x | test/CMakeLists.txt | 17 | ||||
-rw-r--r-- | test/messages_cb_channel_test.c | 37 | ||||
-rw-r--r-- | test/messages_incoming_test.c | 104 | ||||
-rw-r--r-- | test/messages_search_test.c | 99 | ||||
-rw-r--r-- | test/messages_send_mms_test.c | 55 | ||||
-rw-r--r-- | test/messages_send_sms_test.c | 49 |
19 files changed, 5105 insertions, 0 deletions
@@ -0,0 +1 @@ +WonYoung Choi <wy80.choi@samsung.com> diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..cf87993 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,97 @@ + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +SET(fw_name "capi-messaging-messages") + +PROJECT(${fw_name}) + +SET(CMAKE_INSTALL_PREFIX /usr) +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) + +SET(INC_DIR include) +INCLUDE_DIRECTORIES(${INC_DIR}) + +SET(dependents "dlog glib-2.0 msg-service capi-base-common capi-appfw-application") + +INCLUDE(FindPkgConfig) +pkg_check_modules(${fw_name} REQUIRED ${dependents}) +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_DEBUG "-O0 -g") + +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DTIZEN_DEBUG") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib") + +aux_source_directory(src SOURCES) +ADD_LIBRARY(${fw_name} SHARED ${SOURCES}) + +TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS}) + +SET_TARGET_PROPERTIES(${fw_name} + PROPERTIES + VERSION ${FULLVER} + SOVERSION ${MAJORVER} + CLEAN_DIRECT_OUTPUT 1 +) + +INSTALL(TARGETS ${fw_name} DESTINATION lib) +INSTALL( + DIRECTORY ${INC_DIR}/ DESTINATION include/messaging + FILES_MATCHING + PATTERN "*_private.h" EXCLUDE + PATTERN "${INC_DIR}/*.h" +) + +SET(PC_NAME ${fw_name}) +SET(PC_REQUIRED ${dependents}) +SET(PC_LDFLAGS -l${fw_name}) +SET(PC_CFLAGS -I\${includedir}/messaging) + +CONFIGURE_FILE( + ${fw_name}.pc.in + ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc + @ONLY +) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION lib/pkgconfig) + +ADD_SUBDIRECTORY(test) + +IF(UNIX) + +ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution) +ADD_CUSTOM_COMMAND( + DEPENDS clean + COMMENT "distribution clean" + COMMAND find + ARGS . + -not -name config.cmake -and \( + -name tester.c -or + -name Testing -or + -name CMakeFiles -or + -name cmake.depends -or + -name cmake.check_depends -or + -name CMakeCache.txt -or + -name cmake.check_cache -or + -name *.cmake -or + -name Makefile -or + -name core -or + -name core.* -or + -name gmon.out -or + -name install_manifest.txt -or + -name *.pc -or + -name *~ \) + | grep -v TC | xargs rm -rf + TARGET distclean + VERBATIM +) + +ENDIF(UNIX) + @@ -0,0 +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. + diff --git a/capi-messaging-messages.pc.in b/capi-messaging-messages.pc.in new file mode 100644 index 0000000..a771af9 --- /dev/null +++ b/capi-messaging-messages.pc.in @@ -0,0 +1,14 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=/usr +libdir=/usr/lib +includedir=/usr/include + +Name: @PC_NAME@ +Description: @PACKAGE_DESCRIPTION@ +Version: @VERSION@ +Requires: @PC_REQUIRED@ +Libs: -L${libdir} @PC_LDFLAGS@ +Cflags: -I${includedir} @PC_CFLAGS@ + diff --git a/include/messages.h b/include/messages.h new file mode 100644 index 0000000..0404c37 --- /dev/null +++ b/include/messages.h @@ -0,0 +1,1046 @@ +/* + * 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_MESSAGING_H__ +#define __TIZEN_MESSAGING_H__ + + +#include <time.h> +#include <messages_types.h> +#include <messages_error.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + * @file messages.h + * @brief This file contains the messages API. + */ + + +/** + * @addtogroup CAPI_MESSAGING_MESSAGES_MODULE + * @{ + */ + + +/** + * @brief Opens a handle for messaging service. + * + * @remark @a service must be released with messages_close_service() by you. + * + * @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 + * @retval #MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED Communication with server failed + * + * @see messages_close_service() + */ +int messages_open_service(messages_service_h *service); + + +/** + * @brief Closes a handle for messaging service. + * + * @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 + * @retval #MESSAGES_ERROR_COMMUNICATION_WITH_SERVER_FAILED Communication with server failed + * + * @see messages_open_service() + */ +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. + * + * @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 + * + * @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 + * + * @see messages_destroy_message() + */ +int messages_create_message(messages_message_type_e type, messages_message_h *msg); + + +/** + * @brief Destroys a message handle and release all its resources. + * + * @param[in] msg A message handle to destroy + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see messages_create_message() + */ +int messages_destroy_message(messages_message_h msg); + +/** + * @brief Gets the message id of the message. + * + * @param[in] msg The message handle + * @param[out] msg_id The message id + * + * @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 + * + * @see messages_search_message_by_id() + */ +int messages_get_message_id(messages_message_h msg, int *msg_id); + +/** + * @brief Gets the message box type of the message. + * + * @param[in] msg The message handle + * @param[out] mbox The message box type + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +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 + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see messages_add_sms_listening_port() + */ +int messages_get_message_port(messages_message_h msg, int *port); + +/** + * @brief Gets the type of the message. + * + * @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 + */ +int messages_get_message_type(messages_message_h msg, messages_message_type_e *type); + + +/** + * @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 + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see messages_get_address() + * @see messages_remove_all_addresses() + */ +int messages_add_address(messages_message_h msg, const char *address, messages_recipient_type_e type); + + +/** + * @brief Gets the total number of recipients in the message. + * + * @param[in] msg The message handle + * @param[out] count The total number of recipients + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see messages_add_address() + * @see messages_remove_all_addresses() + */ +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. + * + * @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. + * + * @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 + * + * @see messages_add_address() + * @see messages_remove_all_addresses() + */ +int messages_get_address(messages_message_h msg, int index, char **address, messages_recipient_type_e *type); + + +/** + * @brief Removes all recipients in the message. + * + * @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 + * + * @see messages_add_address() + * @see messages_get_address() + */ +int messages_remove_all_addresses(messages_message_h msg); + + +/** + * @brief Sets the text of the message. + * + * @param[in] msg The message handle + * @param[in] text The text of the message \n + * The maximum length of @a text is 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 + * + * @see messages_get_text() + */ +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. + * + * @param[in] msg The message handle + * @param[out] text The text of the message + * + * @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 + * + * @see messages_set_text() + */ +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 + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +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(). + * + * @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 + * + * @return 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 + * + * @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 + * + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + */ +int messages_get_message_count(messages_service_h service, + messages_message_box_e mbox, messages_message_type_e type, + int *count); + + + +/** + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * + * @see messages_free_message_array() + */ +int messages_search_message(messages_service_h service, + messages_message_box_e mbox, + messages_message_type_e type, + 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. + * + * @remark @a msg must be released with messages_destroy_message() by you. + * + * @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 + * + * @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 + * + * @see messages_get_message_id() + */ +int messages_search_message_by_id(messages_service_h service, int msg_id, messages_message_h *msg); + + +/** + * @brief Frees message array. + * + * @param[in] message_array The array of the message handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see messages_search_message() + */ +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 + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * + * @post It invokes messages_search_cb(). + * @see messages_search_cb() + */ +int messages_foreach_message(messages_service_h service, + messages_message_box_e mbox, + messages_message_type_e type, + const char *keyword, const char *address, + int offset, int limit, + messages_search_cb callback, void *user_data); + +/** + * @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 + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OPERATION_FAILED Messaging operation failed + * + * @post It will invoke messages_incoming_cb(). + * + * @see messages_unset_message_incoming_cb() + * @see messages_incoming_cb() + */ +int messages_set_message_incoming_cb(messages_service_h service, messages_incoming_cb callback, void *user_data); + + +/** + * @brief Unregisters the callback function. + * + * @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 + * + * @see messages_set_message_incoming_cb() + * @see messages_incoming_cb() + */ +int messages_unset_message_incoming_cb(messages_service_h service); + +/** + * @brief Adds an additional listening port for the incoming SMS messages. + * + * @param[in] service The message service handle + * @param[in] port The listening port for the SMS messages + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see messages_set_message_incoming_cb() + * @see messages_get_message_port() + */ +int messages_add_sms_listening_port(messages_service_h service, int port); + +/** + * @addtogroup CAPI_MESSAGING_MESSAGES_MMS_MODULE + * @{ + */ +/** + * @brief Sets the subject of the message. + * + * @param[in] msg The message handle + * @param[in] subject The subject of the message \n + * The maximum length of @a subject is 120. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @pre @a msg is created as a #MESSAGES_TYPE_MMS. + * + * @see messages_mms_get_subject() + */ +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. + * + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + * + * @pre @a msg is created as a #MESSAGES_TYPE_MMS. + * + * @see messages_mms_set_subject() + */ +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 + * @param[in] type The attachment type + * @param[in] path The file path to attach \n + * The maximum length of @a path is 1024. + * + * @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 + * + * @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() + */ +int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e type, const char *path); + + +/** + * @brief Gets the file path of the attachment with the specified index. + * + * @remark @a path must be released with @c free() by you. + * + * @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 + * + * @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 + * + * @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() + */ +int messages_mms_get_attachment(messages_message_h msg, int index, messages_media_type_e *type, char **path); + + +/** + * @brief Gets the attachment with the specified index. + * + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + * + * @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() + */ +int messages_mms_get_attachment_count(messages_message_h msg, int *count); + + +/** + * @brief Removes all attachments to the MMS message. + * + * @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 + * + * @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() + */ +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. + * + * @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 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +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. + * + * @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 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +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. + * + * @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 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_push_register(messages_service_h service, const char *content_type, const char *app_id); + + +/** + * @brief Deregisters an application from the mapping table of the WAP Push service. + * + * @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 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +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. + * + * @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 The composite key for searching mapping information.\n + * "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 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +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); + +/** + * @} + */ + + +/** + * @addtogroup CAPI_MESSAGING_MESSAGES_CB_MODULE + * @{ + */ + +/** + * @brief Gets the message id of the CB message. + * + * @param[in] msg The CB message handle + * @param[out] msg_id The message id of the CB message + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_get_message_id(messages_cb_message_h msg, int *msg_id); + +/** + * @brief Gets the serial number of the CB message. + * + * @param[in] msg The CB message handle + * @param[out] serial The serial number of the CB message (16-bit integer) + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_get_serial_number(messages_cb_message_h msg, int *serial); + +/** + * @brief Gets the DCS(Data Coding Scheme) value of the CB message. + * + * @param[in] msg The CB message handle + * @param[out] dcs The DCS value of the CB message (8-bit integer) + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_get_dcs(messages_cb_message_h msg, int *dcs); + +/** + * @brief Gets the message type of the CB message. + * + * @param[in] msg The CB message handle + * @param[out] type The message type of the CB message + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_get_message_type(messages_cb_message_h msg, messages_message_type_e *type); + + +/** + * @brief Gets the language type of the CB message. + * + * @remarks @a type must be released with @c free() by you. + * + * @param[in] msg The CB message handle + * @param[out] text The language type of the CB message + * + * @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 + */ +int messages_cb_get_language_type(messages_cb_message_h msg, char **type); + +/** + * @brief Gets the text contents of the CB message. + * + * @remarks @a text must be released with @c free() by you. + * + * @param[in] msg The CB message handle + * @param[out] text The the text of the CB message + * + * @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 if the type of @a msg is MESSAGES_CB_TYPE_ETWS_PRIMARY + * @retval #MESSAGES_ERROR_OUT_OF_MEMORY Out of memory + */ +int messages_cb_get_text(messages_cb_message_h msg, char **text); + + +/** + * @brief Gets the received time of the CB message. + * + * @param[in] msg The CB message handle + * @param[out] time The recieved time of the CB message + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_get_time(messages_cb_message_h msg, time_t *time); + + +/** + * @brief Registers a callback to be invoked when an CB message is received. + * + * @param[in] service The message service handle + * @param[in] save Set to true to save the message, else false. + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_set_incoming_cb(messages_service_h service, bool save, + messages_cb_incoming_cb callback, void *user_data); + + +/** + * @brief Unregisters the callback function for cb incoming message. + * + * @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 + */ +int messages_cb_unset_incoming_cb(messages_service_h service); + +/** + * @brief Registers a callback to be invoked when an ETWS primary notification message is received. + * + * @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 + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_set_etws_primary_noti_cb(messages_service_h service, + messages_cb_etws_primary_noti_cb callback, void *user_data); + +/** + * @brief Unregisters the callback function for ETWS primary notification message is received. + * + * @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 + */ +int messages_cb_unset_etws_primary_noti_cb(messages_service_h service); + + +/** + * @brief Loads the settings for CB messaging. + * + * @remark The @a settings will be free automatically when the @a service is destroyed. + * + * @param[in] service The message service handle + * @param[out] settings The settings 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_OUT_OF_MEMORY Out of memory + */ +int messages_cb_load_settings(messages_service_h service, messages_cb_settings_h *settings); + +/** + * @brief Saves the settings for CB messaging. + * + * @param[in] service The message service handle + * @param[in] settings The settings handle + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_save_settings(messages_service_h service, messages_cb_settings_h settings); + +/** + * @brief Enables or disables the CB messaging. + * + * @param[in] settings The settings handle + * @param[in] enabled If true, the CB messaging is enabled. otherwise the CB messaging is disabled. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_settings_set_enabled(messages_cb_settings_h settings, bool enabled); + +/** + * @brief Determines whether the CB messaging is enabled. + * + * @param[in] settings The settings handle + * @param[out] enabled true if the CB messaging is enabled, false otherwise. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_settings_is_enabled(messages_cb_settings_h settings, bool *enabled); + +/** + * @brief Adds a channel to the CB messaging settings. + * + * @param[in] settings The settings handle + * @param[in] channel The channel handle to add + * + * @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_RANGE Maximum cb channels exceeded + */ +int messages_cb_settings_add_channel(messages_cb_settings_h settings, messages_cb_channel_h channel); + +/** + * @brief Removes a channel from the CB messaging settings. + * + * @param[in] settings The settings handle + * @param[in] channel The channel handle to remove + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_settings_remove_channel(messages_cb_settings_h settings, messages_cb_channel_h channel); + +/** + * @brief Gets a channel from the CB messaging settings. + * + * @param[in] settings The settings handle + * @param[in] index The zero-based index of channel to receive + * @param[out] channel The channel with specified index + * + * @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 + */ +int messages_cb_settings_get_channel(messages_cb_settings_h settings, int index, messages_cb_channel_h *channel); + +/** + * @brief Gets the total number of channels in the settings. + * + * @param[in] settings The settings handle + * @param[out] count The total number of channels + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_settings_get_channel_count(messages_cb_settings_h settings, int *count); + +/** + * @brief Creates a channel handle. + * + * @remark @a channel must be released with messages_cb_destroy_channel() by you. + * + * @param[out] channel A message handle to be newly created if successful + * + * @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 + */ +int messages_cb_create_channel(messages_cb_channel_h *channel); + +/** + * @brief Destroys a channel handle and release all its resource. + * + * @param[in] channel A channel handle to destroy + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_destroy_channel(messages_cb_channel_h channel); + +/** + * @brief Sets the range of channel id values for the CB messaging. + * + * @param[in] channel The channel handle + * @param[in] from_id The start of the range of channel id values. + * @param[in] to_id The end of the range of channel id values. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_channel_set_id(messages_cb_channel_h channel, int from_id, int to_id); + +/** + * @brief Gets the range of channel id values for the CB messaging. + * + * @param[in] channel The channel handle + * @param[out] from_id The start of the range of channel id values. + * @param[out] to_id The end of the range of channel id values. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_channel_get_id(messages_cb_channel_h channel, int *from_id, int *to_id); + +/** + * @brief Sets the name of the channel. + * + * @param[in] channel The channel handle + * @param[in] name The name of the channel + * + * @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_RANGE Maximum length of name exceeded + */ +int messages_cb_channel_set_name(messages_cb_channel_h channel, const char *name); + +/** + * @brief Gets the name of the channel. + * + * @param[in] channel The channel handle + * @param[out] name The name of the channel + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_channel_get_name(messages_cb_channel_h channel, char **name); + +/** + * @brief Activates or deactivates a specific channel. + * + * @param[in] channel The channel handle + * @param[in] activated If true, the channel is activated. otherwise, the channel is deactivated. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_channel_set_activated(messages_cb_channel_h channel, bool activated); + +/** + * @brief Determines whether the channel is activated. + * + * @param[in] channel The channel handle + * @param[out] activated true If the channel is activated, false otherwise. + * + * @return 0 on success, otherwise a negative error value. + * @retval #MESSAGES_ERROR_NONE Successful + * @retval #MESSAGES_ERROR_INVALID_PARAMETER Invalid parameter + */ +int messages_cb_channel_is_activated(messages_cb_channel_h channel, bool *activated); + + + +/** + * @} + */ + + + +#ifdef __cplusplus +} +#endif + + +#endif /* __TIZEN_MESSAGING_H__ */ diff --git a/include/messages_error.h b/include/messages_error.h new file mode 100644 index 0000000..41b6217 --- /dev/null +++ b/include/messages_error.h @@ -0,0 +1,58 @@ +/* + * 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_MESSAGING_ERROR_H__ +#define __TIZEN_MESSAGING_ERROR_H__ + +#include <tizen.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @addtogroup CAPI_MESSAGING_MESSAGES_MODULE + * @{ + */ + + +/** + * @brief Enumerations of error code for Messaging. + */ +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_OUT_OF_RANGE = TIZEN_ERROR_MESSAGING_CLASS|0x503, /**< Index out of range */ + 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_NO_SIM_CARD = TIZEN_ERROR_MESSAGING_CLASS|0x506, /**< No SIM Card */ + MESSAGES_ERROR_NO_DATA = TIZEN_ERROR_MESSAGING_CLASS|0x507, /**< No data available */ +} messages_error_e; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MESSAGING_ERROR_H__ */ diff --git a/include/messages_private.h b/include/messages_private.h new file mode 100644 index 0000000..f557646 --- /dev/null +++ b/include/messages_private.h @@ -0,0 +1,115 @@ +/* + * 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_MESSAGING_PRIVATE_H__ +#define __TIZEN_MESSAGING_PRIVATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +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; + + bool cbs_enabled_cb; + + void* cbs_incoming_cb; + void* cbs_incoming_cb_user_data; + bool cbs_incoming_cb_save; + + void* etws_incoming_cb; + void* etws_incoming_cb_user_data; + + messages_cb_settings_h cbs_settings_h; +} messages_service_s; + +typedef struct _messages_message_s { + 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 +1]; +} messages_attachment_s; + +typedef struct _messages_sent_callback_s { + 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; + + + +// CBS + +#define MESSAGES_ETWS_WARNING_INFO_LEN 50 + +typedef struct _messages_cb_message_s { + msg_struct_t cb_msg_h; +} messages_cb_message_s; + +typedef struct _messages_cb_settings_s { + msg_struct_t _struct; + GSList* channel_list; +} messages_cb_settings_s; + +typedef struct _messages_cb_channel_s { + int from_id; + int to_id; + char name[CB_CHANNEL_NAME_MAX + 1]; + bool activated; +} messages_cb_channel_s; + + + +#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) + + +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); + +int _messages_cb_clear_settings(messages_cb_settings_s *settings); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MESSAGING_PRIVATE_H__ */ diff --git a/include/messages_types.h b/include/messages_types.h new file mode 100644 index 0000000..7b1d44c --- /dev/null +++ b/include/messages_types.h @@ -0,0 +1,245 @@ +/* + * 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_MESSAGING_TYPES_H__ +#define __TIZEN_MESSAGING_TYPES_H__ + +#include <stdbool.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @addtogroup CAPI_MESSAGING_MESSAGES_MODULE + * @{ + */ + +/** + * @brief The messaging service handle. + */ +typedef struct messages_service_s *messages_service_h; + + +/** + * @brief The message handle. + */ +typedef struct messages_message_s *messages_message_h; + +/** + * @brief The message box type. + */ +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_message_box_e; + + +/** + * @brief The message type. + */ +typedef enum { + 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. + */ +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_type_e; + +/** + * @brief The recipient type of a message. + */ +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_type_e; + +/** + * @brief The result of sending a message. + */ +typedef enum { + MESSAGES_SENDING_FAILED = -1, /**< Message sending is failed */ + MESSAGES_SENDING_SUCCEEDED = 0, /**< Message sending is succeeded */ +} messages_sending_result_e; + +/** + * @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 + * + * @pre messages_send_message() will invoke this callback if you register this callback using messages_set_message_sent_cb(). + * + * @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); + + +/** + * @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 + * + * @pre You register this callback using messages_set_message_incoming_cb() for getting an incoming message. + * + * @see messages_set_message_incoming_cb() + * @see messages_unset_message_incoming_cb() + */ +typedef void (* messages_incoming_cb)(messages_message_h incoming_msg, void *user_data); + + +/** + * @brief Called when a message is retrieved from a search request. + * + * @remark 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. + * + * @return @c true to continue with the next iteration of the loop or return @c false to break out of the loop. + * + * @pre messages_foreach_message() will invoke this callback function. + * + * @see messages_foreach_message() + */ +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. + * + * @param[in] header The header of the push message + * @param[in] body The body of the push message. (It's 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); + +/** + * @} + */ + + +/** + * @addtogroup CAPI_MESSAGING_MESSAGES_CB_MODULE + * @{ + */ + +/** + * @brief The CB Message handle. + */ +typedef struct messages_cb_message_s *messages_cb_message_h; + +/** + * @brief The CB Settings handle. + */ +typedef struct messages_cb_settings_s *messages_cb_settings_h; + + /** + * @brief The CB Channel handle. + */ +typedef struct messages_cb_channel_s *messages_cb_channel_h; + +/** + * @brief Called when an incoming cb message is received. + * + * @param[in] msg The incoming CB message handle. \n + This handle will be destroyed when exiting this callback function automatically. + * @param[in] user_data The user data to be passed to the callback function + * + * @pre You register this callback using messages_cb_set_incoming_cb() for getting an incoming message. + * + * @see messages_cb_set_incoming_cb() + * @see messages_cb_unset_incoming_cb() + */ +typedef void (* messages_cb_incoming_cb)(messages_cb_message_h msg, void *user_data); + + +/** + * @brief Called when an incoming ETWS primary notification message is received. + * + * @details The ETWS primary notification message doesn't have text contents, but two parameters about ETWS are provided more. \n + * + * @remark The @a etws_security_info is 50 bytes binary data. + * + * @param[in] msg The incoming CB message handle. \n + This handle will be destroyed when exiting this callback function automatically. + * @param[in] etws_warning_type The ETWS warning type + * @param[in] etws_security_info The ETWS security info (50 bytes binary data) + * @param[in] user_data The user data to be passed to the callback function + * + * @pre You register this callback using messages_cb_set_incoming_cb() for getting an incoming message. + * + * @see messages_cb_set_etws_primary_noti_cb() + * @see messages_cb_unset_etws_primary_noti_cb() + */ +typedef void (* messages_cb_etws_primary_noti_cb)(messages_cb_message_h msg, + int etws_warning_type, const char *etws_security_info, void *user_data); + + +/** + * @} + */ + + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MESSAGING_TYPES_H__ */ diff --git a/packaging/capi-messaging-messages.spec b/packaging/capi-messaging-messages.spec new file mode 100644 index 0000000..d118d97 --- /dev/null +++ b/packaging/capi-messaging-messages.spec @@ -0,0 +1,65 @@ +Name: capi-messaging-messages +Summary: A SMS/MMS library in Tizen Native API +Version: 0.1.25 +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: pkgconfig(capi-appfw-application) +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description + + +%package devel +Summary: A SMS/MMS library in Tizen Native API (Development) +Requires: %{name} = %{version}-%{release} +Requires: pkgconfig(msg-service) +Requires: pkgconfig(capi-base-common) + +%description devel + + + +%prep +%setup -q + + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +rm -fr cmake_build_tmp; mkdir cmake_build_tmp +cd cmake_build_tmp +cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} + + +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 + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + + +%files +%{_libdir}/libcapi-messaging-messages.so.* +%{_datadir}/license/%{name} + +%files devel +%{_includedir}/messaging/*.h +%{_libdir}/pkgconfig/*.pc +%{_libdir}/libcapi-messaging-messages.so + + diff --git a/src/messages.c b/src/messages.c new file mode 100644 index 0000000..061f528 --- /dev/null +++ b/src/messages.c @@ -0,0 +1,1945 @@ +/* + * 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 <sys/stat.h> +#include <unistd.h> + +#include <stdio.h> +#include <stdlib.h> +#include <memory.h> + +#include <glib.h> + +#include <dlog.h> +#include <msg.h> +#include <msg_transport.h> +#include <msg_storage.h> + +#include <messages.h> +#include <messages_types.h> +#include <messages_private.h> + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "CAPI_MESSAGING" +#define DBG_MODE (1) + +#define MAX_MESSAGES_TEXT_LEN 1530 + +/* Private Utility Functions */ +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_open_service(messages_service_h *svc) +{ + int ret; + messages_service_s *_svc; + + CHECK_NULL(svc); + + _svc = (messages_service_s*)calloc(1, sizeof(messages_service_s)); + if (NULL == 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; + } + + _svc->sent_cb_list = NULL; + _svc->incoming_cb = NULL; + _svc->incoming_cb_enabled = false; + _svc->push_incoming_cb_list = NULL; + _svc->cbs_enabled_cb = false; + _svc->cbs_incoming_cb = NULL; + _svc->cbs_incoming_cb_save = false; + _svc->etws_incoming_cb = NULL; + _svc->cbs_settings_h = 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) +{ + int ret; + + messages_service_s *_svc = (messages_service_s *)svc; + messages_cb_settings_s *_settings; + CHECK_NULL(_svc); + + ret = msg_close_msg_handle(&_svc->service_h); + + 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; + } + + if (_svc->cbs_settings_h) { + _settings = (messages_cb_settings_s *)_svc->cbs_settings_h; + _messages_cb_clear_settings(_settings); + free(_settings); + _svc->cbs_settings_h = NULL; + } + + free(svc); + + return ERROR_CONVERT(ret); +} + +int messages_create_message(messages_message_type_e type, messages_message_h *msg) +{ + int ret; + messages_message_s *_msg = NULL; + + CHECK_NULL(msg); + + _msg = (messages_message_s*)calloc(1, sizeof(messages_message_s)); + if (NULL == _msg) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_msg'." + , __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) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_msg->msg_h'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + free(_msg); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + _msg->text = NULL; + _msg->attachment_list = NULL; + + if (MESSAGES_TYPE_SMS == type) + { + ret = ERROR_CONVERT(msg_set_int_value(_msg->msg_h, MSG_MESSAGE_TYPE_INT, MSG_TYPE_SMS)); + if (MESSAGES_ERROR_NONE != ret) + { + msg_release_struct(&_msg->msg_h); + free(_msg); + return ret; + } + } + else if (MESSAGES_TYPE_MMS == type) + { + 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 + { + LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type is unknown." + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); + msg_release_struct(&_msg->msg_h); + free(_msg); + return MESSAGES_ERROR_INVALID_PARAMETER; + } + + *msg = (messages_message_h)_msg; + + return MESSAGES_ERROR_NONE; +} + +int messages_destroy_message(messages_message_h msg) +{ + int ret; + + messages_message_s *_msg = (messages_message_s*)msg; + + CHECK_NULL(_msg); + + messages_mms_remove_all_attachments(msg); + if (_msg->text) + { + free(_msg->text); + _msg->text = NULL; + } + + ret = msg_release_struct(&_msg->msg_h); + + free(msg); + + return ERROR_CONVERT(ret); +} + +int messages_get_message_type(messages_message_h msg, messages_message_type_e *type) +{ + int msgType; + int ret; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(type); + + ret = msg_get_int_value(_msg->msg_h, MSG_MESSAGE_TYPE_INT, &msgType); + if (ret != MSG_SUCCESS) + { + return ERROR_CONVERT(ret); + } + + switch (msgType) + { + 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: + *type = MESSAGES_TYPE_SMS; + break; + case MSG_TYPE_MMS: + case MSG_TYPE_MMS_NOTI: + case MSG_TYPE_MMS_JAVA: + *type = MESSAGES_TYPE_MMS; + break; + default: + *type = MESSAGES_TYPE_UNKNOWN; + break; + } + + return MESSAGES_ERROR_NONE; +} + +int messages_add_address(messages_message_h msg, const char *address, messages_recipient_type_e type) +{ + int ret; + + messages_message_type_e msgType; + msg_struct_list_s *addr_list = NULL; + msg_struct_t addr_info; + + messages_message_s *_msg = (messages_message_s*)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(address); + + messages_get_message_type(msg, &msgType); + + ret = msg_get_list_handle(_msg->msg_h, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); + if (MSG_SUCCESS != ret) { + return ERROR_CONVERT(ret); + } + + addr_info = addr_list->msg_struct_info[addr_list->nCount]; + + if (IS_SMS(msgType)) + { + msg_set_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, MSG_RECIPIENTS_TYPE_TO); + } + else if (IS_MMS(msgType)) + { + if (strchr(address, '@') == NULL) + { + msg_set_int_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MSG_ADDRESS_TYPE_PLMN); + } + else + { + msg_set_int_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MSG_ADDRESS_TYPE_EMAIL); + } + msg_set_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, _messages_convert_recipient_to_fw(type)); + } + else + { + LOGE("[%s] INVALID_PARAMETER(0x%08x) : the message type is unknown." + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); + return MESSAGES_ERROR_INVALID_PARAMETER; + } + + ret = msg_set_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, (char *)address, strlen(address)); + 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) +{ + int ret; + msg_struct_list_s *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); + if (MSG_SUCCESS != ret) { + return ERROR_CONVERT(ret); + } + + *count = addr_list->nCount; + + return MESSAGES_ERROR_NONE; +} + +int messages_get_address(messages_message_h msg, int index, char **address, messages_recipient_type_e *type) +{ + int ret; + char _address[MAX_ADDRESS_VAL_LEN] = {0, }; + int _type; + + msg_struct_list_s *addr_list = NULL; + msg_struct_t addr_info; + + messages_message_s *_msg = (messages_message_s*)msg; + + 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); + if (MSG_SUCCESS != ret) { + return ERROR_CONVERT(ret); + } + + if (index > addr_list->nCount) + { + LOGE("[%s] INVALID_PARAMETER(0x%08x) : index(%d) > addr_list->nCount(%d) " + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER, index, addr_list->nCount); + return MESSAGES_ERROR_INVALID_PARAMETER; + } + + addr_info = addr_list->msg_struct_info[index]; + + ret = msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, _address, MAX_ADDRESS_VAL_LEN); + if (MSG_SUCCESS != ret) + { + *address = NULL; + } + else + { + *address = strdup(_address); + if (NULL == *address) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '*address'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + } + + if (NULL != type) + { + ret = msg_get_int_value(addr_info, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, &_type); + if (MSG_SUCCESS != ret) + { + *type = MESSAGES_RECIPIENT_UNKNOWN; + } + else + { + switch (_type) { + case MSG_RECIPIENTS_TYPE_TO: + *type = MESSAGES_RECIPIENT_TO; + break; + case MSG_RECIPIENTS_TYPE_CC: + *type = MESSAGES_RECIPIENT_CC; + break; + case MSG_RECIPIENTS_TYPE_BCC: + *type = MESSAGES_RECIPIENT_BCC; + break; + default: + *type = MESSAGES_RECIPIENT_UNKNOWN; + break; + } + } + } + + return MESSAGES_ERROR_NONE; +} + +int messages_remove_all_addresses(messages_message_h msg) +{ + int ret; + msg_struct_list_s *addr_list = NULL; + + 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; + } + + return ERROR_CONVERT(ret); +} + +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) +{ + int ret; + int reqId; + msg_struct_t req; + msg_struct_t sendOpt; + msg_struct_t option = NULL; + messages_message_type_e msgType; + + messages_service_s *_svc = (messages_service_s*)svc; + messages_message_s *_msg = (messages_message_s*)msg; + + messages_sent_callback_s *_cb; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + + 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); + + messages_get_message_type(msg, &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); + + 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 (IS_MMS(msgType)) + { + ret = _messages_save_mms_data(_msg); + if (MESSAGES_ERROR_NONE == ret) + { + if (DBG_MODE) + { + _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_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); + + 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); + msg_release_struct(&sendOpt); + return TIZEN_ERROR_INVALID_PARAMETER; + } + + msg_release_struct(&sendOpt); + + if (NULL != callback && MSG_SUCCESS == ret) + { + // Add callback to mapping table + _cb = (messages_sent_callback_s *)malloc(sizeof(messages_sent_callback_s)); + if (NULL != _cb) { + _cb->req_id = reqId; + _cb->callback = (void *)callback; + _cb->user_data = user_data; + _svc->sent_cb_list = g_slist_append(_svc->sent_cb_list, _cb); + } + } + + return ERROR_CONVERT(ret); +} + +int messages_get_message_count(messages_service_h service, + messages_message_box_e mbox, messages_message_type_e type, + int *count) +{ + 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 (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) + { + return ret; + } + } + + 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) + { + return ret; + } + } + + *count = nSms + nMms; + } + else + { + countInfo = msg_create_struct(MSG_STRUCT_COUNT_INFO); + 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); + + msg_release_struct(&countInfo); + + switch (type) + { + case MESSAGES_TYPE_SMS: *count = nSms; break; + case MESSAGES_TYPE_MMS: *count = nMms; break; + case MESSAGES_TYPE_UNKNOWN: *count = nSms + nMms; break; + default: *count = 0; break; + } + } + + return MESSAGES_ERROR_NONE; +} + +int messages_search_message(messages_service_h service, + messages_message_box_e mbox, + messages_message_type_e type, + const char *keyword, const char *address, + int offset, int limit, + messages_message_h **message_array, int *length, int *total) +{ + int i; + int ret; + + msg_struct_list_s msg_list; + msg_struct_t searchCon; + 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)); + if (NULL != keyword) + { + msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_SEARCH_VALUE_STR, strdup(keyword), strlen(keyword)); + } + if (NULL != address) + { + msg_set_str_value(searchCon, MSG_SEARCH_CONDITION_ADDRESS_VALUE_STR, strdup(address), strlen(address)); + } + + // Search + ret = msg_search_message(_svc->service_h, searchCon, offset, limit, &msg_list); + if (MSG_SUCCESS != ret) + { + msg_release_struct(&searchCon); + 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) + { + 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)); + if (NULL == _msg) + { + LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create '_msg'." + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + free(_array); + 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 (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) +{ + 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]); + if (MESSAGES_ERROR_NONE != ret) + { + LOGW("[%s:%d] messages_destroy_message() is fail. ret = %d" + , __FUNCTION__, __LINE__, ret); + } + + i++; + } + + free(message_array); + + return MESSAGES_ERROR_NONE; +} + +int messages_foreach_message(messages_service_h svc, + messages_message_box_e mbox, + messages_message_type_e type, + const char *keyword, const char *address, + int offset, int limit, + messages_search_cb callback, void *user_data) +{ + int i; + int ret; + bool ret_cb; + + 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; + } + + 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 MESSAGES_ERROR_NONE; +} + +void _messages_sent_mediator_cb(msg_handle_t handle, msg_struct_t pStatus, void *user_param) +{ + messages_sending_result_e ret; + messages_service_s *_svc = (messages_service_s*)user_param; + + int i; + int status = MSG_NETWORK_SEND_FAIL; + int reqId = 0; + messages_sent_callback_s *_cb; + + msg_get_int_value(pStatus, MSG_SENT_STATUS_REQUESTID_INT, &reqId); + msg_get_int_value(pStatus, MSG_SENT_STATUS_NETWORK_STATUS_INT, &status); + + if (NULL == _svc) + { + return; + } + + for (i=0; i < g_slist_length(_svc->sent_cb_list); i++) + { + _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) ? + MESSAGES_SENDING_SUCCEEDED : MESSAGES_SENDING_FAILED; + + ((messages_sent_cb)_cb->callback)(ret, _cb->user_data); + _svc->sent_cb_list = g_slist_remove(_svc->sent_cb_list, _cb); + free(_cb); + break; + } + } +} + +void _messages_incoming_mediator_cb(msg_handle_t handle, msg_struct_t msg, void *user_param) +{ + messages_message_type_e msgType; + messages_message_s *_msg; + messages_service_s *_svc = (messages_service_s*)user_param; + + if (NULL == _svc) + { + return; + } + + if (_svc->incoming_cb_enabled && _svc->incoming_cb != NULL) + { + _msg = (messages_message_s*)calloc(1, sizeof(messages_message_s)); + if (NULL == _msg) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_msg'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return; + } + + _msg->msg_h = msg; + + messages_get_message_type((messages_message_h)_msg, &msgType); + + if (IS_MMS(msgType)) + { + _messages_load_mms_data(_msg, handle); + } + + ((messages_incoming_cb)_svc->incoming_cb)((messages_message_h)_msg, _svc->incoming_cb_user_data); + + free(_msg); + } +} + +int messages_set_message_incoming_cb(messages_service_h svc, messages_incoming_cb callback, void *user_data) +{ + int ret; + + messages_service_s *_svc = (messages_service_s*)svc; + + CHECK_NULL(_svc); + CHECK_NULL(callback); + + if (NULL == _svc->incoming_cb) + { + ret = ERROR_CONVERT( + msg_reg_sms_message_callback(_svc->service_h, &_messages_incoming_mediator_cb, 0, (void*)_svc) + ); + if (MESSAGES_ERROR_NONE != ret) + { + return ret; + } + + ret = ERROR_CONVERT( + msg_reg_mms_conf_message_callback(_svc->service_h, &_messages_incoming_mediator_cb, NULL, (void*)_svc) + ); + if (MESSAGES_ERROR_NONE != ret) + { + return ret; + } + } + + _svc->incoming_cb = (void*)callback; + _svc->incoming_cb_user_data = (void*)user_data; + _svc->incoming_cb_enabled = true; + + return MESSAGES_ERROR_NONE; +} + +int messages_add_sms_listening_port(messages_service_h service, int port) +{ + 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) +{ + messages_service_s *_svc = (messages_service_s*)svc; + + CHECK_NULL(_svc); + + _svc->incoming_cb_enabled = false; + + return MESSAGES_ERROR_NONE; +} + +int messages_get_message_port(messages_message_h msg, int *port) +{ + 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) +{ + int ret; + int len; + messages_message_type_e type; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(text); + + ret = messages_get_message_type(msg, &type); + if (MESSAGES_ERROR_NONE != ret) { + return ret; + } + + if (IS_SMS(type)) + { + len = strlen(text); + 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); + return MESSAGES_ERROR_INVALID_PARAMETER; + } + ret = ERROR_CONVERT(msg_set_str_value(_msg->msg_h, MSG_MESSAGE_SMS_DATA_STR, (char *)text, len)); + } + else if (IS_MMS(type)) + { + if (NULL != _msg->text) + { + free(_msg->text); + } + + _msg->text = strdup(text); + if (NULL == _msg->text) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '_msg->text'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + ret = MESSAGES_ERROR_NONE; + } + else + { + LOGE("[%s] INVALID_PARAMETER(0x%08x) : unknown message type" + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); + return MESSAGES_ERROR_INVALID_PARAMETER; + } + + return ret; +} + +int messages_get_text(messages_message_h msg, char **text) +{ + int ret; + char _text[MAX_MSG_TEXT_LEN]; + messages_message_type_e type; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(text); + + ret = messages_get_message_type(msg, &type); + if (MESSAGES_ERROR_NONE != ret) { + return ret; + } + + 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) + { + *text = NULL; + } + else + { + *text = strdup(_text); + if (NULL == *text) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '*text'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + } + } + else if (IS_MMS(type)) + { + if (NULL == _msg->text) + { + *text = NULL; + } + else + { + *text = strdup(_msg->text); + if (NULL == *text) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '*text'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + } + } + else + { + LOGE("[%s] INVALID_PARAMETER(0x%08x) : unknown message type" + , __FUNCTION__, MESSAGES_ERROR_INVALID_PARAMETER); + return MESSAGES_ERROR_INVALID_PARAMETER; + } + + return MESSAGES_ERROR_NONE; +} + + + +int messages_get_time(messages_message_h msg, time_t *time) +{ + 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) + { + return ERROR_CONVERT(ret); + } + + *time = (time_t)_time; + + return MESSAGES_ERROR_NONE; +} + +int messages_get_message_id(messages_message_h msg, int *msg_id) +{ + 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_search_message_by_id(messages_service_h service, int msg_id, messages_message_h *msg) +{ + int ret; + msg_struct_t new_msg_h; + messages_message_type_e _msgType; + msg_struct_t sendOpt; + + 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); + sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT); + ret = msg_get_message(_svc->service_h, msg_id, new_msg_h, sendOpt); + if (MSG_SUCCESS != ret) + { + 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)); + 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 (IS_MMS(_msgType)) + { + 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) +{ + 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: + *mbox = MESSAGES_MBOX_INBOX; + break; + case MSG_OUTBOX_ID: + *mbox = MESSAGES_MBOX_OUTBOX; + break; + case MSG_SENTBOX_ID: + *mbox = MESSAGES_MBOX_SENTBOX; + break; + case MSG_DRAFT_ID: + *mbox = MESSAGES_MBOX_DRAFT; + break; + default: + *mbox = MESSAGES_MBOX_ALL; + break; + } + + return MESSAGES_ERROR_NONE; +} + + +// MMS ///////////////////////////////////////////////////////////////////// + +int messages_mms_set_subject(messages_message_h msg, const char *subject) +{ + int ret; + messages_message_type_e type; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(subject); + + ret = messages_get_message_type(msg, &type); + if (MESSAGES_ERROR_NONE != ret) { + return ret; + } + + 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; + } + + ret = msg_set_str_value(_msg->msg_h, MSG_MESSAGE_SUBJECT_STR, (char *)subject, strlen(subject)); + + return ERROR_CONVERT(ret); +} + +int messages_mms_get_subject(messages_message_h msg, char **subject) +{ + int ret; + char _subject[MAX_SUBJECT_LEN]; + messages_message_type_e type; + + messages_message_s *_msg = (messages_message_s*)msg; + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(subject); + + ret = messages_get_message_type(msg, &type); + if (MESSAGES_ERROR_NONE != ret) { + return ret; + } + + 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; + } + + ret = msg_get_str_value(_msg->msg_h, MSG_MESSAGE_SUBJECT_STR, _subject, MAX_SUBJECT_LEN); + if (MSG_SUCCESS != ret) + { + *subject = NULL; + } + else + { + *subject = strdup(_subject); + if (NULL == *subject) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '*subject'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + } + + return MESSAGES_ERROR_NONE; +} + + +int messages_mms_add_attachment(messages_message_h msg, messages_media_type_e type, const char *path) +{ + messages_message_type_e msg_type; + + messages_message_s *_msg = (messages_message_s*)msg; + messages_attachment_s *attach; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(path); + + // Check Message Type + messages_get_message_type(msg, &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; + } + + // New Attach + attach = (messages_attachment_s *)calloc(1, sizeof(messages_attachment_s)); + if (NULL == attach) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a 'attach'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + attach->media_type = type; + strncpy(attach->filepath, path, strlen(path)); + + // Append + _msg->attachment_list = g_slist_append(_msg->attachment_list, attach); + + return MESSAGES_ERROR_NONE; +} + +int messages_mms_get_attachment_count(messages_message_h msg, int *count) +{ + messages_message_type_e type; + + messages_message_s *_msg = (messages_message_s*)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(count); + + // Check Message Type + messages_get_message_type(msg, &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; + } + + // Count + *count = g_slist_length(_msg->attachment_list); + + return MESSAGES_ERROR_NONE; +} + +int messages_mms_get_attachment(messages_message_h msg, int index, messages_media_type_e *type, char **path) +{ + messages_attachment_s *_attach; + messages_message_type_e msg_type; + + messages_message_s *_msg = (messages_message_s*)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + CHECK_NULL(path); + + // Check Message Type + messages_get_message_type(msg, &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; + } + + _attach = (messages_attachment_s *)g_slist_nth_data(_msg->attachment_list, index); + if (NULL == _attach) + { + *type = MESSAGES_MEDIA_UNKNOWN; + *path = NULL; + } + else + { + *type = _attach->media_type; + *path = strdup(_attach->filepath); + if (NULL == *path) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '*path'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + } + + return MESSAGES_ERROR_NONE; +} + +int messages_mms_remove_all_attachments(messages_message_h msg) +{ + messages_message_s *_msg = (messages_message_s*)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->msg_h); + + if (_msg->attachment_list) + { + g_slist_foreach(_msg->attachment_list, (GFunc)g_free, NULL); + g_slist_free(_msg->attachment_list); + _msg->attachment_list = NULL; + } + + return MESSAGES_ERROR_NONE; +} + +int _messages_save_mms_data(messages_message_s *msg) +{ + int i; + int ret; + + msg_struct_t mms_data; + msg_struct_t region; + + msg_struct_t page; + msg_struct_t media; + msg_struct_t smil_text; + msg_struct_t mms_attach; + + messages_attachment_s *attach; + messages_attachment_s *image; + messages_attachment_s *audio; + + 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.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + // Check Attachments + image = NULL; + audio = NULL; + for (i=0; i < g_slist_length(msg->attachment_list); i++) + { + attach = g_slist_nth_data(msg->attachment_list, i); + if (MESSAGES_MEDIA_IMAGE == attach->media_type) + { + if (NULL == image) + { + image = attach; + } + } + else if (MESSAGES_MEDIA_VIDEO == attach->media_type) + { + if (NULL == image) + { + image = attach; + } + } + else if (MESSAGES_MEDIA_AUDIO == attach->media_type) + { + if (NULL == audio) + { + audio = attach; + } + } + } + + // Layout Setting + msg_set_int_value(mms_data, MSG_MMS_ROOTLAYOUT_WIDTH_INT, 100); + msg_set_int_value(mms_data, MSG_MMS_ROOTLAYOUT_HEIGHT_INT, 100); + msg_set_int_value(mms_data, MSG_MMS_ROOTLAYOUT_BGCOLOR_INT, 0xffffff); + msg_set_bool_value(mms_data, MSG_MMS_ROOTLAYOUT_WIDTH_PERCENT_BOOL, true); + msg_set_bool_value(mms_data, MSG_MMS_ROOTLAYOUT_HEIGHT_PERCENT_BOOL, true); + + if (NULL == image) + { + msg_mms_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); + } + else if (NULL == msg->text) + { + msg_mms_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); + } + else + { + msg_mms_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_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); + 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); + } + + // Add Media + msg_mms_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_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, MSG_FILEPATH_LEN_MAX); + } + else if (MESSAGES_MEDIA_VIDEO == image->media_type) + { + msg_mms_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, MSG_FILEPATH_LEN_MAX); + } + } + + if (NULL != audio) + { + msg_mms_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, MSG_FILEPATH_LEN_MAX); + } + + if (NULL != msg->text) + { + ret = _messages_save_textfile(msg->text, &filepath); + if (MESSAGES_ERROR_NONE == ret) + { + msg_mms_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, 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); + msg_set_bool_value(smil_text, MSG_MMS_SMIL_TEXT_BOLD_BOOL, false); + } + + if (NULL != filepath) + { + free(filepath); + } + } + + // Add Attachment + for (i=0; i < g_slist_length(msg->attachment_list); i++) + { + 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, 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.", + __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; +} + +int _messages_load_mms_data(messages_message_s *msg, msg_handle_t handle) +{ + int i,j; + int ret; + int msg_id; + int media_type; + 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; + + CHECK_NULL(msg); + + // Get MessageId + 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.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + // Load MMS_MESSAGE_DATA_S + new_msg_h = msg_create_struct(MSG_STRUCT_MESSAGE_INFO); + sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT); + 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.", + __FUNCTION__, __LINE__, 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.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + msg_release_struct(&new_msg_h); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + 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.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + msg_release_struct(&mms_data); + msg_release_struct(&new_msg_h); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + // Load Media, Text + 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); + if (NULL == mms_page) + { + continue; + } + + 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, 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, MSG_FILEPATH_LEN_MAX); + + if (MMS_SMIL_MEDIA_TEXT == media_type) + { + _messages_load_textfile(filepath, &msg->text); + } + else + { + strncpy(attach->filepath, filepath, MSG_FILEPATH_LEN_MAX); + switch (media_type) + { + case MMS_SMIL_MEDIA_IMG: + attach->media_type = MESSAGES_MEDIA_IMAGE; + break; + case MMS_SMIL_MEDIA_VIDEO: + attach->media_type = MESSAGES_MEDIA_VIDEO; + break; + case MMS_SMIL_MEDIA_AUDIO: + attach->media_type = MESSAGES_MEDIA_AUDIO; + break; + default: + attach->media_type = MESSAGES_MEDIA_UNKNOWN; + } + + msg->attachment_list = g_slist_append(msg->attachment_list, attach); + } + } + } + + // Load Attachments + msg_get_list_handle(mms_data, MSG_MMS_ATTACH_LIST_HND, (void **)&mms_attach_list); + for (i=0; i < msg_list_length(mms_attach_list); i++) + { + mms_attach = (msg_struct_t)msg_list_nth_data(mms_attach_list, i); + if (NULL == mms_attach) + { + 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_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; + + CHECK_NULL(text); + + *filepath = (char *)malloc(sizeof(char)*MSG_FILEPATH_LEN_MAX+1); + if (NULL == *filepath) + { + LOGE("[%s:%d] OUT_OF_MEMORY(0x%08x) fail to create a '*filepath'." + , __FUNCTION__, __LINE__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + snprintf(*filepath, MSG_FILEPATH_LEN_MAX+1, "/tmp/.capi_messages_text_%d.txt", getpid()); + + file = fopen(*filepath, "w"); + if (file != NULL) + { + fputs(text, file); + fclose(file); + } + else + { + 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; + } + + return MESSAGES_ERROR_NONE; +} + +int _messages_load_textfile(const char *filepath, char **text) +{ + FILE *file = NULL; + char buf[1024]; + struct stat st; + size_t nread, len; + char *pos; + + CHECK_NULL(filepath); + + file = fopen(filepath, "r"); + + if (NULL == file) + { + 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; + } + + 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); + pos = *text; + } + else + { + len = strlen(*text); + *text = (char*)realloc(*text, len + st.st_size + 2); + (*text)[len] = '\n'; + pos = *text + len + 1; + } + + while(0 < (nread = fread(buf, 1, 1024, file))) + { + memcpy(pos, buf, nread); + pos += nread; + } + pos[0] = '\0'; + + fclose(file); + + return 0; +} + +int _messages_get_media_type_from_filepath(const char *filepath) +{ + int len; + int ret; + char *file_ext; + + if (NULL == filepath) + { + return MESSAGES_MEDIA_UNKNOWN; + } + // check the length of filepath + len = strlen(filepath); + if (len < 5) + { + return MESSAGES_MEDIA_UNKNOWN; + } + + // check extension of file + file_ext = (char *)&filepath[len - 4]; + + 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; + } + else if(strncmp(file_ext,".mp4",4) !=0 && strncmp(file_ext,".3gp",4) !=0) + { + ret = MESSAGES_MEDIA_VIDEO; + } + else if(strncmp(file_ext,".mid",4) !=0 && strncmp(file_ext,".aac",4) !=0 && strncmp(file_ext,".amr",4) !=0) + { + ret = MESSAGES_MEDIA_AUDIO; + } + else + { + ret = MESSAGES_MEDIA_UNKNOWN; + } + + return ret; +} + +int _messages_convert_mbox_to_fw(messages_message_box_e mbox) +{ + int folderId; + switch(mbox) + { + case MESSAGES_MBOX_INBOX: + folderId = MSG_INBOX_ID; + break; + case MESSAGES_MBOX_OUTBOX: + folderId = MSG_OUTBOX_ID; + break; + case MESSAGES_MBOX_SENTBOX: + folderId = MSG_SENTBOX_ID; + break; + case MESSAGES_MBOX_DRAFT: + folderId = MSG_DRAFT_ID; + break; + default: + folderId = MSG_ALLBOX_ID; + break; + } + return folderId; +} + +int _messages_convert_msgtype_to_fw(messages_message_type_e type) +{ + int msgType; + switch (type) + { + case MESSAGES_TYPE_SMS: + msgType = MSG_TYPE_SMS; + break; + case MESSAGES_TYPE_MMS: + msgType = MSG_TYPE_MMS; + break; + default: + msgType = MSG_TYPE_INVALID; + break; + } + return msgType; +} + +int _messages_convert_recipient_to_fw(messages_recipient_type_e type) +{ + int ret; + switch (type) + { + case MESSAGES_RECIPIENT_TO: + ret = MSG_RECIPIENTS_TYPE_TO; + break; + case MESSAGES_RECIPIENT_CC: + ret = MSG_RECIPIENTS_TYPE_CC; + break; + case MESSAGES_RECIPIENT_BCC: + ret = MSG_RECIPIENTS_TYPE_BCC; + break; + default: + ret = MSG_RECIPIENTS_TYPE_UNKNOWN; + break; + } + return ret; +} + + +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.", + func, line, MESSAGES_ERROR_INVALID_PARAMETER, err); + return MESSAGES_ERROR_INVALID_PARAMETER; + + case MSG_ERR_INVALID_PARAMETER: + LOGE("[%s:%d] INVALID_PARAMETER(0x%08x) : Error from internal Messaging F/W ret: %d.", + func, line, MESSAGES_ERROR_INVALID_PARAMETER, err); + return MESSAGES_ERROR_INVALID_PARAMETER; + + case -EINVAL: + 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.", + func, line, MESSAGES_ERROR_SERVER_NOT_READY, err); + return MESSAGES_ERROR_SERVER_NOT_READY; + + case MSG_ERR_COMMUNICATION_ERROR: + 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.", + 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_SUCCESS: + return MESSAGES_ERROR_NONE; + + default: + 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; + + } +} diff --git a/src/messages_cb.c b/src/messages_cb.c new file mode 100644 index 0000000..4a57ce5 --- /dev/null +++ b/src/messages_cb.c @@ -0,0 +1,711 @@ +/* + * 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 <sys/stat.h> +#include <unistd.h> + +#include <stdio.h> +#include <stdlib.h> +#include <memory.h> + +#include <glib.h> + +#include <dlog.h> +#include <msg.h> +#include <msg_transport.h> +#include <msg_storage.h> + +#include <messages.h> +#include <messages_types.h> +#include <messages_private.h> + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "CAPI_MESSAGING" + + + +void _messages_cb_incoming_mediator_cb(msg_handle_t handle, msg_struct_t msg, void *user_param) +{ + int cbType; + int etwsWarningType; + char etwsWarningInfo[MESSAGES_ETWS_WARNING_INFO_LEN]; + + messages_cb_message_s *_msg = NULL; + messages_service_s *_svc = (messages_service_s*)user_param; + + if (NULL == _svc) { + LOGW("[%s:%d] _svc is NULL.", __FUNCTION__, __LINE__); + return; + } + + if (NULL == msg) { + LOGW("[%s:%d] msg is NULL.", __FUNCTION__, __LINE__); + return; + } + + if (_svc->etws_incoming_cb || _svc->cbs_incoming_cb) + { + + _msg = (messages_cb_message_s *)calloc(1, sizeof(messages_message_s)); + if (NULL == _msg) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_msg'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return; + } + + _msg->cb_msg_h = msg; + + msg_get_int_value(msg, MSG_CB_MSG_TYPE_INT, &cbType); + + if (MSG_TYPE_SMS_ETWS_PRIMARY == cbType) + { + if (_svc->etws_incoming_cb) + { + msg_get_int_value(msg, MSG_CB_MSG_ETWS_WARNING_TYPE_INT, &etwsWarningType); + msg_get_str_value(msg, MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR, etwsWarningInfo, MESSAGES_ETWS_WARNING_INFO_LEN); + + ((messages_cb_etws_primary_noti_cb)_svc->etws_incoming_cb)((messages_cb_message_h)_msg, etwsWarningType, etwsWarningInfo, _svc->etws_incoming_cb_user_data); + } + } + else { + if (_svc->cbs_incoming_cb) + { + ((messages_cb_incoming_cb)_svc->cbs_incoming_cb)((messages_cb_message_h)_msg, _svc->cbs_incoming_cb_user_data); + } + } + + free(_msg); + } +} + + +int messages_cb_get_message_id(messages_cb_message_h msg, int *msg_id) +{ + int ret; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(msg_id); + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_MSG_ID_INT, msg_id); + + return ERROR_CONVERT(ret); +} + +int messages_cb_get_serial_number(messages_cb_message_h msg, int *serial) +{ + int ret; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(serial); + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_SERIAL_NUM_INT, serial); + + return ERROR_CONVERT(ret); +} + +int messages_cb_get_dcs(messages_cb_message_h msg, int *dcs) +{ + int ret; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(dcs); + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_DCS_INT, dcs); + + return ERROR_CONVERT(ret); +} + +int messages_cb_get_message_type(messages_cb_message_h msg, messages_message_type_e *type) +{ + int ret; + int msgType; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(type); + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_TYPE_INT, &msgType); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + switch (msgType) + { + case MSG_TYPE_SMS_ETWS_PRIMARY: + *type = MESSAGES_TYPE_SMS_ETWS_PRIMARY; + break; + case MSG_TYPE_SMS_ETWS_SECONDARY: + *type = MESSAGES_TYPE_SMS_ETWS_SECONDARY; + break; + default: + *type = MESSAGES_TYPE_SMS_CB; + break; + } + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_get_language_type(messages_cb_message_h msg, char **type) +{ + int ret; + int len; + char *_type; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(type); + + len = 15; + + _type = (char*)calloc(len + 1, sizeof(char)); // Maximum 15 bytes + if (NULL == _type) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_type'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + ret = msg_get_str_value(_msg->cb_msg_h, MSG_CB_MSG_LANGUAGE_TYPE_STR, _type, len); + if (MSG_SUCCESS != ret) + { + free(_type); + return ERROR_CONVERT(ret); + } + + *type = _type; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_get_text(messages_cb_message_h msg, char **text) +{ + int ret; + + int txtLen; + int msgType; + char *_text; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(text); + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_TYPE_INT, &msgType); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + if (MSG_TYPE_SMS_ETWS_PRIMARY == msgType) + { + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : The type of msg is ETWS_PRIMARY. This msg doesn't have 'text'.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_CB_TEXT_LEN_INT, &txtLen); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + _text = (char *)calloc(txtLen + 1, sizeof(char)); + if (NULL == _text) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_text'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + ret = msg_get_str_value(_msg->cb_msg_h, MSG_CB_MSG_CB_TEXT_STR, _text, txtLen + 1); + if (MSG_SUCCESS != ret) + { + free(_text); + return ERROR_CONVERT(ret); + } + + *text = _text; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_get_time(messages_cb_message_h msg, time_t *time) +{ + int ret; + int _time; + + messages_cb_message_s *_msg = (messages_cb_message_s *)msg; + + CHECK_NULL(_msg); + CHECK_NULL(_msg->cb_msg_h); + CHECK_NULL(time); + + ret = msg_get_int_value(_msg->cb_msg_h, MSG_CB_MSG_RECV_TIME_INT, &_time); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + *time = (time_t)_time; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_set_incoming_cb(messages_service_h service, bool save, + messages_cb_incoming_cb callback, void *user_data) +{ + int ret; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(callback); + + if (!_svc->cbs_enabled_cb) + { + ret = msg_reg_cb_message_callback(_svc->service_h, _messages_cb_incoming_mediator_cb, save, (void*)_svc); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + _svc->cbs_enabled_cb = true; + } + + _svc->cbs_incoming_cb = (void*)callback; + _svc->cbs_incoming_cb_user_data = (void*)user_data; + _svc->cbs_incoming_cb_save = save; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_unset_incoming_cb(messages_service_h service) +{ + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + + _svc->cbs_incoming_cb = NULL; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_set_etws_primary_noti_cb(messages_service_h service, + messages_cb_etws_primary_noti_cb callback, void *user_data) +{ + int ret; + + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(callback); + + if (!_svc->cbs_enabled_cb) + { + ret = msg_reg_cb_message_callback(_svc->service_h, _messages_cb_incoming_mediator_cb, _svc->cbs_incoming_cb_save, (void*)_svc); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + _svc->cbs_enabled_cb = true; + } + + _svc->etws_incoming_cb = (void*)callback; + _svc->etws_incoming_cb_user_data = (void*)user_data; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_unset_etws_primary_noti_cb(messages_service_h service) +{ + messages_service_s *_svc = (messages_service_s *)service; + + CHECK_NULL(_svc); + + _svc->etws_incoming_cb = NULL; + + return MESSAGES_ERROR_NONE; +} + +int _messages_cb_clear_settings(messages_cb_settings_s *settings) +{ + CHECK_NULL(settings); + CHECK_NULL(settings->_struct); + + msg_release_struct(&settings->_struct); + + if (settings->channel_list) + { + g_slist_foreach(settings->channel_list, (GFunc)g_free, NULL); + g_slist_free(settings->channel_list); + settings->channel_list = NULL; + } + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_load_settings(messages_service_h service, messages_cb_settings_h *settings) +{ + int i; + int ret; + + messages_service_s *_svc = (messages_service_s *)service; + messages_cb_settings_s * _settings; + + msg_struct_list_s *channels = NULL; + + messages_cb_channel_s *_ch; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(settings); + + // Allocate Settings + _settings = (messages_cb_settings_s *)calloc(1, sizeof(messages_cb_settings_s)); + if (NULL == _settings) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '_settings'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + // Load Settings + _settings->_struct = msg_create_struct(MSG_STRUCT_SETTING_CB_OPT); + ret = msg_get_cb_opt(_svc->service_h, _settings->_struct); + if (MSG_SUCCESS != ret) + { + msg_release_struct(&_settings->_struct); + free(_settings); + return ERROR_CONVERT(ret); + } + + // Load Channel List + msg_get_list_handle(_settings->_struct, MSG_CB_CHANNEL_LIST_STRUCT, (void **)&channels); + for (i=0; i < channels->nCount; i++) + { + _ch = (messages_cb_channel_s *)calloc(1, sizeof(messages_cb_channel_s)); + if (NULL == _ch) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_ch'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + _messages_cb_clear_settings(_settings); + free(_settings); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + msg_get_bool_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_ACTIVATE_BOOL, &_ch->activated); + msg_get_int_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_ID_FROM_INT, &_ch->from_id); + msg_get_int_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_ID_TO_INT, &_ch->to_id); + msg_get_str_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_NAME_STR, _ch->name, CB_CHANNEL_NAME_MAX); + + _settings->channel_list = g_slist_append(_settings->channel_list, (messages_cb_channel_h)_ch); + } + + if (NULL != _svc->cbs_settings_h) + { + _messages_cb_clear_settings((messages_cb_settings_s*)_svc->cbs_settings_h); + free(_svc->cbs_settings_h); + } + _svc->cbs_settings_h = (messages_cb_settings_h)_settings; + + *settings = (messages_cb_settings_h)_settings; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_save_settings(messages_service_h service, messages_cb_settings_h settings) +{ + int i; + int count; + int ret; + + messages_service_s *_svc = (messages_service_s *)service; + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + messages_cb_channel_s *_ch; + msg_struct_list_s *channels = NULL; + + CHECK_NULL(_svc); + CHECK_NULL(_svc->service_h); + CHECK_NULL(_settings); + CHECK_NULL(_settings->_struct); + + msg_get_list_handle(_settings->_struct, MSG_CB_CHANNEL_LIST_STRUCT, (void **)&channels); + + count = g_slist_length(_settings->channel_list); + if (CB_CHANNEL_MAX < count) + { + count = CB_CHANNEL_MAX; + } + channels->nCount = count; + + for (i=0; i < channels->nCount; i++) + { + _ch = (messages_cb_channel_s *)g_slist_nth_data(_settings->channel_list, i); + + msg_set_bool_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_ACTIVATE_BOOL, _ch->activated); + msg_set_int_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_ID_FROM_INT, _ch->from_id); + msg_set_int_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_ID_TO_INT, _ch->to_id); + msg_set_str_value(channels->msg_struct_info[i], MSG_CB_CHANNEL_NAME_STR, _ch->name, CB_CHANNEL_NAME_MAX); + } + + ret = msg_set_cb_opt(_svc->service_h, _settings->_struct); + + return ERROR_CONVERT(ret); +} + + +int messages_cb_settings_set_enabled(messages_cb_settings_h settings, bool enabled) +{ + int ret; + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + CHECK_NULL(_settings); + CHECK_NULL(_settings->_struct); + + ret = msg_set_bool_value(_settings->_struct, MSG_CB_RECEIVE_BOOL, enabled); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_settings_is_enabled(messages_cb_settings_h settings, bool *enabled) +{ + int ret; + bool _enabled; + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + CHECK_NULL(_settings); + CHECK_NULL(_settings->_struct); + CHECK_NULL(enabled); + + ret = msg_get_bool_value(_settings->_struct, MSG_CB_RECEIVE_BOOL, &_enabled); + if (MSG_SUCCESS != ret) + { + return ERROR_CONVERT(ret); + } + + *enabled = _enabled; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_settings_add_channel(messages_cb_settings_h settings, messages_cb_channel_h channel) +{ + int count; + + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + CHECK_NULL(_settings); + CHECK_NULL(channel); + + count = g_slist_length(_settings->channel_list); + if (CB_CHANNEL_MAX <= count) + { + LOGE("[%s] OUT_OF_RANGE(0x%08x) channel_list is full." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_RANGE; + } + + _settings->channel_list = g_slist_append(_settings->channel_list, channel); + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_settings_remove_channel(messages_cb_settings_h settings, messages_cb_channel_h channel) +{ + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + CHECK_NULL(_settings); + CHECK_NULL(channel); + + _settings->channel_list = g_slist_remove_all(_settings->channel_list, channel); + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_settings_get_channel(messages_cb_settings_h settings, int index, messages_cb_channel_h *channel) +{ + messages_cb_channel_h ch; + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + CHECK_NULL(_settings); + CHECK_NULL(channel); + + ch = (messages_cb_channel_h)g_slist_nth_data(_settings->channel_list, index); + if (NULL == ch) + { + LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : No channel data in the channel list.", + __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED); + return MESSAGES_ERROR_OPERATION_FAILED; + } + + *channel = ch; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_settings_get_channel_count(messages_cb_settings_h settings, int *count) +{ + messages_cb_settings_s *_settings = (messages_cb_settings_s *)settings; + + CHECK_NULL(_settings); + CHECK_NULL(count); + + *count = g_slist_length(_settings->channel_list); + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_create_channel(messages_cb_channel_h *channel) +{ + messages_cb_channel_s *_channel; + + CHECK_NULL(channel); + + _channel = (messages_cb_channel_s *)calloc(1, sizeof(messages_cb_channel_s)); + if (NULL == _channel) + { + LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create '_channel'." + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY); + return MESSAGES_ERROR_OUT_OF_MEMORY; + } + + *channel = (messages_cb_channel_h)_channel; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_destroy_channel(messages_cb_channel_h channel) +{ + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + + free(channel); + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_channel_set_id(messages_cb_channel_h channel, int from_id, int to_id) +{ + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + + _channel->from_id = from_id; + _channel->to_id = to_id; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_channel_get_id(messages_cb_channel_h channel, int *from_id, int *to_id) +{ + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + CHECK_NULL(from_id); + CHECK_NULL(to_id); + + *from_id = _channel->from_id; + *to_id = _channel->to_id; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_channel_set_name(messages_cb_channel_h channel, const char *name) +{ + int size; + + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + CHECK_NULL(name); + + size = strlen(name); + + if (CB_CHANNEL_NAME_MAX < size) + { + LOGE("[%s] OUT_OF_RANGE(0x%08x) channel name > %d" + , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY, CB_CHANNEL_NAME_MAX); + return MESSAGES_ERROR_OUT_OF_RANGE; + } + + strncpy(_channel->name, name, CB_CHANNEL_NAME_MAX); + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_channel_get_name(messages_cb_channel_h channel, char **name) +{ + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + CHECK_NULL(name); + + *name = strdup(_channel->name); + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_channel_set_activated(messages_cb_channel_h channel, bool activated) +{ + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + + _channel->activated = activated; + + return MESSAGES_ERROR_NONE; +} + +int messages_cb_channel_is_activated(messages_cb_channel_h channel, bool *activated) +{ + messages_cb_channel_s *_channel = (messages_cb_channel_s *)channel; + + CHECK_NULL(_channel); + CHECK_NULL(activated); + + *activated = _channel->activated; + + return MESSAGES_ERROR_NONE; +} + + + + + diff --git a/src/messages_push.c b/src/messages_push.c new file mode 100644 index 0000000..a6f0bd3 --- /dev/null +++ b/src/messages_push.c @@ -0,0 +1,243 @@ +/*
+ * 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 <sys/stat.h>
+#include <unistd.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+
+#include <glib.h>
+
+#include <dlog.h>
+#include <msg.h>
+#include <msg_transport.h>
+#include <msg_storage.h>
+
+#include <app.h>
+
+#include <messages.h>
+#include <messages_types.h>
+#include <messages_private.h>
+
+#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)
+{
+ 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)
+{
+ 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)
+{
+ 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_package(&pkg_name);
+ if (APP_ERROR_NONE != ret) {
+ LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_package 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)
+{
+ 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_package(&pkg_name);
+ if (APP_ERROR_NONE != ret) {
+ LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_package 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)
+{
+ 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_package(&pkg_name);
+ if (APP_ERROR_NONE != ret) {
+ LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_package 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_search_test.c.swp b/test/.messages_search_test.c.swp Binary files differnew file mode 100644 index 0000000..b224d24 --- /dev/null +++ b/test/.messages_search_test.c.swp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100755 index 0000000..7715cac --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,17 @@ +SET(fw_test "${fw_name}-test") + +INCLUDE(FindPkgConfig) +pkg_check_modules(${fw_test} REQUIRED glib-2.0) +FOREACH(flag ${${fw_test}_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall") + +aux_source_directory(. sources) +FOREACH(src ${sources}) + GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) + MESSAGE("${src_name}") + ADD_EXECUTABLE(${src_name} ${src}) + TARGET_LINK_LIBRARIES(${src_name} ${fw_name} ${${fw_test}_LDFLAGS}) +ENDFOREACH() diff --git a/test/messages_cb_channel_test.c b/test/messages_cb_channel_test.c new file mode 100644 index 0000000..f3bf92d --- /dev/null +++ b/test/messages_cb_channel_test.c @@ -0,0 +1,37 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <messages.h> + +int main(int argc, char *argv[]) +{ + int ret; + + messages_service_h svc; + + messages_cb_settings_h settings; + + + + // open service + ret = messages_open_service(&svc); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_open_service() = %d", ret); + return 1; + } + + ret = messages_cb_load_settings(svc, &settings); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_cb_load_settings() = %d", ret); + return 1; + } + + + + + // close service + messages_close_service(svc); + + + return 0; +} diff --git a/test/messages_incoming_test.c b/test/messages_incoming_test.c new file mode 100644 index 0000000..8339b5f --- /dev/null +++ b/test/messages_incoming_test.c @@ -0,0 +1,104 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <glib.h> + +#include <messages.h> + +#define ERROR_CHECK(ret) \ + if (MESSAGES_ERROR_NONE != ret) { \ + printf("%d: error, ret=%d \n", __LINE__, ret); \ + exit(1); \ + } + +static GMainLoop *mainloop; + +static void sig_quit(int signo) +{ + if(mainloop) + { + g_main_loop_quit(mainloop); + } +} + +void incoming_cb(messages_message_h msg, void *user_data) +{ + int ret; + messages_message_type_e msgType; + char *text; + int i, nAddr; + char *addr = NULL; + time_t time; + struct tm *ptm; + + printf("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); + free(addr); + } + } + + ret = messages_get_text(msg, &text); + if (MESSAGES_ERROR_NONE == ret) { + printf("Text: %s\n", text); + free(text); + } else { + printf("%d: error, ret=%d\n", __LINE__, ret); + } + + + messages_get_message_type(msg, &msgType); + switch(msgType) { + case MESSAGES_TYPE_SMS: + printf("Type: SMS\n"); + break; + case MESSAGES_TYPE_MMS: + printf("Type: MMS\n"); + break; + default: + printf("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 + ); + + +} + +int main(int argc, char *argv[]) +{ + int ret; + messages_service_h svc; + + + signal(SIGINT, sig_quit); + signal(SIGTERM, sig_quit); + signal(SIGQUIT, sig_quit); + mainloop = g_main_loop_new(NULL, FALSE); + + ret = messages_open_service(&svc); + ERROR_CHECK(ret); + + + messages_set_message_incoming_cb(svc, incoming_cb, NULL); + + g_main_loop_run(mainloop); + g_main_loop_unref(mainloop); + + messages_close_service(svc); + + + return 0; +} + diff --git a/test/messages_search_test.c b/test/messages_search_test.c new file mode 100644 index 0000000..5bca8bc --- /dev/null +++ b/test/messages_search_test.c @@ -0,0 +1,99 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <messages.h> + + +bool _search_cb(messages_message_h msg, int index, int result_count, int total_count, void *user_data) +{ + messages_message_type_e msgType; + messages_message_box_e mbox; + int ret; + char *text; + int i, nAddr; + char *addr = NULL; + time_t time; + + messages_get_message_type(msg, &msgType); + + printf("=[%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); + free(addr); + } + } + + ret = messages_get_text(msg, &text); + if (MESSAGES_ERROR_NONE == ret) { + printf("Text: %s\n", text); + free(text); + } + + if (MESSAGES_TYPE_SMS == msgType) { + printf("Type: SMS\n"); + } else if (MESSAGES_TYPE_MMS == msgType) { + printf("Type: MMS\n"); + ret = messages_mms_get_subject(msg, &text); + if (MESSAGES_ERROR_NONE == ret) { + printf("Subject: %s\n", text); + free(text); + } + } else { + printf("Type: Unknown"); + } + + + ret = messages_get_time(msg, &time); + printf("Time: %d, %s", (int)time, ctime(&time)); + + ret = messages_get_mbox_type(msg, &mbox); + printf("MBOX: %d\n", mbox); + + + return true; +} + +int main(int argc, char *argv[]) +{ + int ret; + int count; + + messages_service_h svc; + + // open service + ret = messages_open_service(&svc); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_open_service() = %d", ret); + return 1; + } + + ret = messages_foreach_message(svc, + MESSAGES_MBOX_ALL, MESSAGES_TYPE_UNKNOWN, + NULL, NULL, + 0, 0, _search_cb, NULL); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_foreach_message_from_db() = %d", ret); + return 1; + } + + printf("===============================================\n"); + ret = messages_get_message_count(svc, MESSAGES_MBOX_INBOX, MESSAGES_TYPE_SMS, &count); + printf("INBOX: %d messages\n", count); + ret = messages_get_message_count(svc, MESSAGES_MBOX_SENTBOX, MESSAGES_TYPE_SMS, &count); + printf("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); + ret = messages_get_message_count(svc, MESSAGES_MBOX_OUTBOX, MESSAGES_TYPE_MMS, &count); + printf("OUTBOX: %d mms messages\n", count); + + + + // destroy + messages_close_service(svc); + + + return 0; +} diff --git a/test/messages_send_mms_test.c b/test/messages_send_mms_test.c new file mode 100644 index 0000000..76c0aa8 --- /dev/null +++ b/test/messages_send_mms_test.c @@ -0,0 +1,55 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <messages.h> + +#define TEST_NUMBER "000000000" + +void _sent_cb(messages_sending_result_e result, void *user_data) +{ +} + +int main(int argc, char *argv[]) +{ + int ret; + + 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); + return 1; + } + + // create message + ret = messages_create_message(MESSAGES_TYPE_MMS, &msg); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_create_message() = %d", ret); + return 1; + } + + messages_add_address(msg, TEST_NUMBER, MESSAGES_RECIPIENT_TO); + 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_IMAGE, "/opt/etc/msg-service/P091120_104633.jpg"); + + printf("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); + return 1; + } + + // destroy + messages_destroy_message(msg); + messages_close_service(svc); + + + return 0; +} diff --git a/test/messages_send_sms_test.c b/test/messages_send_sms_test.c new file mode 100644 index 0000000..d54cc53 --- /dev/null +++ b/test/messages_send_sms_test.c @@ -0,0 +1,49 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <messages.h> + +#define TEST_NUMBER "00000000000" + +void _sent_cb(messages_sending_result_e result, void *user_data) +{ +} + +int main(int argc, char *argv[]) +{ + int ret; + + 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); + return 1; + } + + // create message + ret = messages_create_message(MESSAGES_TYPE_SMS, &msg); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_create_message() = %d", ret); + return 1; + } + + messages_add_address(msg, TEST_NUMBER, MESSAGES_RECIPIENT_TO); + messages_set_text(msg, "This is simple message!"); + + // send message + ret = messages_send_message(svc, msg, true, _sent_cb, NULL); + if (MESSAGES_ERROR_NONE != ret) { + printf("error: messages_send_message() = %d", ret); + return 1; + } + + // destroy + messages_destroy_message(msg); + messages_close_service(svc); + + + return 0; +} |