#define ERR_BUFFER_SIZE 1024
#define WIDGET_PRIVILEGE "http://tizen.org/privilege/widget.viewer"
+#define WIDGET_RESTART_TIMEOUT 5000
/*!
* \note
Evas_Object *win;
GHashTable *widget_table;
GHashTable *instance_cnt_table;
+ GList *restart_list;
+ int restart_timer;
} s_info = {
.w = 0,
.h = 0,
.win = NULL,
.widget_table = NULL,
.instance_cnt_table = NULL,
+ .restart_list = NULL,
+ .restart_timer = 0
};
struct pending_item {
static int __default_delayed_resuming_time = 100;
static bool __is_delayed_resuming_mode;
static void __destroy_widget_info(gpointer data);
+static gboolean __restart_timeout_cb(gpointer user_data);
+static void __remove_restart_info(const char *instance_id);
+static void __restart_instance(void);
static void __destroy_pending_item(gpointer data)
{
LOGD("instance_id(%s), event(%s)", info->instance_id, item->event);
}
+static void __add_restart_list(const char *instance_id)
+{
+ char *restart_instance_id;
+
+ if (!instance_id) {
+ LOGE("Invalid parameter");/* LCOV_EXCL_LINE */
+ return;/* LCOV_EXCL_LINE */
+ }
+
+ restart_instance_id = strdup(instance_id);
+ if (restart_instance_id == NULL) {
+ LOGE("Out Of Memory");
+ return;
+ }
+
+ s_info.restart_list = g_list_append(s_info.restart_list, restart_instance_id);
+ LOGW("add restart(%s)", instance_id);
+}
+
static inline bool __is_widget_feature_enabled(void)
{
static bool feature = false;
info->state = WIDGET_STATE_ATTACHED;
+ __remove_restart_info(instance_id);
+ __restart_instance();
__flush_event_queue(info);
/**
* @note
g_queue_push_tail(info->event_queue, GINT_TO_POINTER(event));
}
+static int __find_restart_info(gconstpointer a, gconstpointer b)
+{
+ if (a == NULL || b == NULL)
+ return -1;
+
+ if (strcmp((const char *)a, (const char *)b) == 0)
+ return 0;
+
+ return -1;
+}
+
+static void __remove_restart_info(const char *instance_id)
+{
+ GList *list;
+ char *restart_instance_id;
+
+ list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info);
+ if (list == NULL)
+ return;
+ restart_instance_id = list->data;
+ s_info.restart_list = g_list_remove(s_info.restart_list, restart_instance_id);
+ free(restart_instance_id);
+
+ if (s_info.restart_timer > 0) {
+ g_source_remove(s_info.restart_timer);
+ s_info.restart_timer = 0;
+ }
+}
+
+static void __restart_instance()
+{
+ struct widget_info *info;
+ char *restart_instance_id;
+ int w, h;
+ screen_connector_toolkit_evas_ops ops;
+
+ if (s_info.restart_list == NULL) {
+ LOGW("null restart list");
+ return;
+ }
+
+ restart_instance_id = s_info.restart_list->data;
+ info = g_hash_table_lookup(s_info.widget_table, restart_instance_id);
+ evas_object_geometry_get(info->layout, NULL, NULL, &w, &h);
+ DbgPrint("Widget launch %s, %d, %d", info->instance_id, w, h);
+
+ ops.added_cb = __screen_connector_toolkit_evas_added_cb;
+ ops.removed_cb = __screen_connector_toolkit_evas_removed_cb;
+ ops.updated_cb = __screen_connector_toolkit_evas_updated_cb;
+
+ if (info->toolkit_h) {
+ screen_connector_toolkit_evas_remove(info->toolkit_h);
+ info->toolkit_h = NULL;
+ }
+
+ info->toolkit_h = screen_connector_toolkit_evas_add(&ops,
+ info->instance_id,
+ SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET,
+ info);
+
+ info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h);
+ info->restart = false;
+
+ s_info.restart_timer = g_timeout_add(WIDGET_RESTART_TIMEOUT,
+ __restart_timeout_cb, restart_instance_id);
+}
+
/* LCOV_EXCL_START */
static int __restart_terminated_widget(const char *widget_id)
{
-
GHashTableIter iter;
gpointer key, value;
- screen_connector_toolkit_evas_ops ops;
struct widget_info *widget_instance_info;
- int w, h;
int target_pid = 0;
g_hash_table_iter_init(&iter, s_info.widget_table);
}
if (target_pid == 0) {
- DbgPrint("can not find widget");
+ DbgPrint("can not find widget(%s)", widget_id);
return 0;
}
while (g_hash_table_iter_next(&iter, &key, &value)) {
widget_instance_info = (struct widget_info *)value;
if (widget_instance_info->restart &&
- widget_instance_info->pid == target_pid) {
- evas_object_geometry_get(widget_instance_info->layout, NULL, NULL, &w, &h);
- DbgPrint("Widget launch %s, %d, %d", widget_instance_info->instance_id, w, h);
-
- ops.added_cb = __screen_connector_toolkit_evas_added_cb;
- ops.removed_cb = __screen_connector_toolkit_evas_removed_cb;
- ops.updated_cb = __screen_connector_toolkit_evas_updated_cb;
-
- if (widget_instance_info->toolkit_h) {
- screen_connector_toolkit_evas_remove(widget_instance_info->toolkit_h);
- widget_instance_info->toolkit_h = NULL;
- }
-
- widget_instance_info->toolkit_h = screen_connector_toolkit_evas_add(&ops,
- widget_instance_info->instance_id,
- SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET,
- widget_instance_info);
-
- widget_instance_info->pid = widget_instance_launch(widget_instance_info->instance_id, widget_instance_info->content_info, w, h);
- widget_instance_info->restart = false;
+ widget_instance_info->pid == target_pid &&
+ (strcmp(widget_instance_info->widget_id, widget_id) == 0)) {
+ __add_restart_list(widget_instance_info->instance_id);
}
}
+ if (s_info.restart_timer == 0)
+ __restart_instance();
return 0;
}
/* LCOV_EXCL_STOP */
+static gboolean __restart_timeout_cb(gpointer user_data)
+{
+ char *restart_instance_id = (char *)user_data;
+
+ WarnPrint("Timeout called !! %s", restart_instance_id);
+ __remove_restart_info(restart_instance_id);
+ __restart_instance();
+ return G_SOURCE_REMOVE;
+}
+
/* LCOV_EXCL_START */
static int __handle_restart_widget_request(const char *widget_id)
{
static int __lifecycle_event_cb(const char *widget_id, widget_lifecycle_event_e lifecycle_event, const char *widget_instance_id, void *data)
{
- int ret;
DbgPrint("__lifecycle_event_cb %s (%d)", widget_id, lifecycle_event);
if (lifecycle_event == WIDGET_LIFE_CYCLE_EVENT_APP_DEAD) {
- ret = __restart_terminated_widget(widget_id);
- return ret;
+ __restart_terminated_widget(widget_id);
}
return 0;
}