summaryrefslogtreecommitdiff
path: root/src/script_handler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/script_handler.c')
-rw-r--r--src/script_handler.c195
1 files changed, 118 insertions, 77 deletions
diff --git a/src/script_handler.c b/src/script_handler.c
index 0b0e789..05d4b3a 100644
--- a/src/script_handler.c
+++ b/src/script_handler.c
@@ -1,7 +1,7 @@
/*
* Copyright 2013 Samsung Electronics Co., Ltd
*
- * Licensed under the Flora License, Version 1.0 (the "License");
+ * Licensed under the Flora License, Version 1.1 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
@@ -129,8 +129,12 @@ struct script_info {
struct script_port *port;
void *port_data;
+
+ Eina_List *cached_blocks;
};
+static inline void consuming_parsed_block(int lineno, struct inst_info *inst, int is_pd, struct block *block);
+
static inline struct script_port *find_port(const char *magic_id)
{
Eina_List *l;
@@ -144,6 +148,18 @@ static inline struct script_port *find_port(const char *magic_id)
return NULL;
}
+static inline void delete_block(struct block *block)
+{
+ DbgFree(block->file);
+ DbgFree(block->type);
+ DbgFree(block->part);
+ DbgFree(block->data);
+ DbgFree(block->option);
+ DbgFree(block->id);
+ DbgFree(block->target_id);
+ DbgFree(block);
+}
+
static void render_pre_cb(void *data, Evas *e, void *event_info)
{
struct inst_info *inst = data;
@@ -230,6 +246,15 @@ int script_signal_emit(Evas *e, const char *part, const char *signal, double sx,
return ret;
}
+static inline void flushing_cached_block(struct script_info *info)
+{
+ struct block *block;
+
+ EINA_LIST_FREE(info->cached_blocks, block) {
+ consuming_parsed_block(-1, info->inst, (instance_pd_script(info->inst) == info), block);
+ }
+}
+
HAPI int script_handler_load(struct script_info *info, int is_pd)
{
int ret;
@@ -270,6 +295,7 @@ HAPI int script_handler_load(struct script_info *info, int is_pd)
return LB_STATUS_ERROR_FAULT;
}
info->loaded = 1;
+ flushing_cached_block(info);
script_signal_emit(e, util_uri_to_path(instance_id(info->inst)),
is_pd ? "pd,show" : "lb,show", 0.0f, 0.0f, 0.0f, 0.0f);
} else {
@@ -371,6 +397,7 @@ HAPI struct script_info *script_handler_create(struct inst_info *inst, const cha
HAPI int script_handler_destroy(struct script_info *info)
{
+ struct block *block;
if (!info || !info->port) {
ErrPrint("port is not valid\n");
return LB_STATUS_ERROR_INVALID;
@@ -385,6 +412,10 @@ HAPI int script_handler_destroy(struct script_info *info)
ErrPrint("Failed to destroy port, but go ahead\n");
fb_destroy(info->fb);
+
+ EINA_LIST_FREE(info->cached_blocks, block) {
+ delete_block(block);
+ }
DbgFree(info);
return LB_STATUS_SUCCESS;
}
@@ -640,14 +671,12 @@ HAPI int script_handler_resize(struct script_info *info, int w, int h)
ErrPrint("Evas(nil) resize to %dx%d\n", w, h);
}
- if (info->w != w || info->h != h) {
- if (instance_lb_script(info->inst) == info) {
- instance_set_lb_info(info->inst, w, h, PRIORITY_NO_CHANGE, CONTENT_NO_CHANGE, TITLE_NO_CHANGE);
- } else if (instance_pd_script(info->inst) == info) {
- instance_set_pd_info(info->inst, w, h);
- } else {
- ErrPrint("Script is not known\n");
- }
+ if (instance_lb_script(info->inst) == info) {
+ instance_set_lb_size(info->inst, w, h);
+ } else if (instance_pd_script(info->inst) == info) {
+ instance_set_pd_size(info->inst, w, h);
+ } else {
+ ErrPrint("Script is not known\n");
}
info->w = w;
@@ -706,43 +735,14 @@ static int update_info(struct inst_info *inst, struct block *block, int is_pd)
return LB_STATUS_SUCCESS;
}
-HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const char *descfile, int is_pd)
+static inline void consuming_parsed_block(int lineno, struct inst_info *inst, int is_pd, struct block *block)
{
- struct inst_info *inst;
- FILE *fp;
- int ch;
- int lineno;
- enum state {
- UNKNOWN = 0x10,
- BLOCK_OPEN = 0x11,
- FIELD = 0x12,
- VALUE = 0x13,
- BLOCK_CLOSE = 0x14,
-
- VALUE_TYPE = 0x00,
- VALUE_PART = 0x01,
- VALUE_DATA = 0x02,
- VALUE_FILE = 0x03,
- VALUE_OPTION = 0x04,
- VALUE_ID = 0x05,
- VALUE_TARGET = 0x06,
- };
- const char *field_name[] = {
- "type",
- "part",
- "data",
- "file",
- "option",
- "id",
- "target",
- NULL
- };
- enum state state;
- register int field_idx;
- register int idx = 0;
- register int i;
- struct block *block;
- struct {
+ struct script_info *info;
+ /*!
+ * To speed up, use the static.
+ * But this will increase the memory slightly.
+ */
+ static struct {
const char *type;
int (*handler)(struct inst_info *inst, struct block *block, int is_pd);
} handlers[] = {
@@ -784,6 +784,74 @@ HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const ch
},
};
+ info = is_pd ? instance_pd_script(inst) : instance_lb_script(inst);
+ if (!info) {
+ ErrPrint("info is NIL (%d, %s)\n", is_pd, instance_id(inst));
+ goto free_out;
+ }
+
+ if (script_handler_is_loaded(info)) {
+ register int i = 0;
+
+ while (handlers[i].type) {
+ if (!strcasecmp(handlers[i].type, block->type)) {
+ handlers[i].handler(inst, block, is_pd);
+ break;
+ }
+ i++;
+ }
+
+ if (!handlers[i].type)
+ ErrPrint("%d: Unknown block type: %s\n", lineno, block->type);
+
+ goto free_out;
+ } else {
+ info->cached_blocks = eina_list_append(info->cached_blocks, block);
+ DbgPrint("%d: Block is cached (%p), %d, %s\n", lineno, block, eina_list_count(info->cached_blocks), instance_id(inst));
+ }
+
+ return;
+
+free_out:
+ delete_block(block);
+}
+
+HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const char *descfile, int is_pd)
+{
+ struct inst_info *inst;
+ FILE *fp;
+ int ch;
+ int lineno;
+ enum state {
+ UNKNOWN = 0x10,
+ BLOCK_OPEN = 0x11,
+ FIELD = 0x12,
+ VALUE = 0x13,
+ BLOCK_CLOSE = 0x14,
+
+ VALUE_TYPE = 0x00,
+ VALUE_PART = 0x01,
+ VALUE_DATA = 0x02,
+ VALUE_FILE = 0x03,
+ VALUE_OPTION = 0x04,
+ VALUE_ID = 0x05,
+ VALUE_TARGET = 0x06,
+ };
+ const char *field_name[] = {
+ "type",
+ "part",
+ "data",
+ "file",
+ "option",
+ "id",
+ "target",
+ NULL
+ };
+ enum state state;
+ register int field_idx;
+ register int idx = 0;
+ struct block *block;
+
block = NULL;
inst = package_find_instance_by_id(pkgname, id);
if (!inst) {
@@ -797,6 +865,8 @@ HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const ch
return LB_STATUS_ERROR_IO;
}
+ DbgPrint("Parsing %s\n", descfile);
+
state = UNKNOWN;
field_idx = 0;
lineno = 1;
@@ -1127,28 +1197,7 @@ HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const ch
}
}
- i = 0;
- while (handlers[i].type) {
- if (!strcasecmp(handlers[i].type, block->type)) {
- handlers[i].handler(inst, block, is_pd);
- break;
- }
- i++;
- }
-
- if (!handlers[i].type)
- ErrPrint("%d: Unknown block type: %s\n", lineno, block->type);
-
- DbgFree(block->file);
- DbgFree(block->type);
- DbgFree(block->part);
- DbgFree(block->data);
- DbgFree(block->option);
- DbgFree(block->id);
- DbgFree(block->target_id);
- DbgFree(block);
- block = NULL;
-
+ consuming_parsed_block(lineno, inst, is_pd, block);
state = UNKNOWN;
break;
@@ -1167,16 +1216,8 @@ HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const ch
errout:
ErrPrint("Parse error at %d file %s\n", lineno, util_basename(descfile));
- if (block) {
- DbgFree(block->file);
- DbgFree(block->type);
- DbgFree(block->part);
- DbgFree(block->data);
- DbgFree(block->option);
- DbgFree(block->id);
- DbgFree(block->target_id);
- DbgFree(block);
- }
+ if (block)
+ delete_block(block);
fclose(fp);
return LB_STATUS_ERROR_INVALID;
}