From 7208f7bd77757c8a8313c7da01daf98b87bd3c9c Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Wed, 10 Jun 2015 11:39:55 +0900 Subject: [PATCH 02/11] appcore-widget : initial commit The capi-appcore-widget provides functions for handling Tizen widget application state changes or system events. Tizen widget application can be shown in the home screen. This APIs support making multiple widget instances per an application. This API provides interfaces for the following categories: - Starting or exiting the main event loop - Registering callbacks for application state change events - Registering callbacks for basic system events - Registering callbacks for instance state change events Change-Id: I9400f117c5c4c1e2efb0214caf41798691c308cb Signed-off-by: Jiwoong Im --- AUTHORS | 1 + CMakeLists.txt | 59 ++ LICENSE | 204 +++++++ appcore-widget.manifest | 5 + capi-appfw-widget-application.pc | 13 + doc/appcore-widget_doc.h | 126 +++++ doc/images/widget_app_lifecycle.png | Bin 0 -> 23168 bytes doc/images/widget_obj_lifecycle.png | Bin 0 -> 54040 bytes include/widget_app.h | 424 ++++++++++++++ include/widget_app_efl.h | 55 ++ include/widget_app_internal.h | 74 +++ packaging/appcore-widget.spec | 70 +++ src/widget-i18n.c | 180 ++++++ src/widget-log.h | 81 +++ src/widget-private.h | 33 ++ src/widget_app.c | 1048 +++++++++++++++++++++++++++++++++++ src/widget_error.c | 96 ++++ 17 files changed, 2469 insertions(+) create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 appcore-widget.manifest create mode 100644 capi-appfw-widget-application.pc create mode 100755 doc/appcore-widget_doc.h create mode 100755 doc/images/widget_app_lifecycle.png create mode 100755 doc/images/widget_obj_lifecycle.png create mode 100755 include/widget_app.h create mode 100644 include/widget_app_efl.h create mode 100644 include/widget_app_internal.h create mode 100644 packaging/appcore-widget.spec create mode 100755 src/widget-i18n.c create mode 100755 src/widget-log.h create mode 100644 src/widget-private.h create mode 100755 src/widget_app.c create mode 100755 src/widget_error.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..12534b4 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Junghoon Park diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..86cbc99 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,59 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(appcore-widget C) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(INCLUDEDIR "\${prefix}/include") +SET(VERSION_MAJOR 1) +SET(VERSION "${VERSION_MAJOR}.1") + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +SET(CMAKE_SKIP_BUILD_RPATH TRUE) + +################################################################# +# Build appcore-widget Library +# ------------------------------ +SET(APPCORE_WIDGET "capi-appfw-widget-application") +SET(SRCS_widget + src/widget-i18n.c + src/widget_app.c + src/widget_error.c + ) +SET(HEADERS_widget widget_app.h widget_app_efl.h widget_app_internal.h) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkg_widget REQUIRED + aul + dlog + capi-appfw-app-control + capi-appfw-app-common + vconf + elementary + vconf-internal-keys + widget_service + widget_provider_app + widget + capi-system-info + ) +FOREACH(flag ${pkg_widget_CFLAGS}) + SET(EXTRA_CFLAGS_widget "${EXTRA_CFLAGS_widget} ${flag}") +ENDFOREACH(flag) + +ADD_LIBRARY(${APPCORE_WIDGET} SHARED ${SRCS_widget}) +SET_TARGET_PROPERTIES(${APPCORE_WIDGET} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${APPCORE_WIDGET} PROPERTIES VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${APPCORE_WIDGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS_widget}) +TARGET_LINK_LIBRARIES(${APPCORE_WIDGET} ${pkg_widget_LDFLAGS} "-ldl") + +INSTALL(TARGETS ${APPCORE_WIDGET} DESTINATION ${LIB_INSTALL_DIR} COMPONENT RuntimeLibraries) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPCORE_WIDGET}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) +FOREACH(hfile ${HEADERS_widget}) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${hfile} DESTINATION include/appfw) +ENDFOREACH(hfile) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9c13a9b --- /dev/null +++ b/LICENSE @@ -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/appcore-widget.manifest b/appcore-widget.manifest new file mode 100644 index 0000000..97e8c31 --- /dev/null +++ b/appcore-widget.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/capi-appfw-widget-application.pc b/capi-appfw-widget-application.pc new file mode 100644 index 0000000..e7ded40 --- /dev/null +++ b/capi-appfw-widget-application.pc @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIB_INSTALL_DIR@ +includedir=@INCLUDEDIR@ + +Name: capi-appfw-widget-application +Description: widget application library +Version: 1.1 +Requires: aul dlog elementary capi-appfw-app-control capi-appfw-app-common widget_service widget_provider_app widget +Libs: -L${libdir} -lcapi-appfw-widget-application +Cflags: -I${includedir} -I${includedir}/appfw diff --git a/doc/appcore-widget_doc.h b/doc/appcore-widget_doc.h new file mode 100755 index 0000000..a6833ee --- /dev/null +++ b/doc/appcore-widget_doc.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2015 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. + */ + +/** + * + * @ingroup CAPI_WIDGET_FRAMEWORK + * @defgroup CAPI_WIDGET_APP_MODULE Widget Application + * @brief Widget application API + * + * @section CAPI_WIDGET_APP_MODULE_HEADER Required Header + * \#include + * \#include + * @section CAPI_WIDGET_APP_MODULE_OVERVIEW Overview + * The @ref CAPI_WIDGET_APP_MODULE API provides functions for handling Tizen widget application state changes or system events. Tizen widget application can be shown in the home screen. + * This APIs support making multiple widget instances per an application. + * + * This API provides interfaces for the following categories: + * - Starting or exiting the main event loop + * - Registering callbacks for application state change events + * - Registering callbacks for basic system events + * - Registering callbacks for instance state change events + * + * @subsection CAPI_WIDGET_APP_MODULE_STATE_CHANGE_EVENT Registering Callbacks for Application State Change Events + * As for Tizen widget application states, it is very simple and somewhat similer to Tizen service application states. + * + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
Callback Description
widget_app_create_cb()Hook to take necessary actions before the main event loop starts. + * Your UI generation code should be placed here so that you do not miss any events from your application UI. + * Please make sure that you should make a class handle and return it. It will be used when the event for creating widget instance is received. + * You can initialize shared resources for widget instances in this callback function as well. + *
widget_app_terminate_cb() Hook to take necessary actions when your application is terminating. + * Your application should release all resources, especially any + * allocations and shared resources must be freed here so other running applications can fully use these shared resources. + *
+ *

+ * + * Please refer to the following state diagram to see the possible transitions and callbacks that are called while transition. + * @image html widget_app_lifecycle.png "Widget Application States" + * + * @subsection CAPI_WIDGET_APP_MODULE_SYSTEM_EVENT Registering Callbacks for System Events + * Tizen widget applications can receive system events with widget_app_add_event_handler() api. + * The type of system events that can be received are same as Tizen UI applications except for APP_EVENT_DEVICE_ORIENTATION_CHANGED. + * See @ref CAPI_APPLICATION_MODULE. + * The event for APP_EVENT_DEVICE_ORIENTATION_CHANGED is not supported in this module. + * + * @subsection CAPI_WIDGET_APP_INSTNACE_STATE_CHANGE_EVENT Registering callbacks for instance state change events + * As for Tizen widget instance states, it is somewhat similer to Tizen application states. + * + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Callback Description
widget_obj_create_cb() Called after widget instance is created. + * In this callback, you can initialize resources for this instance. + * If parameter 'content' is not NULL, You should restore the pervious status. + *
widget_obj_destroy_cb() Called before widget instance is destroyed. + * In this callback, you can finalize resources for this instance. + *
widget_obj_pause_cb() Called when the widget is invisible. + * The paused instance may be destroyed by framework + *
widget_obj_resume_cb() Called when the widget is visible. + * The callback function is called when the widget is visible. + *
widget_obj_resize_cb() Called before the widget size is changed. + * The callback function is called before the widget size is changed. + *
widget_obj_update_cb() Called when the event for updating widget is received. + * The callback function is called when the event for updating widget is received. + *
+ *

+ * + * Please refer to the following state diagram to see the possible transitions and callbacks that are called while transition. + * @image html widget_obj_lifecycle.png "Widget Instance States" + * + * + * + */ diff --git a/doc/images/widget_app_lifecycle.png b/doc/images/widget_app_lifecycle.png new file mode 100755 index 0000000000000000000000000000000000000000..13d394c2cc9bf75505979bdcabe327d666f942b1 GIT binary patch literal 23168 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 literal 0 HcmV?d00001 diff --git a/doc/images/widget_obj_lifecycle.png b/doc/images/widget_obj_lifecycle.png new file mode 100755 index 0000000000000000000000000000000000000000..71113aa56eee7e54f8cfbac911f0d27eaab87cf4 GIT binary patch literal 54040 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 KF;Cvm_kRIRMQxw} literal 0 HcmV?d00001 diff --git a/include/widget_app.h b/include/widget_app.h new file mode 100755 index 0000000..49180e1 --- /dev/null +++ b/include/widget_app.h @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2015 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_APPFW_WIDGET_APP_H__ +#define __TIZEN_APPFW_WIDGET_APP_H__ + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup CAPI_WIDGET_APP_MODULE + * @{ + */ + +/** + * @brief Destroy type of widget instance + * @since_tizen 2.3.1 + */ +typedef enum widget_app_destroy_type { + WIDGET_APP_DESTROY_TYPE_DEFAULT = 0x00, /**< Deleted */ + WIDGET_APP_DESTROY_TYPE_UPGRADE = 0x01, /**< Deleted for upgrading */ + WIDGET_APP_DESTROY_TYPE_UNINSTALL = 0x02, /**< Deleted by uninstalling */ + WIDGET_APP_DESTROY_TYPE_TERMINATE = 0x03, /**< Deleted for reboot device */ + WIDGET_APP_DESTROY_TYPE_FAULT = 0x04, /**< Deleted by system-fault */ + WIDGET_APP_DESTROY_TYPE_TEMPORARY = 0x05, /**< Temporarly deleted, will be created again */ + WIDGET_APP_DESTROY_TYPE_UNKNOWN = 0x06 /**< Undefined reason */ +} widget_app_destroy_type_e; /**< Delete type */ + +/** + * @brief The handle for widget class. + * @since_tizen 2.3.1 + */ +typedef struct _widget_class* widget_class_h; + +/** + * @brief The handle for widget context + * @since_tizen 2.3.1 + */ +typedef struct _widget_context* widget_context_h; + +/** + * @brief Called when the widget instance starts. + * @since_tizen 2.3.1 + * + * @details The callback function is called after widget instance is created. + * In this callback, you can initialize resources for this instance. + * + * @param[in] context The context of widget instance. + * @param[in] content The data set for the previous status + * @param[in] w The pixel value for widget width + * @param[in] h The pixel value for widget height + * + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + */ +typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *content, int w, int h); + +/** + * @brief Called before the widget instance is destroyed. + * @since_tizen 2.3.1 + * + * @details The callback function is called before widget instance is destroyed. + * In this callback, you can finalize resources for this instance. + * If reason is not #WIDGET_APP_DESTROY_TYPE_DEFAULT, It should store the current status by using incoming bundle. + * + * @param[in] context The context of widget instance. + * @param[in] reason The reason for destruction + * @param[in,out] content The data set to save + * @remark Note that the parameter 'content' is used to save the status of the widget instance. + * As a input parameter, content contains the saved status of the widget instance. + * You can fill the content parameter with the current status in this callback, + * then the framework will save the content by receiving it as a output parameter. + * Consequently, you should not use widget_app_context_set_content_info() api in this callback. + * The content will be overwritten after this callback returns with the 'content' parameter. + * + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + */ +typedef int (*widget_instance_destroy_cb)(widget_context_h context, widget_app_destroy_type_e reason, bundle *content); + +/** + * @brief Called when the widget is invisible. + * @since_tizen 2.3.1 + * + * @details The callback function is called when the widget is invisible. + * The paused instance may be destroyed by framework + * + * @param[in] context The context of widget instance. + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + */ +typedef int (*widget_instance_pause_cb)(widget_context_h context); + +/** + * @brief Called when the widget is visible. + * @since_tizen 2.3.1 + * + * @details The callback function is called when the widget is visible. + * + * @param[in] context The context of widget instance. + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + */ +typedef int (*widget_instance_resume_cb)(widget_context_h context); + +/** + * @brief Called before the widget size is changed. + * @since_tizen 2.3.1 + * + * @details The callback function is called before the widget size is changed. + * + * @param[in] context The context of widget instance. + * @param[in] w The pixel value for widget width + * @param[in] h The pixel value for widget height + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + */ +typedef int (*widget_instance_resize_cb)(widget_context_h context, int w, int h); + +/** + * @brief Called when the event for updating widget is received. + * @since_tizen 2.3.1 + * + * @details The callback function is called when the event for updating widget is received. + * + * @param[in] context The context of widget instance. + * @param[in] content The data set for updating this widget. It will be provided by requester. + * Requester can use widget_service_trigger_update(). + * @param[in] force Although the widget is paused, if it is TRUE, the widget can be updated. + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @see widget_service_trigger_update + */ +typedef int (*widget_instance_update_cb)(widget_context_h context, bundle *content, int force); + +/** + * @brief The structure for lifecycle of a widget instance + * @since_tizen 2.3.1 + */ +typedef struct +{ + widget_instance_create_cb create; /**< The callback function is called after widget instance is created. */ + widget_instance_destroy_cb destroy; /**< The callback function is called before widget instance is destroyed. */ + widget_instance_pause_cb pause; /**< The callback function is called when the widget is invisible. */ + widget_instance_resume_cb resume; /**< The callback function is called when the widget is visible. */ + widget_instance_resize_cb resize; /**< The callback function is called before the widget size is changed. */ + widget_instance_update_cb update; /**< The callback function is called when the event for updating widget is received. */ +} widget_instance_lifecycle_callback_s; + +/** + * @brief Called when the application starts. + * @since_tizen 2.3.1 + * + * @details The callback function is called before the main loop of the application starts. + * In this callback, you can initialize resources which can be shared among widget instances. + * This function should return the handle for widget class so that it will be used for making instances of widget. + * + * @param[in] user_data The user data passed from the callback registration function + * @return The object of widget class + * @see widget_app_main() + * @code + * + * static widget_class_h __widget_app_created(void *user_data) + * { + * widget_instance_lifecycle_callback_s callback = { .... }; + * + * return widget_app_class_create(callback); + * } + * + * @endcode + */ +typedef widget_class_h (*widget_app_create_cb)(void *user_data); + +/** + * @brief Called when the application's main loop exits. + * @details This callback function is called once after the main loop of the application exits. + * You should release the application's resources in this function. + * @since_tizen 2.3.1 + * + * @param[in] user_data The user data passed from the callback registration function + * @see widget_app_main() + */ +typedef void (*widget_app_terminate_cb)(void *user_data); + +/** + * @brief The structure for lifecycle of a widget application + * @since_tizen 2.3.1 + */ +typedef struct +{ + widget_app_create_cb create; /**< The callback function is called before the main loop of the application starts. */ + widget_app_terminate_cb terminate; /**< This callback function is called once after the main loop of the application exits. */ +} widget_app_lifecycle_callback_s; + +/** + * @brief Called for each widget context + * @since_tizen 2.3.1 + * + * @details This function will be called in the function of widget_app_foreach_context repeatedly. + * + * @param[in] context The context for widget instance + * @param[in] data The data for caller + * @return true to continue with the next iteration of the loop, + * otherwise false to break out of the loop. + * @see widget_app_foreach_context + */ +typedef bool (*widget_context_cb)(widget_context_h context, void *data); + +/** + * @brief Runs the main loop of the application until widget_app_exit() is called. + * @since_tizen 2.3.1 + * + * @param[in] argc The argument count + * @param[in] argv The argument vector + * @param[in] callback The set of callback functions to handle application events + * @param[in] user_data The user data to be passed to the callback functions + * + * @return @c 0 on success, + * otherwise a negative error value. + * @retval #WIDGET_ERROR_NONE Successful + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @see widget_app_exit + */ +int widget_app_main(int argc, char **argv, widget_app_lifecycle_callback_s *callback, void *user_data); + +/** + * @brief Exits the main loop of the application. + * @details The main loop of the application stops and widget_app_terminate_cb() is invoked. + * @since_tizen 2.3.1 + * + * @return @c 0 on success, + * otherwise a negative error value. + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @see widget_app_main + * @see widget_app_terminate_cb + */ +int widget_app_exit(void); + +/** + * @brief Finishes context for the widget instance + * @since_tizen 2.3.1 + * + * @param[in] context The context for widget instance + * + * @return @c 0 on success, otherwise a negative error value. + * @retval #WIDGET_ERROR_NONE Successfull + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + */ +int widget_app_terminate_context(widget_context_h context); + +/** + * @brief Retrieves all widget contexts in this application + * @since_tizen 2.3.1 + * + * @param[in] callback The iteration callback function + * @param[in] data The data for the callback function + * + * @return 0 on success, otherwise a negative error value + * @retval #WIDGET_ERROR_NONE Successfull + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_CANCELED The iteration is canceled + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @see widget_app_foreach_context + */ +int widget_app_foreach_context(widget_context_cb callback, void *data); + +/** + * @brief Adds the system event handler + * @since_tizen 2.3.1 + * + * @param[out] event_handler The event handler + * @param[in] event_type The system event type. APP_EVENT_DEVICE_ORIENTATION_CHANGED is not supported + * @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 #WIDGET_ERROR_NONE Successfull + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @see app_event_type_e + * @see app_event_cb + * @see watch_app_remove_event_handler + */ +int widget_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, + app_event_cb callback, void *user_data); + +/** + * @brief Removes registered event handler + * @since_tizen 2.3.1 + * + * @param[in] event_handler The event handler + * + * @return 0 on success, otherwise a negative error value + * @retval #WIDGET_ERROR_NONE Successfull + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @see watch_app_add_event_handler + */ +int widget_app_remove_event_handler(app_event_handler_h event_handler); + +/** + * @brief Gets a widget instance id + * @since_tizen 2.3.1 + * + * @param[in] context The context for widget instance + * + * @return Widget ID on success, otherwise NULL + * You can get the returned value using get_last_result() + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @remark You must not free returned Widget ID + * @see get_last_result + */ +const char* widget_app_get_id(widget_context_h context); + +/** + * @brief Makes a class for widget instances. + * @since_tizen 2.3.1 + * + * @param[in] callback The set of lifecycle callbacks + * @return The handle of class on success, otherwise NULL + * You can get the returned value using get_last_result() + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @see get_last_result + */ +widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback); + +/** + * @brief Sets a tag in the context + * @since_tizen 2.3.1 + * + * @param[in] context The context for widget instance + * @param[in] tag The value to save + * + * @return 0 on success, otherwise a negative error value + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + */ +int widget_app_context_set_tag(widget_context_h context, void *tag); + +/** + * @brief Gets the tag in the context + * @since_tizen 2.3.1 + * + * @param[in] context The context for widget instance + * @param[out] tag The value to get + * + * @return 0 on success, otherwise a negative error value + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + */ +int widget_app_context_get_tag(widget_context_h context, void **tag); + +/** + * @brief Sets the content info to the widget + * @since_tizen 2.3.1 + * @param[in] context The context for widget instance + * @param[in] content_info The data set to save + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid argument + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @retval #WIDGET_ERROR_NONE Successfully sent + */ +int widget_app_context_set_content_info(widget_context_h context, bundle *content_info); + +/** + * @brief Sends the title to the widget + * @since_tizen 2.3.1 + * @param[in] context The context for widget instance + * @param[in] title When an accessibility mode is turned on, this string will be read. + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid argument + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @retval #WIDGET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @retval #WIDGET_ERROR_NONE Successfully sent + */ +int widget_app_context_set_title(widget_context_h context, const char *title); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_APPFW_WIDGET_APP_H__ */ diff --git a/include/widget_app_efl.h b/include/widget_app_efl.h new file mode 100644 index 0000000..4bd1765 --- /dev/null +++ b/include/widget_app_efl.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015 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_APPFW_WIDGET_APP_EFL_H__ +#define __TIZEN_APPFW_WIDGET_APP_EFL_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup CAPI_WIDGET_APP_MODULE + * @{ + */ + +/** + * @brief Gets a evas object for the widget + * @since_tizen 2.3.1 + * + * @param[in] context The context for widget instance + * @param[out] win Evas object for window + * + * @return 0 on success, otherwise a negative error value + * @retval #WIDGET_ERROR_NONE Successfull + * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIDGET_ERROR_FAULT Failed to make evas object + * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported + */ +int widget_app_get_elm_win(widget_context_h context, Evas_Object **win); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/widget_app_internal.h b/include/widget_app_internal.h new file mode 100644 index 0000000..968f584 --- /dev/null +++ b/include/widget_app_internal.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2015 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_APPFW_WIDGET_APP_INTERNAL_H__ +#define __TIZEN_APPFW_WIDGET_APP_INTERNAL_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * For in-house applications + * + */ + +typedef struct +{ + struct __pointer + { + double x; + double y; + int down; + } pointer; + + struct __part + { + double sx; + double sy; + double ex; + double ey; + } part; + +} widget_obj_event_info_s; + +typedef int (*widget_instance_text_signal_cb)(widget_context_h context, const char *signal_name, + const char *source, widget_obj_event_info_s *info); + +typedef struct _widget_obj_private_ops +{ + widget_instance_text_signal_cb text_signal; +} widget_obj_private_ops_s; + +typedef struct _widget_class_factory_full widget_class_factory_full_s; +typedef const widget_class_factory_full_s* (*widget_class_factory_override_text_signal)(widget_instance_text_signal_cb op); + +typedef widget_class_h (*_widget_class_factory_operation_make)(widget_instance_lifecycle_callback_s callback); + +struct _widget_class_factory_full +{ + widget_class_factory_override_text_signal override_text_signal; +}; + +const widget_class_factory_full_s* widget_app_get_class_factory(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/packaging/appcore-widget.spec b/packaging/appcore-widget.spec new file mode 100644 index 0000000..e8c6bcf --- /dev/null +++ b/packaging/appcore-widget.spec @@ -0,0 +1,70 @@ +Name: appcore-widget +Summary: Widget Application +Version: 1.0.0.0 +Release: 1 +Group: Application Framework/Libraries +License: Apache-2.0 +Source0: appcore-widget-%{version}.tar.gz +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(dbus-glib-1) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(vconf-internal-keys) +BuildRequires: pkgconfig(alarm-service) +BuildRequires: pkgconfig(capi-appfw-app-control) +BuildRequires: pkgconfig(capi-appfw-app-common) +BuildRequires: pkgconfig(widget_service) +BuildRequires: pkgconfig(widget_provider_app) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(widget) +BuildRequires: cmake + + +%description +Widget application + +%package -n capi-appfw-widget-application-devel +Summary: Widget application +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +%description -n capi-appfw-widget-application-devel +widget application (development files) + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%__make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +mkdir -p %{buildroot}%{_libdir}/pkgconfig +cp capi-appfw-widget-application.pc %{buildroot}%{_libdir}/pkgconfig +mkdir -p %{buildroot}/usr/share/license +cp LICENSE %{buildroot}/usr/share/license/%{name} + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + + +%files +%manifest appcore-widget.manifest +%defattr(-,root,root,-) +%{_libdir}/libcapi-appfw-widget-application.so +%{_libdir}/libcapi-appfw-widget-application.so.1 +%{_libdir}/libcapi-appfw-widget-application.so.1.1 +/usr/share/license/%{name} + +%files -n capi-appfw-widget-application-devel +/usr/include/appfw/widget_app.h +/usr/include/appfw/widget_app_efl.h +/usr/include/appfw/widget_app_internal.h +%{_libdir}/pkgconfig/capi-appfw-widget-application.pc + diff --git a/src/widget-i18n.c b/src/widget-i18n.c new file mode 100755 index 0000000..84c96aa --- /dev/null +++ b/src/widget-i18n.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "widget-log.h" +#include "widget-private.h" + +void _update_lang(void) +{ + char *lang = vconf_get_str(VCONFKEY_LANGSET); + if (lang) { + setenv("LANG", lang, 1); + setenv("LC_MESSAGES", lang, 1); + + char *r = setlocale(LC_ALL, ""); + if (r == NULL) { + r = setlocale(LC_ALL, lang); + if (r) { + _D("*****appcore setlocale=%s\n", r); + } + } + free(lang); + } else { + _E("failed to get current language for set lang env"); + } +} + +void _update_region(void) +{ + char *region; + char *r; + + region = vconf_get_str(VCONFKEY_REGIONFORMAT); + if (region) { + setenv("LC_CTYPE", region, 1); + setenv("LC_NUMERIC", region, 1); + setenv("LC_TIME", region, 1); + setenv("LC_COLLATE", region, 1); + setenv("LC_MONETARY", region, 1); + setenv("LC_PAPER", region, 1); + setenv("LC_NAME", region, 1); + setenv("LC_ADDRESS", region, 1); + setenv("LC_TELEPHONE", region, 1); + setenv("LC_MEASUREMENT", region, 1); + setenv("LC_IDENTIFICATION", region, 1); + r = setlocale(LC_ALL, ""); + if (r != NULL) { + _D("*****appcore setlocale=%s\n", r); + } + free(region); + } else { + _E("failed to get current region format for set region env"); + } +} + +static int __read_proc(const char *path, char *buf, int size) +{ + int fd; + int ret; + + if (buf == NULL || path == NULL) + return -1; + + fd = open(path, O_RDONLY); + if (fd < 0) + return -1; + + ret = read(fd, buf, size - 1); + if (ret <= 0) { + close(fd); + return -1; + } else + buf[ret] = 0; + + close(fd); + + return ret; +} + +static char* __proc_get_cmdline() +{ +#define MAX_CMD_BUFSZ 1024 + + char buf[MAX_CMD_BUFSZ]; + int ret; + + snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid()); + ret = __read_proc(buf, buf, sizeof(buf)); + if (ret <= 0) + return NULL; + + return strdup(buf); +} + +static void __get_dir_name(char *dirname, int maxlen) +{ + const char *path = NULL; + + path = aul_get_app_root_path(); + snprintf(dirname, maxlen, "%s/res/locale", path); + free(path); +} + + +static int __set_i18n(const char *domain) +{ + char *r; + char dirname[PATH_MAX] = {0, }; + + if (domain == NULL) { + errno = EINVAL; + return -1; + } + + __get_dir_name(dirname, PATH_MAX - 1); + _D("locale dir: %s", dirname); + + r = setlocale(LC_ALL, ""); + /* if locale is not set properly, try again to set as language base */ + if (r == NULL) { + char *lang = vconf_get_str(VCONFKEY_LANGSET); + r = setlocale(LC_ALL, lang); + if (r) { + _D("*****appcore setlocale=%s\n", r); + } + if (lang) { + free(lang); + } + } + if (r == NULL) { + _E("appcore: setlocale() error"); + } + + r = bindtextdomain(domain, dirname); + if (r == NULL) { + _E("appcore: bindtextdomain() error"); + } + + r = textdomain(domain); + if (r == NULL) { + _E("appcore: textdomain() error"); + } + + return 0; +} + +int _set_i18n(const char *domainname) +{ + _update_lang(); + _update_region(); + + return __set_i18n(domainname); +} + diff --git a/src/widget-log.h b/src/widget-log.h new file mode 100755 index 0000000..e8eb56d --- /dev/null +++ b/src/widget-log.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2015 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 __APPFW_WIDGET_LOG_H__ +#define __APPFW_WIDGET_LOG_H__ + +#include + +#define _E(fmt, arg...) LOGE(fmt, ##arg) +#define _I(fmt, arg...) LOGI(fmt, ##arg) +#define _D(fmt, arg...) LOGD(fmt, ##arg) +#define _W(fmt, arg...) LOGW(fmt, ##arg) + +#ifndef EXPORT_API +#define EXPORT_API __attribute__ ((visibility("default"))) +#endif + +#ifndef _E +#define _E(fmt, arg...) LOGE(fmt, ##arg) +#endif + +#ifndef _I +#define _I(...) LOGI(__VA_ARGS__) +#endif + +#ifndef _D +#define _D(...) LOGD(__VA_ARGS__) +#endif + +#ifndef _W +#define _W(...) LOGW(__VA_ARGS__) +#endif + +#define _warn_if(expr, fmt, arg...) do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + } \ + } while (0) + +#define _ret_if(expr) do { \ + if (expr) { \ + return; \ + } \ + } while (0) + +#define _retv_if(expr, val) do { \ + if (expr) { \ + return (val); \ + } \ + } while (0) + +#define _retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + return; \ + } \ + } while (0) + +#define _retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + return (val); \ + } \ + } while (0) + + +#endif //__APPFW_WIDGET_LOG_H_ diff --git a/src/widget-private.h b/src/widget-private.h new file mode 100644 index 0000000..662b734 --- /dev/null +++ b/src/widget-private.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2015 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 __APPCORE_WIDGET_PRIVATE_H__ +#define __APPCORE_WIDGET_PRIVATE_H__ + +#include +#include +#include + +#define FEATURE_SHELL_APPWIDGET "http://tizen.org/feature/shell.appwidget" + + +int _set_i18n(const char *domainname); +void _update_lang(void); +void _update_region(void); +int widget_app_error(widget_error_e error, const char* function, const char *description); + +#endif /* __APPCORE_WIDGET_PRIVATE_H__ */ diff --git a/src/widget_app.c b/src/widget_app.c new file mode 100755 index 0000000..17dd0f2 --- /dev/null +++ b/src/widget_app.c @@ -0,0 +1,1048 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "widget_app.h" +#include "widget-log.h" +#include "widget-private.h" +#include "widget_app_internal.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define STR_MAX_BUF 128 +#define LOG_TAG "CAPI_WIDGET_APPLICATION" +#define K_REASON "__WC_K_REASON__" + +#define ELM_WIN_TIZEN_WIDGET -1 +/* TODO + * This definition is intended to prevent the build break. + * This should be removed after adding ELM_WIN_TIZEN_WIDGET in Elm_Win_Type. + */ + +#define WIDGET_APP_EVENT_MAX 5 +static GList *handler_list[WIDGET_APP_EVENT_MAX] = {NULL, }; + +typedef enum _widget_obj_state_e { + WC_READY = 0, + WC_RUNNING = 1, + WC_PAUSED = 2, + WC_TERMINATED = 3 +} widget_obj_state_e; + +struct app_event_handler { + app_event_type_e type; + app_event_cb cb; + void *data; +}; + +struct app_event_info { + app_event_type_e type; + void *value; +}; + +struct _widget_class { + widget_instance_lifecycle_callback_s ops; + widget_obj_private_ops_s ops_private; +}; + +struct _widget_context { + char *id; + int state; + void *tag; + widget_instance_lifecycle_callback_s ops; + widget_obj_private_ops_s ops_private; +}; + +typedef struct _widget_class widget_class_s; +typedef struct _widget_context widget_context_s; + +static widget_app_lifecycle_callback_s *app_ops = NULL; +static void *app_user_data = NULL; +static widget_class_factory_full_s factory; +static widget_class_s *widget_class = NULL; +static widget_class_s widget_class_tmp; +static GList *contexts = NULL; +static int is_init_provider = 0; +static char *appid = NULL; +static int is_background = -1; + +static gint __comp_by_id(gconstpointer a, gconstpointer b) +{ + widget_context_s *wc = (widget_context_s*)a; + + return strcmp(wc->id, (const char*)b); +} + +static void __check_status_for_cgroup(void) +{ + GList *iter = g_list_first(contexts); + + while (iter != NULL) { + widget_context_s *cxt = (widget_context_s*) iter->data; + + if (cxt->state != WC_PAUSED) { + if (is_background != 0) { + is_background = 0; + _I("enter foreground group"); + //TODO: Do something to enter foreground group + } + return; + } + iter = g_list_next(iter); + } + + if (g_list_length(contexts) > 0 && is_background == 0) { + is_background = 1; + _I("enter background group"); + //TODO: DO something to enter background group + } +} + +static widget_context_s* __find_context_by_id(const char *id) +{ + GList* ret = g_list_find_custom(contexts, id, __comp_by_id); + + if ( ret == NULL) + return NULL; + + return ret->data; +} + +static int __provider_create_cb(const char *id, const char *content, int w, + int h, + void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *wc = (widget_context_s*)malloc(sizeof(widget_context_s)); + if (wc == NULL) + return WIDGET_ERROR_OUT_OF_MEMORY; + + wc->id = strdup(id); + wc->state = WC_READY; + wc->tag = NULL; + wc->ops = widget_class->ops; + wc->ops_private = widget_class->ops_private; + contexts = g_list_append(contexts, wc); + + if (wc->ops.create) { + bundle *b = bundle_decode((const bundle_raw*)content, strlen(content)); + ret = wc->ops.create(wc, b, w, h); + bundle_free(b); + } + _I("widget obj was created"); + + return ret; +} + +static int __provider_resize_cb(const char *id, int w, int h, void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) { + if (cxt->ops.resize) + ret = cxt->ops.resize(cxt, w, h); + _I("received resizing signal"); + } else { + _E("could not find widget obj : %s", __FUNCTION__); + } + + return ret; +} + +static int __provider_destroy_cb(const char *id, widget_destroy_type_e reason, + void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) { + cxt->state = WC_TERMINATED; + if (cxt->ops.destroy) { + bundle *b = bundle_create(); + ret = cxt->ops.destroy(cxt,(widget_app_destroy_type_e)reason, b); + + bundle_raw *raw = NULL; + int len; + + bundle_encode(b, &raw, &len); + if (raw) { + widget_provider_app_send_extra_info(id, (const char*)raw, NULL); + free(raw); + } + + bundle_free(b); + contexts = g_list_remove(contexts, cxt); + + free(cxt->id); + free(cxt); + } + _I("widget obj was deleted"); + } else { + _E("could not find widget obj : %s", __FUNCTION__); + } + + return ret; +} + +static int __provider_update_cb(const char *id, const char *content, int force, + void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) { + if (cxt->ops.update) { + bundle *b = bundle_decode((const bundle_raw*)content, strlen(content)); + ret = cxt->ops.update(cxt, b, force); + bundle_free(b); + } + _I("received updating signal"); + } else { + _E("could not find widget obj : %s", __FUNCTION__); + } + + return ret; +} + +static int __provider_pause_cb(const char *id, void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) { + if (cxt->ops.pause) + ret = cxt->ops.pause(cxt); + cxt->state = WC_PAUSED; + _I("widget obj was paused"); + } else { + _E("could not find widget obj : %s", __FUNCTION__); + } + + __check_status_for_cgroup(); + return ret; +} + +static int __provider_resume_cb(const char *id, void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) { + if (cxt->ops.resume) + ret = cxt->ops.resume(cxt); + cxt->state = WC_RUNNING; + _I("widget obj was resumed"); + } else { + _E("could not find widget obj : %s", __FUNCTION__); + } + + __check_status_for_cgroup(); + return ret; +} + +static int __provider_text_signal_cb(const char *id, const char *signal_name, + const char *source, struct widget_event_info *info, void *data) +{ + int ret = WIDGET_ERROR_FAULT; + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) { + if (cxt->ops_private.text_signal) { + ret = cxt->ops_private.text_signal(cxt, signal_name, source, + (widget_obj_event_info_s*)info); + } + _I("received text signal"); + } else { + _E("could not find widget obj : %s", __FUNCTION__); + } + + return ret; +} + +static const widget_class_factory_full_s* +__widget_class_factory_override_text_signal(widget_instance_text_signal_cb op) +{ + widget_class_tmp.ops_private.text_signal = op; + return &factory; +} + +static void __free_handler_cb(gpointer data) +{ + if (data) + free(data); +} + +static void __free_handler_list(void) +{ + int i; + + for (i = 0; i < WIDGET_APP_EVENT_MAX; i++) { + g_list_free_full(handler_list[i], __free_handler_cb); + handler_list[i] = NULL; + } +} + +static void __control(bundle *b) +{ + app_control_h app_control; + + if (is_init_provider) { + _E("already initialized"); + return; + } + + if (app_control_create_event(b, &app_control) != 0) { + _E("failed to get the app_control handle"); + return; + } + + char *op = NULL; + app_control_get_operation(app_control, &op); + + if (op && strcmp(op, "http://tizen.org/appcontrol/operation/main") == 0) { + static struct widget_provider_event_callback cb = { + .create = __provider_create_cb, + .resize = __provider_resize_cb, + .destroy = __provider_destroy_cb, + + .update = __provider_update_cb, + .text_signal = __provider_text_signal_cb, + + .pause = __provider_pause_cb, + .resume = __provider_resume_cb, + + .connected = NULL, + .disconnected = NULL, + + .data = NULL, + }; + + if (widget_provider_app_init(app_control, &cb) == 0) { + is_init_provider = 1; + } + } + + app_control_destroy(app_control); + if (op) + free(op); +} + +static void __pause_all() +{ + GList *iter = g_list_first(contexts); + + while (iter != NULL) { + widget_context_s *cxt = (widget_context_s*) iter->data; + const char *id = cxt->id; + + switch (cxt->state) { + case WC_READY: + __provider_resume_cb(id, NULL); + __provider_pause_cb(id, NULL); + break; + + case WC_RUNNING: + __provider_pause_cb(id, NULL); + break; + } + iter = g_list_next(iter); + } +} + +static int __aul_handler(aul_type type, bundle *b, void *data) +{ + switch (type) { + case AUL_START: + __control(b); + break; + case AUL_RESUME: + break; + case AUL_TERMINATE: + widget_app_exit(); + break; + default: + break; + } + + return 0; +} + +static char* __get_domain_name(const char *aid) +{ + char *name_token = NULL; + + if (aid == NULL) { + _E("appid is NULL"); + return NULL; + } + + // com.vendor.name -> name + name_token = strrchr(aid, '.'); + + if (name_token == NULL) { + _E("appid is invalid"); + return strdup(aid); + } + + name_token++; + + return strdup(name_token); +} + +static int __before_loop(int argc, char **argv) +{ + int r; + +#if !(GLIB_CHECK_VERSION(2, 36, 0)) + g_type_init(); +#endif + + elm_init(argc, argv); + + factory.override_text_signal = __widget_class_factory_override_text_signal; + + r = aul_launch_init(__aul_handler, NULL); + if (r < 0) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, + "Fail to call the aul_launch_init"); + } + + r = aul_launch_argv_handler(argc, argv); + if (r < 0) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, + "Fail to call the aul_launch_argv_handler"); + } + + r = app_get_id(&appid); + if (r != APP_ERROR_NONE) + return r; + + char *name = __get_domain_name(appid); + + if (name == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, + "Fail to call __get_domain_name"); + } + + r = _set_i18n(name); + + free(name); + if (r < 0) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, + "Fail to call _set_i18n"); + } + + widget_provider_app_create_app(); + + memset(&widget_class_tmp, 0, sizeof(widget_class_tmp)); + widget_class = app_ops->create(app_user_data); + if (widget_class == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, + "widget_class is NULL"); + } + + return WIDGET_ERROR_NONE; +} + +static void __after_loop() +{ + __pause_all(); + widget_provider_app_terminate_app(WIDGET_DESTROY_TYPE_TEMPORARY, 1); + + if (app_ops->terminate) + app_ops->terminate(app_user_data); + + if (is_init_provider) { + widget_provider_app_fini(); + is_init_provider = 0; + } + __free_handler_list(); + elm_shutdown(); + if (appid) + free(appid); + if (contexts) + g_list_free(contexts); + contexts = NULL; +} + +static gboolean __finish_event_cb(gpointer user_data) +{ + if (user_data == NULL) + return FALSE; + + widget_context_s *wc = (widget_context_s*) user_data; + const char* id = wc->id; + + switch (wc->state) { + case WC_READY: + __provider_resume_cb(id, NULL); + __provider_pause_cb(id, NULL); + __provider_destroy_cb(id, WIDGET_DESTROY_TYPE_DEFAULT, NULL); + break; + + case WC_RUNNING: + __provider_pause_cb(id, NULL); + __provider_destroy_cb(id, WIDGET_DESTROY_TYPE_DEFAULT, NULL); + break; + + case WC_PAUSED: + __provider_destroy_cb(id, WIDGET_DESTROY_TYPE_DEFAULT, NULL); + break; + } + + widget_provider_app_send_deleted(id); + return FALSE; +} + +static void __on_low_memory(keynode_t *key, void *data) +{ + int val; + + val = vconf_keynode_get_int(key); + if (val == VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING) { + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_low_memory"); + + event.type = APP_EVENT_LOW_MEMORY; + event.value = (void*)&val; + + GList *iter = g_list_first(handler_list[APP_EVENT_LOW_MEMORY]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } + } +} + +static void __on_low_battery(keynode_t *key, void *data) +{ + int val; + + val = vconf_keynode_get_int(key); + if (val <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) { + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_low_battery"); + + event.type = APP_EVENT_LOW_BATTERY; + event.value = (void*)&val; + + GList *iter = g_list_first(handler_list[APP_EVENT_LOW_BATTERY]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } + } +} + +static void __on_lang_changed(keynode_t *key, void *data) +{ + char *val; + + _update_lang(); + val = vconf_keynode_get_str(key); + + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_lang_changed"); + + event.type = APP_EVENT_LANGUAGE_CHANGED; + event.value = (void*)val; + + GList *iter = g_list_first(handler_list[APP_EVENT_LANGUAGE_CHANGED]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } +} + +static void __on_region_changed(keynode_t *key, void *data) +{ + char *val; + + _update_region(); + val = vconf_keynode_get_str(key); + + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_region_changed"); + + event.type = APP_EVENT_REGION_FORMAT_CHANGED; + event.value = (void*)val; + + GList *iter = g_list_first(handler_list[APP_EVENT_REGION_FORMAT_CHANGED]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } +} + +static void __register_event(int event_type) +{ + switch (event_type) { + case APP_EVENT_LOW_MEMORY: + vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory, NULL); + break; + + case APP_EVENT_LOW_BATTERY: + vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery, + NULL); + break; + + case APP_EVENT_LANGUAGE_CHANGED: + vconf_notify_key_changed(VCONFKEY_LANGSET, __on_lang_changed, NULL); + break; + + case APP_EVENT_REGION_FORMAT_CHANGED: + vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, __on_region_changed, NULL); + break; + } +} + +static void __unregister_event(int event_type) +{ + switch (event_type) { + case APP_EVENT_LOW_MEMORY: + vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory); + break; + + case APP_EVENT_LOW_BATTERY: + vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery); + break; + + case APP_EVENT_LANGUAGE_CHANGED: + vconf_ignore_key_changed(VCONFKEY_LANGSET, __on_lang_changed); + break; + + case APP_EVENT_REGION_FORMAT_CHANGED: + vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, __on_region_changed); + break; + } +} + +EXPORT_API int widget_app_main(int argc, char **argv, + widget_app_lifecycle_callback_s *callback, void *user_data) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (argc <= 0 || argv == NULL || callback == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + if (callback->create == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, "widget_app_create_cb() callback must be registered"); + + app_ops = callback; + app_user_data = user_data; + r = __before_loop(argc, argv); + if (r < 0) + return r; + + ecore_main_loop_begin(); + //aul_status_update(STATUS_DYING); + __after_loop(); + + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_exit(void) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + ecore_main_loop_quit(); + + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_terminate_context(widget_context_h context) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (context == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, + "obj is NULL"); + } + + g_idle_add(__finish_event_cb, context); + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (cb == NULL) + return WIDGET_ERROR_INVALID_PARAMETER; + + GList *iter = g_list_first(contexts); + + while (iter != NULL) { + widget_context_s *cxt = (widget_context_s*) iter->data; + if ( !cb(cxt, data)) { + return WIDGET_ERROR_CANCELED; + } + + iter = g_list_next(iter); + } + + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, + app_event_type_e event_type, app_event_cb callback, void *user_data) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + app_event_handler_h handler; + + if (event_handler == NULL || callback == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + if (event_type < APP_EVENT_LOW_MEMORY + || event_type > APP_EVENT_REGION_FORMAT_CHANGED) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + if (event_type == APP_EVENT_DEVICE_ORIENTATION_CHANGED) + return widget_app_error(WIDGET_ERROR_NOT_SUPPORTED, __FUNCTION__, NULL); + + GList *iter = g_list_first(handler_list[event_type]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + + if (handler->cb == callback) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + iter = g_list_next(iter); + } + + handler = calloc(1, sizeof(struct app_event_handler)); + if (!handler) + return widget_app_error(WIDGET_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + + if (g_list_length(handler_list[event_type]) == 0) { + __register_event(event_type); + } + + handler->type = event_type; + handler->cb = callback; + handler->data = user_data; + handler_list[event_type] = g_list_append(handler_list[event_type], handler); + + *event_handler = handler; + + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_remove_event_handler(app_event_handler_h + event_handler) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + app_event_type_e type; + + if (event_handler == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + type = event_handler->type; + if (type < APP_EVENT_LOW_MEMORY || type > APP_EVENT_REGION_FORMAT_CHANGED) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + handler_list[type] = g_list_remove(handler_list[type], event_handler); + free(event_handler); + + if (g_list_length(handler_list[type]) == 0) + __unregister_event(type); + + return WIDGET_ERROR_NONE; +} + +EXPORT_API const char* widget_app_get_id(widget_context_h context) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) { + set_last_result(WIDGET_ERROR_FAULT); + return NULL; + } + + if (!feature) { + set_last_result(WIDGET_ERROR_NOT_SUPPORTED); + return NULL; + } + + if (context == NULL) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + + widget_context_s *cxt = (widget_context_s*)context; + + set_last_result(WIDGET_ERROR_NONE); + return cxt->id; +} + +EXPORT_API int widget_app_get_elm_win(widget_context_h context, + Evas_Object **win) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (context == NULL || win == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + widget_context_s *cxt = (widget_context_s*)context; + Evas *evas; + Evas_Object *ret_win = NULL; + + evas = widget_get_evas(cxt->id); + if (evas) { + Evas_Object *widget_parent; + widget_parent = evas_object_rectangle_add(evas); + if (widget_parent) { + ret_win = elm_win_add(widget_parent, cxt->id, ELM_WIN_TIZEN_WIDGET); + evas_object_del(widget_parent); + if (ret_win == NULL) { + _E("win is NULL"); + return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); + } + } else { + _E("Failed to get parent widget"); + return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); + } + } else { + _E("parent evas object is NULL"); + return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); + } + + *win = ret_win; + return WIDGET_ERROR_NONE; +} + +EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) { + set_last_result(WIDGET_ERROR_FAULT); + return NULL; + } + + if (!feature) { + set_last_result(WIDGET_ERROR_NOT_SUPPORTED); + return NULL; + } + + widget_class_s *wc = (widget_class_s*)malloc(sizeof(widget_class_s)); + + if (wc == NULL) { + _E("failed to malloc : %s", __FUNCTION__); + set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); + return NULL; + } + + wc->ops = callback; + wc->ops_private = widget_class_tmp.ops_private; + set_last_result(WIDGET_ERROR_NONE); + return wc; +} + +EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (context == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + context->tag = tag; + + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (context == NULL || tag == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + *tag = context->tag; + + return WIDGET_ERROR_NONE; +} + +EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bundle *content_info) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (content_info == NULL) + return WIDGET_ERROR_INVALID_PARAMETER; + + bundle_raw *raw = NULL; + int len; + int ret = WIDGET_ERROR_FAULT; + + bundle_encode(content_info, &raw, &len); + if (raw) { + ret = widget_provider_app_send_extra_info(context->id, (const char*)raw, NULL); + free(raw); + } + + return ret; +} + +EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) +{ + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) + return WIDGET_ERROR_NOT_SUPPORTED; + + if (context == NULL) + return WIDGET_ERROR_INVALID_PARAMETER; + + return widget_provider_app_send_extra_info(context->id, NULL, title); +} + +// private API +EXPORT_API const widget_class_factory_full_s* widget_app_get_class_factory(void) +{ + return &factory; +} diff --git a/src/widget_error.c b/src/widget_error.c new file mode 100755 index 0000000..390a820 --- /dev/null +++ b/src/widget_error.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include + +#include +#include + +#include "widget-private.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "CAPI_WIDGET_APPLICATIO" + +static const char* widget_app_error_to_string(widget_error_e error) +{ + switch (error) { + case WIDGET_ERROR_NONE: + return "NONE"; + + case WIDGET_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + + case WIDGET_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + + case WIDGET_ERROR_RESOURCE_BUSY: + return "RESOURCE_BUSY"; + + case WIDGET_ERROR_PERMISSION_DENIED: + return "PERMISSION_DENIED"; + + case WIDGET_ERROR_CANCELED: + return "CANCELED"; + + case WIDGET_ERROR_IO_ERROR: + return "IO_ERROR"; + + case WIDGET_ERROR_TIMED_OUT: + return "TIMED_OUT"; + + case WIDGET_ERROR_NOT_SUPPORTED: + return "NOT_SUPPORTED"; + + case WIDGET_ERROR_FILE_NO_SPACE_ON_DEVICE: + return "FILE_NO_SPACE_ON_DEVICE"; + + case WIDGET_ERROR_FAULT: + return "FAULT"; + + case WIDGET_ERROR_ALREADY_EXIST: + return "ALREADY_EXIST"; + + case WIDGET_ERROR_ALREADY_STARTED: + return "ALREADY_STARTED"; + + case WIDGET_ERROR_NOT_EXIST: + return "NOT_EXIST"; + + case WIDGET_ERROR_DISABLED: + return "DISABLED"; + + default : + return "UNKNOWN"; + } +} + +int widget_app_error(widget_error_e error, const char* function, + const char *description) +{ + if (description) { + LOGE("[%s] %s(0x%08x) : %s", function, widget_app_error_to_string(error), error, + description); + } else { + LOGE("[%s] %s(0x%08x)", function, widget_app_error_to_string(error), error); + } + + return error; +} -- 2.7.4 From 11a72e0c52013001af118512e7eac86259b0294b Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Fri, 3 Jul 2015 17:07:52 +0900 Subject: [PATCH 03/11] sync with tizen_2.4 - change interfaces to add parameter for user data at widget instance Change-Id: I8436dc5a834c54f0c12221d04e5c4d4494cf1480 Signed-off-by: Jiwoong Im --- doc/images/widget_app_lifecycle.png | Bin 23168 -> 18154 bytes doc/images/widget_obj_lifecycle.png | Bin 54040 -> 49932 bytes include/widget_app.h | 21 +++++--- include/widget_app_internal.h | 2 +- src/widget-i18n.c | 40 ++++++-------- src/widget_app.c | 104 +++++++++++++++++++----------------- src/widget_error.c | 4 +- 7 files changed, 88 insertions(+), 83 deletions(-) diff --git a/doc/images/widget_app_lifecycle.png b/doc/images/widget_app_lifecycle.png index 13d394c2cc9bf75505979bdcabe327d666f942b1..9b1d87cfb4753375651512e0d3e43ab35581568c 100755 GIT binary patch literal 18154 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 Ib4q9e0RCkO^Z)<= literal 23168 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 diff --git a/doc/images/widget_obj_lifecycle.png b/doc/images/widget_obj_lifecycle.png index 71113aa56eee7e54f8cfbac911f0d27eaab87cf4..41d11e1b4583e5a4e0d503c8da339058941a72e2 100755 GIT binary patch literal 49932 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 literal 54040 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 KF;Cvm_kRIRMQxw} diff --git a/include/widget_app.h b/include/widget_app.h index 49180e1..fbcf59a 100755 --- a/include/widget_app.h +++ b/include/widget_app.h @@ -70,11 +70,12 @@ typedef struct _widget_context* widget_context_h; * @param[in] content The data set for the previous status * @param[in] w The pixel value for widget width * @param[in] h The pixel value for widget height + * @param[in] user_data The user data passed from widget_app_class_create function * * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure */ -typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *content, int w, int h); +typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *content, int w, int h, void *user_data); /** * @brief Called before the widget instance is destroyed. @@ -87,6 +88,7 @@ typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *conte * @param[in] context The context of widget instance. * @param[in] reason The reason for destruction * @param[in,out] content The data set to save + * @param[in] user_data The user data passed from widget_app_class_create function * @remark Note that the parameter 'content' is used to save the status of the widget instance. * As a input parameter, content contains the saved status of the widget instance. * You can fill the content parameter with the current status in this callback, @@ -97,7 +99,7 @@ typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *conte * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure */ -typedef int (*widget_instance_destroy_cb)(widget_context_h context, widget_app_destroy_type_e reason, bundle *content); +typedef int (*widget_instance_destroy_cb)(widget_context_h context, widget_app_destroy_type_e reason, bundle *content, void *user_data); /** * @brief Called when the widget is invisible. @@ -107,10 +109,11 @@ typedef int (*widget_instance_destroy_cb)(widget_context_h context, widget_app_d * The paused instance may be destroyed by framework * * @param[in] context The context of widget instance. + * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure */ -typedef int (*widget_instance_pause_cb)(widget_context_h context); +typedef int (*widget_instance_pause_cb)(widget_context_h context, void *user_data); /** * @brief Called when the widget is visible. @@ -119,10 +122,11 @@ typedef int (*widget_instance_pause_cb)(widget_context_h context); * @details The callback function is called when the widget is visible. * * @param[in] context The context of widget instance. + * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure */ -typedef int (*widget_instance_resume_cb)(widget_context_h context); +typedef int (*widget_instance_resume_cb)(widget_context_h context, void *user_data); /** * @brief Called before the widget size is changed. @@ -133,10 +137,11 @@ typedef int (*widget_instance_resume_cb)(widget_context_h context); * @param[in] context The context of widget instance. * @param[in] w The pixel value for widget width * @param[in] h The pixel value for widget height + * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure */ -typedef int (*widget_instance_resize_cb)(widget_context_h context, int w, int h); +typedef int (*widget_instance_resize_cb)(widget_context_h context, int w, int h, void *user_data); /** * @brief Called when the event for updating widget is received. @@ -148,11 +153,12 @@ typedef int (*widget_instance_resize_cb)(widget_context_h context, int w, int h) * @param[in] content The data set for updating this widget. It will be provided by requester. * Requester can use widget_service_trigger_update(). * @param[in] force Although the widget is paused, if it is TRUE, the widget can be updated. + * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure * @see widget_service_trigger_update */ -typedef int (*widget_instance_update_cb)(widget_context_h context, bundle *content, int force); +typedef int (*widget_instance_update_cb)(widget_context_h context, bundle *content, int force, void *user_data); /** * @brief The structure for lifecycle of a widget instance @@ -348,12 +354,13 @@ const char* widget_app_get_id(widget_context_h context); * @since_tizen 2.3.1 * * @param[in] callback The set of lifecycle callbacks + * @param[in] user_data The user data to be passed to the callback functions * @return The handle of class on success, otherwise NULL * You can get the returned value using get_last_result() * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @see get_last_result */ -widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback); +widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data); /** * @brief Sets a tag in the context diff --git a/include/widget_app_internal.h b/include/widget_app_internal.h index 968f584..260f4f3 100644 --- a/include/widget_app_internal.h +++ b/include/widget_app_internal.h @@ -48,7 +48,7 @@ typedef struct } widget_obj_event_info_s; typedef int (*widget_instance_text_signal_cb)(widget_context_h context, const char *signal_name, - const char *source, widget_obj_event_info_s *info); + const char *source, widget_obj_event_info_s *info, void *user_data); typedef struct _widget_obj_private_ops { diff --git a/src/widget-i18n.c b/src/widget-i18n.c index 84c96aa..0fbd2be 100755 --- a/src/widget-i18n.c +++ b/src/widget-i18n.c @@ -41,9 +41,10 @@ void _update_lang(void) char *r = setlocale(LC_ALL, ""); if (r == NULL) { r = setlocale(LC_ALL, lang); - if (r) { + + if (r) _D("*****appcore setlocale=%s\n", r); - } + } free(lang); } else { @@ -70,9 +71,10 @@ void _update_region(void) setenv("LC_MEASUREMENT", region, 1); setenv("LC_IDENTIFICATION", region, 1); r = setlocale(LC_ALL, ""); - if (r != NULL) { + + if (r != NULL) _D("*****appcore setlocale=%s\n", r); - } + free(region); } else { _E("failed to get current region format for set region env"); @@ -118,16 +120,6 @@ static char* __proc_get_cmdline() return strdup(buf); } -static void __get_dir_name(char *dirname, int maxlen) -{ - const char *path = NULL; - - path = aul_get_app_root_path(); - snprintf(dirname, maxlen, "%s/res/locale", path); - free(path); -} - - static int __set_i18n(const char *domain) { char *r; @@ -138,7 +130,7 @@ static int __set_i18n(const char *domain) return -1; } - __get_dir_name(dirname, PATH_MAX - 1); + snprintf(dirname, PATH_MAX, "%s/res/locale", aul_get_app_root_path()); _D("locale dir: %s", dirname); r = setlocale(LC_ALL, ""); @@ -146,26 +138,24 @@ static int __set_i18n(const char *domain) if (r == NULL) { char *lang = vconf_get_str(VCONFKEY_LANGSET); r = setlocale(LC_ALL, lang); - if (r) { + + if (r) _D("*****appcore setlocale=%s\n", r); - } - if (lang) { + + if (lang) free(lang); - } + } - if (r == NULL) { + if (r == NULL) _E("appcore: setlocale() error"); - } r = bindtextdomain(domain, dirname); - if (r == NULL) { + if (r == NULL) _E("appcore: bindtextdomain() error"); - } r = textdomain(domain); - if (r == NULL) { + if (r == NULL) _E("appcore: textdomain() error"); - } return 0; } diff --git a/src/widget_app.c b/src/widget_app.c index 17dd0f2..4556c3d 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -57,10 +57,10 @@ static GList *handler_list[WIDGET_APP_EVENT_MAX] = {NULL, }; typedef enum _widget_obj_state_e { - WC_READY = 0, - WC_RUNNING = 1, - WC_PAUSED = 2, - WC_TERMINATED = 3 + WC_READY = 0, + WC_RUNNING = 1, + WC_PAUSED = 2, + WC_TERMINATED = 3 } widget_obj_state_e; struct app_event_handler { @@ -75,6 +75,7 @@ struct app_event_info { }; struct _widget_class { + void *user_data; widget_instance_lifecycle_callback_s ops; widget_obj_private_ops_s ops_private; }; @@ -136,15 +137,15 @@ static widget_context_s* __find_context_by_id(const char *id) { GList* ret = g_list_find_custom(contexts, id, __comp_by_id); - if ( ret == NULL) + if (ret == NULL) return NULL; return ret->data; } static int __provider_create_cb(const char *id, const char *content, int w, - int h, - void *data) + int h, + void *data) { int ret = WIDGET_ERROR_FAULT; widget_context_s *wc = (widget_context_s*)malloc(sizeof(widget_context_s)); @@ -159,9 +160,12 @@ static int __provider_create_cb(const char *id, const char *content, int w, contexts = g_list_append(contexts, wc); if (wc->ops.create) { - bundle *b = bundle_decode((const bundle_raw*)content, strlen(content)); - ret = wc->ops.create(wc, b, w, h); - bundle_free(b); + bundle *b = NULL; + if (content) + b = bundle_decode((const bundle_raw*)content, strlen(content)); + ret = wc->ops.create(wc, b, w, h, widget_class->user_data); + if (b) + bundle_free(b); } _I("widget obj was created"); @@ -175,7 +179,7 @@ static int __provider_resize_cb(const char *id, int w, int h, void *data) if (cxt) { if (cxt->ops.resize) - ret = cxt->ops.resize(cxt, w, h); + ret = cxt->ops.resize(cxt, w, h, widget_class->user_data); _I("received resizing signal"); } else { _E("could not find widget obj : %s", __FUNCTION__); @@ -185,7 +189,7 @@ static int __provider_resize_cb(const char *id, int w, int h, void *data) } static int __provider_destroy_cb(const char *id, widget_destroy_type_e reason, - void *data) + void *data) { int ret = WIDGET_ERROR_FAULT; widget_context_s *cxt = __find_context_by_id(id); @@ -194,7 +198,7 @@ static int __provider_destroy_cb(const char *id, widget_destroy_type_e reason, cxt->state = WC_TERMINATED; if (cxt->ops.destroy) { bundle *b = bundle_create(); - ret = cxt->ops.destroy(cxt,(widget_app_destroy_type_e)reason, b); + ret = cxt->ops.destroy(cxt, (widget_app_destroy_type_e)reason, b, widget_class->user_data); bundle_raw *raw = NULL; int len; @@ -220,16 +224,20 @@ static int __provider_destroy_cb(const char *id, widget_destroy_type_e reason, } static int __provider_update_cb(const char *id, const char *content, int force, - void *data) + void *data) { int ret = WIDGET_ERROR_FAULT; widget_context_s *cxt = __find_context_by_id(id); if (cxt) { if (cxt->ops.update) { - bundle *b = bundle_decode((const bundle_raw*)content, strlen(content)); - ret = cxt->ops.update(cxt, b, force); - bundle_free(b); + bundle *b = NULL; + if (content) + b = bundle_decode((const bundle_raw*)content, strlen(content)); + ret = cxt->ops.update(cxt, b, force, widget_class->user_data); + + if (b) + bundle_free(b); } _I("received updating signal"); } else { @@ -246,7 +254,7 @@ static int __provider_pause_cb(const char *id, void *data) if (cxt) { if (cxt->ops.pause) - ret = cxt->ops.pause(cxt); + ret = cxt->ops.pause(cxt, widget_class->user_data); cxt->state = WC_PAUSED; _I("widget obj was paused"); } else { @@ -264,7 +272,7 @@ static int __provider_resume_cb(const char *id, void *data) if (cxt) { if (cxt->ops.resume) - ret = cxt->ops.resume(cxt); + ret = cxt->ops.resume(cxt, widget_class->user_data); cxt->state = WC_RUNNING; _I("widget obj was resumed"); } else { @@ -276,7 +284,7 @@ static int __provider_resume_cb(const char *id, void *data) } static int __provider_text_signal_cb(const char *id, const char *signal_name, - const char *source, struct widget_event_info *info, void *data) + const char *source, struct widget_event_info *info, void *data) { int ret = WIDGET_ERROR_FAULT; widget_context_s *cxt = __find_context_by_id(id); @@ -284,7 +292,7 @@ static int __provider_text_signal_cb(const char *id, const char *signal_name, if (cxt) { if (cxt->ops_private.text_signal) { ret = cxt->ops_private.text_signal(cxt, signal_name, source, - (widget_obj_event_info_s*)info); + (widget_obj_event_info_s*)info, widget_class->user_data); } _I("received text signal"); } else { @@ -352,9 +360,9 @@ static void __control(bundle *b) .data = NULL, }; - if (widget_provider_app_init(app_control, &cb) == 0) { + if (widget_provider_app_init(app_control, &cb) == 0) is_init_provider = 1; - } + } app_control_destroy(app_control); @@ -411,7 +419,7 @@ static char* __get_domain_name(const char *aid) return NULL; } - // com.vendor.name -> name + /* com.vendor.name -> name */ name_token = strrchr(aid, '.'); if (name_token == NULL) { @@ -439,13 +447,13 @@ static int __before_loop(int argc, char **argv) r = aul_launch_init(__aul_handler, NULL); if (r < 0) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call the aul_launch_init"); + "Fail to call the aul_launch_init"); } r = aul_launch_argv_handler(argc, argv); if (r < 0) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call the aul_launch_argv_handler"); + "Fail to call the aul_launch_argv_handler"); } r = app_get_id(&appid); @@ -456,7 +464,7 @@ static int __before_loop(int argc, char **argv) if (name == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call __get_domain_name"); + "Fail to call __get_domain_name"); } r = _set_i18n(name); @@ -464,7 +472,7 @@ static int __before_loop(int argc, char **argv) free(name); if (r < 0) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call _set_i18n"); + "Fail to call _set_i18n"); } widget_provider_app_create_app(); @@ -473,7 +481,7 @@ static int __before_loop(int argc, char **argv) widget_class = app_ops->create(app_user_data); if (widget_class == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "widget_class is NULL"); + "widget_class is NULL"); } return WIDGET_ERROR_NONE; @@ -633,8 +641,7 @@ static void __register_event(int event_type) break; case APP_EVENT_LOW_BATTERY: - vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery, - NULL); + vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery, NULL); break; case APP_EVENT_LANGUAGE_CHANGED: @@ -669,7 +676,7 @@ static void __unregister_event(int event_type) } EXPORT_API int widget_app_main(int argc, char **argv, - widget_app_lifecycle_callback_s *callback, void *user_data) + widget_app_lifecycle_callback_s *callback, void *user_data) { int r; bool feature; @@ -731,7 +738,7 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) if (context == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "obj is NULL"); + "obj is NULL"); } g_idle_add(__finish_event_cb, context); @@ -757,9 +764,9 @@ EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) while (iter != NULL) { widget_context_s *cxt = (widget_context_s*) iter->data; - if ( !cb(cxt, data)) { + + if (!cb(cxt, data)) return WIDGET_ERROR_CANCELED; - } iter = g_list_next(iter); } @@ -768,7 +775,8 @@ EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) } EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, - app_event_type_e event_type, app_event_cb callback, void *user_data) + app_event_type_e event_type, app_event_cb callback, + void *user_data) { int r; bool feature; @@ -799,6 +807,7 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, if (handler->cb == callback) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + iter = g_list_next(iter); } @@ -806,9 +815,8 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, if (!handler) return widget_app_error(WIDGET_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); - if (g_list_length(handler_list[event_type]) == 0) { + if (g_list_length(handler_list[event_type]) == 0) __register_event(event_type); - } handler->type = event_type; handler->cb = callback; @@ -821,7 +829,7 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, } EXPORT_API int widget_app_remove_event_handler(app_event_handler_h - event_handler) + event_handler) { int r; bool feature; @@ -879,7 +887,7 @@ EXPORT_API const char* widget_app_get_id(widget_context_h context) } EXPORT_API int widget_app_get_elm_win(widget_context_h context, - Evas_Object **win) + Evas_Object **win) { int r; bool feature; @@ -891,9 +899,8 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, if (!feature) return WIDGET_ERROR_NOT_SUPPORTED; - if (context == NULL || win == NULL) { + if (context == NULL || win == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - } widget_context_s *cxt = (widget_context_s*)context; Evas *evas; @@ -905,6 +912,8 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, widget_parent = evas_object_rectangle_add(evas); if (widget_parent) { ret_win = elm_win_add(widget_parent, cxt->id, ELM_WIN_TIZEN_WIDGET); + /* ret_win = elm_win_tizen_widget_add(cxt->id, widget_parent); */ + evas_object_del(widget_parent); if (ret_win == NULL) { _E("win is NULL"); @@ -923,7 +932,7 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, return WIDGET_ERROR_NONE; } -EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback) +EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) { int r; bool feature; @@ -947,6 +956,7 @@ EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_call return NULL; } + wc->user_data = user_data; wc->ops = callback; wc->ops_private = widget_class_tmp.ops_private; set_last_result(WIDGET_ERROR_NONE); @@ -965,9 +975,8 @@ EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) if (!feature) return WIDGET_ERROR_NOT_SUPPORTED; - if (context == NULL) { + if (context == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - } context->tag = tag; @@ -986,9 +995,8 @@ EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) if (!feature) return WIDGET_ERROR_NOT_SUPPORTED; - if (context == NULL || tag == NULL) { + if (context == NULL || tag == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - } *tag = context->tag; @@ -1041,7 +1049,7 @@ EXPORT_API int widget_app_context_set_title(widget_context_h context, const char return widget_provider_app_send_extra_info(context->id, NULL, title); } -// private API +/* private API */ EXPORT_API const widget_class_factory_full_s* widget_app_get_class_factory(void) { return &factory; diff --git a/src/widget_error.c b/src/widget_error.c index 390a820..010adb0 100755 --- a/src/widget_error.c +++ b/src/widget_error.c @@ -77,13 +77,13 @@ static const char* widget_app_error_to_string(widget_error_e error) case WIDGET_ERROR_DISABLED: return "DISABLED"; - default : + default: return "UNKNOWN"; } } int widget_app_error(widget_error_e error, const char* function, - const char *description) + const char *description) { if (description) { LOGE("[%s] %s(0x%08x) : %s", function, widget_app_error_to_string(error), error, -- 2.7.4 From abe90a6cd98c5570d799f102df570348bf106a11 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Thu, 12 Nov 2015 11:35:21 +0900 Subject: [PATCH 04/11] Initial pepper-based widget framework commit - Support wayland subcompositor - Remove widget-provider dependency - Replace data-provider-master Change-Id: I4b6b3a9f55add2273de9f27d5e4c9fd6023fdb25 Signed-off-by: Daehyeon Jung --- CMakeLists.txt | 2 - capi-appfw-widget-application.pc | 2 +- include/widget_app.h | 137 +++--- packaging/appcore-widget.spec | 2 - src/widget-i18n.c | 39 -- src/widget_app.c | 957 ++++++++++----------------------------- 6 files changed, 317 insertions(+), 822 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86cbc99..495fac4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,6 @@ pkg_check_modules(pkg_widget REQUIRED elementary vconf-internal-keys widget_service - widget_provider_app - widget capi-system-info ) FOREACH(flag ${pkg_widget_CFLAGS}) diff --git a/capi-appfw-widget-application.pc b/capi-appfw-widget-application.pc index e7ded40..e857f73 100644 --- a/capi-appfw-widget-application.pc +++ b/capi-appfw-widget-application.pc @@ -8,6 +8,6 @@ includedir=@INCLUDEDIR@ Name: capi-appfw-widget-application Description: widget application library Version: 1.1 -Requires: aul dlog elementary capi-appfw-app-control capi-appfw-app-common widget_service widget_provider_app widget +Requires: aul dlog elementary capi-appfw-app-control capi-appfw-app-common widget_service Libs: -L${libdir} -lcapi-appfw-widget-application Cflags: -I${includedir} -I${includedir}/appfw diff --git a/include/widget_app.h b/include/widget_app.h index fbcf59a..67b6457 100755 --- a/include/widget_app.h +++ b/include/widget_app.h @@ -34,7 +34,7 @@ extern "C" { */ /** - * @brief Destroy type of widget instance + * @brief Destroy type of widget instance. * @since_tizen 2.3.1 */ typedef enum widget_app_destroy_type { @@ -54,7 +54,7 @@ typedef enum widget_app_destroy_type { typedef struct _widget_class* widget_class_h; /** - * @brief The handle for widget context + * @brief The handle for widget context. * @since_tizen 2.3.1 */ typedef struct _widget_context* widget_context_h; @@ -106,9 +106,9 @@ typedef int (*widget_instance_destroy_cb)(widget_context_h context, widget_app_d * @since_tizen 2.3.1 * * @details The callback function is called when the widget is invisible. - * The paused instance may be destroyed by framework + * The paused instance may be destroyed by framework. * - * @param[in] context The context of widget instance. + * @param[in] context The context of widget instance * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure @@ -121,7 +121,7 @@ typedef int (*widget_instance_pause_cb)(widget_context_h context, void *user_dat * * @details The callback function is called when the widget is visible. * - * @param[in] context The context of widget instance. + * @param[in] context The context of widget instance * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure @@ -134,7 +134,7 @@ typedef int (*widget_instance_resume_cb)(widget_context_h context, void *user_da * * @details The callback function is called before the widget size is changed. * - * @param[in] context The context of widget instance. + * @param[in] context The context of widget instance * @param[in] w The pixel value for widget width * @param[in] h The pixel value for widget height * @param[in] user_data The user data passed from widget_app_class_create function @@ -151,17 +151,17 @@ typedef int (*widget_instance_resize_cb)(widget_context_h context, int w, int h, * * @param[in] context The context of widget instance. * @param[in] content The data set for updating this widget. It will be provided by requester. - * Requester can use widget_service_trigger_update(). - * @param[in] force Although the widget is paused, if it is TRUE, the widget can be updated. + * Requester can use widget_service_trigger_update() + * @param[in] force Although the widget is paused, if it is TRUE, the widget can be updated * @param[in] user_data The user data passed from widget_app_class_create function * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure - * @see widget_service_trigger_update + * @see widget_service_trigger_update() */ typedef int (*widget_instance_update_cb)(widget_context_h context, bundle *content, int force, void *user_data); /** - * @brief The structure for lifecycle of a widget instance + * @brief The structure for lifecycle of a widget instance. * @since_tizen 2.3.1 */ typedef struct @@ -210,7 +210,7 @@ typedef widget_class_h (*widget_app_create_cb)(void *user_data); typedef void (*widget_app_terminate_cb)(void *user_data); /** - * @brief The structure for lifecycle of a widget application + * @brief The structure for lifecycle of a widget application. * @since_tizen 2.3.1 */ typedef struct @@ -220,7 +220,7 @@ typedef struct } widget_app_lifecycle_callback_s; /** - * @brief Called for each widget context + * @brief Called for each widget context. * @since_tizen 2.3.1 * * @details This function will be called in the function of widget_app_foreach_context repeatedly. @@ -229,7 +229,7 @@ typedef struct * @param[in] data The data for caller * @return true to continue with the next iteration of the loop, * otherwise false to break out of the loop. - * @see widget_app_foreach_context + * @see widget_app_foreach_context() */ typedef bool (*widget_context_cb)(widget_context_h context, void *data); @@ -242,13 +242,13 @@ typedef bool (*widget_context_cb)(widget_context_h context, void *data); * @param[in] callback The set of callback functions to handle application events * @param[in] user_data The user data to be passed to the callback functions * - * @return @c 0 on success, - * otherwise a negative error value. + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure * @retval #WIDGET_ERROR_NONE Successful * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_FAULT Unrecoverable error - * @see widget_app_exit + * @see widget_app_exit() */ int widget_app_main(int argc, char **argv, widget_app_lifecycle_callback_s *callback, void *user_data); @@ -257,23 +257,25 @@ int widget_app_main(int argc, char **argv, widget_app_lifecycle_callback_s *call * @details The main loop of the application stops and widget_app_terminate_cb() is invoked. * @since_tizen 2.3.1 * - * @return @c 0 on success, - * otherwise a negative error value. + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successful * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_FAULT Unrecoverable error - * @see widget_app_main - * @see widget_app_terminate_cb + * @see widget_app_main() + * @see widget_app_terminate_cb() */ int widget_app_exit(void); /** - * @brief Finishes context for the widget instance + * @brief Finishes context for the widget instance. * @since_tizen 2.3.1 * * @param[in] context The context for widget instance * - * @return @c 0 on success, otherwise a negative error value. - * @retval #WIDGET_ERROR_NONE Successfull + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successful * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_FAULT Unrecoverable error @@ -281,24 +283,25 @@ int widget_app_exit(void); int widget_app_terminate_context(widget_context_h context); /** - * @brief Retrieves all widget contexts in this application + * @brief Retrieves all widget contexts in this application. * @since_tizen 2.3.1 * * @param[in] callback The iteration callback function * @param[in] data The data for the callback function * - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_ERROR_NONE Successfull + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successful * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_CANCELED The iteration is canceled * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_FAULT Unrecoverable error - * @see widget_app_foreach_context + * @see widget_app_foreach_context() */ int widget_app_foreach_context(widget_context_cb callback, void *data); /** - * @brief Adds the system event handler + * @brief Adds the system event handler. * @since_tizen 2.3.1 * * @param[out] event_handler The event handler @@ -306,46 +309,48 @@ int widget_app_foreach_context(widget_context_cb callback, void *data); * @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 #WIDGET_ERROR_NONE Successfull + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successful * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_OUT_OF_MEMORY Out of memory * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_FAULT Unrecoverable error * @see app_event_type_e - * @see app_event_cb - * @see watch_app_remove_event_handler + * @see app_event_cb() + * @see watch_app_remove_event_handler() */ int widget_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, app_event_cb callback, void *user_data); /** - * @brief Removes registered event handler + * @brief Removes registered event handler. * @since_tizen 2.3.1 * * @param[in] event_handler The event handler * - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_ERROR_NONE Successfull + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successful * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_FAULT Unrecoverable error - * @see watch_app_add_event_handler + * @see watch_app_add_event_handler() */ int widget_app_remove_event_handler(app_event_handler_h event_handler); /** - * @brief Gets a widget instance id + * @brief Gets a widget instance id. * @since_tizen 2.3.1 * * @param[in] context The context for widget instance * + * @remarks The specific error code can be obtained using the get_last_result() method. Error codes are described in Exception section. * @return Widget ID on success, otherwise NULL - * You can get the returned value using get_last_result() - * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported - * @retval #WIDGET_ERROR_FAULT Unrecoverable error + * @exception #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @exception #WIDGET_ERROR_FAULT Unrecoverable error * @remark You must not free returned Widget ID - * @see get_last_result + * @see get_last_result() */ const char* widget_app_get_id(widget_context_h context); @@ -353,23 +358,27 @@ const char* widget_app_get_id(widget_context_h context); * @brief Makes a class for widget instances. * @since_tizen 2.3.1 * + * @remarks The specific error code can be obtained using the get_last_result() method. Error codes are described in Exception section. * @param[in] callback The set of lifecycle callbacks * @param[in] user_data The user data to be passed to the callback functions - * @return The handle of class on success, otherwise NULL - * You can get the returned value using get_last_result() - * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported - * @see get_last_result + * @return The new widget class object. NULL on error + * @exception #WIDGET_ERROR_NONE Successfully added + * @exception #WIDGET_ERROR_INVALID_PARAMETER Not supported + * @exception #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @exception #WIDGET_ERROR_OUT_OF_MEMORY Out of memory + * @see get_last_result() */ widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data); /** - * @brief Sets a tag in the context + * @brief Sets a tag in the context. * @since_tizen 2.3.1 * * @param[in] context The context for widget instance * @param[in] tag The value to save * - * @return 0 on success, otherwise a negative error value + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_FAULT Unrecoverable error @@ -377,13 +386,13 @@ widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s call int widget_app_context_set_tag(widget_context_h context, void *tag); /** - * @brief Gets the tag in the context + * @brief Gets the tag in the context. * @since_tizen 2.3.1 * * @param[in] context The context for widget instance * @param[out] tag The value to get - * - * @return 0 on success, otherwise a negative error value + * @return #WIDGET_ERROR_NONE on success, + * otherwise an error code (see WIDGET_ERROR_XXX) on failure * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid parameter * @retval #WIDGET_ERROR_FAULT Unrecoverable error @@ -391,36 +400,54 @@ int widget_app_context_set_tag(widget_context_h context, void *tag); int widget_app_context_get_tag(widget_context_h context, void **tag); /** - * @brief Sets the content info to the widget + * @brief Sets the content info to the widget. * @since_tizen 2.3.1 * @param[in] context The context for widget instance * @param[in] content_info The data set to save * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successfully sent * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid argument * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_OUT_OF_MEMORY Out of memory * @retval #WIDGET_ERROR_FAULT Unrecoverable error - * @retval #WIDGET_ERROR_NONE Successfully sent */ int widget_app_context_set_content_info(widget_context_h context, bundle *content_info); /** - * @brief Sends the title to the widget + * @brief Sends the title to the widget. * @since_tizen 2.3.1 * @param[in] context The context for widget instance - * @param[in] title When an accessibility mode is turned on, this string will be read. + * @param[in] title When an accessibility mode is turned on, this string will be read * @return #WIDGET_ERROR_NONE on success, * otherwise an error code (see WIDGET_ERROR_XXX) on failure + * @retval #WIDGET_ERROR_NONE Successfully sent * @retval #WIDGET_ERROR_INVALID_PARAMETER Invalid argument * @retval #WIDGET_ERROR_NOT_SUPPORTED Not supported * @retval #WIDGET_ERROR_OUT_OF_MEMORY Out of memory * @retval #WIDGET_ERROR_FAULT Unrecoverable error - * @retval #WIDGET_ERROR_NONE Successfully sent */ int widget_app_context_set_title(widget_context_h context, const char *title); /** + * @brief Adds an additional widget class for multi-class of widget instantiation. + * @since_tizen 3.0 + * @remarks The specific error code can be obtained using the get_last_result() method. Error codes are described in Exception section. + * @param[in] widget_class The result of widget_app_class_create() + * @param[in] class_id The class id of provider + * @param[in] callback The set of lifecycle callbacks + * @param[in] user_data The user data to be passed to the callback functions + * @return The new widget class object. NULL on error + * @exception #WIDGET_ERROR_NONE Successfully added + * @exception #WIDGET_ERROR_INVALID_PARAMETER Not supported + * @exception #WIDGET_ERROR_NOT_SUPPORTED Not supported + * @exception #WIDGET_ERROR_OUT_OF_MEMORY Out of memory + * @see get_last_result() + */ +widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, + widget_instance_lifecycle_callback_s callback, void *user_data); + +/** * @} */ diff --git a/packaging/appcore-widget.spec b/packaging/appcore-widget.spec index e8c6bcf..1fbbb9f 100644 --- a/packaging/appcore-widget.spec +++ b/packaging/appcore-widget.spec @@ -15,9 +15,7 @@ BuildRequires: pkgconfig(alarm-service) BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(capi-appfw-app-common) BuildRequires: pkgconfig(widget_service) -BuildRequires: pkgconfig(widget_provider_app) BuildRequires: pkgconfig(capi-system-info) -BuildRequires: pkgconfig(widget) BuildRequires: cmake diff --git a/src/widget-i18n.c b/src/widget-i18n.c index 0fbd2be..23cbd3b 100755 --- a/src/widget-i18n.c +++ b/src/widget-i18n.c @@ -81,45 +81,6 @@ void _update_region(void) } } -static int __read_proc(const char *path, char *buf, int size) -{ - int fd; - int ret; - - if (buf == NULL || path == NULL) - return -1; - - fd = open(path, O_RDONLY); - if (fd < 0) - return -1; - - ret = read(fd, buf, size - 1); - if (ret <= 0) { - close(fd); - return -1; - } else - buf[ret] = 0; - - close(fd); - - return ret; -} - -static char* __proc_get_cmdline() -{ -#define MAX_CMD_BUFSZ 1024 - - char buf[MAX_CMD_BUFSZ]; - int ret; - - snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid()); - ret = __read_proc(buf, buf, sizeof(buf)); - if (ret <= 0) - return NULL; - - return strdup(buf); -} - static int __set_i18n(const char *domain) { char *r; diff --git a/src/widget_app.c b/src/widget_app.c index 4556c3d..9326483 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -22,17 +22,13 @@ #include #include #include +#include #include #include -#include -#include -#include -#include -#include #include -#include #include -#include +#include +#include #include "widget_app.h" #include "widget-log.h" @@ -47,15 +43,6 @@ #define LOG_TAG "CAPI_WIDGET_APPLICATION" #define K_REASON "__WC_K_REASON__" -#define ELM_WIN_TIZEN_WIDGET -1 -/* TODO - * This definition is intended to prevent the build break. - * This should be removed after adding ELM_WIN_TIZEN_WIDGET in Elm_Win_Type. - */ - -#define WIDGET_APP_EVENT_MAX 5 -static GList *handler_list[WIDGET_APP_EVENT_MAX] = {NULL, }; - typedef enum _widget_obj_state_e { WC_READY = 0, WC_RUNNING = 1, @@ -77,60 +64,37 @@ struct app_event_info { struct _widget_class { void *user_data; widget_instance_lifecycle_callback_s ops; - widget_obj_private_ops_s ops_private; + char *classid; + struct _widget_class *next; + struct _widget_class *prev; }; struct _widget_context { char *id; + struct _widget_class *provider; int state; void *tag; + Evas_Object *win; + bundle *content; widget_instance_lifecycle_callback_s ops; - widget_obj_private_ops_s ops_private; }; typedef struct _widget_class widget_class_s; typedef struct _widget_context widget_context_s; -static widget_app_lifecycle_callback_s *app_ops = NULL; +static int caller_pid = 0; +static widget_app_lifecycle_callback_s *app_ops; static void *app_user_data = NULL; -static widget_class_factory_full_s factory; -static widget_class_s *widget_class = NULL; -static widget_class_s widget_class_tmp; -static GList *contexts = NULL; -static int is_init_provider = 0; static char *appid = NULL; -static int is_background = -1; +static widget_class_h class_provider = NULL; +static GList *contexts = NULL; +static char *viewer_endpoint = NULL; static gint __comp_by_id(gconstpointer a, gconstpointer b) { widget_context_s *wc = (widget_context_s*)a; - return strcmp(wc->id, (const char*)b); -} - -static void __check_status_for_cgroup(void) -{ - GList *iter = g_list_first(contexts); - - while (iter != NULL) { - widget_context_s *cxt = (widget_context_s*) iter->data; - - if (cxt->state != WC_PAUSED) { - if (is_background != 0) { - is_background = 0; - _I("enter foreground group"); - //TODO: Do something to enter foreground group - } - return; - } - iter = g_list_next(iter); - } - - if (g_list_length(contexts) > 0 && is_background == 0) { - is_background = 1; - _I("enter background group"); - //TODO: DO something to enter background group - } + return strcmp(wc->id, (const char*)b); } static widget_context_s* __find_context_by_id(const char *id) @@ -143,262 +107,182 @@ static widget_context_s* __find_context_by_id(const char *id) return ret->data; } -static int __provider_create_cb(const char *id, const char *content, int w, - int h, - void *data) +static int __send_update_status(const char *class_id, const char *instance_id, + int status, bundle *extra, int internal_only) { - int ret = WIDGET_ERROR_FAULT; - widget_context_s *wc = (widget_context_s*)malloc(sizeof(widget_context_s)); - if (wc == NULL) - return WIDGET_ERROR_OUT_OF_MEMORY; + bundle *b = extra; - wc->id = strdup(id); - wc->state = WC_READY; - wc->tag = NULL; - wc->ops = widget_class->ops; - wc->ops_private = widget_class->ops_private; - contexts = g_list_append(contexts, wc); + if (b == NULL) + b = bundle_create(); - if (wc->ops.create) { - bundle *b = NULL; - if (content) - b = bundle_decode((const bundle_raw*)content, strlen(content)); - ret = wc->ops.create(wc, b, w, h, widget_class->user_data); - if (b) - bundle_free(b); - } - _I("widget obj was created"); + bundle_add_str(b, WIDGET_K_ID, class_id); + bundle_add_str(b, WIDGET_K_INSTANCE, instance_id); + bundle_add_byte(b, WIDGET_K_STATUS, &status, sizeof(int)); - return ret; + aul_app_com_send(viewer_endpoint, b); + + if (extra == NULL) + bundle_free(b); } -static int __provider_resize_cb(const char *id, int w, int h, void *data) +static int __instance_create(widget_class_h handle, const char *id, bundle *b) { - int ret = WIDGET_ERROR_FAULT; - widget_context_s *cxt = __find_context_by_id(id); - - if (cxt) { - if (cxt->ops.resize) - ret = cxt->ops.resize(cxt, w, h, widget_class->user_data); - _I("received resizing signal"); - } else { - _E("could not find widget obj : %s", __FUNCTION__); - } + widget_context_s *wc = NULL; + int w = 0, h = 0; + char *w_str = NULL, *h_str = NULL; + char *remain = NULL; + int ret = 0; - return ret; -} + wc = (widget_context_s *)malloc(sizeof(widget_context_s)); + if (!wc) + return WIDGET_ERROR_OUT_OF_MEMORY; -static int __provider_destroy_cb(const char *id, widget_destroy_type_e reason, - void *data) -{ - int ret = WIDGET_ERROR_FAULT; - widget_context_s *cxt = __find_context_by_id(id); - - if (cxt) { - cxt->state = WC_TERMINATED; - if (cxt->ops.destroy) { - bundle *b = bundle_create(); - ret = cxt->ops.destroy(cxt, (widget_app_destroy_type_e)reason, b, widget_class->user_data); - - bundle_raw *raw = NULL; - int len; - - bundle_encode(b, &raw, &len); - if (raw) { - widget_provider_app_send_extra_info(id, (const char*)raw, NULL); - free(raw); - } + wc->state = WC_READY; + wc->id = g_strdup(id); + wc->provider = handle; + wc->win = NULL; - bundle_free(b); - contexts = g_list_remove(contexts, cxt); + wc->content = bundle_dup(b); + bundle_get_str(b, WIDGET_K_WIDTH, &w_str); + bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); - free(cxt->id); - free(cxt); - } - _I("widget obj was deleted"); - } else { - _E("could not find widget obj : %s", __FUNCTION__); + if (w_str) { + w = (int)g_ascii_strtoll(w_str, &remain, 10); } - return ret; -} - -static int __provider_update_cb(const char *id, const char *content, int force, - void *data) -{ - int ret = WIDGET_ERROR_FAULT; - widget_context_s *cxt = __find_context_by_id(id); - - if (cxt) { - if (cxt->ops.update) { - bundle *b = NULL; - if (content) - b = bundle_decode((const bundle_raw*)content, strlen(content)); - ret = cxt->ops.update(cxt, b, force, widget_class->user_data); - - if (b) - bundle_free(b); - } - _I("received updating signal"); - } else { - _E("could not find widget obj : %s", __FUNCTION__); + if (h_str) { + h = (int)g_ascii_strtoll(h_str, &remain, 10); } - return ret; -} + contexts = g_list_append(contexts, wc); -static int __provider_pause_cb(const char *id, void *data) -{ - int ret = WIDGET_ERROR_FAULT; - widget_context_s *cxt = __find_context_by_id(id); - - if (cxt) { - if (cxt->ops.pause) - ret = cxt->ops.pause(cxt, widget_class->user_data); - cxt->state = WC_PAUSED; - _I("widget obj was paused"); - } else { - _E("could not find widget obj : %s", __FUNCTION__); - } + handle->ops.create(wc, b, w, h, handle->user_data); + + ret = __send_update_status(handle->classid, wc->id, WIDGET_INSTANCE_EVENT_CREATE, b, 0); - __check_status_for_cgroup(); return ret; } -static int __provider_resume_cb(const char *id, void *data) +static int __instance_destroy(widget_class_h handle, const char *id, widget_destroy_type_e reason, bundle *b) { - int ret = WIDGET_ERROR_FAULT; - widget_context_s *cxt = __find_context_by_id(id); - - if (cxt) { - if (cxt->ops.resume) - ret = cxt->ops.resume(cxt, widget_class->user_data); - cxt->state = WC_RUNNING; - _I("widget obj was resumed"); - } else { - _E("could not find widget obj : %s", __FUNCTION__); - } + widget_context_s *wc = __find_context_by_id(id); + int ret = 0; - __check_status_for_cgroup(); - return ret; -} + if (wc) { + wc->state = WC_TERMINATED; + handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, handle->user_data); -static int __provider_text_signal_cb(const char *id, const char *signal_name, - const char *source, struct widget_event_info *info, void *data) -{ - int ret = WIDGET_ERROR_FAULT; - widget_context_s *cxt = __find_context_by_id(id); + ret = __send_update_status(handle->classid, id, WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); - if (cxt) { - if (cxt->ops_private.text_signal) { - ret = cxt->ops_private.text_signal(cxt, signal_name, source, - (widget_obj_event_info_s*)info, widget_class->user_data); - } - _I("received text signal"); + contexts = g_list_remove(contexts, wc); + + if (wc->id) + free(wc->id); + free(wc); } else { - _E("could not find widget obj : %s", __FUNCTION__); + _E("could not find widget obj: %s", id); + ret = WIDGET_ERROR_INVALID_PARAMETER; } return ret; } -static const widget_class_factory_full_s* -__widget_class_factory_override_text_signal(widget_instance_text_signal_cb op) +static widget_class_h __find_class_handler(const char *class_id, widget_class_h handle) { - widget_class_tmp.ops_private.text_signal = op; - return &factory; -} + if (!class_id || !handle) + return NULL; -static void __free_handler_cb(gpointer data) -{ - if (data) - free(data); -} + widget_class_h head = handle; -static void __free_handler_list(void) -{ - int i; + while (head) { + if (head->classid && strcmp(head->classid, class_id) == 0) + return head; - for (i = 0; i < WIDGET_APP_EVENT_MAX; i++) { - g_list_free_full(handler_list[i], __free_handler_cb); - handler_list[i] = NULL; + head = head->next; } + + return NULL; } static void __control(bundle *b) { - app_control_h app_control; + char *class_id = NULL; + char *id = NULL; + char *operation = NULL; + char *reason = NULL; + char *remain = NULL; + int destroy_type = WIDGET_DESTROY_TYPE_DEFAULT; - if (is_init_provider) { - _E("already initialized"); - return; - } + widget_class_h handle = NULL; + bundle_get_str(b, WIDGET_K_CLASS, &class_id); + /* for previous version compatibility, use appid for default class id */ + if (class_id == NULL) + class_id = appid; - if (app_control_create_event(b, &app_control) != 0) { - _E("failed to get the app_control handle"); - return; - } + bundle_get_str(b, WIDGET_K_INSTANCE, &id); + bundle_get_str(b, WIDGET_K_OPERATION, &operation); - char *op = NULL; - app_control_get_operation(app_control, &op); - - if (op && strcmp(op, "http://tizen.org/appcontrol/operation/main") == 0) { - static struct widget_provider_event_callback cb = { - .create = __provider_create_cb, - .resize = __provider_resize_cb, - .destroy = __provider_destroy_cb, - - .update = __provider_update_cb, - .text_signal = __provider_text_signal_cb, - - .pause = __provider_pause_cb, - .resume = __provider_resume_cb, - - .connected = NULL, - .disconnected = NULL, + handle = __find_class_handler(class_id, class_provider); + if (!handle) { + _E("no handle provided: %s", class_id); + goto error; + } - .data = NULL, - }; + if (!operation) { + _E("no operation provided"); + goto error; + } - if (widget_provider_app_init(app_control, &cb) == 0) - is_init_provider = 1; + if (strcmp(operation, "create") == 0) { + __instance_create(handle, id, b); + } else if (strcmp(operation, "resize") == 0) { + /* TODO */ + } else if (strcmp(operation, "update") == 0) { + /* TODO */ + } else if (strcmp(operation, "destroy") == 0) { + bundle_get_str(b, WIDGET_K_REASON, &reason); + if (reason) + destroy_type = (int)g_ascii_strtoll(reason, &remain, 10); + __instance_destroy(handle, id, destroy_type, b); + } else if (strcmp(operation, "resume") == 0) { + /* TODO */ + } else if (strcmp(operation, "pause") == 0) { + /* TODO */ } - app_control_destroy(app_control); - if (op) - free(op); + return; +error: + LOGD("error on control"); + return; } -static void __pause_all() +static void __show_all() { - GList *iter = g_list_first(contexts); - - while (iter != NULL) { - widget_context_s *cxt = (widget_context_s*) iter->data; - const char *id = cxt->id; - - switch (cxt->state) { - case WC_READY: - __provider_resume_cb(id, NULL); - __provider_pause_cb(id, NULL); - break; - - case WC_RUNNING: - __provider_pause_cb(id, NULL); - break; - } - iter = g_list_next(iter); - } + LOGD("resume"); } static int __aul_handler(aul_type type, bundle *b, void *data) { + char *caller = NULL; + char *remain = NULL; + switch (type) { case AUL_START: + if (b) { + bundle_get_str(b, WIDGET_K_CALLER, &caller); + if (caller) + caller_pid = g_ascii_strtoll(caller, &remain, 10); + else { + /* using caller appid and query pid using caller appid? */ + _E("no caller pid"); + } + } + __control(b); break; case AUL_RESUME: + __show_all(); break; case AUL_TERMINATE: widget_app_exit(); @@ -410,39 +294,37 @@ static int __aul_handler(aul_type type, bundle *b, void *data) return 0; } -static char* __get_domain_name(const char *aid) -{ - char *name_token = NULL; - - if (aid == NULL) { - _E("appid is NULL"); - return NULL; - } - - /* com.vendor.name -> name */ - name_token = strrchr(aid, '.'); - - if (name_token == NULL) { - _E("appid is invalid"); - return strdup(aid); - } - - name_token++; - - return strdup(name_token); -} static int __before_loop(int argc, char **argv) { int r; + bundle *kb = NULL; + char *wayland_display = NULL; + char *xdg_runtime_dir = NULL; #if !(GLIB_CHECK_VERSION(2, 36, 0)) g_type_init(); #endif - elm_init(argc, argv); + kb = bundle_import_from_argv(argc, argv); + if (kb) { + bundle_get_str(kb, AUL_K_WAYLAND_WORKING_DIR, &xdg_runtime_dir); + bundle_get_str(kb, AUL_K_WAYLAND_DISPLAY, &wayland_display); + bundle_get_str(kb, WIDGET_K_ENDPOINT, &viewer_endpoint); + + if (xdg_runtime_dir) + setenv("XDG_RUNTIME_DIR", xdg_runtime_dir, 1); - factory.override_text_signal = __widget_class_factory_override_text_signal; + if (wayland_display) + setenv("WAYLAND_DISPLAY", wayland_display, 1); + + bundle_free(kb); + kb = NULL; + } else { + _E("failed to get launch argv"); + } + + elm_init(argc, argv); r = aul_launch_init(__aul_handler, NULL); if (r < 0) { @@ -460,26 +342,8 @@ static int __before_loop(int argc, char **argv) if (r != APP_ERROR_NONE) return r; - char *name = __get_domain_name(appid); - - if (name == NULL) { - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call __get_domain_name"); - } - - r = _set_i18n(name); - - free(name); - if (r < 0) { - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call _set_i18n"); - } - - widget_provider_app_create_app(); - - memset(&widget_class_tmp, 0, sizeof(widget_class_tmp)); - widget_class = app_ops->create(app_user_data); - if (widget_class == NULL) { + class_provider = app_ops->create(app_user_data); + if (class_provider == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, "widget_class is NULL"); } @@ -489,204 +353,16 @@ static int __before_loop(int argc, char **argv) static void __after_loop() { - __pause_all(); - widget_provider_app_terminate_app(WIDGET_DESTROY_TYPE_TEMPORARY, 1); - if (app_ops->terminate) app_ops->terminate(app_user_data); - if (is_init_provider) { - widget_provider_app_fini(); - is_init_provider = 0; - } - __free_handler_list(); elm_shutdown(); - if (appid) - free(appid); - if (contexts) - g_list_free(contexts); - contexts = NULL; -} - -static gboolean __finish_event_cb(gpointer user_data) -{ - if (user_data == NULL) - return FALSE; - - widget_context_s *wc = (widget_context_s*) user_data; - const char* id = wc->id; - - switch (wc->state) { - case WC_READY: - __provider_resume_cb(id, NULL); - __provider_pause_cb(id, NULL); - __provider_destroy_cb(id, WIDGET_DESTROY_TYPE_DEFAULT, NULL); - break; - - case WC_RUNNING: - __provider_pause_cb(id, NULL); - __provider_destroy_cb(id, WIDGET_DESTROY_TYPE_DEFAULT, NULL); - break; - - case WC_PAUSED: - __provider_destroy_cb(id, WIDGET_DESTROY_TYPE_DEFAULT, NULL); - break; - } - - widget_provider_app_send_deleted(id); - return FALSE; -} - -static void __on_low_memory(keynode_t *key, void *data) -{ - int val; - - val = vconf_keynode_get_int(key); - if (val == VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING) { - app_event_handler_h handler; - struct app_event_info event; - - _I("widget_app_low_memory"); - - event.type = APP_EVENT_LOW_MEMORY; - event.value = (void*)&val; - - GList *iter = g_list_first(handler_list[APP_EVENT_LOW_MEMORY]); - - while (iter) { - handler = (app_event_handler_h) iter->data; - handler->cb(&event, handler->data); - iter = g_list_next(iter); - } - } -} - -static void __on_low_battery(keynode_t *key, void *data) -{ - int val; - - val = vconf_keynode_get_int(key); - if (val <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) { - app_event_handler_h handler; - struct app_event_info event; - - _I("widget_app_low_battery"); - - event.type = APP_EVENT_LOW_BATTERY; - event.value = (void*)&val; - - GList *iter = g_list_first(handler_list[APP_EVENT_LOW_BATTERY]); - - while (iter) { - handler = (app_event_handler_h) iter->data; - handler->cb(&event, handler->data); - iter = g_list_next(iter); - } - } -} - -static void __on_lang_changed(keynode_t *key, void *data) -{ - char *val; - - _update_lang(); - val = vconf_keynode_get_str(key); - - app_event_handler_h handler; - struct app_event_info event; - - _I("widget_app_lang_changed"); - - event.type = APP_EVENT_LANGUAGE_CHANGED; - event.value = (void*)val; - - GList *iter = g_list_first(handler_list[APP_EVENT_LANGUAGE_CHANGED]); - - while (iter) { - handler = (app_event_handler_h) iter->data; - handler->cb(&event, handler->data); - iter = g_list_next(iter); - } -} - -static void __on_region_changed(keynode_t *key, void *data) -{ - char *val; - - _update_region(); - val = vconf_keynode_get_str(key); - - app_event_handler_h handler; - struct app_event_info event; - - _I("widget_app_region_changed"); - - event.type = APP_EVENT_REGION_FORMAT_CHANGED; - event.value = (void*)val; - - GList *iter = g_list_first(handler_list[APP_EVENT_REGION_FORMAT_CHANGED]); - - while (iter) { - handler = (app_event_handler_h) iter->data; - handler->cb(&event, handler->data); - iter = g_list_next(iter); - } -} - -static void __register_event(int event_type) -{ - switch (event_type) { - case APP_EVENT_LOW_MEMORY: - vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory, NULL); - break; - - case APP_EVENT_LOW_BATTERY: - vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery, NULL); - break; - - case APP_EVENT_LANGUAGE_CHANGED: - vconf_notify_key_changed(VCONFKEY_LANGSET, __on_lang_changed, NULL); - break; - - case APP_EVENT_REGION_FORMAT_CHANGED: - vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, __on_region_changed, NULL); - break; - } -} - -static void __unregister_event(int event_type) -{ - switch (event_type) { - case APP_EVENT_LOW_MEMORY: - vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory); - break; - - case APP_EVENT_LOW_BATTERY: - vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery); - break; - - case APP_EVENT_LANGUAGE_CHANGED: - vconf_ignore_key_changed(VCONFKEY_LANGSET, __on_lang_changed); - break; - - case APP_EVENT_REGION_FORMAT_CHANGED: - vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, __on_region_changed); - break; - } } EXPORT_API int widget_app_main(int argc, char **argv, widget_app_lifecycle_callback_s *callback, void *user_data) { int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; if (argc <= 0 || argv == NULL || callback == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -701,7 +377,7 @@ EXPORT_API int widget_app_main(int argc, char **argv, return r; ecore_main_loop_begin(); - //aul_status_update(STATUS_DYING); + aul_status_update(STATUS_DYING); __after_loop(); return WIDGET_ERROR_NONE; @@ -709,68 +385,47 @@ EXPORT_API int widget_app_main(int argc, char **argv, EXPORT_API int widget_app_exit(void) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - ecore_main_loop_quit(); return WIDGET_ERROR_NONE; } -EXPORT_API int widget_app_terminate_context(widget_context_h context) +static gboolean __finish_event_cb(gpointer user_data) { - int r; - bool feature; + if (user_data == NULL) + return FALSE; - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; + widget_context_s *wc = (widget_context_s *)user_data; - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; + switch (wc->state) { + case WC_READY: - if (context == NULL) { - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "obj is NULL"); + break; + case WC_RUNNING: + + break; + case WC_PAUSED: + + break; + default: + break; } + + return FALSE; +} + +EXPORT_API int widget_app_terminate_context(widget_context_h context) +{ + if (context == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + g_idle_add(__finish_event_cb, context); return WIDGET_ERROR_NONE; } EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - - if (cb == NULL) - return WIDGET_ERROR_INVALID_PARAMETER; - - GList *iter = g_list_first(contexts); - - while (iter != NULL) { - widget_context_s *cxt = (widget_context_s*) iter->data; - - if (!cb(cxt, data)) - return WIDGET_ERROR_CANCELED; - - iter = g_list_next(iter); - } - return WIDGET_ERROR_NONE; } @@ -778,176 +433,47 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, app_event_cb callback, void *user_data) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - - app_event_handler_h handler; - - if (event_handler == NULL || callback == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - if (event_type < APP_EVENT_LOW_MEMORY - || event_type > APP_EVENT_REGION_FORMAT_CHANGED) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - if (event_type == APP_EVENT_DEVICE_ORIENTATION_CHANGED) - return widget_app_error(WIDGET_ERROR_NOT_SUPPORTED, __FUNCTION__, NULL); - - GList *iter = g_list_first(handler_list[event_type]); - - while (iter) { - handler = (app_event_handler_h) iter->data; - - if (handler->cb == callback) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - iter = g_list_next(iter); - } - - handler = calloc(1, sizeof(struct app_event_handler)); - if (!handler) - return widget_app_error(WIDGET_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); - - if (g_list_length(handler_list[event_type]) == 0) - __register_event(event_type); - - handler->type = event_type; - handler->cb = callback; - handler->data = user_data; - handler_list[event_type] = g_list_append(handler_list[event_type], handler); - - *event_handler = handler; - - return WIDGET_ERROR_NONE; + /* TODO */ + return 0; } EXPORT_API int widget_app_remove_event_handler(app_event_handler_h event_handler) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - - app_event_type_e type; - - if (event_handler == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - type = event_handler->type; - if (type < APP_EVENT_LOW_MEMORY || type > APP_EVENT_REGION_FORMAT_CHANGED) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - handler_list[type] = g_list_remove(handler_list[type], event_handler); - free(event_handler); - - if (g_list_length(handler_list[type]) == 0) - __unregister_event(type); - - return WIDGET_ERROR_NONE; + /* TODO */ + return 0; } EXPORT_API const char* widget_app_get_id(widget_context_h context) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) { - set_last_result(WIDGET_ERROR_FAULT); - return NULL; - } - - if (!feature) { - set_last_result(WIDGET_ERROR_NOT_SUPPORTED); - return NULL; - } - - if (context == NULL) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - widget_context_s *cxt = (widget_context_s*)context; - - set_last_result(WIDGET_ERROR_NONE); - return cxt->id; + return context->id; } EXPORT_API int widget_app_get_elm_win(widget_context_h context, Evas_Object **win) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - if (context == NULL || win == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); widget_context_s *cxt = (widget_context_s*)context; - Evas *evas; Evas_Object *ret_win = NULL; - evas = widget_get_evas(cxt->id); - if (evas) { - Evas_Object *widget_parent; - widget_parent = evas_object_rectangle_add(evas); - if (widget_parent) { - ret_win = elm_win_add(widget_parent, cxt->id, ELM_WIN_TIZEN_WIDGET); - /* ret_win = elm_win_tizen_widget_add(cxt->id, widget_parent); */ - - evas_object_del(widget_parent); - if (ret_win == NULL) { - _E("win is NULL"); - return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); - } - } else { - _E("Failed to get parent widget"); - return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); - } - } else { - _E("parent evas object is NULL"); - return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); + ret_win = elm_win_add(NULL, cxt->id, ELM_WIN_BASIC); + if (ret_win == NULL) { + _E("failed to create window"); + return WIDGET_ERROR_FAULT; } + elm_win_title_set(ret_win, cxt->id); *win = ret_win; + cxt->win = ret_win; + return WIDGET_ERROR_NONE; } -EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) +widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, + widget_instance_lifecycle_callback_s callback, void *user_data) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) { - set_last_result(WIDGET_ERROR_FAULT); - return NULL; - } - - if (!feature) { - set_last_result(WIDGET_ERROR_NOT_SUPPORTED); - return NULL; - } - widget_class_s *wc = (widget_class_s*)malloc(sizeof(widget_class_s)); if (wc == NULL) { @@ -956,25 +482,38 @@ EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_call return NULL; } + wc->classid = strdup(class_id); wc->user_data = user_data; wc->ops = callback; - wc->ops_private = widget_class_tmp.ops_private; + wc->next = prev; + wc->prev = NULL; + set_last_result(WIDGET_ERROR_NONE); + + if (prev) + prev->prev = wc; + return wc; } -EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) +EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, + widget_instance_lifecycle_callback_s callback, void *user_data) { - int r; - bool feature; + if (class_id == NULL) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; + return _widget_class_create(widget_class, class_id, callback, user_data); +} - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; +EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) +{ + return _widget_class_create(class_provider, appid, callback, user_data); +} +EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) +{ if (context == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -985,16 +524,6 @@ EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - if (context == NULL || tag == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -1005,52 +534,34 @@ EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bundle *content_info) { - int r; - bool feature; + const char *class_id = NULL; + int ret = 0; + if (context == NULL || content_info == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; + if (context->provider == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; + class_id = context->provider->classid; - if (content_info == NULL) - return WIDGET_ERROR_INVALID_PARAMETER; + if (class_id == NULL) + return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); - bundle_raw *raw = NULL; - int len; - int ret = WIDGET_ERROR_FAULT; + ret = __send_update_status(class_id, context->id, WIDGET_INSTANCE_EVENT_UPDATE, content_info, true); - bundle_encode(content_info, &raw, &len); - if (raw) { - ret = widget_provider_app_send_extra_info(context->id, (const char*)raw, NULL); - free(raw); + if (ret < 0) { + _E("failed to send content info: %s of %s (%d)", context->id, class_id, ret); + return widget_app_error(WIDGET_ERROR_IO_ERROR, __FUNCTION__, NULL); } - return ret; + return WIDGET_ERROR_NONE; } EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) { - int r; - bool feature; - - r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); - if (r < 0) - return WIDGET_ERROR_FAULT; - - if (!feature) - return WIDGET_ERROR_NOT_SUPPORTED; - - if (context == NULL) - return WIDGET_ERROR_INVALID_PARAMETER; - - return widget_provider_app_send_extra_info(context->id, NULL, title); + /* TODO + may use widget status update, or use surface title set. + */ + return 0; } -/* private API */ -EXPORT_API const widget_class_factory_full_s* widget_app_get_class_factory(void) -{ - return &factory; -} -- 2.7.4 From e9c537d0960cad631176a45c06ea523e7d62a442 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Wed, 13 Jan 2016 19:31:31 +0900 Subject: [PATCH 05/11] use class_name for instance id Change-Id: I13db581b0914f2798c39fa001c51369318083978 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index 9326483..5e7d2e2 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -456,14 +456,23 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); widget_context_s *cxt = (widget_context_s*)context; - Evas_Object *ret_win = NULL; + Evas_Object *ret_win; + Ecore_Wl_Window *wl_win; ret_win = elm_win_add(NULL, cxt->id, ELM_WIN_BASIC); if (ret_win == NULL) { _E("failed to create window"); return WIDGET_ERROR_FAULT; } - elm_win_title_set(ret_win, cxt->id); + + wl_win = elm_win_wl_window_get(ret_win); + if (wl_win == NULL) { + _E("failed to get wayland window"); + evas_object_del(ret_win); + return WIDGET_ERROR_FAULT; + } + + ecore_wl_window_class_name_set(wl_win, cxt->id); *win = ret_win; cxt->win = ret_win; -- 2.7.4 From 72213bf7f0971e6ff5876d015b3f0590b8fe22fb Mon Sep 17 00:00:00 2001 From: "SukHyung, Kang" Date: Thu, 14 Jan 2016 10:05:40 +0900 Subject: [PATCH 06/11] change doc files to sync tizen 2.4 for API references Change-Id: I67d460b11ae48482f411125a9c22be1385111e25 Signed-off-by: SukHyung, Kang --- doc/appcore-widget_doc.h | 15 +++++++++------ doc/images/widget_app_lifecycle.png | Bin 18154 -> 22048 bytes 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/appcore-widget_doc.h b/doc/appcore-widget_doc.h index a6833ee..e9fe5a5 100755 --- a/doc/appcore-widget_doc.h +++ b/doc/appcore-widget_doc.h @@ -79,38 +79,38 @@ * Description * * - * widget_obj_create_cb() + * widget_instance_create_cb() * Called after widget instance is created. * In this callback, you can initialize resources for this instance. * If parameter 'content' is not NULL, You should restore the pervious status. * * * - * widget_obj_destroy_cb() + * widget_instance_destroy_cb() * Called before widget instance is destroyed. * In this callback, you can finalize resources for this instance. * * * - * widget_obj_pause_cb() + * widget_instance_pause_cb() * Called when the widget is invisible. * The paused instance may be destroyed by framework * * * - * widget_obj_resume_cb() + * widget_instance_resume_cb() * Called when the widget is visible. * The callback function is called when the widget is visible. * * * - * widget_obj_resize_cb() + * widget_instance_resize_cb() * Called before the widget size is changed. * The callback function is called before the widget size is changed. * * * - * widget_obj_update_cb() + * widget_instance_update_cb() * Called when the event for updating widget is received. * The callback function is called when the event for updating widget is received. * @@ -121,6 +121,9 @@ * Please refer to the following state diagram to see the possible transitions and callbacks that are called while transition. * @image html widget_obj_lifecycle.png "Widget Instance States" * + * @section CAPI_WIDGET_APP_MODULE_RELATED_FEATURES Related Features + * This API is related with the following feature: + * - http://tizen.org/feature/shell.appwidget * * */ diff --git a/doc/images/widget_app_lifecycle.png b/doc/images/widget_app_lifecycle.png index 9b1d87cfb4753375651512e0d3e43ab35581568c..923dd25eb4ab810fa0a2a74e26120e0baf86b25a 100755 GIT binary patch literal 22048 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 HQDOfBh-@q7 literal 18154 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 Ib4q9e0RCkO^Z)<= -- 2.7.4 From 79e75769d76403cca9848899f84416454900a17a Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Tue, 19 Jan 2016 11:44:52 +0900 Subject: [PATCH 07/11] fix warning Change-Id: If56e793e74dafe05b05bcb02f20be462ec6db92d Signed-off-by: Daehyeon Jung --- src/widget_app.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/widget_app.c b/src/widget_app.c index 5e7d2e2..eff8ab3 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -29,6 +30,8 @@ #include #include #include +#include +#include #include "widget_app.h" #include "widget-log.h" @@ -123,6 +126,8 @@ static int __send_update_status(const char *class_id, const char *instance_id, if (extra == NULL) bundle_free(b); + + return 0; } static int __instance_create(widget_class_h handle, const char *id, bundle *b) -- 2.7.4 From 0827f6ee9c2e35f743b7d91b7b59d781b88d2a88 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Fri, 29 Jan 2016 17:23:04 +0900 Subject: [PATCH 08/11] Check invalid parameter Change-Id: I17e6b7593210b7a4c4b0ef4d3491777af67a14f6 --- src/widget_app.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index eff8ab3..1c3c855 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -431,6 +431,9 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) { + if (!cb) + return WIDGET_ERROR_INVALID_PARAMETER; + return WIDGET_ERROR_NONE; } @@ -439,18 +442,42 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, void *user_data) { /* TODO */ - return 0; + if (!event_handler || !callback) + return WIDGET_ERROR_INVALID_PARAMETER; + + switch (event_type) { + case APP_EVENT_LOW_MEMORY: + case APP_EVENT_LOW_BATTERY: + case APP_EVENT_LANGUAGE_CHANGED: + case APP_EVENT_DEVICE_ORIENTATION_CHANGED: + case APP_EVENT_REGION_FORMAT_CHANGED: + case APP_EVENT_SUSPENDED_STATE_CHANGED: + + break; + default: + return WIDGET_ERROR_INVALID_PARAMETER; + } + + return WIDGET_ERROR_NONE; } EXPORT_API int widget_app_remove_event_handler(app_event_handler_h event_handler) { /* TODO */ - return 0; + if (!event_handler) + return WIDGET_ERROR_INVALID_PARAMETER; + + return WIDGET_ERROR_NONE; } EXPORT_API const char* widget_app_get_id(widget_context_h context) { + if (!context) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + return context->id; } @@ -574,8 +601,12 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) { /* TODO - may use widget status update, or use surface title set. + call elm_win_title_set() */ - return 0; + + if (!context || !title) + return WIDGET_ERROR_INVALID_PARAMETER; + + return WIDGET_ERROR_NONE; } -- 2.7.4 From add47d6698911638a2abbd9e8c4f70441a9f1ef8 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Thu, 25 Feb 2016 13:17:30 +0900 Subject: [PATCH 09/11] check widget feature first Change-Id: I35deb1006d0b4734bdf592cb90a126cc6f2fe056 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index 1c3c855..b77fe74 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -32,6 +32,7 @@ #include #include #include +#include #include "widget_app.h" #include "widget-log.h" @@ -93,6 +94,27 @@ static widget_class_h class_provider = NULL; static GList *contexts = NULL; static char *viewer_endpoint = NULL; +static inline bool _is_widget_feature_enabled(void) +{ + static bool feature = false; + static bool retrieved = false; + int ret; + + if (retrieved == true) + return feature; + + ret = system_info_get_platform_bool( + "http://tizen.org/feature/shell.appwidget", &feature); + if (ret != SYSTEM_INFO_ERROR_NONE) { + _E("failed to get system info"); + return false; + } + + retrieved = true; + + return feature; +} + static gint __comp_by_id(gconstpointer a, gconstpointer b) { widget_context_s *wc = (widget_context_s*)a; @@ -369,6 +391,11 @@ EXPORT_API int widget_app_main(int argc, char **argv, { int r; + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (argc <= 0 || argv == NULL || callback == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -390,6 +417,11 @@ EXPORT_API int widget_app_main(int argc, char **argv, EXPORT_API int widget_app_exit(void) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + ecore_main_loop_quit(); return WIDGET_ERROR_NONE; @@ -422,6 +454,11 @@ static gboolean __finish_event_cb(gpointer user_data) EXPORT_API int widget_app_terminate_context(widget_context_h context) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -431,6 +468,11 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (!cb) return WIDGET_ERROR_INVALID_PARAMETER; @@ -441,6 +483,11 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, app_event_cb callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + /* TODO */ if (!event_handler || !callback) return WIDGET_ERROR_INVALID_PARAMETER; @@ -464,6 +511,11 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, EXPORT_API int widget_app_remove_event_handler(app_event_handler_h event_handler) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + /* TODO */ if (!event_handler) return WIDGET_ERROR_INVALID_PARAMETER; @@ -473,6 +525,12 @@ EXPORT_API int widget_app_remove_event_handler(app_event_handler_h EXPORT_API const char* widget_app_get_id(widget_context_h context) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + set_last_result(WIDGET_ERROR_NOT_SUPPORTED); + return NULL; + } + if (!context) { set_last_result(WIDGET_ERROR_INVALID_PARAMETER); return NULL; @@ -484,13 +542,18 @@ EXPORT_API const char* widget_app_get_id(widget_context_h context) EXPORT_API int widget_app_get_elm_win(widget_context_h context, Evas_Object **win) { - if (context == NULL || win == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - widget_context_s *cxt = (widget_context_s*)context; Evas_Object *ret_win; Ecore_Wl_Window *wl_win; + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + + if (context == NULL || win == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + ret_win = elm_win_add(NULL, cxt->id, ELM_WIN_BASIC); if (ret_win == NULL) { _E("failed to create window"); @@ -515,6 +578,12 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + set_last_result(WIDGET_ERROR_NOT_SUPPORTED); + return NULL; + } + widget_class_s *wc = (widget_class_s*)malloc(sizeof(widget_class_s)); if (wc == NULL) { @@ -540,6 +609,12 @@ widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + if (class_id == NULL) { set_last_result(WIDGET_ERROR_INVALID_PARAMETER); return NULL; @@ -550,11 +625,21 @@ EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, cons EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + return _widget_class_create(class_provider, appid, callback, user_data); } EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -565,6 +650,11 @@ EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL || tag == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -577,6 +667,12 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun { const char *class_id = NULL; int ret = 0; + + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL || content_info == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -600,6 +696,11 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + /* TODO call elm_win_title_set() */ -- 2.7.4 From 5cb01bf9f4f90bc6a5e2b75b400de61977c21e71 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 26 Feb 2016 15:57:48 +0900 Subject: [PATCH 10/11] Fix the exception about checking widget feature Change-Id: I5ab197ba3ec80bae9a37d1a6cc0b45f4d1f46c5a Signed-off-by: Hwankyu Jhun --- src/widget_app.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index b77fe74..905b186 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -119,7 +119,7 @@ static gint __comp_by_id(gconstpointer a, gconstpointer b) { widget_context_s *wc = (widget_context_s*)a; - return strcmp(wc->id, (const char*)b); + return strcmp(wc->id, (const char*)b); } static widget_context_s* __find_context_by_id(const char *id) @@ -173,13 +173,11 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) bundle_get_str(b, WIDGET_K_WIDTH, &w_str); bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); - if (w_str) { + if (w_str) w = (int)g_ascii_strtoll(w_str, &remain, 10); - } - if (h_str) { + if (h_str) h = (int)g_ascii_strtoll(h_str, &remain, 10); - } contexts = g_list_append(contexts, wc); @@ -578,14 +576,20 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { + widget_class_s *wc; + if (!_is_widget_feature_enabled()) { _E("not supported"); set_last_result(WIDGET_ERROR_NOT_SUPPORTED); return NULL; } - widget_class_s *wc = (widget_class_s*)malloc(sizeof(widget_class_s)); + if (class_id == NULL) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + wc = (widget_class_s *)malloc(sizeof(widget_class_s)); if (wc == NULL) { _E("failed to malloc : %s", __FUNCTION__); set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); @@ -609,27 +613,11 @@ widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { - if (!_is_widget_feature_enabled()) { - _E("not supported"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (class_id == NULL) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - return _widget_class_create(widget_class, class_id, callback, user_data); } EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) { - if (!_is_widget_feature_enabled()) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - return _widget_class_create(class_provider, appid, callback, user_data); } -- 2.7.4 From cf58e4b97a8c72028d7a88649854cb33d7c0400a Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Wed, 9 Mar 2016 12:06:26 +0900 Subject: [PATCH 11/11] Enable compiler option -Werror Change-Id: I28bb59cb233d9f988f80086301188229a54d46ac Signed-off-by: Junghoon Park --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 495fac4..d57515e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_SKIP_BUILD_RPATH TRUE) -- 2.7.4