clouseau: Adopted ecore_con_eet interface. This is a whole-new clouseau
utilizing the new ecore_con_eet API. Clouseau looks the same as before, changed communication handling. Signed-off-by: Aharon Hillel <a.hillel@samsung.com> SVN revision: 79825
This commit is contained in:
parent
6cdcdb1b2e
commit
65e9f49ccd
|
@ -1,6 +1,6 @@
|
|||
#include <Elementary_Cursor.h>
|
||||
#include "Clouseau.h"
|
||||
#include <Ecore_Ipc.h>
|
||||
#include <Ecore_Con_Eet.h>
|
||||
|
||||
#include "clouseau_private.h"
|
||||
|
||||
|
@ -12,8 +12,8 @@
|
|||
|
||||
struct _app_data_st
|
||||
{
|
||||
Variant_st *app; /* app->data is (app_info_st *) */
|
||||
Variant_st *td; /* tree->data is (tree_data_st *) */
|
||||
app_info_st *app;
|
||||
tree_data_st *td;
|
||||
};
|
||||
typedef struct _app_data_st app_data_st;
|
||||
|
||||
|
@ -59,7 +59,7 @@ static Eina_List *bmp_req = NULL; /* List of (bmp_node *) */
|
|||
static Elm_Genlist_Item_Class itc;
|
||||
static Eina_Bool list_show_clippers = EINA_TRUE, list_show_hidden = EINA_TRUE;
|
||||
static Eina_Bool do_highlight = EINA_TRUE;
|
||||
static Ecore_Ipc_Server *svr = NULL;
|
||||
static Ecore_Con_Reply *eet_svr = NULL;
|
||||
static Eina_Bool _add_callback_called = EINA_FALSE;
|
||||
static void _cancel_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
|
||||
static void _ofl_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
|
||||
|
@ -76,7 +76,7 @@ _titlebar_string_set(gui_elements *g, Eina_Bool online)
|
|||
}
|
||||
else
|
||||
{
|
||||
char *str = malloc(strlen(CLIENT_NAME) + 32);
|
||||
char *str = malloc(strlen(CLIENT_NAME) + strlen(" - Offline") + 32);
|
||||
sprintf(str, "%s - Offline", CLIENT_NAME);
|
||||
elm_win_title_set(g->win, str);
|
||||
free(str);
|
||||
|
@ -84,30 +84,15 @@ _titlebar_string_set(gui_elements *g, Eina_Bool online)
|
|||
}
|
||||
|
||||
Eina_Bool
|
||||
_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
||||
_add(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED Ecore_Con_Server *conn)
|
||||
{
|
||||
Ecore_Ipc_Event_Server_Add *ev = event;
|
||||
void *p;
|
||||
int size = 0;
|
||||
|
||||
_add_callback_called = EINA_TRUE;
|
||||
ecore_ipc_server_data_size_max_set(ev->server, -1);
|
||||
|
||||
if (svr)
|
||||
{
|
||||
eet_svr = reply;
|
||||
connect_st t = { getpid(), __FILE__ };
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_GUI_CLIENT_CONNECT,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(ev->server);
|
||||
free(p);
|
||||
}
|
||||
|
||||
ecore_con_eet_send(reply, CLOUSEAU_GUI_CLIENT_CONNECT_STR, &t);
|
||||
_titlebar_string_set(gui, EINA_TRUE);
|
||||
}
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
@ -176,22 +161,21 @@ _work_offline_popup(void)
|
|||
}
|
||||
|
||||
Eina_Bool
|
||||
_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
||||
_del(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
Ecore_Con_Server *conn)
|
||||
{
|
||||
Ecore_Ipc_Event_Server_Del *ev = event;
|
||||
|
||||
if ((!_add_callback_called) || (!ev->server))
|
||||
if ((!_add_callback_called) || (!eet_svr))
|
||||
{ /* if initial connection with daemon failed - exit */
|
||||
ecore_ipc_server_del(ev->server);
|
||||
svr = NULL; /* Global svr var */
|
||||
ecore_con_server_del(conn);
|
||||
eet_svr = NULL; /* Global svr var */
|
||||
_work_offline_popup();
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
printf("Lost server with ip %s!\n", ecore_ipc_server_ip_get(ev->server));
|
||||
printf("Lost server with ip <%s>!\n", ecore_con_server_ip_get(conn));
|
||||
|
||||
ecore_ipc_server_del(ev->server);
|
||||
svr = NULL; /* Global svr var */
|
||||
ecore_con_server_del(conn);
|
||||
eet_svr = NULL; /* Global svr var */
|
||||
_show_gui(gui, EINA_TRUE);
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
|
@ -269,25 +253,24 @@ static void
|
|||
_close_app_views(app_info_st *app, Eina_Bool clr)
|
||||
{ /* Close any open-views if this app */
|
||||
Eina_List *l;
|
||||
Variant_st *view;
|
||||
bmp_info_st *view;
|
||||
EINA_LIST_FOREACH(app->view, l, view)
|
||||
{
|
||||
bmp_info_st *b = view->data;
|
||||
if (b->win)
|
||||
evas_object_del(b->win);
|
||||
if (view->win)
|
||||
evas_object_del(view->win);
|
||||
|
||||
if (b->bt)
|
||||
elm_object_disabled_set(b->bt, EINA_FALSE);
|
||||
if (view->bt)
|
||||
elm_object_disabled_set(view->bt, EINA_FALSE);
|
||||
|
||||
b->win = b->bt = NULL;
|
||||
view->win = view->bt = NULL;
|
||||
}
|
||||
|
||||
if (clr)
|
||||
{ /* These are cleared when app data is reloaded */
|
||||
EINA_LIST_FREE(app->view, view)
|
||||
{ /* Free memory allocated to show any app screens */
|
||||
clouseau_bmp_blob_free(view->data);
|
||||
clouseau_data_variant_free(view);
|
||||
clouseau_bmp_blob_free(view);
|
||||
free(view);
|
||||
}
|
||||
|
||||
app->view = NULL;
|
||||
|
@ -304,14 +287,14 @@ _set_selected_app(void *data, Evas_Object *pobj,
|
|||
gui->gl_it = NULL;
|
||||
|
||||
if (gui->sel_app)
|
||||
_close_app_views(gui->sel_app->app->data, EINA_FALSE);
|
||||
_close_app_views(gui->sel_app->app, EINA_FALSE);
|
||||
|
||||
if (st)
|
||||
{
|
||||
if (!svr)
|
||||
if (!eet_svr)
|
||||
{ /* Got TREE_DATA from file, update this immidately */
|
||||
gui->sel_app = st;
|
||||
char *str = _app_name_get(st->app->data);
|
||||
char *str = _app_name_get(st->app);
|
||||
elm_object_text_set(pobj, str);
|
||||
free(str);
|
||||
_load_list(gui);
|
||||
|
@ -321,7 +304,7 @@ _set_selected_app(void *data, Evas_Object *pobj,
|
|||
if (gui->sel_app != st)
|
||||
{ /* Reload only of selected some other app */
|
||||
gui->sel_app = st;
|
||||
char *str = _app_name_get(st->app->data);
|
||||
char *str = _app_name_get(st->app);
|
||||
elm_object_text_set(pobj, str);
|
||||
free(str);
|
||||
|
||||
|
@ -338,7 +321,7 @@ _set_selected_app(void *data, Evas_Object *pobj,
|
|||
gui->sel_app = NULL;
|
||||
}
|
||||
|
||||
if (svr)
|
||||
if (eet_svr)
|
||||
{ /* Enable/Disable buttons only if we are online */
|
||||
elm_object_disabled_set(gui->bt_load, (gui->sel_app == NULL));
|
||||
elm_object_disabled_set(gui->bt_save, (gui->sel_app == NULL));
|
||||
|
@ -349,7 +332,7 @@ static int
|
|||
_app_ptr_cmp(const void *d1, const void *d2)
|
||||
{
|
||||
const app_data_st *info = d1;
|
||||
app_info_st *app = info->app->data;
|
||||
app_info_st *app = info->app;
|
||||
|
||||
return ((app->ptr) - (unsigned long long) (uintptr_t) d2);
|
||||
}
|
||||
|
@ -357,7 +340,7 @@ _app_ptr_cmp(const void *d1, const void *d2)
|
|||
static void
|
||||
_add_app_to_dd_list(Evas_Object *dd_list, app_data_st *st)
|
||||
{ /* Add app to Drop Down List */
|
||||
char *str = _app_name_get(st->app->data);
|
||||
char *str = _app_name_get(st->app);
|
||||
elm_hoversel_item_add(dd_list, str, NULL, ELM_ICON_NONE,
|
||||
_set_selected_app, st);
|
||||
|
||||
|
@ -367,53 +350,48 @@ _add_app_to_dd_list(Evas_Object *dd_list, app_data_st *st)
|
|||
static int
|
||||
_bmp_object_ptr_cmp(const void *d1, const void *d2)
|
||||
{ /* Comparison according to Evas ptr of BMP struct */
|
||||
const Variant_st *info = d1;
|
||||
bmp_info_st *bmp = info->data;
|
||||
|
||||
const bmp_info_st *bmp = d1;
|
||||
return ((bmp->object) - (unsigned long long) (uintptr_t) d2);
|
||||
}
|
||||
|
||||
static int
|
||||
_bmp_app_ptr_cmp(const void *d1, const void *d2)
|
||||
{ /* Comparison according to app ptr of BMP struct */
|
||||
const Variant_st *info = d1;
|
||||
bmp_info_st *bmp = info->data;
|
||||
|
||||
const bmp_info_st *bmp = d1;
|
||||
return ((bmp->app) - (unsigned long long) (uintptr_t) d2);
|
||||
}
|
||||
|
||||
static Eina_List *
|
||||
_remove_bmp(Eina_List *view, void *ptr)
|
||||
{ /* Remove app bitmap from bitmaps list */
|
||||
Variant_st *v = (Variant_st *)
|
||||
bmp_info_st *st = (bmp_info_st *)
|
||||
eina_list_search_unsorted(view, _bmp_app_ptr_cmp,
|
||||
(void *) (uintptr_t) ptr);
|
||||
|
||||
if (v)
|
||||
if (st)
|
||||
{
|
||||
bmp_info_st *st = v->data;
|
||||
if (st->win)
|
||||
evas_object_del(st->win);
|
||||
|
||||
if (st->bmp)
|
||||
free(st->bmp);
|
||||
|
||||
clouseau_data_variant_free(v);
|
||||
return eina_list_remove(view, v);
|
||||
free(st);
|
||||
return eina_list_remove(view, st);
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
static app_data_st *
|
||||
_add_app(gui_elements *g, Variant_st *v)
|
||||
_add_app(gui_elements *g, app_info_st *app)
|
||||
{
|
||||
app_data_st *st;
|
||||
|
||||
st = malloc(sizeof(app_data_st));
|
||||
if (!st) return NULL;
|
||||
|
||||
st->app = v;
|
||||
st->app = app;
|
||||
st->td = NULL; /* Will get this on TREE_DATA message */
|
||||
apps = eina_list_append(apps, st);
|
||||
|
||||
|
@ -423,48 +401,43 @@ _add_app(gui_elements *g, Variant_st *v)
|
|||
}
|
||||
|
||||
static void
|
||||
_free_app_tree_data(Variant_st *td)
|
||||
_free_app_tree_data(tree_data_st *ftd)
|
||||
{
|
||||
tree_data_st *ftd;
|
||||
|
||||
if (!td) return ;
|
||||
if (!ftd) return;
|
||||
|
||||
ftd = td->data;
|
||||
clouseau_data_tree_free(ftd->tree);
|
||||
clouseau_data_variant_free(td);
|
||||
free(ftd);
|
||||
}
|
||||
|
||||
static void
|
||||
_free_app(app_data_st *st)
|
||||
{
|
||||
Variant_st *view;
|
||||
app_info_st *app = st->app->data;
|
||||
bmp_info_st *view;
|
||||
app_info_st *app = st->app;
|
||||
if (app->file)
|
||||
free(app->file);
|
||||
|
||||
EINA_LIST_FREE(app->view, view)
|
||||
{ /* Free memory allocated to show any app screens */
|
||||
bmp_info_st *b = view->data;
|
||||
if (b->win)
|
||||
evas_object_del(b->win);
|
||||
if (view->win)
|
||||
evas_object_del(view->win);
|
||||
|
||||
if (b->bmp)
|
||||
free(b->bmp);
|
||||
if (view->bmp)
|
||||
free(view->bmp);
|
||||
|
||||
clouseau_data_variant_free(view);
|
||||
free(view);
|
||||
}
|
||||
|
||||
clouseau_data_variant_free(st->app);
|
||||
_free_app_tree_data(st->td);
|
||||
free(app);
|
||||
free(st);
|
||||
}
|
||||
|
||||
static void
|
||||
_remove_app(gui_elements *g, Variant_st *v)
|
||||
{
|
||||
app_closed_st *app = v->data;
|
||||
/* Handle the case that NO app is selected, set sel_app to NULL */
|
||||
app_info_st *sel_app = (g->sel_app) ? g->sel_app->app->data : NULL;
|
||||
_remove_app(gui_elements *g, app_closed_st *app)
|
||||
{ /* Handle the case that NO app is selected, set sel_app to NULL */
|
||||
app_info_st *sel_app = (g->sel_app) ? g->sel_app->app: NULL;
|
||||
app_data_st *st = (app_data_st *)
|
||||
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
||||
(void *) (uintptr_t) app->ptr);
|
||||
|
@ -474,7 +447,7 @@ _remove_app(gui_elements *g, Variant_st *v)
|
|||
_set_selected_app(NULL, g->dd_list, NULL);
|
||||
|
||||
if (st)
|
||||
{ /* Remove from list and free all variants */
|
||||
{ /* Remove from list and free all app info */
|
||||
Eina_List *l;
|
||||
apps = eina_list_remove(apps, st);
|
||||
_free_app(st);
|
||||
|
@ -486,46 +459,15 @@ _remove_app(gui_elements *g, Variant_st *v)
|
|||
EINA_LIST_FOREACH(apps, l , st)
|
||||
_add_app_to_dd_list(g->dd_list, st);
|
||||
}
|
||||
|
||||
clouseau_data_variant_free(v);
|
||||
}
|
||||
|
||||
static void
|
||||
_update_tree_offline(gui_elements *g, Variant_st *v)
|
||||
_update_tree_offline(gui_elements *g, tree_data_st *td)
|
||||
{
|
||||
tree_data_st *td = v->data;
|
||||
elm_genlist_clear(g->gl);
|
||||
_load_gui_with_list(g, td->tree);
|
||||
}
|
||||
|
||||
static void
|
||||
_update_tree(gui_elements *g, Variant_st *v)
|
||||
{ /* Update Tree for app, then update GUI if its displayed */
|
||||
tree_data_st *td = v->data;
|
||||
app_info_st *selected = g->sel_app->app->data;
|
||||
|
||||
/* Update only if tree is from APP on our list */
|
||||
app_data_st *st = (app_data_st *)
|
||||
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
||||
(void *) (uintptr_t) td->app);
|
||||
|
||||
if (st)
|
||||
{ /* Free app TREE_DATA then set ptr to new data */
|
||||
_free_app_tree_data(st->td);
|
||||
st->td = v;
|
||||
|
||||
if (selected->ptr == td->app)
|
||||
{ /* Update GUI only if TREE_DATA is from SELECTED app */
|
||||
elm_genlist_clear(g->gl);
|
||||
_load_gui_with_list(g, td->tree);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* Happens when TREE_DATA of app that already closed has arrived */
|
||||
_free_app_tree_data(v); /* Dispose unused info */
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
_bmp_node_cmp(const void *d1, const void *d2)
|
||||
{ /* Compare accoring to Evas ptr */
|
||||
|
@ -566,66 +508,6 @@ _get_bmp_node(bmp_info_st *st, app_info_st *app)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
|
||||
{ /* Remove bmp if exists (according to obj-ptr), then add the new one */
|
||||
bmp_info_st *st = v->data;
|
||||
st->zoom_val = 1.0; /* Init zoom value */
|
||||
|
||||
app_data_st *app = (app_data_st *)
|
||||
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
||||
(void *) (uintptr_t) st->app);
|
||||
|
||||
/* Check for relevant bmp req in the bmp_req list */
|
||||
bmp_node *nd = _get_bmp_node(st, app->app->data);
|
||||
|
||||
if (!st->bmp)
|
||||
{ /* We consider a case out request will be answered with empty bmp
|
||||
this may happen if we have a sub-window of app
|
||||
(like checks in elementary test)
|
||||
if the user closed it just as we send our BMP_REQ
|
||||
this Evas is no longer valid and we get NULL ptr for BMP.
|
||||
This code ignores this case. */
|
||||
elm_progressbar_pulse(g->pb, EINA_FALSE);
|
||||
evas_object_hide(g->pb);
|
||||
clouseau_data_variant_free(v);
|
||||
|
||||
/* Make refresh button display: screenshot NOT available */
|
||||
if (nd)
|
||||
_set_button(g->win, nd->bt,
|
||||
SCREENSHOT_MISSING,
|
||||
"Screenshot not available", EINA_TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (app && nd)
|
||||
{ /* Remove app bmp data if exists, then update */
|
||||
elm_progressbar_pulse(g->pb, EINA_FALSE);
|
||||
evas_object_hide(g->pb);
|
||||
|
||||
app_info_st *info = app->app->data;
|
||||
info->view = _remove_bmp(info->view,
|
||||
(void *) (uintptr_t) (st->object));
|
||||
info->view = eina_list_append(info->view, v);
|
||||
|
||||
/* Now we need to update refresh button, make it open-window */
|
||||
_set_button(g->win, nd->bt,
|
||||
SHOW_SCREENSHOT,
|
||||
"Show App Screenshot", EINA_FALSE);
|
||||
|
||||
bmp_req = eina_list_remove(bmp_req, nd);
|
||||
free(nd);
|
||||
}
|
||||
else
|
||||
{ /* Dispose bmp info if app no longer in the list of apps */
|
||||
/* or the bmp_info is no longer relevant */
|
||||
if (st->bmp)
|
||||
free(st->bmp);
|
||||
|
||||
clouseau_data_variant_free(v);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clouseau_make_lines(bmp_info_st *st, Evas_Coord xx, Evas_Coord yy)
|
||||
{ /* and no, we are NOT talking about WHITE lines */
|
||||
|
@ -719,6 +601,7 @@ _app_win_del(void *data,
|
|||
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{ /* when closeing view, set view ptr to NULL, and enable open button */
|
||||
bmp_info_st *st = data;
|
||||
clouseau_lines_free(st);
|
||||
elm_object_disabled_set(st->bt, EINA_FALSE);
|
||||
evas_object_event_callback_del(st->o, EVAS_CALLBACK_MOUSE_MOVE,
|
||||
_mouse_move);
|
||||
|
@ -818,6 +701,7 @@ _open_app_window(bmp_info_st *st, Evas_Object *bt, Clouseau_Tree_Item *treeit)
|
|||
|
||||
char s_bar[128];
|
||||
char *win_name = malloc(strlen(treeit->name) + strlen(SHOT_HEADER) + 1);
|
||||
st->zoom_val = 1.0; /* Init zoom value */
|
||||
st->bt = bt;
|
||||
st->win = elm_win_add(NULL, "win", ELM_WIN_BASIC);
|
||||
sprintf(win_name, "%s%s", treeit->name, SHOT_HEADER);
|
||||
|
@ -938,34 +822,24 @@ _open_app_window(bmp_info_st *st, Evas_Object *bt, Clouseau_Tree_Item *treeit)
|
|||
static void
|
||||
_show_app_window(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
||||
{ /* Open window with currnent bmp, or download it if missing */
|
||||
app_info_st *st = gui->sel_app->app->data;
|
||||
app_info_st *st = gui->sel_app->app;
|
||||
Clouseau_Tree_Item *treeit = data;
|
||||
|
||||
/* First search app->view list if already have the window bmp */
|
||||
Variant_st *v = (Variant_st *)
|
||||
bmp_info_st *bmp = (bmp_info_st *)
|
||||
eina_list_search_unsorted(st->view, _bmp_object_ptr_cmp,
|
||||
(void *) (uintptr_t) treeit->ptr);
|
||||
if (v)
|
||||
return _open_app_window(v->data, obj, data);
|
||||
if (bmp)
|
||||
return _open_app_window(bmp, obj, data);
|
||||
|
||||
/* Need to issue BMP_REQ */
|
||||
if (svr)
|
||||
if (eet_svr)
|
||||
{
|
||||
int size = 0;
|
||||
bmp_req_st t = { (unsigned long long) (uintptr_t) NULL,
|
||||
(unsigned long long) (uintptr_t) st->ptr,
|
||||
(unsigned long long) (uintptr_t) treeit->ptr, st->refresh_ctr };
|
||||
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_BMP_REQ,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_server_send(svr,
|
||||
0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(svr);
|
||||
free(p);
|
||||
|
||||
ecore_con_eet_send(eet_svr, CLOUSEAU_BMP_REQ_STR, &t);
|
||||
elm_object_disabled_set(obj, EINA_TRUE);
|
||||
elm_progressbar_pulse(gui->pb, EINA_TRUE);
|
||||
evas_object_show(gui->pb);
|
||||
|
@ -976,49 +850,118 @@ _show_app_window(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|||
b_node->bt = obj; /* Button of BMP_REQ */
|
||||
bmp_req = eina_list_append(bmp_req, b_node);
|
||||
}
|
||||
}
|
||||
else /* Disable button if we lost server */
|
||||
_set_button(gui->win, obj,
|
||||
SCREENSHOT_MISSING,
|
||||
"Screenshot not available", EINA_TRUE);
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
_data(void *data, int type EINA_UNUSED, void *event)
|
||||
/* START - Callbacks to handle messages from daemon */
|
||||
void
|
||||
_app_closed_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{
|
||||
Ecore_Ipc_Event_Server_Data *ev = event;
|
||||
Variant_st *v;
|
||||
_remove_app(gui, value);
|
||||
}
|
||||
|
||||
v = clouseau_data_packet_info_get(ev->data, ev->size);
|
||||
if (!v) return ECORE_CALLBACK_RENEW;
|
||||
void
|
||||
_app_add_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{
|
||||
_add_app(gui, value);
|
||||
}
|
||||
|
||||
switch (clouseau_data_packet_mapping_type_get(v->type))
|
||||
{
|
||||
case CLOUSEAU_APP_ADD: /* Add info to list of APPs */
|
||||
_add_app(data, v); /* v->data is (app_info_st *) */
|
||||
break;
|
||||
void
|
||||
_tree_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* Update Tree for app, then update GUI if its displayed */
|
||||
tree_data_st *td = value;
|
||||
app_info_st *selected = gui->sel_app->app;
|
||||
|
||||
case CLOUSEAU_APP_CLOSED: /* Remove and free APP info */
|
||||
_remove_app(data, v); /* v->data is (app_closed_st *) */
|
||||
break;
|
||||
/* Update only if tree is from APP on our list */
|
||||
app_data_st *st = (app_data_st *)
|
||||
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
||||
(void *) (uintptr_t) td->app);
|
||||
|
||||
case CLOUSEAU_TREE_DATA: /* Update genlist with APP TREE info */
|
||||
_update_tree(data, v); /* data is the gui pointer */
|
||||
break; /* v->data is (tree_data_st *) */
|
||||
if (st)
|
||||
{ /* Free app TREE_DATA then set ptr to new data */
|
||||
_free_app_tree_data(st->td);
|
||||
st->td = value;
|
||||
|
||||
case CLOUSEAU_BMP_DATA: /* Contains a snapshot of canvas window */
|
||||
{ /* v->data is (bmp_info_st *) */
|
||||
_add_bmp(data, v); /* data is the gui pointer */
|
||||
if (selected->ptr == td->app)
|
||||
{ /* Update GUI only if TREE_DATA is from SELECTED app */
|
||||
elm_genlist_clear(gui->gl);
|
||||
_load_gui_with_list(gui, td->tree);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{ /* Happens when TREE_DATA of app that already closed has arrived */
|
||||
_free_app_tree_data(value);
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
void
|
||||
_bmp_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
const char *protocol_name, EINA_UNUSED const char *section,
|
||||
void *value, size_t length)
|
||||
{ /* Remove bmp if exists (according to obj-ptr), then add the new one */
|
||||
bmp_info_st *st = clouseau_data_packet_info_get(protocol_name,
|
||||
value, length);
|
||||
|
||||
st->zoom_val = 1.0; /* Init zoom value */
|
||||
|
||||
app_data_st *app = (app_data_st *)
|
||||
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
||||
(void *) (uintptr_t) st->app);
|
||||
|
||||
/* Check for relevant bmp req in the bmp_req list */
|
||||
bmp_node *nd = _get_bmp_node(st, app->app);
|
||||
|
||||
if (!st->bmp)
|
||||
{ /* We consider a case out request will be answered with empty bmp
|
||||
this may happen if we have a sub-window of app
|
||||
(like checks in elementary test)
|
||||
if the user closed it just as we send our BMP_REQ
|
||||
this Evas is no longer valid and we get NULL ptr for BMP.
|
||||
This code ignores this case. */
|
||||
elm_progressbar_pulse(gui->pb, EINA_FALSE);
|
||||
evas_object_hide(gui->pb);
|
||||
free(st);
|
||||
|
||||
/* Make refresh button display: screenshot NOT available */
|
||||
if (nd)
|
||||
_set_button(gui->win, nd->bt,
|
||||
SCREENSHOT_MISSING,
|
||||
"Screenshot not available", EINA_TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
/* variant_free(v) - freed when removed from app list */
|
||||
if (app && nd)
|
||||
{ /* Remove app bmp data if exists, then update */
|
||||
elm_progressbar_pulse(gui->pb, EINA_FALSE);
|
||||
evas_object_hide(gui->pb);
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
app_info_st *info = app->app;
|
||||
info->view = _remove_bmp(info->view,
|
||||
(void *) (uintptr_t) (st->object));
|
||||
info->view = eina_list_append(info->view, st);
|
||||
|
||||
/* Now we need to update refresh button, make it open-window */
|
||||
_set_button(gui->win, nd->bt,
|
||||
SHOW_SCREENSHOT,
|
||||
"Show App Screenshot", EINA_FALSE);
|
||||
|
||||
bmp_req = eina_list_remove(bmp_req, nd);
|
||||
free(nd);
|
||||
}
|
||||
else
|
||||
{ /* Dispose bmp info if app no longer in the list of apps */
|
||||
/* or the bmp_info is no longer relevant */
|
||||
if (st->bmp)
|
||||
free(st->bmp);
|
||||
|
||||
free(st);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1064,8 +1007,6 @@ gl_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_inf
|
|||
elm_genlist_item_expanded_set(glit, EINA_FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static Evas_Object *
|
||||
item_icon_get(void *data, Evas_Object *parent, const char *part)
|
||||
{
|
||||
|
@ -1079,15 +1020,15 @@ item_icon_get(void *data, Evas_Object *parent, const char *part)
|
|||
Evas_Object *bt = elm_button_add(parent);
|
||||
app_info_st *app = NULL;
|
||||
if (gui->sel_app)
|
||||
app = gui->sel_app->app->data;
|
||||
app = gui->sel_app->app;
|
||||
|
||||
if (app)
|
||||
{ /* match ptr with bmp->object ptr to find view */
|
||||
Variant_st *v = (Variant_st *)
|
||||
bmp_info_st *bmp = (bmp_info_st *)
|
||||
eina_list_search_unsorted(app->view, _bmp_object_ptr_cmp,
|
||||
(void *) (uintptr_t) treeit->ptr);
|
||||
|
||||
if (v)
|
||||
if (bmp)
|
||||
{ /* Set to "show view" if view exists */
|
||||
_set_button(parent, bt,
|
||||
SHOW_SCREENSHOT,
|
||||
|
@ -1095,7 +1036,7 @@ item_icon_get(void *data, Evas_Object *parent, const char *part)
|
|||
}
|
||||
else
|
||||
{ /* Set to Download or not available if offline */
|
||||
if (svr)
|
||||
if (eet_svr)
|
||||
{
|
||||
_set_button(parent, bt,
|
||||
TAKE_SCREENSHOT,
|
||||
|
@ -1200,15 +1141,17 @@ client_win_del(void *data EINA_UNUSED,
|
|||
elm_exit(); /* exit the program's main loop that runs in elm_run() */
|
||||
}
|
||||
|
||||
static Ecore_Ipc_Server *
|
||||
static Eina_Bool
|
||||
_connect_to_daemon(gui_elements *g)
|
||||
{
|
||||
if (svr && ecore_ipc_server_connected_get(svr))
|
||||
return svr; /* Already connected */
|
||||
if (eet_svr)
|
||||
return EINA_TRUE;
|
||||
|
||||
int port = PORT;
|
||||
char *address = LOCALHOST;
|
||||
char *p_colon = NULL;
|
||||
Ecore_Con_Server *server;
|
||||
Ecore_Con_Eet *ece = NULL;
|
||||
|
||||
if (g->address && strlen(g->address))
|
||||
{
|
||||
|
@ -1223,28 +1166,44 @@ _connect_to_daemon(gui_elements *g)
|
|||
port = atoi(p_colon+1);
|
||||
}
|
||||
|
||||
svr = ecore_ipc_server_connect(ECORE_IPC_REMOTE_SYSTEM,
|
||||
server = ecore_con_server_connect(ECORE_CON_REMOTE_TCP,
|
||||
address, port, NULL);
|
||||
|
||||
if (p_colon)
|
||||
*p_colon = ':';
|
||||
|
||||
if (!svr)
|
||||
if (!server)
|
||||
{
|
||||
printf("could not connect to the server: %s\n", g->address);
|
||||
return NULL;
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
ecore_ipc_server_data_size_max_set(svr, -1);
|
||||
/* TODO: ecore_con_server_data_size_max_set(server, -1); */
|
||||
|
||||
/* set event handler for server connect */
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, _add, g);
|
||||
/* set event handler for server disconnect */
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, _del, g);
|
||||
/* set event handler for receiving server data */
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, _data, g);
|
||||
ece = ecore_con_eet_client_new(server);
|
||||
if (!ece)
|
||||
{
|
||||
printf("could not connect to the server: %s\n", g->address);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
return svr;
|
||||
clouseau_register_descs(ece);
|
||||
|
||||
/* Register callbacks for ecore_con_eet */
|
||||
ecore_con_eet_server_connect_callback_add(ece, _add, NULL);
|
||||
ecore_con_eet_server_disconnect_callback_add(ece, _del, NULL);
|
||||
ecore_con_eet_data_callback_add(ece, CLOUSEAU_APP_CLOSED_STR,
|
||||
_app_closed_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(ece, CLOUSEAU_APP_ADD_STR,
|
||||
_app_add_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(ece, CLOUSEAU_TREE_DATA_STR,
|
||||
_tree_data_cb, NULL);
|
||||
|
||||
/* At the moment our only raw-data packet is BMP info */
|
||||
ecore_con_eet_raw_data_callback_add(ece, CLOUSEAU_BMP_DATA_STR,
|
||||
_bmp_data_cb, NULL);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1268,23 +1227,13 @@ _gl_selected(void *data, Evas_Object *pobj EINA_UNUSED, void *event_info)
|
|||
return;
|
||||
|
||||
/* START - replacing libclouseau_highlight(obj); */
|
||||
int size;
|
||||
app_info_st *app = g->sel_app->app->data;
|
||||
app_info_st *app = g->sel_app->app;
|
||||
highlight_st st = { (unsigned long long) (uintptr_t) app->ptr,
|
||||
treeit->ptr };
|
||||
|
||||
if (svr)
|
||||
if (eet_svr)
|
||||
{
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_HIGHLIGHT,
|
||||
&st, sizeof(st), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_server_send(svr,
|
||||
0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(svr);
|
||||
free(p);
|
||||
}
|
||||
ecore_con_eet_send(eet_svr, CLOUSEAU_HIGHLIGHT_STR, &st);
|
||||
}
|
||||
|
||||
/* We also like to HIGHLIGHT on any app views that open (for offline) */
|
||||
|
@ -1296,14 +1245,14 @@ _gl_selected(void *data, Evas_Object *pobj EINA_UNUSED, void *event_info)
|
|||
while (prt);
|
||||
|
||||
Clouseau_Tree_Item *t = elm_object_item_data_get(parent);
|
||||
Variant_st *v = eina_list_search_unsorted(app->view,
|
||||
bmp_info_st *bmp = eina_list_search_unsorted(app->view,
|
||||
_bmp_object_ptr_cmp,
|
||||
(void*) (uintptr_t) t->ptr);
|
||||
|
||||
if (v)
|
||||
if (bmp && bmp->win)
|
||||
{ /* Third param gives evas surface when running offline */
|
||||
clouseau_data_object_highlight((void*) (uintptr_t) treeit->ptr,
|
||||
&treeit->info->evas_props, v->data);
|
||||
&treeit->info->evas_props, bmp);
|
||||
}
|
||||
/* END - replacing clouseau_object_highlight(obj); */
|
||||
}
|
||||
|
@ -1318,8 +1267,8 @@ _load_list(gui_elements *g)
|
|||
{
|
||||
elm_genlist_clear(g->gl);
|
||||
elm_genlist_clear(g->prop_list);
|
||||
app_info_st *st = g->sel_app->app->data;
|
||||
tree_data_st *td = (g->sel_app->td) ? g->sel_app->td->data: NULL;
|
||||
app_info_st *st = g->sel_app->app;
|
||||
tree_data_st *td = (g->sel_app->td) ? g->sel_app->td : NULL;
|
||||
|
||||
if (td)
|
||||
{ /* Just show currnet tree we got */
|
||||
|
@ -1327,7 +1276,7 @@ _load_list(gui_elements *g)
|
|||
}
|
||||
else
|
||||
{ /* Ask for app info only if was not fetched */
|
||||
if (!svr)
|
||||
if (!eet_svr)
|
||||
{
|
||||
_update_tree_offline(g, g->sel_app->td);
|
||||
return 0;
|
||||
|
@ -1336,22 +1285,12 @@ _load_list(gui_elements *g)
|
|||
if (eina_list_search_unsorted(apps, _app_ptr_cmp,
|
||||
(void *) (uintptr_t) st->ptr))
|
||||
{ /* do it only if app selected AND found in apps list */
|
||||
int size;
|
||||
data_req_st t = { (unsigned long long) (uintptr_t) NULL,
|
||||
(unsigned long long) (uintptr_t) st->ptr };
|
||||
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_DATA_REQ,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_con_eet_send(eet_svr, CLOUSEAU_DATA_REQ_STR, &t);
|
||||
elm_progressbar_pulse(g->pb, EINA_TRUE);
|
||||
evas_object_show(g->pb);
|
||||
ecore_ipc_server_send(svr,
|
||||
0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(svr);
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1390,7 +1329,7 @@ _bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|||
/* Close all app-bmp-view windows here and clear mem */
|
||||
if (g->sel_app)
|
||||
{
|
||||
app_info_st *st = g->sel_app->app->data;
|
||||
app_info_st *st = g->sel_app->app;
|
||||
_close_app_views(st, EINA_TRUE);
|
||||
st->refresh_ctr++;
|
||||
}
|
||||
|
@ -1406,18 +1345,16 @@ static void
|
|||
_bt_load_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
|
||||
{
|
||||
gui_elements *g = data;
|
||||
Variant_st *app = calloc(1, sizeof(Variant_st));
|
||||
Variant_st *td = calloc(1, sizeof(Variant_st));
|
||||
/* app_info_st *app = NULL; */
|
||||
app_info_st *app = calloc(1, sizeof(*app));
|
||||
tree_data_st *td = calloc(1, sizeof(*td));
|
||||
if (event_info)
|
||||
{
|
||||
Eina_Bool s = clouseau_data_eet_info_read(event_info,
|
||||
(app_info_st **) &app->data,
|
||||
(tree_data_st **) &td->data);
|
||||
(app_info_st **) &app, (tree_data_st **) &td);
|
||||
|
||||
if (s)
|
||||
{ /* Add the app to list of apps, then set this as selected app */
|
||||
((app_info_st *) app->data)->file = strdup(event_info);
|
||||
app->file = strdup(event_info);
|
||||
app_data_st *st = _add_app(g, app);
|
||||
st->td = td; /* This is the same as we got TREE_DATA message */
|
||||
_set_selected_app(st, g->dd_list, NULL);
|
||||
|
@ -1437,8 +1374,8 @@ _dismiss_save_dialog(void *data,
|
|||
static void
|
||||
_bt_save_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
|
||||
{
|
||||
app_info_st *app = gui->sel_app->app->data;
|
||||
tree_data_st *ftd = gui->sel_app->td->data;
|
||||
app_info_st *app = gui->sel_app->app;
|
||||
tree_data_st *ftd = gui->sel_app->td;
|
||||
if (event_info)
|
||||
{
|
||||
/* FIXME: Handle failure. */
|
||||
|
@ -1504,19 +1441,16 @@ _save_file_dialog(void *data,
|
|||
ck_bx = elm_box_add(g->save_inwin);
|
||||
|
||||
Eina_List *l;
|
||||
app_info_st *a = g->sel_app->app->data;
|
||||
tree_data_st *td = g->sel_app->td->data;
|
||||
bmp_info_st *bmp;
|
||||
app_info_st *a = g->sel_app->app;
|
||||
tree_data_st *td = g->sel_app->td;
|
||||
Clouseau_Tree_Item *treeit;
|
||||
char buf[256];
|
||||
EINA_LIST_FOREACH(td->tree, l, treeit)
|
||||
{ /* First search app->view list if already have the window bmp */
|
||||
Variant_st *v = (Variant_st *)
|
||||
bmp_info_st *bmp = (bmp_info_st *)
|
||||
eina_list_search_unsorted(a->view, _bmp_object_ptr_cmp,
|
||||
(void *) (uintptr_t) treeit->ptr);
|
||||
|
||||
bmp = (v) ? v->data : NULL;
|
||||
|
||||
ck = elm_check_add(ck_bx);
|
||||
evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 1.0);
|
||||
evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.0);
|
||||
|
@ -1586,19 +1520,14 @@ _remove_apps_with_no_tree_data(gui_elements *g)
|
|||
Eina_List *l, *l_next;
|
||||
app_data_st *st;
|
||||
app_closed_st t;
|
||||
Variant_st *v;
|
||||
EINA_LIST_FOREACH_SAFE(apps, l, l_next, st)
|
||||
{
|
||||
if (!st->td)
|
||||
{ /* We actually fake APP_CLOSED message, for app NO tree */
|
||||
t.ptr = (unsigned long long) (uintptr_t)
|
||||
(((app_info_st *) st->app->data)->ptr);
|
||||
(((app_info_st *) st->app)->ptr);
|
||||
|
||||
/* v is freed by _remove_app */
|
||||
v = clouseau_data_variant_alloc(CLOUSEAU_APP_CLOSED,
|
||||
sizeof(t), &t);
|
||||
|
||||
_remove_app(g, v); /* v->data is (app_closed_st *) */
|
||||
_remove_app(g, &t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1645,8 +1574,7 @@ _show_gui(gui_elements *g, Eina_Bool work_offline)
|
|||
elm_object_disabled_set(g->bt_save, (g->sel_app == NULL));
|
||||
evas_object_show(g->bt_save);
|
||||
|
||||
svr = _connect_to_daemon(g);
|
||||
if(!svr)
|
||||
if (!_connect_to_daemon(g))
|
||||
{
|
||||
printf("Failed to connect to server.\n");
|
||||
elm_exit(); /* exit the program's main loop,runs in elm_run() */
|
||||
|
@ -1682,54 +1610,54 @@ _ofl_bt_clicked(void *data,
|
|||
}
|
||||
|
||||
static void
|
||||
_control_buttons_create(gui_elements *gui, Evas_Object *win)
|
||||
_control_buttons_create(gui_elements *g, Evas_Object *win)
|
||||
{
|
||||
Evas_Object *show_hidden_check, *show_clippers_check, *highlight_check;
|
||||
|
||||
gui->hbx = elm_box_add(gui->bx);
|
||||
evas_object_size_hint_align_set(gui->hbx, 0.0, 0.5);
|
||||
elm_box_horizontal_set(gui->hbx, EINA_TRUE);
|
||||
elm_box_pack_end(gui->bx, gui->hbx);
|
||||
elm_box_padding_set(gui->hbx, 10, 0);
|
||||
evas_object_show(gui->hbx);
|
||||
g->hbx = elm_box_add(g->bx);
|
||||
evas_object_size_hint_align_set(g->hbx, 0.0, 0.5);
|
||||
elm_box_horizontal_set(g->hbx, EINA_TRUE);
|
||||
elm_box_pack_end(g->bx, g->hbx);
|
||||
elm_box_padding_set(g->hbx, 10, 0);
|
||||
evas_object_show(g->hbx);
|
||||
|
||||
gui->bt_load = elm_button_add(gui->hbx);
|
||||
evas_object_size_hint_align_set(gui->bt_load, 0.0, 0.3);
|
||||
elm_box_pack_end(gui->hbx, gui->bt_load);
|
||||
evas_object_show(gui->bt_load);
|
||||
g->bt_load = elm_button_add(g->hbx);
|
||||
evas_object_size_hint_align_set(g->bt_load, 0.0, 0.3);
|
||||
elm_box_pack_end(g->hbx, g->bt_load);
|
||||
evas_object_show(g->bt_load);
|
||||
|
||||
gui->dd_list = elm_hoversel_add(gui->hbx);
|
||||
elm_hoversel_hover_parent_set(gui->dd_list, win);
|
||||
elm_object_text_set(gui->dd_list, "SELECT APP");
|
||||
g->dd_list = elm_hoversel_add(g->hbx);
|
||||
elm_hoversel_hover_parent_set(g->dd_list, win);
|
||||
elm_object_text_set(g->dd_list, "SELECT APP");
|
||||
|
||||
evas_object_size_hint_align_set(gui->dd_list, 0.0, 0.3);
|
||||
elm_box_pack_end(gui->hbx, gui->dd_list);
|
||||
evas_object_show(gui->dd_list);
|
||||
evas_object_size_hint_align_set(g->dd_list, 0.0, 0.3);
|
||||
elm_box_pack_end(g->hbx, g->dd_list);
|
||||
evas_object_show(g->dd_list);
|
||||
|
||||
show_hidden_check = elm_check_add(gui->hbx);
|
||||
show_hidden_check = elm_check_add(g->hbx);
|
||||
elm_object_text_set(show_hidden_check, "Show Hidden");
|
||||
elm_check_state_set(show_hidden_check, list_show_hidden);
|
||||
elm_box_pack_end(gui->hbx, show_hidden_check);
|
||||
elm_box_pack_end(g->hbx, show_hidden_check);
|
||||
evas_object_show(show_hidden_check);
|
||||
|
||||
show_clippers_check = elm_check_add(gui->hbx);
|
||||
show_clippers_check = elm_check_add(g->hbx);
|
||||
elm_object_text_set(show_clippers_check, "Show Clippers");
|
||||
elm_check_state_set(show_clippers_check, list_show_clippers);
|
||||
elm_box_pack_end(gui->hbx, show_clippers_check);
|
||||
elm_box_pack_end(g->hbx, show_clippers_check);
|
||||
evas_object_show(show_clippers_check);
|
||||
|
||||
highlight_check = elm_check_add(gui->hbx);
|
||||
highlight_check = elm_check_add(g->hbx);
|
||||
elm_object_text_set(highlight_check , "Highlight");
|
||||
elm_check_state_set(highlight_check , do_highlight);
|
||||
elm_box_pack_end(gui->hbx, highlight_check);
|
||||
elm_box_pack_end(g->hbx, highlight_check);
|
||||
evas_object_show(highlight_check);
|
||||
|
||||
evas_object_smart_callback_add(show_hidden_check, "changed",
|
||||
_show_hidden_check_changed, gui);
|
||||
_show_hidden_check_changed, g);
|
||||
evas_object_smart_callback_add(show_clippers_check, "changed",
|
||||
_show_clippers_check_changed, gui);
|
||||
_show_clippers_check_changed, g);
|
||||
evas_object_smart_callback_add(highlight_check, "changed",
|
||||
_highlight_check_check_changed, gui);
|
||||
_highlight_check_check_changed, g);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1842,7 +1770,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
|
|||
|
||||
eina_init();
|
||||
ecore_init();
|
||||
ecore_ipc_init();
|
||||
ecore_con_init();
|
||||
clouseau_data_init();
|
||||
|
||||
/* START - Popup to get IP, PORT from user */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#endif
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <Ecore_Ipc.h>
|
||||
#include <Ecore_Con_Eet.h>
|
||||
|
||||
#include "clouseau_private.h"
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
|||
|
||||
static Eina_List *gui = NULL; /* List of app_info_st for gui clients */
|
||||
static Eina_List *app = NULL; /* List of app_info_st for app clients */
|
||||
Ecore_Ipc_Server *ipc_svr = NULL;
|
||||
static Ecore_Con_Eet *eet_svr = NULL;
|
||||
|
||||
/* For Debug */
|
||||
char msg_buf[MAX_LINE+1];
|
||||
|
@ -39,9 +39,11 @@ static void
|
|||
_daemon_cleanup(void)
|
||||
{ /* Free strings */
|
||||
app_info_st *p;
|
||||
time_t currentTime;
|
||||
|
||||
sprintf(msg_buf,"Clients connected to this server when exiting: %d\n",
|
||||
eina_list_count(ecore_ipc_server_clients_get(ipc_svr)));
|
||||
time (¤tTime);
|
||||
sprintf(msg_buf,"\n\n%sClients connected to this server when exiting: %d\n"
|
||||
, ctime(¤tTime), eina_list_count(app) + eina_list_count(gui));
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
EINA_LIST_FREE(gui, p)
|
||||
|
@ -49,6 +51,9 @@ _daemon_cleanup(void)
|
|||
if(p->file)
|
||||
free(p->file);
|
||||
|
||||
if (p->ptr)
|
||||
free((void *) (uint32_t) p->ptr);
|
||||
|
||||
free(p->name);
|
||||
free(p);
|
||||
}
|
||||
|
@ -58,15 +63,18 @@ _daemon_cleanup(void)
|
|||
if(p->file)
|
||||
free(p->file);
|
||||
|
||||
if (p->ptr)
|
||||
free((void *) (uint32_t) p->ptr);
|
||||
|
||||
free(p->name);
|
||||
free(p);
|
||||
}
|
||||
|
||||
gui = app = NULL;
|
||||
ipc_svr = NULL;
|
||||
eet_svr = NULL;
|
||||
|
||||
clouseau_data_shutdown();
|
||||
ecore_ipc_shutdown();
|
||||
ecore_con_shutdown();
|
||||
ecore_shutdown();
|
||||
eina_shutdown();
|
||||
}
|
||||
|
@ -115,15 +123,19 @@ _client_ptr_cmp(const void *d1, const void *d2)
|
|||
}
|
||||
|
||||
static Eina_List *
|
||||
_add_client(Eina_List *clients, connect_st *t, void *client)
|
||||
_add_client(Eina_List *clients, connect_st *t, void *client, const char *type)
|
||||
{
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, client);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
if(!eina_list_search_unsorted(clients, _client_ptr_cmp, client))
|
||||
{
|
||||
app_info_st *st = calloc(1, sizeof(app_info_st));
|
||||
st->name = strdup(t->name);
|
||||
st->pid = t->pid;
|
||||
st->ptr = (unsigned long long) (uintptr_t) client;
|
||||
|
||||
sprintf(msg_buf, "\tAdded %s client <%p>", type, client);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
return eina_list_append(clients, st);
|
||||
}
|
||||
|
||||
|
@ -131,13 +143,18 @@ _add_client(Eina_List *clients, connect_st *t, void *client)
|
|||
}
|
||||
|
||||
static Eina_List *
|
||||
_remove_client(Eina_List *clients, void *client)
|
||||
_remove_client(Eina_List *clients, void *client, const char *type)
|
||||
{
|
||||
app_info_st *p = eina_list_search_unsorted(clients, _client_ptr_cmp, client);
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, client);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
if (p)
|
||||
{
|
||||
free(p->name);
|
||||
free(p);
|
||||
sprintf(msg_buf, "\tRemoved %s client <%p>", type, client);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
return eina_list_remove(clients, p);
|
||||
}
|
||||
|
||||
|
@ -145,139 +162,111 @@ _remove_client(Eina_List *clients, void *client)
|
|||
}
|
||||
|
||||
Eina_Bool
|
||||
_add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Add *ev)
|
||||
_add(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED Ecore_Con_Client *conn)
|
||||
{
|
||||
ecore_ipc_client_data_size_max_set(ev->client, -1);
|
||||
sprintf(msg_buf, "<%s> msg from <%p>", __func__, ev->client);
|
||||
/* TODO: ecore_ipc_client_data_size_max_set(ev->client, -1); */
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
_del(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Del *ev)
|
||||
_del(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED Ecore_Con_Client *conn)
|
||||
{
|
||||
if (!ev->client)
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
|
||||
sprintf(msg_buf, "<%s> msg from <%p>", __func__, ev->client);
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
/* Now we need to find if its an APP or GUI client */
|
||||
app_info_st *i = eina_list_search_unsorted(gui, _client_ptr_cmp, ev->client);
|
||||
app_info_st *i = eina_list_search_unsorted(gui, _client_ptr_cmp, reply);
|
||||
if (i) /* Only need to remove GUI client from list */
|
||||
gui = _remove_client(gui, ev->client);
|
||||
gui = _remove_client(gui, reply, "GUI");
|
||||
|
||||
i = eina_list_search_unsorted(app, _client_ptr_cmp, ev->client);
|
||||
i = eina_list_search_unsorted(app, _client_ptr_cmp, reply);
|
||||
if (i)
|
||||
{ /* Notify all GUI clients to remove this APP */
|
||||
app_closed_st t = { (unsigned long long) (uintptr_t) ev->client };
|
||||
app_closed_st t = { (unsigned long long) (uintptr_t) reply };
|
||||
Eina_List *l;
|
||||
int size;
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_APP_CLOSED,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
EINA_LIST_FOREACH(gui, l, i)
|
||||
{
|
||||
ecore_ipc_client_send((void *) (uintptr_t) i->ptr,
|
||||
0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_client_flush((void *) (uintptr_t) i->ptr);
|
||||
sprintf(msg_buf, "\t<%p> Sending APP_CLOSED to <%p>",
|
||||
reply, (void *) (uint32_t) i->ptr);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uintptr_t) i->ptr,
|
||||
CLOUSEAU_APP_CLOSED_STR, &t);
|
||||
}
|
||||
|
||||
free(p);
|
||||
app = _remove_client(app, reply, "APP");
|
||||
}
|
||||
|
||||
app = _remove_client(app, ev->client);
|
||||
}
|
||||
|
||||
ecore_ipc_client_del(ev->client);
|
||||
|
||||
if (!eina_list_count(ecore_ipc_server_clients_get(ipc_svr)))
|
||||
if (!(gui || app))
|
||||
{ /* Trigger cleanup and exit when all clients disconneced */
|
||||
/* ecore_con_eet_server_free(eet_svr); why this causes Segfault? */
|
||||
ecore_con_server_del(data);
|
||||
ecore_main_loop_quit();
|
||||
}
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
_data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data *ev)
|
||||
{
|
||||
void *p;
|
||||
int size = 0;
|
||||
|
||||
sprintf(msg_buf, "<%s> msg from <%p>", __func__, ev->client);
|
||||
void
|
||||
_gui_client_connect_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* Register GUI, then notify about all APP */
|
||||
app_info_st *st;
|
||||
Eina_List *l;
|
||||
connect_st *t = value;
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
Variant_st *v = clouseau_data_packet_info_get(ev->data, ev->size);
|
||||
/* This is where daemon impl communication protocol.
|
||||
* In order to simplify, all messages also contains recipient ptr
|
||||
* as saved by daemon.
|
||||
* Thus we only need to peek this info then FWD, reply to this recipient */
|
||||
if (!v)
|
||||
{
|
||||
log_message(LOG_FILE, "a", "Failed to decode data.");
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
gui = _add_client(gui, t, reply, "GUI");
|
||||
|
||||
switch(clouseau_data_packet_mapping_type_get(v->type))
|
||||
{
|
||||
case CLOUSEAU_APP_CLIENT_CONNECT:
|
||||
{ /* Register APP then notify GUI about it */
|
||||
app_info_st *st;
|
||||
Eina_List *l;
|
||||
connect_st *t = v->data;
|
||||
app_info_st m = { t->pid, (char *) t->name, NULL,
|
||||
(unsigned long long) (uintptr_t) ev->client, NULL, 0 };
|
||||
|
||||
app = _add_client(app, t, ev->client);
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_APP_ADD,
|
||||
&m, sizeof(m), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
EINA_LIST_FOREACH(gui, l, st)
|
||||
{ /* Notify all GUI clients to add APP */
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) st->ptr,
|
||||
0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) st->ptr);
|
||||
}
|
||||
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case CLOUSEAU_GUI_CLIENT_CONNECT:
|
||||
{ /* Register GUI, then notify about all APP */
|
||||
app_info_st *st;
|
||||
Eina_List *l;
|
||||
connect_st *t = v->data;
|
||||
gui = _add_client(gui, t, ev->client);
|
||||
/* Add all registered apps to newly open GUI */
|
||||
EINA_LIST_FOREACH(app, l, st)
|
||||
{ /* Add all registered apps to newly open GUI */
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_APP_ADD,
|
||||
st, sizeof(*st), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_client_send(ev->client,
|
||||
0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_client_flush(ev->client);
|
||||
free(p);
|
||||
}
|
||||
sprintf(msg_buf, "\t<%p> Sending APP_ADD to <%p>",
|
||||
(void *) (uint32_t) st->ptr, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send(reply, CLOUSEAU_APP_ADD_STR, st);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
void
|
||||
_app_client_connect_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* Register APP then notify GUI about it */
|
||||
app_info_st *st;
|
||||
Eina_List *l;
|
||||
connect_st *t = value;
|
||||
app_info_st m = { t->pid, (char *) t->name, NULL,
|
||||
(unsigned long long) (uintptr_t) reply, NULL, 0 };
|
||||
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
app = _add_client(app, t, reply, "APP");
|
||||
|
||||
/* Notify all GUI clients to add APP */
|
||||
EINA_LIST_FOREACH(gui, l, st)
|
||||
{
|
||||
sprintf(msg_buf, "\t<%p> Sending APP_ADD to <%p>",
|
||||
reply, (void *) (uint32_t) st->ptr);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) st->ptr,
|
||||
CLOUSEAU_APP_ADD_STR, &m);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_data_req_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* msg coming from GUI, FWD this to APP specified in REQ */
|
||||
data_req_st *req = value;
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
case CLOUSEAU_DATA_REQ:
|
||||
{ /* msg coming from GUI, FWD this to app specified in req */
|
||||
data_req_st *req = v->data;
|
||||
if (req->app)
|
||||
{ /* Requesting specific app data */
|
||||
if(eina_list_search_unsorted(app,
|
||||
|
@ -285,21 +274,14 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
|
|||
(void *) (uintptr_t) req->app))
|
||||
{ /* Do the req only of APP connected to daemon */
|
||||
data_req_st t = {
|
||||
(unsigned long long) (uintptr_t) ev->client,
|
||||
(unsigned long long) (uintptr_t) reply,
|
||||
(unsigned long long) (uintptr_t) req->app };
|
||||
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_DATA_REQ,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) req->app,
|
||||
0,0,0,0, EINA_FALSE, p, size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) req->app);
|
||||
free(p);
|
||||
}
|
||||
sprintf(msg_buf, "\t<%p> Sending DATA_REQ to <%p>",
|
||||
reply, (void *) (uint32_t) req->app);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) req->app,
|
||||
CLOUSEAU_DATA_REQ_STR, &t);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -307,43 +289,39 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
|
|||
Eina_List *l;
|
||||
app_info_st *st;
|
||||
data_req_st t = {
|
||||
(unsigned long long) (uintptr_t) ev->client,
|
||||
(unsigned long long) (uintptr_t) reply,
|
||||
(unsigned long long) (uintptr_t) NULL };
|
||||
|
||||
EINA_LIST_FOREACH(app, l, st)
|
||||
{
|
||||
t.app = (unsigned long long) (uintptr_t) st->ptr;
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_DATA_REQ,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
sprintf(msg_buf, "\t<%p> Sending DATA_REQ to <%p>",
|
||||
reply, (void *) (uint32_t) st->ptr);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) st->ptr, CLOUSEAU_DATA_REQ_STR, &t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) st->ptr,
|
||||
0,0,0,0, EINA_FALSE, p, size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) st->ptr);
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
void
|
||||
_tree_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* Tree Data comes from APP, GUI client specified in msg */
|
||||
tree_data_st *td = value;
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
case CLOUSEAU_TREE_DATA:
|
||||
{ /* Tree Data comes from APP, GUI client specified in msg */
|
||||
tree_data_st *td = v->data;
|
||||
if (td->gui)
|
||||
{ /* Sending tree data to specific GUI client */
|
||||
if(eina_list_search_unsorted(gui,
|
||||
_client_ptr_cmp,
|
||||
(void *) (uintptr_t) td->gui))
|
||||
{ /* Do the req only of GUI connected to daemon */
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) td->gui, 0,0,0,0,
|
||||
EINA_FALSE, ev->data, ev->size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) td->gui);
|
||||
sprintf(msg_buf, "\t<%p> Sending TREE_DATA to <%p>",
|
||||
reply, (void *) (uint32_t) td->gui);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) td->gui,
|
||||
CLOUSEAU_TREE_DATA_STR, value);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -352,72 +330,81 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
|
|||
app_info_st *info;
|
||||
EINA_LIST_FOREACH(gui, l, info)
|
||||
{
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) info->ptr, 0,0,0,0,
|
||||
EINA_FALSE, ev->data, ev->size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) info->ptr);
|
||||
sprintf(msg_buf, "\t<%p> Sending TREE_DATA to <%p>",
|
||||
reply, (void *) (uint32_t) info->ptr);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) info->ptr,
|
||||
CLOUSEAU_TREE_DATA_STR, value);
|
||||
}
|
||||
}
|
||||
|
||||
clouseau_data_tree_free(td->tree);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
void
|
||||
_highlight_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* FWD this message to APP */
|
||||
highlight_st *ht = value;
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
case CLOUSEAU_HIGHLIGHT:
|
||||
{ /* FWD this message to app */
|
||||
highlight_st *ht = v->data;
|
||||
if(eina_list_search_unsorted(app,
|
||||
_client_ptr_cmp, (void *) (uintptr_t) ht->app))
|
||||
{ /* Do the req only of APP connected to daemon */
|
||||
ecore_ipc_client_send((void *)
|
||||
(uintptr_t) ht->app, 0,0,0,0,
|
||||
EINA_FALSE, ev->data, ev->size);
|
||||
ecore_ipc_client_flush((void *) (uintptr_t) ht->app);
|
||||
{ /* Do the REQ only of APP connected to daemon */
|
||||
sprintf(msg_buf, "\t<%p> Sending HIGHLIGHT to <%p>",
|
||||
reply, (void *) (uint32_t) ht->app);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) ht->app,
|
||||
CLOUSEAU_HIGHLIGHT_STR, value);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
void
|
||||
_bmp_req_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* BMP data request coming from GUI to APP client */
|
||||
bmp_req_st *req = value;
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
case CLOUSEAU_BMP_REQ:
|
||||
{
|
||||
bmp_req_st *req = v->data;
|
||||
if(eina_list_search_unsorted(app,
|
||||
_client_ptr_cmp, (void *) (uintptr_t) req->app))
|
||||
{ /* Do the req only of APP connected to daemon */
|
||||
{ /* Do the req only if APP connected to daemon */
|
||||
bmp_req_st t = {
|
||||
(unsigned long long) (uintptr_t) ev->client,
|
||||
(unsigned long long) (uintptr_t) reply,
|
||||
req->app, req->object, req->ctr };
|
||||
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_BMP_REQ,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
sprintf(msg_buf, "\t<%p> Sending BMP_REQ to <%p>",
|
||||
reply, (void *) (uint32_t) req->app);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_send((void *) (uint32_t) req->app,
|
||||
CLOUSEAU_BMP_REQ_STR, &t);
|
||||
}
|
||||
}
|
||||
|
||||
if (p)
|
||||
{ /* FWD req to app with client data */
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) req->app,
|
||||
0,0,0,0, EINA_FALSE, p, size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) req->app);
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
void
|
||||
_bmp_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, EINA_UNUSED const char *section,
|
||||
void *value, EINA_UNUSED size_t length)
|
||||
{ /* BMP Data comes from APP, GUI client specified in msg */
|
||||
bmp_info_st *st = clouseau_data_packet_info_get(protocol_name,
|
||||
value, length);
|
||||
|
||||
sprintf(msg_buf, "\n<%s> msg from <%p>", __func__, reply);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
|
||||
case CLOUSEAU_BMP_DATA:
|
||||
{ /* Bmp Data comes from APP, GUI client specified in msg */
|
||||
bmp_info_st *st = v->data;
|
||||
if (st->gui)
|
||||
{ /* Sending BMP data to specific GUI client */
|
||||
if(eina_list_search_unsorted(gui,
|
||||
_client_ptr_cmp,
|
||||
(void *) (uintptr_t) st->gui))
|
||||
{ /* Do the req only of GUI connected to daemon */
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) st->gui, 0,0,0,0,
|
||||
EINA_FALSE, ev->data, ev->size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) st->gui);
|
||||
sprintf(msg_buf, "\t<%p> Sending BMP_DATA to <%p>",
|
||||
reply, (void *) (uint32_t) st->gui);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_raw_send((void *) (uint32_t) st->gui,
|
||||
CLOUSEAU_BMP_DATA_STR, "BMP", value, length);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -426,27 +413,18 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
|
|||
app_info_st *info;
|
||||
EINA_LIST_FOREACH(gui, l, info)
|
||||
{
|
||||
ecore_ipc_client_send(
|
||||
(void *) (uintptr_t) info->ptr, 0,0,0,0,
|
||||
EINA_FALSE, ev->data, ev->size);
|
||||
ecore_ipc_client_flush(
|
||||
(void *) (uintptr_t) info->ptr);
|
||||
sprintf(msg_buf, "\t<%p> Sending BMP_DATA to <%p>",
|
||||
reply, (void *) (uint32_t) info->ptr);
|
||||
log_message(LOG_FILE, "a", msg_buf);
|
||||
ecore_con_eet_raw_send((void *) (uint32_t) info->ptr,
|
||||
CLOUSEAU_BMP_DATA_STR, "BMP", value, length);
|
||||
}
|
||||
}
|
||||
|
||||
if (st->bmp)
|
||||
free(st->bmp);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
clouseau_data_variant_free(v);
|
||||
|
||||
log_message(LOG_FILE, "a", "_data() finished");
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
free(st);
|
||||
}
|
||||
/* END - Ecore communication callbacks */
|
||||
|
||||
|
@ -455,18 +433,37 @@ int main(void)
|
|||
daemonize();
|
||||
eina_init();
|
||||
ecore_init();
|
||||
ecore_ipc_init();
|
||||
ecore_con_init();
|
||||
clouseau_data_init();
|
||||
Ecore_Con_Server *server = NULL;
|
||||
|
||||
if (!(ipc_svr = ecore_ipc_server_add(ECORE_IPC_REMOTE_SYSTEM,
|
||||
if (!(server = ecore_con_server_add(ECORE_CON_REMOTE_TCP,
|
||||
LISTEN_IP, PORT, NULL)))
|
||||
exit(1);
|
||||
|
||||
ecore_ipc_server_data_size_max_set(ipc_svr, -1);
|
||||
eet_svr = ecore_con_eet_server_new(server);
|
||||
if (!eet_svr)
|
||||
exit(2);
|
||||
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
|
||||
clouseau_register_descs(eet_svr);
|
||||
|
||||
/* Register callbacks for ecore_con_eet */
|
||||
ecore_con_eet_client_connect_callback_add(eet_svr, _add, NULL);
|
||||
ecore_con_eet_client_disconnect_callback_add(eet_svr, _del, server);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_GUI_CLIENT_CONNECT_STR,
|
||||
_gui_client_connect_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_APP_CLIENT_CONNECT_STR,
|
||||
_app_client_connect_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_DATA_REQ_STR,
|
||||
_data_req_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_TREE_DATA_STR,
|
||||
_tree_data_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_HIGHLIGHT_STR,
|
||||
_highlight_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_BMP_REQ_STR,
|
||||
_bmp_req_cb, NULL);
|
||||
ecore_con_eet_raw_data_callback_add(eet_svr, CLOUSEAU_BMP_DATA_STR,
|
||||
_bmp_data_cb, NULL);
|
||||
|
||||
ecore_main_loop_begin();
|
||||
_daemon_cleanup();
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include <dlfcn.h>
|
||||
#include <execinfo.h>
|
||||
|
||||
#include <Ecore_Ipc.h>
|
||||
#include <Ecore_Con_Eet.h>
|
||||
#include <Edje.h>
|
||||
#include <Evas.h>
|
||||
#include <Elementary.h>
|
||||
|
@ -139,58 +139,41 @@ _load_list(void)
|
|||
return tree; /* User has to call clouseau_tree_free() */
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Add *ev)
|
||||
Eina_Bool
|
||||
_add(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED Ecore_Con_Server *conn)
|
||||
{
|
||||
void *p;
|
||||
int size = 0;
|
||||
|
||||
ecore_ipc_server_data_size_max_set(ev->server, -1);
|
||||
|
||||
/* ecore_con_server_data_size_max_set(conn, -1); */
|
||||
connect_st t = { getpid(), _my_app_name };
|
||||
p = clouseau_data_packet_compose(CLOUSEAU_APP_CLIENT_CONNECT,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(ev->server);
|
||||
free(p);
|
||||
}
|
||||
ecore_con_eet_send(reply, CLOUSEAU_APP_CLIENT_CONNECT_STR, &t);
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_del(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Del *ev)
|
||||
Eina_Bool
|
||||
_del(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
Ecore_Con_Server *conn)
|
||||
{
|
||||
if (!ev->server)
|
||||
if (!conn)
|
||||
{
|
||||
printf("Failed to establish connection to the server.\nExiting.\n");
|
||||
ecore_main_loop_quit();
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
printf("Lost server with ip %s!\n", ecore_ipc_server_ip_get(ev->server));
|
||||
printf("Lost server with ip <%s>\n", ecore_con_server_ip_get(conn));
|
||||
|
||||
ecore_ipc_server_del(ev->server);
|
||||
ecore_con_server_del(conn);
|
||||
|
||||
ecore_main_loop_quit();
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data *ev)
|
||||
{
|
||||
Variant_st *v;
|
||||
|
||||
v = clouseau_data_packet_info_get(ev->data, ev->size);
|
||||
switch (clouseau_data_packet_mapping_type_get(v->type))
|
||||
{
|
||||
case CLOUSEAU_DATA_REQ:
|
||||
{ /* data req includes ptr to GUI, to tell which client asking */
|
||||
int size = 0;
|
||||
data_req_st *req = v->data;
|
||||
void
|
||||
_data_req_cb(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* data req includes ptr to GUI, to tell which client asking */
|
||||
data_req_st *req = value;
|
||||
tree_data_st t;
|
||||
t.gui = req->gui; /* GUI client requesting data from daemon */
|
||||
t.app = req->app; /* APP client sending data to daemon */
|
||||
|
@ -198,35 +181,27 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
|
|||
|
||||
if (t.tree)
|
||||
{ /* Reply with tree data to data request */
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_TREE_DATA,
|
||||
&t, sizeof(t), &size, NULL, 0);
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_server_send(ev->server, 0,0,0,0,
|
||||
EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(ev->server);
|
||||
free(p);
|
||||
}
|
||||
|
||||
ecore_con_eet_send(reply, CLOUSEAU_TREE_DATA_STR, &t);
|
||||
clouseau_data_tree_free(t.tree);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CLOUSEAU_HIGHLIGHT:
|
||||
{ /* Highlight msg contains PTR of object to highlight */
|
||||
highlight_st *ht = v->data;
|
||||
void
|
||||
_highlight_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* Highlight msg contains PTR of object to highlight */
|
||||
highlight_st *ht = value;
|
||||
Evas_Object *obj = (Evas_Object *) (uintptr_t) ht->object;
|
||||
clouseau_data_object_highlight(obj, NULL, NULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CLOUSEAU_BMP_REQ:
|
||||
{ /* Bitmap req msg contains PTR of Ecore Evas */
|
||||
bmp_req_st *req = v->data;
|
||||
void
|
||||
_bmp_req_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
||||
EINA_UNUSED const char *protocol_name, void *value)
|
||||
{ /* Bitmap req msg contains PTR of Ecore Evas */
|
||||
bmp_req_st *req = value;
|
||||
Evas_Coord w, h;
|
||||
int size = 0;
|
||||
unsigned int size = 0;
|
||||
void *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t)
|
||||
req->object, &w, &h);
|
||||
|
||||
|
@ -235,61 +210,59 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
|
|||
NULL,NULL, NULL, 1.0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL };
|
||||
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_BMP_DATA,
|
||||
&t, sizeof(t), &size, bmp, (w * h * sizeof(int)));
|
||||
void *p = clouseau_data_packet_compose(CLOUSEAU_BMP_DATA_STR,
|
||||
&t, &size, bmp, (w * h * sizeof(int)));
|
||||
|
||||
|
||||
if (p)
|
||||
{
|
||||
ecore_ipc_server_send(ev->server, 0,0,0,0,
|
||||
EINA_FALSE, p, size);
|
||||
ecore_ipc_server_flush(ev->server);
|
||||
ecore_con_eet_raw_send(reply, CLOUSEAU_BMP_DATA_STR, "BMP", p, size);
|
||||
free(p);
|
||||
}
|
||||
|
||||
if (bmp)
|
||||
free(bmp);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
clouseau_data_variant_free(v);
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static int
|
||||
static Eina_Bool
|
||||
_connect_to_daemon(void)
|
||||
{
|
||||
Ecore_Ipc_Server *svr;
|
||||
Ecore_Con_Server *server;
|
||||
const char *address = LOCALHOST;
|
||||
Ecore_Con_Eet *eet_svr = NULL;
|
||||
|
||||
eina_init();
|
||||
ecore_init();
|
||||
ecore_ipc_init();
|
||||
ecore_con_init();
|
||||
|
||||
svr = ecore_ipc_server_connect(ECORE_IPC_REMOTE_SYSTEM,
|
||||
server = ecore_con_server_connect(ECORE_CON_REMOTE_TCP,
|
||||
LOCALHOST, PORT, NULL);
|
||||
|
||||
if (!svr)
|
||||
if (!server)
|
||||
{
|
||||
printf("could not connect to the server: %s, port %d.\n",
|
||||
address, PORT);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
ecore_ipc_server_data_size_max_set(svr, -1);
|
||||
eet_svr = ecore_con_eet_client_new(server);
|
||||
if (!eet_svr)
|
||||
{
|
||||
printf("could not create con_eet client.\n");
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
/* set event handler for server connect */
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
|
||||
(Ecore_Event_Handler_Cb)_add, NULL);
|
||||
/* set event handler for server disconnect */
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
|
||||
(Ecore_Event_Handler_Cb)_del, NULL);
|
||||
/* set event handler for receiving server data */
|
||||
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
|
||||
(Ecore_Event_Handler_Cb)_data, NULL);
|
||||
clouseau_register_descs(eet_svr);
|
||||
|
||||
/* Register callbacks for ecore_con_eet */
|
||||
ecore_con_eet_server_connect_callback_add(eet_svr, _add, NULL);
|
||||
ecore_con_eet_server_disconnect_callback_add(eet_svr, _del, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_DATA_REQ_STR,
|
||||
_data_req_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_HIGHLIGHT_STR,
|
||||
_highlight_cb, NULL);
|
||||
ecore_con_eet_data_callback_add(eet_svr, CLOUSEAU_BMP_REQ_STR,
|
||||
_bmp_req_cb, NULL);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
@ -324,14 +297,14 @@ ecore_main_loop_begin(void)
|
|||
_my_app_name = "clouseau";
|
||||
}
|
||||
|
||||
clouseau_data_init();
|
||||
|
||||
if(!_connect_to_daemon())
|
||||
{
|
||||
printf("Failed to connect to server.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
clouseau_data_init();
|
||||
|
||||
_ecore_main_loop_begin();
|
||||
|
||||
clouseau_data_shutdown();
|
||||
|
|
|
@ -19,7 +19,6 @@ static Eet_Data_Descriptor *clouseau_tree_edd = NULL;
|
|||
static Eet_Data_Descriptor *clouseau_app_closed_edd = NULL;
|
||||
static Eet_Data_Descriptor *clouseau_highlight_edd = NULL;
|
||||
static Eet_Data_Descriptor *clouseau_bmp_req_edd = NULL;
|
||||
static Eet_Data_Descriptor *clouseau_variant_edd = NULL;
|
||||
static Eet_Data_Descriptor *clouseau_protocol_edd = NULL;
|
||||
static Eet_Data_Descriptor *clouseau_map_point_props_edd = NULL;
|
||||
|
||||
|
@ -45,97 +44,6 @@ clouseau_data_tree_free(Eina_List *tree)
|
|||
_clouseau_tree_item_free(treeit);
|
||||
}
|
||||
|
||||
static const struct {
|
||||
Clouseau_Message_Type t;
|
||||
const char *name;
|
||||
} eet_mapping[] = {
|
||||
{ CLOUSEAU_GUI_CLIENT_CONNECT, "GUI_CONNECT" },
|
||||
{ CLOUSEAU_APP_CLIENT_CONNECT, "APP_CONNECT" },
|
||||
{ CLOUSEAU_APP_ADD, "APP_ADD" },
|
||||
{ CLOUSEAU_DATA_REQ, "DATA_REQ" },
|
||||
{ CLOUSEAU_TREE_DATA, "TREE_DATA" },
|
||||
{ CLOUSEAU_APP_CLOSED, "APP_CLOSED" },
|
||||
{ CLOUSEAU_HIGHLIGHT, "HIGHLIGHT" },
|
||||
{ CLOUSEAU_BMP_REQ, "BMP_REQ" },
|
||||
{ CLOUSEAU_BMP_DATA, "BMP_DATA" },
|
||||
{ CLOUSEAU_UNKNOWN, NULL }
|
||||
};
|
||||
|
||||
EAPI Clouseau_Message_Type
|
||||
clouseau_data_packet_mapping_type_get(const char *name)
|
||||
{
|
||||
int i;
|
||||
if (!name)
|
||||
return CLOUSEAU_UNKNOWN;
|
||||
|
||||
for (i = 0; eet_mapping[i].name != NULL; ++i)
|
||||
if (strcmp(name, eet_mapping[i].name) == 0)
|
||||
return eet_mapping[i].t;
|
||||
|
||||
return CLOUSEAU_UNKNOWN;
|
||||
}
|
||||
|
||||
static const char *
|
||||
_clouseau_packet_mapping_type_str_get(Clouseau_Message_Type t)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; eet_mapping[i].name != NULL; ++i)
|
||||
if (t == eet_mapping[i].t)
|
||||
return eet_mapping[i].name;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *
|
||||
_clouseau_variant_type_get(const void *data, Eina_Bool *unknow EINA_UNUSED)
|
||||
{
|
||||
const char * const *type = data;
|
||||
int i;
|
||||
|
||||
for (i = 0; eet_mapping[i].name != NULL; ++i)
|
||||
if (strcmp(*type, eet_mapping[i].name) == 0)
|
||||
return eet_mapping[i].name;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_clouseau_variant_type_set(const char *type,
|
||||
void *data,
|
||||
Eina_Bool unknow EINA_UNUSED)
|
||||
{
|
||||
const char **t = data;
|
||||
|
||||
*t = type;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
clouseau_data_variant_free(Variant_st *v)
|
||||
{
|
||||
if (v->data)
|
||||
free(v->data);
|
||||
|
||||
free(v);
|
||||
}
|
||||
|
||||
EAPI Variant_st *
|
||||
clouseau_data_variant_alloc(Clouseau_Message_Type t, size_t size, void *info)
|
||||
{
|
||||
Variant_st *v;
|
||||
|
||||
if (t == CLOUSEAU_UNKNOWN) return NULL;
|
||||
|
||||
/* This will allocate variant and message struct */
|
||||
v = malloc(sizeof(Variant_st));
|
||||
v->data = malloc(size);
|
||||
_clouseau_variant_type_set(_clouseau_packet_mapping_type_str_get(t),
|
||||
&v->type, EINA_FALSE);
|
||||
memcpy(v->data, info, size);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
static void
|
||||
_clouseau_connect_desc_make(void)
|
||||
{
|
||||
|
@ -571,8 +479,6 @@ _clouseau_object_desc_make(void)
|
|||
static void
|
||||
clouseau_data_descriptors_init(void)
|
||||
{
|
||||
Eet_Data_Descriptor_Class eddc;
|
||||
|
||||
_clouseau_bmp_req_desc_make();
|
||||
_clouseau_bmp_info_desc_make();
|
||||
_clouseau_shot_list_desc_make();
|
||||
|
@ -584,36 +490,6 @@ clouseau_data_descriptors_init(void)
|
|||
_clouseau_tree_data_desc_make();
|
||||
_clouseau_app_closed_desc_make();
|
||||
_clouseau_highlight_desc_make();
|
||||
|
||||
/* for variant */
|
||||
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Variant_st);
|
||||
clouseau_protocol_edd = eet_data_descriptor_file_new(&eddc);
|
||||
|
||||
eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
|
||||
eddc.func.type_get = _clouseau_variant_type_get;
|
||||
eddc.func.type_set = _clouseau_variant_type_set;
|
||||
clouseau_variant_edd = eet_data_descriptor_stream_new(&eddc);
|
||||
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"GUI_CONNECT", clouseau_connect_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"APP_CONNECT", clouseau_connect_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"APP_ADD" , clouseau_app_add_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"DATA_REQ", clouseau_data_req_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"TREE_DATA", clouseau_tree_data_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"APP_CLOSED", clouseau_app_closed_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"HIGHLIGHT", clouseau_highlight_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"BMP_REQ", clouseau_bmp_req_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_MAPPING(clouseau_variant_edd,
|
||||
"BMP_DATA", clouseau_bmp_info_edd);
|
||||
EET_DATA_DESCRIPTOR_ADD_VARIANT(clouseau_protocol_edd, Variant_st,
|
||||
"data", data, type, clouseau_variant_edd);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -626,7 +502,6 @@ clouseau_data_descriptors_shutdown(void)
|
|||
eet_data_descriptor_free(clouseau_app_closed_edd);
|
||||
eet_data_descriptor_free(clouseau_highlight_edd);
|
||||
eet_data_descriptor_free(clouseau_object_edd);
|
||||
eet_data_descriptor_free(clouseau_variant_edd);
|
||||
eet_data_descriptor_free(clouseau_bmp_req_edd);
|
||||
eet_data_descriptor_free(clouseau_bmp_info_edd);
|
||||
eet_data_descriptor_free(clouseau_shot_list_edd);
|
||||
|
@ -689,124 +564,110 @@ _net_to_host_blob_get(void *blob, int blob_size)
|
|||
}
|
||||
|
||||
EAPI void *
|
||||
clouseau_data_packet_compose(Clouseau_Message_Type t, void *data,
|
||||
int data_size, int *size,
|
||||
void *blob, int blob_size)
|
||||
{
|
||||
/* Returns packet BLOB and size in size param, NULL on failure */
|
||||
/* Packet is composed of packet type BYTE + packet data. */
|
||||
void *p = NULL;
|
||||
void *pb = NULL;
|
||||
unsigned char p_type = VARIANT_PACKET;
|
||||
Variant_st *v;
|
||||
clouseau_data_packet_compose(const char *p_type, void *data,
|
||||
unsigned int *size, void *blob, int blob_size)
|
||||
{ /* Returns packet BLOB and size in size param, NULL on failure */
|
||||
/* User has to free returned buffer */
|
||||
/* Packet is composed of Message Type + packet data. */
|
||||
void *net_blob = NULL;
|
||||
|
||||
switch (t)
|
||||
{
|
||||
case CLOUSEAU_BMP_DATA:
|
||||
if (!strcmp(p_type, CLOUSEAU_BMP_DATA_STR))
|
||||
{ /* Builed Bitmap data as follows:
|
||||
First we have encoding size of bmp_info_st
|
||||
(Done Network Byte Order)
|
||||
First uint32_t is encoding size of bmp_info_st
|
||||
The next to come will be the encoded bmp_info_st itself
|
||||
Then we have blob_size param (specifiying bmp-blob-size)
|
||||
folloed by the Bitmap raw data. */
|
||||
|
||||
/* First, we like to encode bmp_info_st from data */
|
||||
int t_size; /* total size */
|
||||
int e_size;
|
||||
uint32_t enc_size;
|
||||
void *net_blob;
|
||||
uint32_t e_size32;
|
||||
uint32_t tmp;
|
||||
void *p;
|
||||
char *b;
|
||||
char *ptr;
|
||||
|
||||
v = clouseau_data_variant_alloc(t, data_size, data);
|
||||
p = eet_data_descriptor_encode(clouseau_protocol_edd, v, &e_size);
|
||||
clouseau_data_variant_free(v);
|
||||
/* First, we like to encode bmp_info_st from data */
|
||||
p = eet_data_descriptor_encode(clouseau_bmp_info_edd, data, &e_size);
|
||||
e_size32 = (uint32_t) e_size;
|
||||
|
||||
/* Allocate buffer to hold whole packet data */
|
||||
t_size = sizeof(e_size32) + /* encoding size of bmp_info_st */
|
||||
+ e_size /* Encoded bmp_info_st */
|
||||
+ sizeof(e_size32) /* bmp-blob-size */
|
||||
+ blob_size; /* The BMP blob data */
|
||||
|
||||
ptr = b = malloc(t_size);
|
||||
|
||||
/* START - Build BMP_RAW_DATA packet data */
|
||||
/* Size of encoded bmp_info_st comes next in uint32 format */
|
||||
memcpy(ptr, &e_size32, sizeof(e_size32));
|
||||
ptr += sizeof(e_size32);
|
||||
|
||||
/* Encoded bmp_info_st comes next */
|
||||
memcpy(ptr, p, e_size);
|
||||
ptr += e_size;
|
||||
|
||||
/* Size of BMP blob comes next */
|
||||
tmp = (uint32_t) blob_size;
|
||||
memcpy(ptr, &tmp, sizeof(uint32_t));
|
||||
ptr += sizeof(uint32_t);
|
||||
|
||||
if (blob && blob_size)
|
||||
{ /* BMP blob info comes right after BMP blob_size */
|
||||
memcpy(ptr, blob, blob_size);
|
||||
}
|
||||
|
||||
/* Save encoded size in network format */
|
||||
enc_size = htonl((uint32_t) e_size);
|
||||
net_blob = _host_to_net_blob_get(blob, &blob_size);
|
||||
net_blob = _host_to_net_blob_get(b, &t_size);
|
||||
*size = t_size; /* Update packet size */
|
||||
|
||||
/* Update size to the buffer size we about to return */
|
||||
*size = (e_size + blob_size + sizeof(enc_size));
|
||||
b = malloc(*size);
|
||||
|
||||
/* Copy encoded-size first, followd by encoded data */
|
||||
memcpy(b, &enc_size, sizeof(enc_size));
|
||||
memcpy(b + sizeof(enc_size), p, e_size);
|
||||
/* All info now in net_blob, free allocated mem */
|
||||
free(b);
|
||||
free(p);
|
||||
|
||||
if (net_blob) /* Copy BMP info */
|
||||
{
|
||||
memcpy(b + sizeof(enc_size) + e_size, net_blob, blob_size);
|
||||
free(net_blob);
|
||||
/* END - Build BMP_RAW_DATA packet data */
|
||||
}
|
||||
|
||||
p_type = BMP_RAW_DATA;
|
||||
p = b;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
/* All others are variant packets with EET encoding */
|
||||
/* Variant is composed of message type + ptr to data */
|
||||
v = clouseau_data_variant_alloc(t, data_size, data);
|
||||
p = eet_data_descriptor_encode(clouseau_protocol_edd, v, size);
|
||||
clouseau_data_variant_free(v);
|
||||
}
|
||||
}
|
||||
|
||||
pb = malloc((*size) + 1);
|
||||
*((unsigned char *) pb) = p_type;
|
||||
memcpy(((char *) pb) + 1, p, *size);
|
||||
*size = (*size) + 1; /* Add space for packet type */
|
||||
free(p);
|
||||
|
||||
return pb; /* User has to free(pb) */
|
||||
return net_blob;
|
||||
}
|
||||
|
||||
EAPI Variant_st *
|
||||
clouseau_data_packet_info_get(void *data, int size)
|
||||
EAPI void *
|
||||
clouseau_data_packet_info_get(const char *p_type, void *data, size_t size)
|
||||
{
|
||||
/* user has to use variant_free() to free return struct */
|
||||
char *ch = data;
|
||||
Variant_st *v;
|
||||
bmp_info_st *st = NULL;
|
||||
void *host_blob = _net_to_host_blob_get(data, size);
|
||||
char *ptr = host_blob;
|
||||
|
||||
if (size <= 0)
|
||||
return NULL;
|
||||
|
||||
switch (*ch)
|
||||
if (!strcmp(p_type, CLOUSEAU_BMP_DATA_STR))
|
||||
{
|
||||
case BMP_RAW_DATA:
|
||||
{
|
||||
void *bmp = NULL;
|
||||
bmp_info_st *st;
|
||||
char *b;
|
||||
uint32_t enc_size;
|
||||
int blob_size;
|
||||
uint32_t *e_size32 = (uint32_t *) ptr;
|
||||
int e_size = (int) (*e_size32); /* First Encoded bmp_info_st size */
|
||||
ptr += sizeof(uint32_t);
|
||||
|
||||
b = (char *) (ch + 1);
|
||||
enc_size = ntohl(*(uint32_t *) b);
|
||||
/* blob_size is total size minus 1st byte and enc_size size */
|
||||
blob_size = size - (enc_size + 1 + sizeof(enc_size));
|
||||
if (blob_size)
|
||||
{
|
||||
/* Allocate BMP only if was included in packet */
|
||||
bmp = _net_to_host_blob_get(b + sizeof(enc_size) + enc_size,
|
||||
blob_size);
|
||||
/* Get the encoded bmp_info_st */
|
||||
st = eet_data_descriptor_decode(clouseau_bmp_info_edd
|
||||
,ptr, e_size);
|
||||
ptr += e_size;
|
||||
|
||||
st->bmp = NULL;
|
||||
|
||||
/* Next Get bmp-blob-size */
|
||||
e_size32 = (uint32_t *) ptr;
|
||||
e_size = (int) (*e_size32); /* Get bmp-blob size */
|
||||
ptr += sizeof(uint32_t);
|
||||
|
||||
/* Now we need to get the bmp data */
|
||||
if (e_size)
|
||||
{ /* BMP data available, allocate and copy */
|
||||
st->bmp = malloc(e_size); /* Freed by user */
|
||||
memcpy(st->bmp, ptr, e_size);
|
||||
}
|
||||
} /* User has to free st, st->bmp */
|
||||
|
||||
/* User have to free both: variant_free(rt), free(t->bmp) */
|
||||
v = eet_data_descriptor_decode(clouseau_protocol_edd,
|
||||
b + sizeof(enc_size), enc_size);
|
||||
|
||||
st = v->data;
|
||||
st->bmp = bmp;
|
||||
return v;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return eet_data_descriptor_decode(clouseau_protocol_edd,
|
||||
ch + 1, size - 1);
|
||||
}
|
||||
free(host_blob);
|
||||
return st;
|
||||
}
|
||||
|
||||
/* HIGHLIGHT code. */
|
||||
|
@ -1022,7 +883,6 @@ clouseau_data_eet_info_read(const char *filename,
|
|||
|
||||
EINA_LIST_FREE(t->view, st)
|
||||
{
|
||||
Variant_st *v;
|
||||
char buf[1024];
|
||||
int alpha;
|
||||
int compress;
|
||||
|
@ -1036,8 +896,7 @@ clouseau_data_eet_info_read(const char *filename,
|
|||
&alpha, &compress, &quality, &lossy);
|
||||
|
||||
/* Add the bitmaps to the actuall app data struct */
|
||||
v = clouseau_data_variant_alloc(CLOUSEAU_BMP_DATA, sizeof(*st), st);
|
||||
(*a)->view = eina_list_append((*a)->view, v);
|
||||
(*a)->view = eina_list_append((*a)->view, st);
|
||||
}
|
||||
|
||||
free(t);
|
||||
|
@ -1061,6 +920,34 @@ clouseau_data_init(void)
|
|||
return clouseau_init_count;
|
||||
}
|
||||
|
||||
EAPI int
|
||||
clouseau_register_descs(Ecore_Con_Eet *eet_svr)
|
||||
{ /* Register descriptors for ecore_con_eet */
|
||||
if (clouseau_init_count)
|
||||
{ /* MUST be called after clouseau_data_init */
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_GUI_CLIENT_CONNECT_STR,
|
||||
clouseau_connect_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_APP_CLIENT_CONNECT_STR,
|
||||
clouseau_connect_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_APP_ADD_STR,
|
||||
clouseau_app_add_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_DATA_REQ_STR,
|
||||
clouseau_data_req_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_TREE_DATA_STR,
|
||||
clouseau_tree_data_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_APP_CLOSED_STR,
|
||||
clouseau_app_closed_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_HIGHLIGHT_STR,
|
||||
clouseau_highlight_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_BMP_REQ_STR,
|
||||
clouseau_bmp_req_edd);
|
||||
ecore_con_eet_register(eet_svr, CLOUSEAU_BMP_DATA_STR,
|
||||
clouseau_bmp_info_edd);
|
||||
}
|
||||
|
||||
return clouseau_init_count;
|
||||
}
|
||||
|
||||
EAPI int
|
||||
clouseau_data_shutdown(void)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef EET_DATA_H
|
||||
#define EET_DATA_H
|
||||
#include "Clouseau.h"
|
||||
#include <Ecore_Con_Eet.h>
|
||||
/* Global constants */
|
||||
#define BMP_FIELD "bmp"
|
||||
|
||||
|
@ -9,33 +10,21 @@
|
|||
#define LOCALHOST "127.0.0.1"
|
||||
#define LISTEN_IP "0.0.0.0" /* Avail all, no mask */
|
||||
|
||||
/* Define packet types, used by packet encode / decode */
|
||||
#define VARIANT_PACKET 0
|
||||
#define BMP_RAW_DATA 1
|
||||
#define CLOUSEAU_GUI_CLIENT_CONNECT_STR "CLOUSEAU_GUI_CLIENT_CONNECT"
|
||||
#define CLOUSEAU_APP_CLIENT_CONNECT_STR "CLOUSEAU_APP_CLIENT_CONNECT"
|
||||
#define CLOUSEAU_APP_ADD_STR "CLOUSEAU_APP_ADD"
|
||||
#define CLOUSEAU_DATA_REQ_STR "CLOUSEAU_DATA_REQ"
|
||||
#define CLOUSEAU_TREE_DATA_STR "CLOUSEAU_TREE_DATA"
|
||||
#define CLOUSEAU_APP_CLOSED_STR "CLOUSEAU_APP_CLOSED"
|
||||
#define CLOUSEAU_HIGHLIGHT_STR "CLOUSEAU_HIGHLIGHT"
|
||||
#define CLOUSEAU_BMP_REQ_STR "CLOUSEAU_BMP_REQ"
|
||||
#define CLOUSEAU_BMP_DATA_STR "CLOUSEAU_BMP_DATA"
|
||||
|
||||
enum _Clouseau_Message_Type
|
||||
{ /* Add any supported types of packets here */
|
||||
CLOUSEAU_UNKNOWN = 0,
|
||||
CLOUSEAU_GUI_CLIENT_CONNECT = 1, /* client PID, name */
|
||||
CLOUSEAU_APP_CLIENT_CONNECT = 2, /* client PID, name */
|
||||
CLOUSEAU_APP_ADD = 3, /* client PTR, name, PID fwd to GUI client */
|
||||
CLOUSEAU_DATA_REQ = 4, /* GUI client PTR (NULL for all),APP client PTR (NULL for all) */
|
||||
CLOUSEAU_TREE_DATA = 5, /* GUI client PTR (NULL for all),APP client PTR, Tree Data */
|
||||
CLOUSEAU_APP_CLOSED = 6,/* APP client PTR from DAEMON to GUI */
|
||||
CLOUSEAU_HIGHLIGHT = 7, /* APP client PTR, object PTR */
|
||||
CLOUSEAU_BMP_REQ = 8, /* APP client PTR, object PTR */
|
||||
CLOUSEAU_BMP_DATA = 9 /* bmp_info_st header + BMP raw data */
|
||||
};
|
||||
typedef enum _Clouseau_Message_Type Clouseau_Message_Type;
|
||||
|
||||
/* This is used for composing message and encoding/decoding with EET */
|
||||
struct _Variant_st
|
||||
{
|
||||
const char *type;
|
||||
|
||||
void *data;
|
||||
};
|
||||
typedef struct _Variant_st Variant_st;
|
||||
/* Private function */
|
||||
#define CLOUSEAU_APP_ADD_ENTRY "clouseau/app"
|
||||
#define CLOUSEAU_TREE_DATA_ENTRY "clouseau/app/tree"
|
||||
#define CLOUSEAU_BMP_LIST_ENTRY "clouseau/app/shot_list"
|
||||
#define CLOUSEAU_BMP_DATA_ENTRY "clouseau/app/screenshot"
|
||||
|
||||
struct _connect_st
|
||||
{ /* This will be used for APP, GUI client connect */
|
||||
|
@ -50,7 +39,7 @@ struct _app_info_st
|
|||
char *name;
|
||||
char *file; /* Valid only if was read from file in offline mode */
|
||||
unsigned long long ptr; /* (void *) client ptr of app as saved by daemon */
|
||||
Eina_List *view; /* Screen views view->data is (bmp_info_st *) ptr */
|
||||
Eina_List *view; /* Screen views pointers of (bmp_info_st *) */
|
||||
unsigned int refresh_ctr; /* Counter of how many times down refresh */
|
||||
};
|
||||
typedef struct _app_info_st app_info_st;
|
||||
|
@ -137,33 +126,21 @@ struct _data_desc
|
|||
Eet_Data_Descriptor *highlight;
|
||||
Eet_Data_Descriptor *tree;
|
||||
Eet_Data_Descriptor *obj_info;
|
||||
Eet_Data_Descriptor *_variant_descriptor;
|
||||
Eet_Data_Descriptor *_variant_unified_descriptor;
|
||||
};
|
||||
typedef struct _data_desc data_desc;
|
||||
|
||||
/* Private function */
|
||||
#define CLOUSEAU_APP_ADD_ENTRY "clouseau/app"
|
||||
#define CLOUSEAU_TREE_DATA_ENTRY "clouseau/app/tree"
|
||||
#define CLOUSEAU_BMP_LIST_ENTRY "clouseau/app/shot_list"
|
||||
#define CLOUSEAU_BMP_DATA_ENTRY "clouseau/app/screenshot"
|
||||
|
||||
|
||||
/* Exported From Object information */
|
||||
EAPI void clouseau_object_information_free(Clouseau_Object *oinfo);
|
||||
EAPI Clouseau_Object * clouseau_object_information_get(Clouseau_Tree_Item *treeit);
|
||||
|
||||
/* Exported function */
|
||||
EAPI void clouseau_data_tree_free(Eina_List *tree);
|
||||
EAPI Clouseau_Message_Type clouseau_data_packet_mapping_type_get(const char *name);
|
||||
EAPI void clouseau_data_variant_free(Variant_st *v);
|
||||
EAPI Variant_st *clouseau_data_variant_alloc(Clouseau_Message_Type t, size_t size, void *info);
|
||||
EAPI void * clouseau_data_packet_compose(Clouseau_Message_Type t, void *data, int data_size, int *size, void *blob, int blob_size);
|
||||
EAPI Variant_st *
|
||||
clouseau_data_packet_info_get(void *data, int size);
|
||||
EAPI void *clouseau_data_packet_compose(const char *p_type, void *data, unsigned int *size, void *blob, int blob_size);
|
||||
EAPI void *clouseau_data_packet_info_get(const char *p_type, void *data, size_t size);
|
||||
EAPI void clouseau_data_object_highlight(Evas_Object *obj, Clouseau_Evas_Props *props, bmp_info_st *view);
|
||||
EAPI Eina_Bool clouseau_data_eet_info_save(const char *filename, app_info_st *a, tree_data_st *ftd, Eina_List *ck_list);
|
||||
EAPI Eina_Bool clouseau_data_eet_info_read(const char *filename, app_info_st **a, tree_data_st **ftd);
|
||||
EAPI int clouseau_data_init(void);
|
||||
EAPI int clouseau_register_descs(Ecore_Con_Eet *eet_svr);
|
||||
EAPI int clouseau_data_shutdown(void);
|
||||
#endif /* EET_DATA_H */
|
||||
|
|
Loading…
Reference in New Issue