clouseau: Stable version with BMP support Canceled BMP eet encoding Need to remove bmp_req list from daemon, no longer needed

Signed-off-by: Aharon Hillel <a.hillel@samsung.com>

SVN revision: 72340
This commit is contained in:
Aharon Hillel 2012-06-18 07:22:31 +00:00 committed by Tom Hacohen
parent 998b191818
commit 5ebf435070
5 changed files with 196 additions and 112 deletions

View File

@ -106,7 +106,7 @@ _add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Add *e
if (svr)
{
connect_st t = { getpid(), __FILE__ };
p = packet_compose(GUI_CLIENT_CONNECT, &t, sizeof(t), &size);
p = packet_compose(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);
@ -259,7 +259,9 @@ _close_app_views(app_info_st *app, Eina_Bool clr)
EINA_LIST_FREE(app->view, view)
{ /* Free memory allocated to show any app screens */
bmp_info_st *b = view->data;
bmp_info_free(b->bmp);
if (b->bmp)
free(b->bmp);
variant_free(view);
}
@ -367,7 +369,9 @@ _remove_bmp(Eina_List *view, void *ptr)
if (st->win)
evas_object_del(st->win);
bmp_info_free(st->bmp);
if (st->bmp)
free(st->bmp);
variant_free(v);
return eina_list_remove(view, v);
}
@ -410,7 +414,9 @@ _free_app(app_data_st *st)
if (b->win)
evas_object_del(b->win);
bmp_info_free(b->bmp);
if (b->bmp)
free(b->bmp);
variant_free(view);
}
@ -528,6 +534,20 @@ 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;
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);
variant_free(v);
return;
}
app_data_st *app = (app_data_st *)
eina_list_search_unsorted(apps, _app_ptr_cmp,
(void *) (uintptr_t) st->app);
@ -542,7 +562,7 @@ _add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
app_info_st *info = app->app->data;
info->view = _remove_bmp(info->view,
(void *) (uintptr_t) (((bmp_info_st *) v->data)->object));
(void *) (uintptr_t) (st->object));
info->view = eina_list_append(info->view, v);
/* Now we need to update refresh button, make it open-window */
@ -562,7 +582,9 @@ _add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
else
{ /* Dispose bmp info if app no longer in the list of apps */
/* or the bmp_info is no longer relevant */
bmp_info_free(((bmp_info_st *) v->data)->bmp);
if (st->bmp)
free(st->bmp);
variant_free(v);
}
}
@ -588,15 +610,15 @@ _open_app_window(bmp_info_st *st, Evas_Object *bt, Tree_Item *treeit)
elm_object_disabled_set(bt, EINA_TRUE);
evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
evas_object_image_alpha_set(o, EINA_FALSE);
evas_object_image_size_set(o, st->bmp->w, st->bmp->h);
evas_object_image_data_copy_set(o, st->bmp->bmp);
evas_object_image_data_update_add(o, 0, 0, st->bmp->w, st->bmp->h);
evas_object_image_size_set(o, st->w, st->h);
evas_object_image_data_copy_set(o, st->bmp);
evas_object_image_data_update_add(o, 0, 0, st->w, st->h);
evas_object_show(o);
evas_object_smart_callback_add(st->win,
"delete,request", _app_win_del, st);
evas_object_resize(o, st->bmp->w, st->bmp->h);
evas_object_resize(st->win, st->bmp->w, st->bmp->h);
evas_object_resize(o, st->w, st->h);
evas_object_resize(st->win, st->w, st->h);
elm_win_autodel_set(st->win, EINA_TRUE);
evas_object_show(st->win);
@ -623,7 +645,7 @@ _show_app_window(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
(unsigned long long) (uintptr_t) st->ptr,
(unsigned long long) (uintptr_t) treeit->ptr, st->refresh_ctr };
void *p = packet_compose(BMP_REQ, &t, sizeof(t), &size);
void *p = packet_compose(BMP_REQ, &t, sizeof(t), &size, NULL, 0);
if (p)
{
ecore_ipc_server_send(svr,
@ -923,7 +945,7 @@ _gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
if (svr)
{
void *p = packet_compose(HIGHLIGHT, &st, sizeof(st), &size);
void *p = packet_compose(HIGHLIGHT, &st, sizeof(st), &size, NULL, 0);
if (p)
{
ecore_ipc_server_send(svr,
@ -969,7 +991,8 @@ _load_list(gui_elements *g)
data_req_st t = { (unsigned long long) (uintptr_t) NULL,
(unsigned long long) (uintptr_t) st->ptr };
void *p = packet_compose(DATA_REQ, &t, sizeof(t), &size);
void *p = packet_compose(DATA_REQ, &t, sizeof(t), &size,
NULL, 0);
if (p)
{
elm_progressbar_pulse(g->pb, EINA_TRUE);

View File

@ -172,7 +172,7 @@ _del(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Del *e
app_closed_st t = { (unsigned long long) (uintptr_t) ev->client };
Eina_List *l;
int size;
void *p = packet_compose(APP_CLOSED, &t, sizeof(t), &size);
void *p = packet_compose(APP_CLOSED, &t, sizeof(t), &size, NULL, 0);
if (p)
{
EINA_LIST_FOREACH(gui, l, i)
@ -225,7 +225,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
(unsigned long long) (uintptr_t) ev->client, NULL, 0 };
app = _add_client(app, t, ev->client);
p = packet_compose(APP_ADD, &m, sizeof(m), &size);
p = packet_compose(APP_ADD, &m, sizeof(m), &size, NULL, 0);
if (p)
{
EINA_LIST_FOREACH(gui, l, st)
@ -250,7 +250,8 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
gui = _add_client(gui, t, ev->client);
EINA_LIST_FOREACH(app, l, st)
{ /* Add all registered apps to newly open GUI */
p = packet_compose(APP_ADD, st, sizeof(app_info_st), &size);
p = packet_compose(APP_ADD, st, sizeof(*st), &size,
NULL, 0);
if (p)
{
ecore_ipc_client_send(ev->client,
@ -277,7 +278,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
(unsigned long long) (uintptr_t) req->app };
p = packet_compose(DATA_REQ,
&t, sizeof(t), &size);
&t, sizeof(t), &size, NULL, 0);
if (p)
{
ecore_ipc_client_send(
@ -301,7 +302,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
{
t.app = (unsigned long long) (uintptr_t) st->ptr;
p = packet_compose(DATA_REQ,
&t, sizeof(t), &size);
&t, sizeof(t), &size, NULL, 0);
if (p)
{
ecore_ipc_client_send(
@ -375,7 +376,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
req->app, req->object, req->ctr };
p = packet_compose(BMP_REQ,
&t, sizeof(t), &size);
&t, sizeof(t), &size, NULL, 0);
if (p)
{ /* FWD req to app with client data */
ecore_ipc_client_send(
@ -419,7 +420,8 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
}
}
bmp_info_free(st->bmp);
if (st->bmp)
free(st->bmp);
}
break;

View File

@ -111,13 +111,6 @@ _variant_type_set(const char *type,
return EINA_TRUE;
} /* _variant_type_set */
void
bmp_info_free(Bmp_Data *bmp)
{
free(bmp->bmp);
free(bmp);
}
void
variant_free(Variant_st *v)
{
@ -189,25 +182,6 @@ data_req_desc_make(void)
return d;
}
Eet_Data_Descriptor *
bmp_data_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Bmp_Data);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY(d, Bmp_Data,
"bmp", bmp, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Bmp_Data,
"w", w, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Bmp_Data,
"h", h, EET_T_INT);
return d;
}
Eet_Data_Descriptor *
bmp_info_desc_make(void)
{
@ -224,10 +198,11 @@ bmp_info_desc_make(void)
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st,
"object", object, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "ctr",
ctr, EET_T_UINT);
EET_DATA_DESCRIPTOR_ADD_SUB(d, bmp_info_st, "bmp",
bmp, desc->bmp_data); /* Carefull - init this first */
ctr, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "w",
w, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "h",
h, EET_T_ULONG_LONG);
return d;
}
@ -341,7 +316,6 @@ data_descriptors_init(void)
Eet_Data_Descriptor_Class eddc;
desc->bmp_data = bmp_data_desc_make();
desc->bmp_req = bmp_req_desc_make();
desc->bmp_info = bmp_info_desc_make();
desc->obj_info = Obj_Information_desc_make();
@ -412,7 +386,6 @@ data_descriptors_shutdown(void)
eet_data_descriptor_free(desc->obj_info);
eet_data_descriptor_free(desc->_variant_descriptor );
eet_data_descriptor_free(desc->_variant_unified_descriptor);
eet_data_descriptor_free(desc->bmp_data);
eet_data_descriptor_free(desc->bmp_req);
eet_data_descriptor_free(desc->bmp_info);
@ -421,34 +394,115 @@ data_descriptors_shutdown(void)
}
}
void *
packet_compose(message_type t, void *data, int data_size, int *size)
{ /* Returns packet BLOB and size in size param, NULL on failure */
/* Packet is composed of message type + ptr to data */
data_desc *d = data_descriptors_init();
Variant_st *v = variant_alloc(t, data_size, data);
void *p = eet_data_descriptor_encode(d->_variant_descriptor , v, size);
variant_free(v);
enum _bmp_field_idx
{ /* Index for bmp_info_st fields to be stored in BLOB */
gui = 0,
app,
object,
ctr,
w,
h,
top_idx /* Used for allocation */
};
typedef enum _bmp_field_idx bmp_field_idx;
/* printf("%s size=<%d>\n", __func__, *size); */
return p; /* User has to free(p) */
void *
packet_compose(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;
switch (t)
{
case BMP_DATA:
{ /* Builed raw data without encoding */
/* Do NOT forget to update *size, allocate using p */
bmp_info_st *b = data;
*size = (top_idx * sizeof(unsigned long long)) + blob_size;
unsigned long long *longs = malloc(*size);
longs[gui] = b->gui;
longs[app] = b->app;
longs[object] = b->object;
longs[ctr] = b->ctr;
longs[w] = b->w;
longs[h] = b->h;
if (blob)
memcpy(&longs[top_idx], blob, blob_size); /* Copy BMP info */
p_type = BMP_RAW_DATA;
p = longs;
}
break;
default:
{ /* All others are variant packets with EET encoding */
/* Variant is composed of message type + ptr to data */
data_desc *d = data_descriptors_init();
Variant_st *v = variant_alloc(t, data_size, data);
p = eet_data_descriptor_encode(
d->_variant_descriptor , v, size);
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) */
}
Variant_st *
packet_info_get(void *data, int size)
{ /* user has to use variant_free() to free return struct */
data_desc *d = data_descriptors_init();
return eet_data_descriptor_decode(d->_variant_descriptor, data, size);
char *ch = data;
switch (*ch)
{
case BMP_RAW_DATA:
{
void *bmp = NULL;
unsigned long long *longs = (unsigned long long *) (ch + 1);
/* Allocate size minus longs array and ch size for bmp */
int blob_size = size - (((char *) (&longs[top_idx])) - ch);
if (blob_size)
{ /* Allocate BMP only if was included in packet */
bmp = malloc(blob_size);
memcpy(bmp, &longs[top_idx], blob_size);
}
bmp_info_st t = { longs[gui], longs[app], longs[object],
longs[ctr], longs[w], longs[h], NULL, NULL, bmp };
/* User have to free both: variant_free(rt), free(t->bmp) */
return variant_alloc(BMP_DATA, sizeof(t), &t);
}
break;
default:
{
data_desc *d = data_descriptors_init();
return eet_data_descriptor_decode(d->_variant_descriptor,
ch + 1, size - 1);
}
}
}
Eina_Bool eet_info_save(const char *filename,
app_info_st *app, tree_data_st *ftd)
app_info_st *a, tree_data_st *ftd)
{
data_desc *d = data_descriptors_init();
Eet_File *fp = eet_open(filename, EET_FILE_MODE_WRITE);
if (fp)
{
eet_data_write(fp, d->app_add, APP_ADD_ENTRY, app, EINA_TRUE);
eet_data_write(fp, d->app_add, APP_ADD_ENTRY, a, EINA_TRUE);
eet_data_write(fp, d->tree_data, TREE_DATA_ENTRY, ftd, EINA_TRUE);
eet_close(fp);
@ -460,13 +514,13 @@ Eina_Bool eet_info_save(const char *filename,
}
Eina_Bool eet_info_read(const char *filename,
app_info_st **app, tree_data_st **ftd)
app_info_st **a, tree_data_st **ftd)
{
data_desc *d = data_descriptors_init();
Eet_File *fp = eet_open(filename, EET_FILE_MODE_READ);
if (fp)
{
*app = eet_data_read(fp, d->app_add, APP_ADD_ENTRY);
*a = eet_data_read(fp, d->app_add, APP_ADD_ENTRY);
*ftd = eet_data_read(fp, d->tree_data, TREE_DATA_ENTRY);
eet_close(fp);

View File

@ -10,6 +10,11 @@
#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 DESC_ADD_BASIC(desc, type, member, eet_type) \
EET_DATA_DESCRIPTOR_ADD_BASIC \
(desc, type, #member, member, eet_type)
@ -35,7 +40,7 @@ enum _message_type
APP_CLOSED, /* APP client PTR from DAEMON to GUI */
HIGHLIGHT, /* APP client PTR, object PTR */
BMP_REQ, /* APP client PTR, object PTR */
BMP_DATA /* APP client PTR, object PTR, Bmp_Data */
BMP_DATA /* bmp_info_st header + BMP raw data */
};
typedef enum _message_type message_type;
@ -109,14 +114,18 @@ struct _bmp_req_st
typedef struct _bmp_req_st bmp_req_st;
struct _bmp_info_st
{ /* This will be used to send app window Bitmap */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr of APP */
unsigned long long object; /* (void *) object ptr of evas */
unsigned int ctr; /* Reload counter to match */
Evas_Object *win; /* Window of view if open */
Evas_Object *bt; /* Button opening win */
Bmp_Data *bmp;
{ /* This will be used to send app window Bitmap */
/* We are using ULONGLONG because we send this as RAW data */
/* win, bt are NOT transferred. */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr of APP */
unsigned long long object; /* (void *) object ptr of evas */
unsigned long long ctr; /* Reload counter to match */
unsigned long long w; /* BMP width, make Evas_Coord */
unsigned long long h; /* BMP hight, make Evas_Coord */
Evas_Object *win; /* Window of view if open */
Evas_Object *bt; /* Button opening win */
void *bmp; /* Bitmap BLOB, size (w * h * sizeof(int)) */
};
typedef struct _bmp_info_st bmp_info_st;
@ -165,12 +174,11 @@ void item_tree_free(Eina_List *tree);
void _item_tree_item_string(Tree_Item *parent);
data_desc *data_descriptors_init(void);
void data_descriptors_shutdown(void);
void bmp_info_free(Bmp_Data *bmp);
void variant_free(Variant_st *v);
Variant_st *variant_alloc(message_type t, size_t size, void *info);
message_type packet_mapping_type_get(const char *name);
const char *packet_mapping_type_str_get(message_type t);
void *packet_compose(message_type t, void *data, int data_size, int *size);
void *packet_compose(message_type t, void *data, int data_size, int *size, void *blob, int blob_size);
Variant_st *packet_info_get(void *data, int size);
Eina_Bool eet_info_save(const char *filename, app_info_st *app, tree_data_st *ftd);
Eina_Bool eet_info_read(const char *filename, app_info_st **app, tree_data_st **ftd);

View File

@ -44,10 +44,9 @@ libclouseau_item_add(Evas_Object *o, Tree_Item *parent)
eina_list_free(children);
}
static Bmp_Data *
_canvas_bmp_get(Ecore_Evas *ee)
static void *
_canvas_bmp_get(Ecore_Evas *ee, Evas_Coord *w_out, Evas_Coord *h_out)
{
Bmp_Data *rt = NULL;
Ecore_X_Image *img;
Ecore_X_Window_Attributes att;
unsigned char *src;
@ -59,7 +58,8 @@ _canvas_bmp_get(Ecore_Evas *ee)
if (!xwin)
{
printf("Can't grab X window.\n");
return rt;
*w_out = *h_out = 0;
return NULL;
}
Evas *e = ecore_evas_get(ee);
@ -84,14 +84,9 @@ _canvas_bmp_get(Ecore_Evas *ee)
/* dst now holds window bitmap */
ecore_x_image_free(img);
rt = malloc(sizeof(*rt)); /* Will be freed by the user */
rt->bmp = (unsigned char *) dst;
rt->bmp_count = (w * h * sizeof(int));
rt->w = w;
rt->h = h;
return rt;
*w_out = w;
*h_out = h;
return (void *) dst;
}
static Eina_List *
@ -145,7 +140,7 @@ _add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Add *e
ecore_ipc_server_data_size_max_set(ev->server, -1);
connect_st t = { getpid(), _my_app_name };
p = packet_compose(APP_CLIENT_CONNECT, &t, sizeof(t), &size);
p = packet_compose(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);
@ -191,7 +186,8 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
t.tree = _load_list();
if (t.tree)
{ /* Reply with tree data to data request */
void *p = packet_compose(TREE_DATA, &t, sizeof(t), &size);
void *p = packet_compose(TREE_DATA, &t, sizeof(t), &size,
NULL, 0);
if (p)
{
ecore_ipc_server_send(ev->server, 0,0,0,0,
@ -215,27 +211,28 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
case BMP_REQ:
{ /* Bitmap req msg contains PTR of Ecore Evas */
bmp_req_st *req = v->data;
Bmp_Data *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t)
req->object);
Evas_Coord w, h;
int size = 0;
void *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t)
req->object, &w, &h);
/* TODO: what if win closed (bmp not found), need to send NULL */
/* and handle bmp-NULL value in client */
if (bmp)
{ /* Send server packet with BMP info */
int size = 0;
bmp_info_st t = { req->gui,
req->app, req->object , req->ctr, NULL, NULL, bmp };
void *p = packet_compose(BMP_DATA, &t, sizeof(t), &size);
if (p)
{
ecore_ipc_server_send(ev->server, 0,0,0,0,
EINA_FALSE, p, size);
ecore_ipc_server_flush(ev->server);
free(p);
}
bmp_info_st t = { req->gui,
req->app, req->object , req->ctr, w, h,
NULL, NULL, NULL };
bmp_info_free(bmp);
void *p = packet_compose(BMP_DATA, &t, sizeof(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);
free(p);
}
if (bmp)
free(bmp);
}
break;