summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/instance.c277
-rw-r--r--src/script_handler.c63
-rw-r--r--src/server.c783
3 files changed, 1007 insertions, 116 deletions
diff --git a/src/instance.c b/src/instance.c
index 6fc0f8b..18e8c51 100644
--- a/src/instance.c
+++ b/src/instance.c
@@ -62,6 +62,11 @@ struct resize_cbdata {
int h;
};
+struct update_mode_cbdata {
+ struct inst_info *inst;
+ int active_update;
+};
+
struct change_group_cbdata {
struct inst_info *inst;
char *cluster;
@@ -94,7 +99,8 @@ struct inst_info {
char *title;
int is_pinned_up;
double sleep_at;
- int scroll_locked;
+ int scroll_locked; /*!< Scroller which is in viewer is locked. */
+ int active_update; /*!< Viewer will reload the buffer by itself, so the provider doesn't need to send the updated event */
enum livebox_visible_state visible;
@@ -255,6 +261,25 @@ static inline int instance_recover_visible_state(struct inst_info *inst)
return ret;
}
+static inline void instance_send_update_mode_event(struct inst_info *inst, int active_mode, int status)
+{
+ struct packet *packet;
+ const char *pkgname;
+
+ if (!inst->info) {
+ ErrPrint("Instance info is not ready to use\n");
+ return;
+ }
+
+ pkgname = package_name(inst->info);
+
+ packet = packet_create_noack("update_mode", "ssii", pkgname, inst->id, status, active_mode);
+ if (packet)
+ CLIENT_SEND_EVENT(inst, packet);
+ else
+ ErrPrint("Failed to send update mode event\n");
+}
+
static inline void instance_send_resized_event(struct inst_info *inst, int is_pd, int w, int h, int status)
{
struct packet *packet;
@@ -286,6 +311,36 @@ static inline void instance_send_resized_event(struct inst_info *inst, int is_pd
ErrPrint("Failed to send size changed event\n");
}
+static void update_mode_cb(struct slave_node *slave, const struct packet *packet, void *data)
+{
+ struct update_mode_cbdata *cbdata = data;
+ int ret;
+
+ if (!packet) {
+ ErrPrint("Invalid packet\n");
+ instance_send_update_mode_event(cbdata->inst, cbdata->active_update, LB_STATUS_ERROR_FAULT);
+ instance_unref(cbdata->inst);
+ DbgFree(cbdata);
+ return;
+ }
+
+ if (packet_get(packet, "i", &ret) != 1) {
+ ErrPrint("Invalid parameters\n");
+ instance_send_update_mode_event(cbdata->inst, cbdata->active_update, LB_STATUS_ERROR_INVALID);
+ instance_unref(cbdata->inst);
+ DbgFree(cbdata);
+ return;
+ }
+
+ if (ret == LB_STATUS_SUCCESS)
+ cbdata->inst->active_update = cbdata->active_update;
+
+ instance_send_update_mode_event(cbdata->inst, cbdata->active_update, ret);
+
+ instance_unref(cbdata->inst);
+ DbgFree(cbdata);
+}
+
HAPI int instance_unicast_created_event(struct inst_info *inst, struct client_node *client)
{
struct packet *packet;
@@ -1354,7 +1409,7 @@ HAPI int instance_reactivate(struct inst_info *inst)
break;
}
- packet = packet_create("renew", "sssiidssiis",
+ packet = packet_create("renew", "sssiidssiisii",
package_name(inst->info),
inst->id,
inst->content,
@@ -1364,7 +1419,9 @@ HAPI int instance_reactivate(struct inst_info *inst)
inst->cluster,
inst->category,
inst->lb.width, inst->lb.height,
- package_abi(inst->info));
+ package_abi(inst->info),
+ inst->scroll_locked,
+ inst->active_update);
if (!packet) {
ErrPrint("Failed to build a packet for %s\n", package_name(inst->info));
return LB_STATUS_ERROR_FAULT;
@@ -1459,6 +1516,156 @@ HAPI int instance_activate(struct inst_info *inst)
return slave_rpc_async_request(package_slave(inst->info), package_name(inst->info), packet, activate_cb, instance_ref(inst), 1);
}
+HAPI int instance_lb_update_begin(struct inst_info *inst, double priority, const char *content, const char *title)
+{
+ struct packet *packet;
+ const char *fbfile;
+
+ if (!inst->active_update) {
+ ErrPrint("Invalid request [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ switch (package_lb_type(inst->info)) {
+ case LB_TYPE_BUFFER:
+ if (!inst->lb.canvas.buffer) {
+ ErrPrint("Buffer is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ fbfile = buffer_handler_id(inst->lb.canvas.buffer);
+ break;
+ case LB_TYPE_SCRIPT:
+ if (!inst->lb.canvas.script) {
+ ErrPrint("Script is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ fbfile = fb_id(script_handler_fb(inst->lb.canvas.script));
+ break;
+ default:
+ ErrPrint("Invalid request[%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ packet = packet_create_noack("lb_update_begin", "ssdsss", package_name(inst->info), inst->id, priority, content, title, fbfile);
+ if (!packet) {
+ ErrPrint("Unable to create a packet\n");
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return CLIENT_SEND_EVENT(inst, packet);
+}
+
+HAPI int instance_lb_update_end(struct inst_info *inst)
+{
+ struct packet *packet;
+
+ if (!inst->active_update) {
+ ErrPrint("Invalid request [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ switch (package_lb_type(inst->info)) {
+ case LB_TYPE_BUFFER:
+ if (!inst->lb.canvas.buffer) {
+ ErrPrint("Buffer is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ break;
+ case LB_TYPE_SCRIPT:
+ if (!inst->lb.canvas.script) {
+ ErrPrint("Script is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ break;
+ default:
+ ErrPrint("Invalid request[%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ packet = packet_create_noack("lb_update_end", "ss", package_name(inst->info), inst->id);
+ if (!packet) {
+ ErrPrint("Unable to create a packet\n");
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return CLIENT_SEND_EVENT(inst, packet);
+}
+
+HAPI int instance_pd_update_begin(struct inst_info *inst)
+{
+ struct packet *packet;
+ const char *fbfile;
+
+ if (!inst->active_update) {
+ ErrPrint("Invalid request [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ switch (package_pd_type(inst->info)) {
+ case PD_TYPE_BUFFER:
+ if (!inst->pd.canvas.buffer) {
+ ErrPrint("Buffer is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ fbfile = buffer_handler_id(inst->pd.canvas.buffer);
+ break;
+ case PD_TYPE_SCRIPT:
+ if (!inst->pd.canvas.script) {
+ ErrPrint("Script is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ fbfile = fb_id(script_handler_fb(inst->pd.canvas.script));
+ break;
+ default:
+ ErrPrint("Invalid request[%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ packet = packet_create_noack("pd_update_begin", "sss", package_name(inst->info), inst->id, fbfile);
+ if (!packet) {
+ ErrPrint("Unable to create a packet\n");
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return CLIENT_SEND_EVENT(inst, packet);
+}
+
+HAPI int instance_pd_update_end(struct inst_info *inst)
+{
+ struct packet *packet;
+
+ if (!inst->active_update) {
+ ErrPrint("Invalid request [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ switch (package_pd_type(inst->info)) {
+ case PD_TYPE_BUFFER:
+ if (!inst->pd.canvas.buffer) {
+ ErrPrint("Buffer is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ break;
+ case PD_TYPE_SCRIPT:
+ if (!inst->pd.canvas.script) {
+ ErrPrint("Script is null [%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+ break;
+ default:
+ ErrPrint("Invalid request[%s]\n", inst->id);
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ packet = packet_create_noack("pd_update_end", "ss", package_name(inst->info), inst->id);
+ if (!packet) {
+ ErrPrint("Unable to create a packet\n");
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return CLIENT_SEND_EVENT(inst, packet);
+}
+
HAPI void instance_lb_updated(const char *pkgname, const char *id)
{
struct inst_info *inst;
@@ -1520,16 +1727,17 @@ HAPI int instance_hold_scroll(struct inst_info *inst, int hold)
struct packet *packet;
if (inst->scroll_locked == hold) {
- DbgPrint("There is changes for hold state: %d\n", hold);
+ DbgPrint("[HOLD] There is changes for hold state: %d\n", hold);
return LB_STATUS_ERROR_ALREADY;
}
packet = packet_create_noack("scroll", "ssi", package_name(inst->info), inst->id, hold);
if (!packet) {
- ErrPrint("Failed to build a packet\n");
+ ErrPrint("[HOLD] Failed to build a packet\n");
return LB_STATUS_ERROR_FAULT;
}
+ DbgPrint("[HOLD] (%s) %d\n", inst->id, hold);
inst->scroll_locked = hold;
return CLIENT_SEND_EVENT(inst, packet);
}
@@ -1600,6 +1808,47 @@ HAPI void instance_pd_updated(const char *pkgname, const char *id, const char *d
instance_pd_updated_by_instance(inst, descfile);
}
+HAPI int instance_set_update_mode(struct inst_info *inst, int active_update)
+{
+ struct packet *packet;
+ struct update_mode_cbdata *cbdata;
+
+ if (package_is_fault(inst->info)) {
+ DbgPrint("Fault package [%s]\n", package_name(inst->info));
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ if (inst->active_update == active_update) {
+ DbgPrint("Active update is not changed: %d\n", inst->active_update);
+ return LB_STATUS_ERROR_ALREADY;
+ }
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return LB_STATUS_ERROR_MEMORY;
+ }
+
+ cbdata->inst = instance_ref(inst);
+ cbdata->active_update = active_update;
+
+ /* NOTE: param is resued from here */
+ packet = packet_create("update_mode", "ssi", package_name(inst->info), inst->id, active_update);
+ if (!packet) {
+ ErrPrint("Failed to build a packet for %s\n", package_name(inst->info));
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return slave_rpc_async_request(package_slave(inst->info), package_name(inst->info), packet, update_mode_cb, cbdata, 0);
+}
+
+HAPI int instance_active_update(struct inst_info *inst)
+{
+ return inst->active_update;
+}
+
HAPI void instance_set_lb_info(struct inst_info *inst, int w, int h, double priority, const char *content, const char *title)
{
char *_content = NULL;
@@ -2509,6 +2758,24 @@ HAPI int instance_need_slave(struct inst_info *inst)
return ret;
}
+HAPI int instance_forward_packet(struct inst_info *inst, struct packet *packet)
+{
+ return CLIENT_SEND_EVENT(inst, packet);
+}
+
+HAPI int instance_send_access_status(struct inst_info *inst, int status)
+{
+ struct packet *packet;
+
+ packet = packet_create_noack("access_status", "ssi", package_name(inst->info), inst->id, status);
+ if (!packet) {
+ ErrPrint("Failed to build a packet\n");
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return CLIENT_SEND_EVENT(inst, packet);
+}
+
HAPI void instance_slave_set_pd_pos(struct inst_info *inst, double x, double y)
{
inst->pd.x = x;
diff --git a/src/script_handler.c b/src/script_handler.c
index b9536d6..69c9217 100644
--- a/src/script_handler.c
+++ b/src/script_handler.c
@@ -50,6 +50,8 @@
#define TYPE_SIGNAL "signal"
#define TYPE_INFO "info"
#define TYPE_DRAG "drag"
+#define TYPE_ACCESS "access"
+
#define INFO_SIZE "size"
#define INFO_CATEGORY "category"
#define ADDEND 256
@@ -71,11 +73,13 @@ struct script_port {
int (*update_color)(void *handle, Evas *e, const char *id, const char *part, const char *rgba);
int (*update_text)(void *handle, Evas *e, const char *id, const char *part, const char *text);
int (*update_image)(void *handle, Evas *e, const char *id, const char *part, const char *path, const char *option);
+ int (*update_access)(void *handle, Evas *e, const char *id, const char *part, const char *text, const char *option);
int (*update_script)(void *handle, Evas *e, const char *src_id, const char *target_id, const char *part, const char *path, const char *option);
int (*update_signal)(void *handle, Evas *e, const char *id, const char *part, const char *signal);
int (*update_drag)(void *handle, Evas *e, const char *id, const char *part, double x, double y);
int (*update_size)(void *handle, Evas *e, const char *id, int w, int h);
int (*update_category)(void *handle, Evas *e, const char *id, const char *category);
+ int (*feed_event)(void *handle, Evas *e, int event_type, int x, int y, double timestamp);
void *(*create)(const char *file, const char *option);
int (*destroy)(void *handle);
@@ -494,6 +498,35 @@ static int update_script_image(struct inst_info *inst, struct block *block, int
return LB_STATUS_SUCCESS;
}
+static int update_access(struct inst_info *inst, struct block *block, int is_pd)
+{
+ struct script_info *info;
+ Evas *e;
+
+ if (!block || !block->part || !block->data) {
+ ErrPrint("Block or block->part or block->data is NIL\n");
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ 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));
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ if (!info->port) {
+ ErrPrint("info->port is NIL\n");
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ e = script_handler_evas(info);
+ if (e)
+ info->port->update_access(info->port_data, e, block->id, block->part, block->data, block->option);
+ else
+ ErrPrint("Evas: (nil) id[%s] part[%s] data[%s]\n", block->id, block->part, block->data);
+ return LB_STATUS_SUCCESS;
+}
+
static int update_script_script(struct inst_info *inst, struct block *block, int is_pd)
{
struct script_info *info;
@@ -742,6 +775,10 @@ HAPI int script_handler_parse_desc(const char *pkgname, const char *id, const ch
.handler = update_info,
},
{
+ .type = TYPE_ACCESS,
+ .handler = update_access,
+ },
+ {
.type = NULL,
.handler = NULL,
},
@@ -1213,6 +1250,10 @@ HAPI int script_init(void)
if (!item->update_image)
goto errout;
+ item->update_access = dlsym(item->handle, "script_update_access");
+ if (!item->update_access)
+ goto errout;
+
item->update_script = dlsym(item->handle, "script_update_script");
if (!item->update_script)
goto errout;
@@ -1257,6 +1298,10 @@ HAPI int script_init(void)
if (!item->fini)
goto errout;
+ item->feed_event = dlsym(item->handle, "script_feed_event");
+ if (!item->feed_event)
+ goto errout;
+
if (item->init() < 0) {
ErrPrint("Failed to initialize script engine\n");
goto errout;
@@ -1307,4 +1352,22 @@ HAPI int script_handler_update_pointer(struct script_info *info, int x, int y, i
return LB_STATUS_SUCCESS;
}
+HAPI int script_handler_feed_event(struct script_info *info, int event, double timestamp)
+{
+ Evas *e;
+
+ if (!info->port) {
+ ErrPrint("info->port is NIL\n");
+ return LB_STATUS_ERROR_INVALID;
+ }
+
+ e = script_handler_evas(info);
+ if (!e) {
+ ErrPrint("Evas is not exists\n");
+ return LB_STATUS_ERROR_FAULT;
+ }
+
+ return info->port->feed_event(info->port_data, e, event, info->x, info->y, timestamp);
+}
+
/* End of a file */
diff --git a/src/server.c b/src/server.c
index b6a6f43..77c45ee 100644
--- a/src/server.c
+++ b/src/server.c
@@ -27,6 +27,7 @@
#include <packet.h>
#include <com-core_packet.h>
#include <livebox-errno.h>
+#include <livebox-service.h>
#include "conf.h"
#include "debug.h"
@@ -68,11 +69,30 @@ enum target_type {
TYPE_ERROR,
};
+struct access_cbdata {
+ int status;
+ struct inst_info *inst;
+};
+
struct deleted_item {
struct client_node *client;
struct inst_info *inst;
};
+static Eina_Bool lazy_access_status_cb(void *data)
+{
+ struct access_cbdata *cbdata = data;
+
+ if (instance_unref(cbdata->inst))
+ instance_send_access_status(cbdata->inst, cbdata->status);
+ /*!
+ * If instance_unref returns NULL,
+ * The instance is destroyed. it means, we don't need to send event to the viewer
+ */
+ free(cbdata);
+ return ECORE_CALLBACK_CANCEL;
+}
+
static int event_lb_route_cb(enum event_state state, struct event_data *event_info, void *data)
{
struct inst_info *inst = data;
@@ -135,17 +155,15 @@ static int event_lb_consume_cb(enum event_state state, struct event_data *event_
switch (state) {
case EVENT_STATE_ACTIVATE:
script_handler_update_pointer(script, event_info->x, event_info->y, 1);
- evas_event_feed_mouse_move(e, event_info->x, event_info->y, timestamp, NULL);
- evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 0.01f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_DOWN, timestamp);
break;
case EVENT_STATE_ACTIVATED:
script_handler_update_pointer(script, event_info->x, event_info->y, -1);
- evas_event_feed_mouse_move(e, event_info->x, event_info->y, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_MOVE, timestamp);
break;
case EVENT_STATE_DEACTIVATE:
script_handler_update_pointer(script, event_info->x, event_info->y, 0);
- evas_event_feed_mouse_move(e, event_info->x, event_info->y, timestamp, NULL);
- evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp + 0.1f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_UP, timestamp);
break;
default:
break;
@@ -218,17 +236,15 @@ static int event_pd_consume_cb(enum event_state state, struct event_data *event_
switch (state) {
case EVENT_STATE_ACTIVATE:
script_handler_update_pointer(script, event_info->x, event_info->y, 1);
- evas_event_feed_mouse_move(e, event_info->x, event_info->y, timestamp, NULL);
- evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 0.01f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_DOWN, timestamp);
break;
case EVENT_STATE_ACTIVATED:
script_handler_update_pointer(script, event_info->x, event_info->y, -1);
- evas_event_feed_mouse_move(e, event_info->x, event_info->y, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_MOVE, timestamp);
break;
case EVENT_STATE_DEACTIVATE:
script_handler_update_pointer(script, event_info->x, event_info->y, 0);
- evas_event_feed_mouse_move(e, event_info->x, event_info->y, timestamp, NULL);
- evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp + 0.1f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_UP, timestamp);
break;
default:
break;
@@ -315,14 +331,12 @@ static struct packet *client_clicked(pid_t pid, int handle, const struct packet
client = client_find_by_pid(pid);
if (!client) {
ErrPrint("Client %d is not exists\n", pid);
- ret = LB_STATUS_ERROR_NOT_EXIST;
goto out;
}
ret = packet_get(packet, "sssddd", &pkgname, &id, &event, &timestamp, &x, &y);
if (ret != 6) {
ErrPrint("Parameter is not matched\n");
- ret = LB_STATUS_ERROR_INVALID;
goto out;
}
@@ -335,17 +349,64 @@ static struct packet *client_clicked(pid_t pid, int handle, const struct packet
*/
inst = package_find_instance_by_id(pkgname, id);
if (!inst)
- ret = LB_STATUS_ERROR_NOT_EXIST;
+ ErrPrint("Instance is not exists\n");
else if (package_is_fault(instance_package(inst)))
- ret = LB_STATUS_ERROR_FAULT;
+ ErrPrint("Fault package\n");
else
- ret = instance_clicked(inst, event, timestamp, x, y);
+ (void)instance_clicked(inst, event, timestamp, x, y);
out:
/*! \note No reply packet */
return NULL;
}
+static struct packet *client_update_mode(pid_t pid, int handle, const struct packet *packet)
+{
+ struct packet *result;
+ struct client_node *client;
+ int active_update;
+ const char *pkgname;
+ const char *id;
+ int ret;
+ struct inst_info *inst;
+
+ client = client_find_by_pid(pid);
+ if (!client) {
+ ErrPrint("Client %d is not exists\n", pid);
+ ret = LB_STATUS_ERROR_INVALID;
+ goto out;
+ }
+
+ ret = packet_get(packet, "ssi", &pkgname, &id, &active_update);
+ if (ret != 3) {
+ ErrPrint("Invalid argument\n");
+ ret = LB_STATUS_ERROR_INVALID;
+ goto out;
+ }
+
+ inst = package_find_instance_by_id(pkgname, id);
+ if (!inst) {
+ ErrPrint("Instance is not exists\n");
+ ret = LB_STATUS_ERROR_NOT_EXIST;
+ } else if (package_is_fault(instance_package(inst))) {
+ ErrPrint("Fault package\n");
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ /*!
+ * \note
+ * Send change update mode request to a slave
+ */
+ ret = instance_set_update_mode(inst, active_update);
+ }
+
+out:
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a packet\n");
+
+ return result;
+}
+
/* pid, pkgname, filename, emission, source, s, sy, ex, ey, ret */
static struct packet *client_text_signal(pid_t pid, int handle, const struct packet *packet)
{
@@ -464,7 +525,6 @@ static struct packet *client_delete(pid_t pid, int handle, const struct packet *
ErrPrint("Heap: %s\n", strerror(errno));
ret = LB_STATUS_ERROR_MEMORY;
} else {
- ret = 0;
/*!
* \NOTE:
* Send DELETED EVENT to the client.
@@ -483,6 +543,8 @@ static struct packet *client_delete(pid_t pid, int handle, const struct packet *
instance_unref(inst);
DbgFree(item);
ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
}
}
} else {
@@ -877,7 +939,7 @@ static struct packet *client_pd_mouse_enter(pid_t pid, int handle, const struct
}
script_handler_update_pointer(script, x, y, -1);
- evas_event_feed_mouse_in(e, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_IN, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -989,7 +1051,7 @@ static struct packet *client_pd_mouse_leave(pid_t pid, int handle, const struct
}
script_handler_update_pointer(script, x, y, -1);
- evas_event_feed_mouse_out(e, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_OUT, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -1103,8 +1165,7 @@ static struct packet *client_pd_mouse_down(pid_t pid, int handle, const struct p
}
script_handler_update_pointer(script, x, y, 1);
- evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
- evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 0.01f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_DOWN, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -1217,8 +1278,7 @@ static struct packet *client_pd_mouse_up(pid_t pid, int handle, const struct pac
}
script_handler_update_pointer(script, x, y, 0);
- evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
- evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp + 0.1f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_UP, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -1331,7 +1391,7 @@ static struct packet *client_pd_mouse_move(pid_t pid, int handle, const struct p
}
script_handler_update_pointer(script, x, y, -1);
- evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_MOVE, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -1442,7 +1502,7 @@ static struct packet *client_lb_mouse_move(pid_t pid, int handle, const struct p
}
script_handler_update_pointer(script, x, y, -1);
- evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_MOVE, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -1834,7 +1894,7 @@ static struct packet *client_lb_mouse_enter(pid_t pid, int handle, const struct
}
script_handler_update_pointer(script, x, y, -1);
- evas_event_feed_mouse_in(e, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_IN, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -1946,7 +2006,7 @@ static struct packet *client_lb_mouse_leave(pid_t pid, int handle, const struct
}
script_handler_update_pointer(script, x, y, -1);
- evas_event_feed_mouse_out(e, timestamp, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_OUT, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -2058,8 +2118,7 @@ static struct packet *client_lb_mouse_down(pid_t pid, int handle, const struct p
}
script_handler_update_pointer(script, x, y, 1);
- evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
- evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 0.01f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_DOWN, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -2171,8 +2230,7 @@ static struct packet *client_lb_mouse_up(pid_t pid, int handle, const struct pac
}
script_handler_update_pointer(script, x, y, 0);
- evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
- evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp + 0.1f, NULL);
+ script_handler_feed_event(script, LB_SCRIPT_MOUSE_UP, timestamp);
ret = 0;
} else {
ErrPrint("Unsupported package\n");
@@ -2186,6 +2244,7 @@ out:
static struct packet *client_pd_access_value_change(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -2284,22 +2343,42 @@ static struct packet *client_pd_access_value_change(pid_t pid, int handle, const
}
script_handler_update_pointer(script, x, y, -1);
- /*!
- * \TODO: Push up the ACCESS_VALUE_CHANGE event
- */
- ret = 0;
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_VALUE_CHANGE, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_pd_access_scroll(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -2398,22 +2477,42 @@ static struct packet *client_pd_access_scroll(pid_t pid, int handle, const struc
}
script_handler_update_pointer(script, x, y, -1);
- /*!
- * \TODO: Push up the ACCESS_SCROLL event
- */
- ret = 0;
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_SCROLL, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_pd_access_hl(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -2512,22 +2611,42 @@ static struct packet *client_pd_access_hl(pid_t pid, int handle, const struct pa
}
script_handler_update_pointer(script, x, y, -1);
- /*!
- * \TODO: Push up the ACCESS_HIGHLIGHT event
- */
- ret = 0;
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_HIGHLIGHT, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_pd_access_hl_prev(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -2626,22 +2745,42 @@ static struct packet *client_pd_access_hl_prev(pid_t pid, int handle, const stru
}
script_handler_update_pointer(script, x, y, -1);
- /*!
- * \TODO: Push up the ACCESS_HIGHLIGHT_PREV event
- */
- ret = 0;
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_HIGHLIGHT_PREV, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_pd_access_hl_next(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -2740,22 +2879,42 @@ static struct packet *client_pd_access_hl_next(pid_t pid, int handle, const stru
}
script_handler_update_pointer(script, x, y, -1);
- /*!
- * \TODO: Push up the ACCESS_HIGHLIGHT_NEXT event
- */
- ret = 0;
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_HIGHLIGHT_NEXT, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_pd_access_activate(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -2854,18 +3013,37 @@ static struct packet *client_pd_access_activate(pid_t pid, int handle, const str
}
script_handler_update_pointer(script, x, y, -1);
- /*!
- * \TODO: Push up the ACCESS_ACTIVATE event
- */
- ret = 0;
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_ACTIVATE, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
+
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_pd_key_down(pid_t pid, int handle, const struct packet *packet)
@@ -3019,15 +3197,13 @@ static struct packet *client_resume_request(pid_t pid, int handle, const struct
client = client_find_by_pid(pid);
if (!client) {
- ErrPrint("Client %d is paused - manually reported\n", pid);
- ret = LB_STATUS_ERROR_NOT_EXIST;
+ ErrPrint("Client %d is not exists\n", pid);
goto out;
}
ret = packet_get(packet, "d", &timestamp);
if (ret != 1) {
ErrPrint("Invalid parameter\n");
- ret = LB_STATUS_ERROR_INVALID;
goto out;
}
@@ -3156,6 +3332,7 @@ out:
static struct packet *client_lb_access_hl(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -3254,23 +3431,42 @@ static struct packet *client_lb_access_hl(pid_t pid, int handle, const struct pa
}
script_handler_update_pointer(script, x, y, -1);
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_HIGHLIGHT, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
- /*!
- * \TODO: Feed up this ACCESS_HIGHLIGHT event
- */
- ret = 0;
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_lb_access_hl_prev(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -3369,23 +3565,42 @@ static struct packet *client_lb_access_hl_prev(pid_t pid, int handle, const stru
}
script_handler_update_pointer(script, x, y, -1);
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_HIGHLIGHT_PREV, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
- /*!
- * \TODO: Feed up this ACCESS_HIGHLIGHT_PREV event
- */
- ret = 0;
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_lb_access_hl_next(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -3484,23 +3699,42 @@ static struct packet *client_lb_access_hl_next(pid_t pid, int handle, const stru
}
script_handler_update_pointer(script, x, y, -1);
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_HIGHLIGHT_NEXT, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
- /*!
- * \TODO: Feed up this ACCESS_HIGHLIGHT_NEXT event
- */
- ret = 0;
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
ret = LB_STATUS_ERROR_INVALID;
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_lb_access_value_change(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -3575,21 +3809,42 @@ static struct packet *client_lb_access_value_change(pid_t pid, int handle, const
goto out;
}
- // script_handler_update_pointer(script, x, y, -1);
+ script_handler_update_pointer(script, x, y, -1);
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_VALUE_CHANGE, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
- /*!
- * \TODO: Feed up this VALUE_CHANGE event
- */
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
}
out:
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_lb_access_scroll(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -3665,20 +3920,41 @@ static struct packet *client_lb_access_scroll(pid_t pid, int handle, const struc
}
script_handler_update_pointer(script, x, y, -1);
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_SCROLL, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
- /*!
- * \TODO: Feed up this ACCESS_SCROLL event
- */
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
}
out:
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_lb_access_activate(pid_t pid, int handle, const struct packet *packet)
{
+ struct packet *result;
struct client_node *client;
const char *pkgname;
const char *id;
@@ -3771,17 +4047,36 @@ static struct packet *client_lb_access_activate(pid_t pid, int handle, const str
}
script_handler_update_pointer(script, x, y, -1);
+ ret = script_handler_feed_event(script, LB_SCRIPT_ACCESS_ACTIVATE, timestamp);
+ if (ret >= 0) {
+ struct access_cbdata *cbdata;
- /*!
- * \TODO: Feed up this ACCESS_ACTIVATE event
- */
+ cbdata = malloc(sizeof(*cbdata));
+ if (!cbdata) {
+ ret = LB_STATUS_ERROR_MEMORY;
+ } else {
+ cbdata->inst = instance_ref(inst);
+ cbdata->status = ret;
+
+ if (!ecore_timer_add(DELAY_TIME, lazy_access_status_cb, cbdata)) {
+ instance_unref(cbdata->inst);
+ free(cbdata);
+ ret = LB_STATUS_ERROR_FAULT;
+ } else {
+ ret = LB_STATUS_SUCCESS;
+ }
+ }
+ }
} else {
ErrPrint("Unsupported package\n");
}
out:
- /*! \note No reply packet */
- return NULL;
+ result = packet_create_reply(packet, "i", ret);
+ if (!result)
+ ErrPrint("Failed to create a reply packet\n");
+
+ return result;
}
static struct packet *client_lb_key_down(pid_t pid, int handle, const struct packet *packet)
@@ -4282,21 +4577,22 @@ out:
static Eina_Bool lazy_pd_created_cb(void *data)
{
- int ret;
-
- ret = instance_client_pd_created(data, LB_STATUS_SUCCESS);
- DbgPrint("Send PD Create event (%d)\n", ret);
+ if (instance_unref(data)) {
+ int ret;
+ ret = instance_client_pd_created(data, LB_STATUS_SUCCESS);
+ DbgPrint("Send PD Create event (%d)\n", ret);
+ }
- instance_unref(data);
return ECORE_CALLBACK_CANCEL;
}
static Eina_Bool lazy_pd_destroyed_cb(void *data)
{
- DbgPrint("Send PD Destroy event\n");
- instance_client_pd_destroyed(data, LB_STATUS_SUCCESS);
+ if (instance_unref(data)) {
+ DbgPrint("Send PD Destroy event\n");
+ instance_client_pd_destroyed(data, LB_STATUS_SUCCESS);
+ }
- instance_unref(data);
return ECORE_CALLBACK_CANCEL;
}
@@ -4527,10 +4823,15 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
* \note
* Send the destroyed PD event to the client
*/
- if (ret == 0) {
+ if (ret == LB_STATUS_SUCCESS) {
inst = instance_ref(inst);
- if (!ecore_timer_add(DELAY_TIME, lazy_pd_destroyed_cb, inst))
+ if (!ecore_timer_add(DELAY_TIME, lazy_pd_destroyed_cb, inst)) {
instance_unref(inst);
+ /*!
+ * How can we handle this?
+ */
+ ret = LB_STATUS_ERROR_FAULT;
+ }
}
} else {
ErrPrint("Invalid PD TYPE\n");
@@ -5008,6 +5309,238 @@ out:
return NULL;
}
+static struct packet *slave_lb_update_begin(pid_t pid, int handle, const struct packet *packet)
+{
+ struct slave_node *slave;
+ struct inst_info *inst;
+ struct pkg_info *pkg;
+ const char *pkgname;
+ const char *id;
+ double priority;
+ const char *content;
+ const char *title;
+ int ret;
+
+ slave = slave_find_by_pid(pid);
+ if (!slave) {
+ ErrPrint("Slave %d is not exists\n", pid);
+ goto out;
+ }
+
+ ret = packet_get(packet, "ssdss", &pkgname, &id, &priority, &content, &title);
+ if (ret != 5) {
+ ErrPrint("Invalid parameters\n");
+ goto out;
+ }
+
+ inst = package_find_instance_by_id(pkgname, id);
+ if (!inst) {
+ ErrPrint("Instance(%s) is not exists\n", id);
+ goto out;
+ } else if (instance_state(inst) == INST_DESTROYED) {
+ ErrPrint("Instance(%s) is already destroyed\n", id);
+ goto out;
+ }
+
+ pkg = instance_package(inst);
+ if (!pkg) {
+ ErrPrint("Invalid instance\n");
+ } else if (package_is_fault(pkg)) {
+ ErrPrint("Faulted instance %s.\n", id);
+ } else if (package_lb_type(pkg) == LB_TYPE_BUFFER) {
+ ret = instance_lb_update_begin(inst, priority, content, title);
+ if (ret == LB_STATUS_SUCCESS)
+ slave_freeze_ttl(slave);
+ } else {
+ ErrPrint("Invalid request[%s]\n", id);
+ }
+
+out:
+ return NULL;
+}
+
+static struct packet *slave_lb_update_end(pid_t pid, int handle, const struct packet *packet)
+{
+ struct slave_node *slave;
+ struct inst_info *inst;
+ struct pkg_info *pkg;
+ const char *pkgname;
+ const char *id;
+ int ret;
+
+ slave = slave_find_by_pid(pid);
+ if (!slave) {
+ ErrPrint("Slave %d is not exists\n", pid);
+ goto out;
+ }
+
+ ret = packet_get(packet, "ss", &pkgname, &id);
+ if (ret != 2) {
+ ErrPrint("Invalid parameters\n");
+ goto out;
+ }
+
+ inst = package_find_instance_by_id(pkgname, id);
+ if (!inst) {
+ ErrPrint("Instance[%s] is not exists\n", id);
+ goto out;
+ } else if (instance_state(inst) == INST_DESTROYED) {
+ ErrPrint("Instance[%s] is already destroyed\n", id);
+ goto out;
+ }
+
+ pkg = instance_package(inst);
+ if (!pkg) {
+ ErrPrint("Invalid instance\n");
+ } else if (package_is_fault(pkg)) {
+ ErrPrint("Faulted instance %s\n", id);
+ } else if (package_lb_type(pkg) == LB_TYPE_BUFFER) {
+ ret = instance_lb_update_end(inst);
+ if (ret == LB_STATUS_SUCCESS)
+ slave_thaw_ttl(slave);
+ } else {
+ ErrPrint("Invalid request[%s]\n", id);
+ }
+
+out:
+ return NULL;
+}
+
+static struct packet *slave_pd_update_begin(pid_t pid, int handle, const struct packet *packet)
+{
+ struct slave_node *slave;
+ struct pkg_info *pkg;
+ struct inst_info *inst;
+ const char *pkgname;
+ const char *id;
+ int ret;
+
+ slave = slave_find_by_pid(pid);
+ if (!slave) {
+ ErrPrint("Slave %d is not exists\n", pid);
+ goto out;
+ }
+
+ ret = packet_get(packet, "ss", &pkgname, &id);
+ if (ret != 2) {
+ ErrPrint("Invalid parameters\n");
+ goto out;
+ }
+
+ inst = package_find_instance_by_id(pkgname, id);
+ if (!inst) {
+ ErrPrint("Instance[%s] is not exists\n", id);
+ goto out;
+ }
+
+ pkg = instance_package(inst);
+ if (!pkg) {
+ ErrPrint("Invalid package\n");
+ } else if (package_is_fault(pkg)) {
+ ErrPrint("Faulted instance %s\n", id);
+ } else if (instance_state(inst) == INST_DESTROYED) {
+ ErrPrint("Instance[%s] is already destroyed\n", id);
+ } else if (package_pd_type(pkg) == PD_TYPE_BUFFER) {
+ (void)instance_pd_update_begin(inst);
+ } else {
+ ErrPrint("Invalid request[%s]\n", id);
+ }
+
+out:
+ return NULL;
+}
+
+static struct packet *slave_access_status(pid_t pid, int handle, const struct packet *packet)
+{
+ struct slave_node *slave;
+ struct pkg_info *pkg;
+ struct inst_info *inst;
+ const char *pkgname;
+ const char *id;
+ int status;
+ int ret;
+
+ slave = slave_find_by_pid(pid);
+ if (!slave) {
+ ErrPrint("Slave %d is not exists\n", pid);
+ goto out;
+ }
+
+ ret = packet_get(packet, "ssi", &pkgname, &id, &status);
+ if (ret != 3) {
+ ErrPrint("Invalid parameters\n");
+ goto out;
+ }
+
+ inst = package_find_instance_by_id(pkgname, id);
+ if (!inst) {
+ ErrPrint("Instance[%s] is not exists\n", id);
+ goto out;
+ }
+
+ pkg = instance_package(inst);
+ if (!pkg) {
+ ErrPrint("Invalid package\n");
+ } else if (package_is_fault(pkg)) {
+ ErrPrint("Faulted instance %s\n", id);
+ } else if (instance_state(inst) == INST_DESTROYED) {
+ ErrPrint("Instance[%s] is already destroyed\n", id);
+ } else {
+ /*!
+ * \note
+ * Forward packet to client
+ */
+ (void)instance_forward_packet(inst, packet_ref((struct packet *)packet));
+ }
+
+out:
+ return NULL;
+}
+
+static struct packet *slave_pd_update_end(pid_t pid, int handle, const struct packet *packet)
+{
+ struct slave_node *slave;
+ struct pkg_info *pkg;
+ struct inst_info *inst;
+ const char *pkgname;
+ const char *id;
+ int ret;
+
+ slave = slave_find_by_pid(pid);
+ if (!slave) {
+ ErrPrint("Slave %d is not exists\n", pid);
+ goto out;
+ }
+
+ ret = packet_get(packet, "ss", &pkgname, &id);
+ if (ret != 2) {
+ ErrPrint("Invalid parameters\n");
+ goto out;
+ }
+
+ inst = package_find_instance_by_id(pkgname, id);
+ if (!inst) {
+ ErrPrint("Instance[%s] is not exists\n", id);
+ goto out;
+ }
+
+ pkg = instance_package(inst);
+ if (!pkg) {
+ ErrPrint("Invalid package\n");
+ } else if (package_is_fault(pkg)) {
+ ErrPrint("Faulted instance %s\n", id);
+ } else if (instance_state(inst) == INST_DESTROYED) {
+ ErrPrint("Instance[%s] is already destroyed\n", id);
+ } else if (package_pd_type(pkg) == PD_TYPE_BUFFER) {
+ (void)instance_pd_update_end(inst);
+ } else {
+ ErrPrint("Invalid request[%s]\n", id);
+ }
+
+out:
+ return NULL;
+}
+
static struct packet *slave_call(pid_t pid, int handle, const struct packet *packet) /* slave_name, pkgname, filename, function, ret */
{
struct slave_node *slave;
@@ -6244,6 +6777,11 @@ static struct method s_client_table[] = {
},
{
+ .cmd = "update_mode",
+ .handler = client_update_mode,
+ },
+
+ {
.cmd = NULL,
.handler = NULL,
},
@@ -6313,6 +6851,29 @@ static struct method s_slave_table[] = {
.cmd = "scroll",
.handler = slave_hold_scroll, /* slave_name, pkgname, id, seize */
},
+
+ {
+ .cmd = "lb_update_begin",
+ .handler = slave_lb_update_begin,
+ },
+ {
+ .cmd = "lb_update_end",
+ .handler = slave_lb_update_end,
+ },
+ {
+ .cmd = "pd_update_begin",
+ .handler = slave_pd_update_begin,
+ },
+ {
+ .cmd = "pd_update_end",
+ .handler = slave_pd_update_end,
+ },
+
+ {
+ .cmd = "access_status",
+ .handler = slave_access_status,
+ },
+
{
.cmd = NULL,
.handler = NULL,