From 11a72e0c52013001af118512e7eac86259b0294b Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Fri, 3 Jul 2015 17:07:52 +0900 Subject: [PATCH 01/16] 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 02/16] 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 03/16] 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 04/16] 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 05/16] 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 06/16] 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 07/16] 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 08/16] 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 09/16] 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 From 95a4e10ca6d551b1830e97e1763062615af74a9e Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Wed, 30 Mar 2016 20:01:03 +0900 Subject: [PATCH 10/16] fix widget status notify Change-Id: I7d4792423d1c67891d67b93172a1f638cae556e6 --- src/widget_app.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/widget_app.c b/src/widget_app.c index 905b186..b856c16 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -144,6 +144,7 @@ static int __send_update_status(const char *class_id, const char *instance_id, bundle_add_str(b, WIDGET_K_INSTANCE, instance_id); bundle_add_byte(b, WIDGET_K_STATUS, &status, sizeof(int)); + _E("send update %s(%d) to %s", instance_id, status, viewer_endpoint); aul_app_com_send(viewer_endpoint, b); if (extra == NULL) @@ -182,7 +183,6 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) contexts = g_list_append(contexts, wc); handle->ops.create(wc, b, w, h, handle->user_data); - ret = __send_update_status(handle->classid, wc->id, WIDGET_INSTANCE_EVENT_CREATE, b, 0); return ret; @@ -336,6 +336,8 @@ static int __before_loop(int argc, char **argv) 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); + _E("viewer endpoint :%s", viewer_endpoint); + viewer_endpoint = strdup(viewer_endpoint); if (xdg_runtime_dir) setenv("XDG_RUNTIME_DIR", xdg_runtime_dir, 1); @@ -381,6 +383,9 @@ static void __after_loop() if (app_ops->terminate) app_ops->terminate(app_user_data); + if (viewer_endpoint) + free(viewer_endpoint); + elm_shutdown(); } -- 2.7.4 From 013d5c1e938cd23dbeed7bbf019f634d7ec5c506 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Wed, 30 Mar 2016 21:10:11 +0900 Subject: [PATCH 11/16] Add NULL check for endpoint Change-Id: I3d1819d9f30784c785fd680593b5e9cb1c4cc65f --- src/widget_app.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index b856c16..f515704 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -336,8 +336,12 @@ static int __before_loop(int argc, char **argv) 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); - _E("viewer endpoint :%s", viewer_endpoint); - viewer_endpoint = strdup(viewer_endpoint); + if (viewer_endpoint) { + _E("viewer endpoint :%s", viewer_endpoint); + viewer_endpoint = strdup(viewer_endpoint); + } else { + _E("endpoint is missing"); + } if (xdg_runtime_dir) setenv("XDG_RUNTIME_DIR", xdg_runtime_dir, 1); -- 2.7.4 From f23e0188ab8db88c7d98391f1e4b451a8cd02951 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 25 Mar 2016 21:48:38 +0900 Subject: [PATCH 12/16] Adjust coding rules Change-Id: Id7b804be392640d7459a91019e180f08a83f1a52 Signed-off-by: Hwankyu Jhun --- doc/appcore-widget_doc.h | 2 +- include/widget_app.h | 17 ++++--- include/widget_app_efl.h | 5 +- include/widget_app_internal.h | 31 +++++------- src/widget-i18n.c | 14 +++--- src/widget-log.h | 72 ++++++++++++++-------------- src/widget-private.h | 7 +-- src/widget_app.c | 109 ++++++++++++++++++++++++++---------------- src/widget_error.c | 32 ++++--------- 9 files changed, 150 insertions(+), 139 deletions(-) diff --git a/doc/appcore-widget_doc.h b/doc/appcore-widget_doc.h index e9fe5a5..1a83d63 100755 --- a/doc/appcore-widget_doc.h +++ b/doc/appcore-widget_doc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2015 - 2016 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. diff --git a/include/widget_app.h b/include/widget_app.h index 67b6457..3c935cd 100755 --- a/include/widget_app.h +++ b/include/widget_app.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -51,13 +51,13 @@ typedef enum widget_app_destroy_type { * @brief The handle for widget class. * @since_tizen 2.3.1 */ -typedef struct _widget_class* widget_class_h; +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; +typedef struct _widget_context *widget_context_h; /** * @brief Called when the widget instance starts. @@ -164,8 +164,7 @@ typedef int (*widget_instance_update_cb)(widget_context_h context, bundle *conte * @brief The structure for lifecycle of a widget instance. * @since_tizen 2.3.1 */ -typedef struct -{ +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. */ @@ -213,8 +212,7 @@ 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 -{ +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; @@ -321,7 +319,7 @@ int widget_app_foreach_context(widget_context_cb callback, void *data); * @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); + app_event_cb callback, void *user_data); /** * @brief Removes registered event handler. @@ -352,7 +350,7 @@ int widget_app_remove_event_handler(app_event_handler_h event_handler); * @remark You must not free returned Widget ID * @see get_last_result() */ -const char* widget_app_get_id(widget_context_h context); +const char *widget_app_get_id(widget_context_h context); /** * @brief Makes a class for widget instances. @@ -456,3 +454,4 @@ widget_class_h widget_app_class_add(widget_class_h widget_class, const char *cla #endif #endif /* __TIZEN_APPFW_WIDGET_APP_H__ */ + diff --git a/include/widget_app_efl.h b/include/widget_app_efl.h index 4bd1765..fd1a0c0 100644 --- a/include/widget_app_efl.h +++ b/include/widget_app_efl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -52,4 +52,5 @@ int widget_app_get_elm_win(widget_context_h context, Evas_Object **win); } #endif -#endif +#endif /* __TIZEN_APPFW_WIDGET_APP_EFL_H__ */ + diff --git a/include/widget_app_internal.h b/include/widget_app_internal.h index 260f4f3..024cfa9 100644 --- a/include/widget_app_internal.h +++ b/include/widget_app_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -27,18 +27,14 @@ extern "C" { * For in-house applications * */ - -typedef struct -{ - struct __pointer - { +typedef struct { + struct __pointer { double x; double y; int down; } pointer; - struct __part - { + struct __part { double sx; double sy; double ex; @@ -47,28 +43,27 @@ 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, void *user_data); +typedef int (*widget_instance_text_signal_cb)(widget_context_h context, + const char *signal_name, const char *source, + widget_obj_event_info_s *info, void *user_data); -typedef struct _widget_obj_private_ops -{ +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 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 -{ +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); +const widget_class_factory_full_s *widget_app_get_class_factory(void); #ifdef __cplusplus } #endif -#endif +#endif /* __TIZEN_APPFW_WIDGET_APP_INTERNAL_H__ */ + diff --git a/src/widget-i18n.c b/src/widget-i18n.c index 23cbd3b..91804e2 100755 --- a/src/widget-i18n.c +++ b/src/widget-i18n.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -33,18 +33,17 @@ void _update_lang(void) { + char *r; char *lang = vconf_get_str(VCONFKEY_LANGSET); if (lang) { setenv("LANG", lang, 1); setenv("LC_MESSAGES", lang, 1); - char *r = setlocale(LC_ALL, ""); + r = setlocale(LC_ALL, ""); if (r == NULL) { r = setlocale(LC_ALL, lang); - if (r) _D("*****appcore setlocale=%s\n", r); - } free(lang); } else { @@ -70,8 +69,8 @@ void _update_region(void) setenv("LC_TELEPHONE", region, 1); setenv("LC_MEASUREMENT", region, 1); setenv("LC_IDENTIFICATION", region, 1); - r = setlocale(LC_ALL, ""); + r = setlocale(LC_ALL, ""); if (r != NULL) _D("*****appcore setlocale=%s\n", r); @@ -85,6 +84,7 @@ static int __set_i18n(const char *domain) { char *r; char dirname[PATH_MAX] = {0, }; + char *lang; if (domain == NULL) { errno = EINVAL; @@ -97,15 +97,13 @@ static int __set_i18n(const char *domain) 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); + 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"); diff --git a/src/widget-log.h b/src/widget-log.h index e8eb56d..980f3e3 100755 --- a/src/widget-log.h +++ b/src/widget-log.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -45,37 +45,39 @@ #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_ +#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 index 662b734..ef6d32c 100644 --- a/src/widget-private.h +++ b/src/widget-private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -24,10 +24,11 @@ #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); +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 index f515704..82f1f89 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -117,14 +117,14 @@ static inline bool _is_widget_feature_enabled(void) static gint __comp_by_id(gconstpointer a, gconstpointer b) { - widget_context_s *wc = (widget_context_s*)a; + 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) +static widget_context_s *__find_context_by_id(const char *id) { - GList* ret = g_list_find_custom(contexts, id, __comp_by_id); + GList *ret = g_list_find_custom(contexts, id, __comp_by_id); if (ret == NULL) return NULL; @@ -183,21 +183,25 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) contexts = g_list_append(contexts, wc); handle->ops.create(wc, b, w, h, handle->user_data); - ret = __send_update_status(handle->classid, wc->id, WIDGET_INSTANCE_EVENT_CREATE, b, 0); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_CREATE, b, 0); return ret; } -static int __instance_destroy(widget_class_h handle, const char *id, widget_destroy_type_e reason, bundle *b) +static int __instance_destroy(widget_class_h handle, const char *id, + widget_destroy_type_e reason, bundle *b) { widget_context_s *wc = __find_context_by_id(id); int ret = 0; if (wc) { wc->state = WC_TERMINATED; - handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, handle->user_data); + handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, + handle->user_data); - ret = __send_update_status(handle->classid, id, WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); + ret = __send_update_status(handle->classid, id, + WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); contexts = g_list_remove(contexts, wc); @@ -212,7 +216,8 @@ static int __instance_destroy(widget_class_h handle, const char *id, widget_dest return ret; } -static widget_class_h __find_class_handler(const char *class_id, widget_class_h handle) +static widget_class_h __find_class_handler(const char *class_id, + widget_class_h handle) { if (!class_id || !handle) return NULL; @@ -267,7 +272,8 @@ static void __control(bundle *b) } 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); + destroy_type = (int)g_ascii_strtoll(reason, &remain, + 10); __instance_destroy(handle, id, destroy_type, b); } else if (strcmp(operation, "resume") == 0) { @@ -296,9 +302,10 @@ static int __aul_handler(aul_type type, bundle *b, void *data) case AUL_START: if (b) { bundle_get_str(b, WIDGET_K_CALLER, &caller); - if (caller) - caller_pid = g_ascii_strtoll(caller, &remain, 10); - else { + if (caller) { + caller_pid = g_ascii_strtoll(caller, &remain, + 10); + } else { /* using caller appid and query pid using caller appid? */ _E("no caller pid"); } @@ -359,14 +366,16 @@ 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"); + 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"); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "Fail to call the aul_launch_argv_handler"); } r = app_get_id(&appid); @@ -375,8 +384,8 @@ static int __before_loop(int argc, char **argv) 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"); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, "widget_class is NULL"); } return WIDGET_ERROR_NONE; @@ -394,7 +403,7 @@ static void __after_loop() } 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; @@ -404,10 +413,14 @@ EXPORT_API int widget_app_main(int argc, char **argv, } if (argc <= 0 || argv == NULL || callback == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, 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"); + 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; @@ -467,7 +480,8 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) } if (context == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); g_idle_add(__finish_event_cb, context); return WIDGET_ERROR_NONE; @@ -487,8 +501,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) { if (!_is_widget_feature_enabled()) { _E("not supported"); @@ -530,7 +544,7 @@ EXPORT_API int widget_app_remove_event_handler(app_event_handler_h return WIDGET_ERROR_NONE; } -EXPORT_API const char* widget_app_get_id(widget_context_h context) +EXPORT_API const char *widget_app_get_id(widget_context_h context) { if (!_is_widget_feature_enabled()) { _E("not supported"); @@ -549,7 +563,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) { - widget_context_s *cxt = (widget_context_s*)context; + widget_context_s *cxt = (widget_context_s *)context; Evas_Object *ret_win; Ecore_Wl_Window *wl_win; @@ -559,7 +573,8 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, } if (context == NULL || win == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, 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) { @@ -619,13 +634,16 @@ widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, return wc; } -EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, 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) { - return _widget_class_create(widget_class, class_id, callback, user_data); + 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) +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); } @@ -638,7 +656,8 @@ 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); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); context->tag = tag; @@ -653,14 +672,16 @@ EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) } if (context == NULL || tag == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, 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) +EXPORT_API int widget_app_context_set_content_info(widget_context_h context, + bundle *content_info) { const char *class_id = NULL; int ret = 0; @@ -671,27 +692,33 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun } if (context == NULL || content_info == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); if (context->provider == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); class_id = context->provider->classid; if (class_id == NULL) return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); - ret = __send_update_status(class_id, context->id, WIDGET_INSTANCE_EVENT_UPDATE, content_info, true); + ret = __send_update_status(class_id, context->id, + WIDGET_INSTANCE_EVENT_UPDATE, content_info, true); 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); + _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 WIDGET_ERROR_NONE; } -EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) +EXPORT_API int widget_app_context_set_title(widget_context_h context, + const char *title) { if (!_is_widget_feature_enabled()) { _E("not supported"); diff --git a/src/widget_error.c b/src/widget_error.c index 010adb0..b6a63cc 100755 --- a/src/widget_error.c +++ b/src/widget_error.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 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. @@ -29,68 +29,56 @@ #define LOG_TAG "CAPI_WIDGET_APPLICATIO" -static const char* widget_app_error_to_string(widget_error_e error) +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) +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); + 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); + LOGE("[%s] %s(0x%08x)", function, + widget_app_error_to_string(error), error); } return error; } + -- 2.7.4 From bf69959df3783f311c5ae27e05a9b7b1a0b54694 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Fri, 8 Apr 2016 18:00:03 +0900 Subject: [PATCH 13/16] Fix widget_app_destroy_type_e Change-Id: I77c1fb8a1e6db6138d08285ff9f1c97d87ffb582 --- include/widget_app.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/include/widget_app.h b/include/widget_app.h index 3c935cd..3b49868 100755 --- a/include/widget_app.h +++ b/include/widget_app.h @@ -38,13 +38,8 @@ extern "C" { * @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_PERMANENT = 0x00, /* User deleted this widget from the viewer */ + WIDGET_APP_DESTROY_TYPE_TEMPORARY = 0x01, /* Widget is deleted because of other reasons (e.g. widget process is terminated temporarily by the system) */ } widget_app_destroy_type_e; /**< Delete type */ /** @@ -83,7 +78,7 @@ typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *conte * * @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. + * If reason is not #WIDGET_APP_DESTROY_TYPE_TEMPORARY, 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 -- 2.7.4 From 0d73d4df19bbea7d7d71f055406b51673a409532 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Tue, 12 Apr 2016 13:53:50 +0900 Subject: [PATCH 14/16] Fix gettext error Change-Id: I0e78c041f2c79db7c0801f84452987e80c1734f5 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/widget_app.c b/src/widget_app.c index 82f1f89..d337d64 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -326,6 +326,28 @@ static int __aul_handler(aul_type type, bundle *b, void *data) return 0; } +static char *__get_domain_name(char *appid) +{ + char *name_token; + + if (appid == NULL) { + _E("appid is NULL"); + return NULL; + } + + name_token = strrchr(appid, '.'); + + if (name_token == NULL) { + _E("appid is invalid"); + return appid; + } + + name_token++; + + return name_token; +} + +extern int _set_i18n(const char *name); static int __before_loop(int argc, char **argv) { @@ -333,6 +355,7 @@ static int __before_loop(int argc, char **argv) bundle *kb = NULL; char *wayland_display = NULL; char *xdg_runtime_dir = NULL; + char *name; #if !(GLIB_CHECK_VERSION(2, 36, 0)) g_type_init(); @@ -382,6 +405,22 @@ static int __before_loop(int argc, char **argv) if (r != APP_ERROR_NONE) return r; + 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); + + if (r < 0) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "Fail to call _set_i18n"); + } + class_provider = app_ops->create(app_user_data); if (class_provider == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, -- 2.7.4 From ed46e42fcfe01b3d38459e06c6bf572848666495 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 18 Apr 2016 17:46:46 +0900 Subject: [PATCH 15/16] Fix the widget_app_get_id() - Set the result Change-Id: I10a03805e042ad3ebce8780329d8a4e519b15458 Signed-off-by: Hwankyu Jhun --- src/widget_app.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widget_app.c b/src/widget_app.c index d337d64..38cda3d 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -596,6 +596,7 @@ EXPORT_API const char *widget_app_get_id(widget_context_h context) return NULL; } + set_last_result(WIDGET_ERROR_NONE); return context->id; } -- 2.7.4 From 49cfed7131365b3b6a23594a619752a343cd027b Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Mon, 18 Apr 2016 18:13:07 +0900 Subject: [PATCH 16/16] implement widget_context_foreach, add window cb Change-Id: I112c0e502ae7906e8cf4614377b32f7f4ac5f231 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/widget_app.c b/src/widget_app.c index 38cda3d..96212dc 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -293,6 +293,41 @@ static void __show_all() LOGD("resume"); } +static Eina_Bool __show_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Show *ev = event; + LOGD("show %d %d", (unsigned int)ev->win, (unsigned int)ev->data[0]); + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __hide_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Hide *ev = event; + LOGD("hide %d", (unsigned int)ev->win); + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __visibility_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Visibility_Change *ev = event; + LOGD("visiblity change: %d %d", (unsigned int)ev->win, (unsigned int)ev->fully_obscured); + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __lower_cb(void *data, int type, void *event) +{ + LOGD("lower"); + return ECORE_CALLBACK_RENEW; +} + +static void __add_climsg() +{ + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __show_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, __hide_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, __lower_cb, NULL); +} + static int __aul_handler(aul_type type, bundle *b, void *data) { char *caller = NULL; @@ -421,6 +456,8 @@ static int __before_loop(int argc, char **argv) "Fail to call _set_i18n"); } + __add_climsg(); + class_provider = app_ops->create(app_user_data); if (class_provider == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, @@ -528,6 +565,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) { + GList *list; + widget_context_s *wc; + if (!_is_widget_feature_enabled()) { _E("not supported"); return WIDGET_ERROR_NOT_SUPPORTED; @@ -536,6 +576,17 @@ EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) if (!cb) return WIDGET_ERROR_INVALID_PARAMETER; + list = g_list_first(contexts); + + while (list) { + wc = (widget_context_s *)list->data; + if (wc) { + if (!cb(wc, data)) + break; + } + list = list->next; + } + return WIDGET_ERROR_NONE; } -- 2.7.4