X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fbase%2Fwidget_base.c;h=d479c5255631eb6c0a742f7562b2b1f3d25596d6;hb=c2233b1e963b14080d8725edbde500649eb7ad52;hp=9df350481a65e39d3842d059293a2fe984323fad;hpb=fdf263c9b2470291ad6ee3c599a21ad1cd6c7231;p=platform%2Fcore%2Fappfw%2Fappcore-widget.git diff --git a/src/base/widget_base.c b/src/base/widget_base.c index 9df3504..d479c52 100644 --- a/src/base/widget_base.c +++ b/src/base/widget_base.c @@ -84,8 +84,12 @@ typedef struct _widget_base_context { typedef struct _widget_base_instance_data { bundle *args; + char *id; char *content; void *tag; + double period; + guint periodic_timer; + bool pending_update; void *user_data; } widget_base_instance_data; @@ -94,6 +98,32 @@ static char *__appid; static char *__package_id; static bool __fg_signal; static char *__viewer_endpoint; +static void __call_update_cb(const char *class_id, const char *id, int force, + const char *content_raw); + +static gboolean __timeout_cb(gpointer user_data) +{ + widget_base_instance_data *data = + (widget_base_instance_data *)user_data; + appcore_multiwindow_base_instance_h cxt; + const char *class_id; + + cxt = appcore_multiwindow_base_instance_find(data->id); + if (appcore_multiwindow_base_instance_is_resumed(cxt)) { + LOGD("Periodic update!"); + class_id = appcore_multiwindow_base_instance_get_class_id(cxt); + __call_update_cb(class_id, data->id, 0, NULL); + } else { + data->pending_update = true; + if (data->periodic_timer) { + LOGD("Remove timer!"); + g_source_remove(data->periodic_timer); + data->periodic_timer = 0; + } + } + + return G_SOURCE_CONTINUE; +} static bool __is_widget_feature_enabled(void) { @@ -151,6 +181,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->content); + free(data->id); free(data); __check_empty_instance(); } @@ -162,16 +193,20 @@ static gint __comp_class(gconstpointer a, gconstpointer b) return strcmp(cls->id, b); } -static widget_base_class __get_class(const char *class_id) +static widget_base_class *__get_class(const char *class_id) { widget_base_class *cls; GList *class_node; class_node = g_list_find_custom(__context.classes, class_id, __comp_class); + if (class_node == NULL) { + LOGE("empty classes"); + return NULL; + } cls = (widget_base_class *)class_node->data; - return *cls; + return cls; } static int __send_lifecycle_event(const char *class_id, const char *instance_id, @@ -256,6 +291,9 @@ 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; data = (widget_base_instance_data *) calloc(1, sizeof(widget_base_instance_data)); @@ -264,7 +302,14 @@ static void __control_create(const char *class_id, const char *id, bundle *b) return; } + 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); @@ -313,7 +358,7 @@ static void __control_resize(const char *class_id, const char *id, bundle *b) int w = 0; int h = 0; void *class_data; - widget_base_class cls; + widget_base_class *cls; const appcore_multiwindow_base_class *raw_cls; instance_h = appcore_multiwindow_base_instance_find(id); @@ -327,6 +372,10 @@ static void __control_resize(const char *class_id, const char *id, bundle *b) return; cls = __get_class(class_id); + if (cls == NULL) { + LOGE("class not found: %s", class_id); + return; + } class_data = raw_cls->data; bundle_get_str(b, WIDGET_K_WIDTH, &w_str); bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); @@ -337,28 +386,26 @@ static void __control_resize(const char *class_id, const char *id, bundle *b) if (h_str) h = (int)g_ascii_strtoll(h_str, &remain, 10); - if (cls.ops.resize) - cls.ops.resize(instance_h, w, h, class_data); + if (cls->ops.resize) + cls->ops.resize(instance_h, w, h, class_data); LOGD("%s is resized to %dx%d", id, w, h); __send_update_status(class_id, id, WIDGET_INSTANCE_EVENT_SIZE_CHANGED, NULL); } -static void __update_cb(const char *class_id, const char *id, - appcore_multiwindow_base_instance_h instance_h, void *data) +static void __call_update_cb(const char *class_id, const char *id, int force, + const char *content_raw) { void *class_data; + widget_base_class *cls; const appcore_multiwindow_base_class *raw_cls; + appcore_multiwindow_base_instance_h instance_h; bundle *content = NULL; - char *content_raw = NULL; - char *force_str = NULL; - int force; - bundle *b = data; - widget_base_class cls; - if (!b) { - LOGE("bundle is NULL"); + instance_h = appcore_multiwindow_base_instance_find(id); + if (!instance_h) { + LOGE("context not found: %s", id); return; } @@ -370,28 +417,23 @@ static void __update_cb(const char *class_id, const char *id, class_data = raw_cls->data; cls = __get_class(class_id); + if (cls == NULL) { + LOGE("class not found: %s", class_id); + return; + } - if (!cls.ops.update) { + if (!cls->ops.update) { LOGE("update callback is NULL"); return; } - bundle_get_str(b, WIDGET_K_FORCE, &force_str); - - if (force_str && strcmp(force_str, "true") == 0) - force = 1; - else - force = 0; - - bundle_get_str(b, WIDGET_K_CONTENT_INFO, &content_raw); - if (content_raw) { content = bundle_decode((const bundle_raw *)content_raw, strlen(content_raw)); } - if (cls.ops.update) - cls.ops.update(instance_h, content, force, class_data); + if (cls->ops.update) + cls->ops.update(instance_h, content, force, class_data); __send_update_status(class_id, id, WIDGET_INSTANCE_EVENT_UPDATE, NULL); @@ -401,13 +443,37 @@ static void __update_cb(const char *class_id, const char *id, bundle_free(content); } +static void __update_process(const char *class_id, const char *id, + appcore_multiwindow_base_instance_h instance_h, void *data) +{ + char *content_raw = NULL; + char *force_str = NULL; + int force; + bundle *b = data; + + if (!b) { + LOGE("bundle is NULL"); + return; + } + + bundle_get_str(b, WIDGET_K_FORCE, &force_str); + + if (force_str && strcmp(force_str, "true") == 0) + force = 1; + else + force = 0; + + bundle_get_str(b, WIDGET_K_CONTENT_INFO, &content_raw); + __call_update_cb(class_id, id, force, content_raw); +} + static void __control_update(const char *class_id, const char *id, bundle *b) { appcore_multiwindow_base_instance_h instance_h; if (!id) { appcore_multiwindow_base_instance_foreach(class_id, - __update_cb, b); + __update_process, b); return; } @@ -417,7 +483,7 @@ static void __control_update(const char *class_id, const char *id, bundle *b) return; } - __update_cb(class_id, id, instance_h, b); + __update_process(class_id, id, instance_h, b); } static void __control_destroy(const char *class_id, const char *id, bundle *b) @@ -439,6 +505,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->content); + free(data->id); free(data); __check_empty_instance(); } @@ -632,7 +699,7 @@ static void __multiwindow_exit(void *data) EXPORT_API int widget_base_exit(void) { appcore_multiwindow_base_exit(); - aul_widget_notify_exit(); + aul_notify_exit(); return 0; } @@ -1110,9 +1177,10 @@ 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( @@ -1186,7 +1254,7 @@ static void __multiwindow_instance_create( int w = 0; int h = 0; int ret = -1; - widget_base_class cls; + widget_base_class *cls; appcore_multiwindow_base_class_on_create(instance_h); instance_data = appcore_multiwindow_base_instance_get_extra(instance_h); @@ -1198,6 +1266,11 @@ static void __multiwindow_instance_create( class_id = __appid; cls = __get_class(class_id); + if (cls == NULL) { + LOGE("class not found: %s", class_id); + return; + } + bundle_get_str(b, AUL_K_WIDGET_INSTANCE_ID, &id); bundle_get_str(b, WIDGET_K_OPERATION, &operation); @@ -1220,8 +1293,8 @@ static void __multiwindow_instance_create( content_info = bundle_decode((const bundle_raw *)content, strlen(content)); - if (cls.ops.create) - ret = cls.ops.create(instance_h, content_info, w, h, class_data); + if (cls->ops.create) + ret = cls->ops.create(instance_h, content_info, w, h, class_data); if (ret < 0) { LOGW("Create callback returns error(%d)", ret); @@ -1246,15 +1319,35 @@ static void __multiwindow_instance_resume( { const char *id; const char *class_id; - widget_base_class cls; + widget_base_class *cls; + widget_base_instance_data *data; appcore_multiwindow_base_class_on_resume(instance_h); id = appcore_multiwindow_base_instance_get_id(instance_h); class_id = appcore_multiwindow_base_instance_get_class_id(instance_h); cls = __get_class(class_id); + if (cls == NULL) { + LOGE("class not found: %s", class_id); + return; + } - if (cls.ops.resume) - cls.ops.resume(instance_h, class_data); + data = (widget_base_instance_data *) + appcore_multiwindow_base_instance_get_extra(instance_h); + + if (data->pending_update) { + LOGD("pending update!"); + data->pending_update = false; + __control_update(class_id, data->id, data->args); + if (data->period > 0) { + LOGD("Restart timer!"); + data->periodic_timer = g_timeout_add_seconds( + data->period, + __timeout_cb, data); + } + } + + if (cls->ops.resume) + cls->ops.resume(instance_h, class_data); LOGD("%s is resumed", id); __send_update_status(class_id, id, @@ -1277,15 +1370,19 @@ static void __multiwindow_instance_pause( { const char *id; const char *class_id; - widget_base_class cls; + widget_base_class *cls; appcore_multiwindow_base_class_on_pause(instance_h); id = appcore_multiwindow_base_instance_get_id(instance_h); class_id = appcore_multiwindow_base_instance_get_class_id(instance_h); cls = __get_class(class_id); + if (cls == NULL) { + LOGE("class not found: %s", class_id); + return; + } - if (cls.ops.pause) - cls.ops.pause(instance_h, class_data); + if (cls->ops.pause) + cls->ops.pause(instance_h, class_data); LOGD("%s is paused", id); __send_update_status(class_id, id, @@ -1314,7 +1411,7 @@ static void __multiwindow_instance_terminate( int event = WIDGET_INSTANCE_EVENT_TERMINATE; const char *id; const char *class_id; - widget_base_class cls; + widget_base_class *cls; id = appcore_multiwindow_base_instance_get_id(instance_h); class_id = appcore_multiwindow_base_instance_get_class_id(instance_h); @@ -1322,6 +1419,10 @@ static void __multiwindow_instance_terminate( (appcore_multiwindow_base_instance_h)instance_h); b = data->args; cls = __get_class(class_id); + if (cls == NULL) { + LOGE("class not found: %s", class_id); + return; + } if (b) { bundle_get_str(b, WIDGET_K_OPERATION, &operation); @@ -1335,8 +1436,8 @@ static void __multiwindow_instance_terminate( else content_info = bundle_create(); - if (cls.ops.destroy) - cls.ops.destroy(instance_h, reason, content_info, class_data); + if (cls->ops.destroy) + cls->ops.destroy(instance_h, reason, content_info, class_data); LOGD("%s is destroyed %d", id, reason); if (reason == WIDGET_BASE_DESTROY_TYPE_PERMANENT) { @@ -1351,6 +1452,9 @@ static void __multiwindow_instance_terminate( if (content_info) bundle_free(content_info); + if (data->periodic_timer) + g_source_remove(data->periodic_timer); + __send_update_status(class_id, id, event, NULL); appcore_multiwindow_base_class_on_terminate(instance_h); }