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;
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)
{
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();
}
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,
{
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));
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);
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);
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);
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;
}
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);
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;
}
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)
/* call stub terminate */
appcore_multiwindow_base_instance_exit(instance_h);
free(data->content);
+ free(data->id);
free(data);
__check_empty_instance();
}
EXPORT_API int widget_base_exit(void)
{
appcore_multiwindow_base_exit();
- aul_widget_notify_exit();
+ aul_notify_exit();
return 0;
}
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);
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);
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);
{
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;
+ }
+
+ 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);
+ if (cls->ops.resume)
+ cls->ops.resume(instance_h, class_data);
LOGD("%s is resumed", id);
__send_update_status(class_id, id,
{
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,
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);
(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);
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) {
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);
}