X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fbase%2Fwidget_base.c;h=c443d00a9d94aceee3931332ff5363e6b61f07f1;hb=eaf6c143ac7eae93e312d9bb96ad01ccd91cb08c;hp=c10cd8d30c1990c9399f626fa0a54b58bbd33ba8;hpb=cc471d913591dde16c9d4e88df5d31aa29b3d63f;p=platform%2Fcore%2Fappfw%2Fappcore-widget.git diff --git a/src/base/widget_base.c b/src/base/widget_base.c index c10cd8d..c443d00 100644 --- a/src/base/widget_base.c +++ b/src/base/widget_base.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -28,10 +29,8 @@ #include #include #include -#include +#include #include -#include -#include #include #include @@ -90,6 +89,7 @@ typedef struct _widget_base_instance_data { double period; guint periodic_timer; bool pending_update; + char *pending_content; void *user_data; } widget_base_instance_data; @@ -98,6 +98,7 @@ static char *__appid; static char *__package_id; static bool __fg_signal; static char *__viewer_endpoint; +static bool __is_permanent; static void __call_update_cb(const char *class_id, const char *id, int force, const char *content_raw); @@ -109,6 +110,12 @@ static gboolean __timeout_cb(gpointer user_data) const char *class_id; cxt = appcore_multiwindow_base_instance_find(data->id); + + if (!cxt) { + LOGE("Can't find the instance"); + return G_SOURCE_REMOVE; + } + if (appcore_multiwindow_base_instance_is_resumed(cxt)) { LOGD("Periodic update!"); class_id = appcore_multiwindow_base_instance_get_class_id(cxt); @@ -145,27 +152,6 @@ static bool __is_widget_feature_enabled(void) return feature; } -/* LCOV_EXCL_START */ -static void __on_poweroff(keynode_t *key, void *data) -{ - int val; - - val = vconf_keynode_get_int(key); - switch (val) { - case VCONFKEY_SYSMAN_POWER_OFF_DIRECT: - case VCONFKEY_SYSMAN_POWER_OFF_RESTART: - LOGI("power off changed: %d", val); - widget_base_exit(); - break; - case VCONFKEY_SYSMAN_POWER_OFF_NONE: - case VCONFKEY_SYSMAN_POWER_OFF_POPUP: - default: - /* DO NOTHING */ - break; - } -} -/* LCOV_EXCL_STOP */ - static void __check_empty_instance(void) { int cnt = appcore_multiwindow_base_instance_get_cnt(); @@ -180,6 +166,7 @@ static void __instance_drop(appcore_multiwindow_base_instance_h instance_h) data = appcore_multiwindow_base_instance_get_extra(instance_h); appcore_multiwindow_base_instance_drop(instance_h); + free(data->pending_content); free(data->content); free(data->id); free(data); @@ -236,12 +223,13 @@ static int __send_lifecycle_event(const char *class_id, const char *instance_id, } static int __send_update_status(const char *class_id, const char *instance_id, - int status, bundle *extra) + int status, int err, bundle *extra) { bundle *b; int lifecycle = -1; bundle_raw *raw = NULL; int len; + char err_str[256]; b = bundle_create(); if (!b) { @@ -249,6 +237,11 @@ static int __send_update_status(const char *class_id, const char *instance_id, return -1; /* LCOV_EXCL_LINE */ } + if (err < 0) { + snprintf(err_str, sizeof(err_str), "%d", err); + bundle_add_str(b, AUL_K_WIDGET_ERROR_CODE, err_str); + } + bundle_add_str(b, AUL_K_WIDGET_ID, class_id); bundle_add_str(b, AUL_K_WIDGET_INSTANCE_ID, instance_id); bundle_add_byte(b, AUL_K_WIDGET_STATUS, &status, sizeof(int)); @@ -291,9 +284,11 @@ static void __control_create(const char *class_id, const char *id, bundle *b) { widget_base_instance_data *data; char *content = NULL; - double *period = NULL; - size_t size; - int ret; + + if (appcore_multiwindow_base_instance_find(id)) { + LOGE("Already exist id (%s)", id); + return; + } data = (widget_base_instance_data *) calloc(1, sizeof(widget_base_instance_data)); @@ -304,12 +299,6 @@ static void __control_create(const char *class_id, const char *id, bundle *b) data->id = strdup(id); data->args = b; - ret = bundle_get_byte(b, WIDGET_K_PERIOD, (void **)&period, &size); - if (ret == BUNDLE_ERROR_NONE) { - data->period = *period; - data->periodic_timer = g_timeout_add_seconds(data->period, - __timeout_cb, data); - } /* call stub create */ appcore_multiwindow_base_instance_run(class_id, id, data); @@ -391,7 +380,7 @@ static void __control_resize(const char *class_id, const char *id, bundle *b) LOGD("%s is resized to %dx%d", id, w, h); __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_SIZE_CHANGED, NULL); + WIDGET_INSTANCE_EVENT_SIZE_CHANGED, 0, NULL); } static void __call_update_cb(const char *class_id, const char *id, int force, @@ -436,13 +425,36 @@ static void __call_update_cb(const char *class_id, const char *id, int force, cls->ops.update(instance_h, content, force, class_data); __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_UPDATE, NULL); + WIDGET_INSTANCE_EVENT_UPDATE, 0, NULL); LOGD("updated:%s", id); if (content) bundle_free(content); } +static void __update_pending_content( + appcore_multiwindow_base_instance_h instance_h, + const char *content_raw) +{ + widget_base_instance_data *data; + + data = (widget_base_instance_data *) + appcore_multiwindow_base_instance_get_extra(instance_h); + + if (data->pending_content) { + free(data->pending_content); + data->pending_content = NULL; + } + + if (content_raw) { + data->pending_content = strdup(content_raw); + if (data->pending_content == NULL) + LOGW("Out of memory"); + } + + data->pending_update = true; +} + static void __update_process(const char *class_id, const char *id, appcore_multiwindow_base_instance_h instance_h, void *data) { @@ -464,7 +476,10 @@ static void __update_process(const char *class_id, const char *id, force = 0; bundle_get_str(b, WIDGET_K_CONTENT_INFO, &content_raw); - __call_update_cb(class_id, id, force, content_raw); + if (!appcore_multiwindow_base_instance_is_resumed(instance_h) && !force) + __update_pending_content(instance_h, content_raw); + else + __call_update_cb(class_id, id, force, content_raw); } static void __control_update(const char *class_id, const char *id, bundle *b) @@ -504,6 +519,7 @@ static void __control_destroy(const char *class_id, const char *id, bundle *b) /* call stub terminate */ appcore_multiwindow_base_instance_exit(instance_h); + free(data->pending_content); free(data->content); free(data->id); free(data); @@ -568,10 +584,6 @@ static int __multiwindow_create(void *data) } screen_connector_provider_init(); - vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, - __on_poweroff, NULL); - - if (__context.ops.create) ret = __context.ops.create(data); @@ -583,9 +595,6 @@ static int __multiwindow_terminate(void *data) { if (__context.ops.terminate) __context.ops.terminate(data); - - vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, - __on_poweroff); screen_connector_provider_fini(); if (__viewer_endpoint) { @@ -740,10 +749,22 @@ static void __multiwindow_exit(void *data) __context.ops.exit(data); } +static void __multiwindow_trim_memory(void *data) +{ + if (__context.ops.trim_memory) + __context.ops.trim_memory(data); +} + EXPORT_API int widget_base_exit(void) { + int ret; + appcore_multiwindow_base_exit(); - aul_notify_exit(); + if (appcore_multiwindow_base_instance_get_cnt() == 0 && __is_permanent) { + ret = aul_notify_exit(); + aul_widget_write_log(LOG_TAG, "[%s:%d] permanent exit : %d", + __FUNCTION__, __LINE__, ret); + } return 0; } @@ -942,7 +963,7 @@ EXPORT_API int widget_base_context_set_content_info( return WIDGET_BASE_ERROR_FAULT; ret = __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_EXTRA_UPDATED, content_info); + WIDGET_INSTANCE_EVENT_EXTRA_UPDATED, 0, content_info); if (data->content) free(data->content); @@ -1107,6 +1128,7 @@ EXPORT_API int widget_base_init(widget_base_ops ops, int argc, char **argv, raw_ops.base.finish = __multiwindow_finish; raw_ops.base.run = __multiwindow_run; raw_ops.base.exit = __multiwindow_exit; + raw_ops.base.trim_memory = __multiwindow_trim_memory; if (!__is_widget_feature_enabled()) { LOGE("not supported"); /* LCOV_EXCL_LINE */ @@ -1115,7 +1137,7 @@ EXPORT_API int widget_base_init(widget_base_ops ops, int argc, char **argv, kb = bundle_import_from_argv(argc, argv); if (kb) { - bundle_get_str(kb, WIDGET_K_ENDPOINT, &viewer_endpoint); + bundle_get_str(kb, AUL_K_WIDGET_VIEWER, &viewer_endpoint); if (viewer_endpoint) { LOGD("viewer endpoint :%s", viewer_endpoint); __viewer_endpoint = strdup(viewer_endpoint); @@ -1165,6 +1187,11 @@ static void __on_exit(void *data) widget_base_on_exit(); } +static void __on_trim_memory(void *data) +{ + widget_base_on_trim_memory(); +} + EXPORT_API int widget_base_on_create(void) { appcore_multiwindow_base_on_create(); @@ -1196,6 +1223,13 @@ EXPORT_API void widget_base_on_exit(void) { } +EXPORT_API int widget_base_on_trim_memory(void) +{ + appcore_multiwindow_base_on_trim_memory(); + + return 0; +} + EXPORT_API widget_base_ops widget_base_get_default_ops(void) { widget_base_ops ops; @@ -1207,6 +1241,7 @@ EXPORT_API widget_base_ops widget_base_get_default_ops(void) ops.finish = __on_finish; ops.run = __on_run; ops.exit = __on_exit; + ops.trim_memory = __on_trim_memory; return ops; } @@ -1221,19 +1256,18 @@ static void __free_class(gpointer data) EXPORT_API void widget_base_fini(void) { + appcore_multiwindow_base_fini(); g_list_free_full(__context.classes, __free_class); __context.classes = NULL; - - appcore_multiwindow_base_fini(); } EXPORT_API int widget_base_context_window_bind( widget_base_instance_h instance_h, const char *id, - Ecore_Wl_Window *wl_win) + Ecore_Wl2_Window *wl_win) { struct wl_surface *surface; - surface = ecore_wl_window_surface_get(wl_win); + surface = ecore_wl2_window_surface_get(wl_win); if (surface == NULL) { LOGE("failed to get surface"); /* LCOV_EXCL_LINE */ return WIDGET_BASE_ERROR_FAULT; /* LCOV_EXCL_LINE */ @@ -1299,6 +1333,8 @@ static void __multiwindow_instance_create( int h = 0; int ret = -1; widget_base_class *cls; + double *period = NULL; + size_t size; appcore_multiwindow_base_class_on_create(instance_h); instance_data = appcore_multiwindow_base_instance_get_extra(instance_h); @@ -1343,14 +1379,28 @@ static void __multiwindow_instance_create( if (ret < 0) { LOGW("Create callback returns error(%d)", ret); ret = __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_CREATE_ABORTED, NULL); + WIDGET_INSTANCE_EVENT_CREATE_ABORTED, ret, NULL); + if (ret < 0) + LOGE("Fail to send abort status (%d) ", ret); __instance_drop(instance_h); } else { LOGD("%s is created", id); ret = __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_CREATE, NULL); + WIDGET_INSTANCE_EVENT_CREATE, 0, NULL); + if (ret < 0) + LOGE("Fail to send create status (%d) ", ret); aul_widget_instance_add(class_id, id); + + ret = bundle_get_byte(b, WIDGET_K_PERIOD, (void **)&period, + &size); + if (ret == BUNDLE_ERROR_NONE && *period > 0) { + LOGI("set periodic update timer (%lf)", *period); + instance_data->period = *period; + instance_data->periodic_timer = g_timeout_add_seconds( + instance_data->period, + __timeout_cb, instance_data); + } } if (content_info) @@ -1381,7 +1431,7 @@ static void __multiwindow_instance_resume( if (data->pending_update) { LOGD("pending update!"); data->pending_update = false; - __control_update(class_id, data->id, data->args); + __call_update_cb(class_id, data->id, 0, data->pending_content); if (data->period > 0) { LOGD("Restart timer!"); data->periodic_timer = g_timeout_add_seconds( @@ -1395,15 +1445,11 @@ static void __multiwindow_instance_resume( LOGD("%s is resumed", id); __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_RESUME, NULL); + WIDGET_INSTANCE_EVENT_RESUME, 0, NULL); if (!__fg_signal) { LOGD("Send fg signal to resourceD"); - aul_send_app_status_change_signal(getpid(), - __appid, - __package_id, - STATUS_FOREGROUND, - APP_TYPE_WIDGET); + aul_widget_instance_change_status(class_id, STATUS_FOREGROUND); __fg_signal = true; } } @@ -1430,15 +1476,11 @@ static void __multiwindow_instance_pause( LOGD("%s is paused", id); __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_PAUSE, NULL); + WIDGET_INSTANCE_EVENT_PAUSE, 0, NULL); if (__fg_signal) { LOGD("Send bg signal to resourceD"); - aul_send_app_status_change_signal(getpid(), - __appid, - __package_id, - STATUS_BACKGROUND, - APP_TYPE_WIDGET); + aul_widget_instance_change_status(class_id, STATUS_BACKGROUND); __fg_signal = false; } } @@ -1483,13 +1525,15 @@ static void __multiwindow_instance_terminate( if (cls->ops.destroy) cls->ops.destroy(instance_h, reason, content_info, class_data); - LOGD("%s is destroyed %d", id, reason); + LOGW("%s is destroyed %d", id, reason); if (reason == WIDGET_BASE_DESTROY_TYPE_PERMANENT) { + __is_permanent = true; event = WIDGET_INSTANCE_EVENT_DESTROY; aul_widget_instance_del(class_id, id); } else { + __is_permanent = false; __send_update_status(class_id, id, - WIDGET_INSTANCE_EVENT_EXTRA_UPDATED, + WIDGET_INSTANCE_EVENT_EXTRA_UPDATED, 0, content_info); } @@ -1499,7 +1543,7 @@ static void __multiwindow_instance_terminate( if (data->periodic_timer) g_source_remove(data->periodic_timer); - __send_update_status(class_id, id, event, NULL); + __send_update_status(class_id, id, event, 0, NULL); appcore_multiwindow_base_class_on_terminate(instance_h); } @@ -1555,6 +1599,7 @@ EXPORT_API widget_base_class widget_base_class_get_default(void) cls.ops.destroy = __class_on_destroy; cls.ops.pause = __class_on_pause; cls.ops.resume = __class_on_resume; + cls.id = NULL; return cls; }