typedef void *(*Font_Request_Msg_Create)(void *data, int *size);
typedef void (*Font_Request_Msg_Free)(void *msg, void *data);
-typedef void (*Font_Request_Response)(Client *c, void *data, void *resp, unsigned int rid);
-typedef void (*Font_Request_Error)(Client *c, void *data, Error_Type error, unsigned int rid);
+typedef Msg_Base *(*Font_Request_Response)(void *data, void *resp, int *size);
+typedef void (*Font_Request_Error)(void *data, Error_Type error);
struct _Font_Request_Funcs {
Font_Request_Msg_Create msg_create;
free(msg);
}
-static void
-_font_load_request_response(Client *client __UNUSED__, void *data, void *resp, unsigned int rid __UNUSED__)
+static Msg_Font_Loaded *
+_font_load_request_response(Font_Entry *fe, Slave_Msg_Font_Loaded *msg, int *size)
{
- Slave_Msg_Font_Loaded *msg = resp;
- Font_Entry *fe = data;
-
- DBG("request %d answered.", rid);
+ Msg_Font_Loaded *resp;
if (!fe->src->ft)
fe->src->ft = msg->ftdata1;
if (fe->request) fe->request = NULL;
- _font_loaded_send(client, rid);
+ /* could be a function, but it's too basic and only used here */
+ resp = calloc(1, sizeof(*resp));
+ resp->base.type = CSERVE2_FONT_LOADED;
+ *size = sizeof(*resp);
+
+ return resp;
}
static void
-_font_load_request_failed(Client *client __UNUSED__, void *data __UNUSED__, Error_Type error __UNUSED__, unsigned int rid __UNUSED__)
+_font_load_request_failed(Font_Entry *fe, Error_Type error __UNUSED__)
{
- Font_Entry *fe = data;
- DBG("request %d error answered.", rid);
-
- cserve2_client_error_send(client, rid, error);
+ Eina_List *l;
+ Reference *ref;
if (fe->request) fe->request = NULL;
- _font_entry_reference_del(client, fe);
+ EINA_LIST_FOREACH(fe->base.references, l, ref)
+ _font_entry_reference_del(ref->client, fe);
}
static Font_Request_Funcs _font_load_funcs = {
return groups;
}
-static void
-_glyphs_loaded_send(Glyphs_Request *req, unsigned int rid)
+static Msg_Font_Glyphs_Loaded *
+_glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size)
{
Msg_Font_Glyphs_Loaded msg;
unsigned int size;
Glyphs_Group *iter;
memset(&msg, 0, sizeof(msg));
- msg.base.rid = rid;
msg.base.type = CSERVE2_FONT_GLYPHS_LOADED;
answers = _glyphs_group_create(req);
free(iter);
}
+ *resp_size = size;
+
+ return (Msg_Font_Glyphs_Loaded *)resp;
+}
+
+static void
+_glyphs_loaded_send(Glyphs_Request *req, unsigned int rid)
+{
+ Msg_Font_Glyphs_Loaded *resp;
+ int size;
+
+ resp = _glyphs_loaded_msg_create(req, &size);
+ resp->base.rid = rid;
+
cserve2_client_send(req->client, &size, sizeof(size));
cserve2_client_send(req->client, resp, size);
free(msg);
}
-static void
-_glyphs_load_request_response(Client *client __UNUSED__, void *data, void *resp, unsigned int rid)
+static Msg_Font_Glyphs_Loaded *
+_glyphs_load_request_response(Glyphs_Request *req, Slave_Msg_Font_Glyphs_Loaded *msg, int *size)
{
- Glyphs_Request *req = data;
- Slave_Msg_Font_Glyphs_Loaded *msg = resp;
Font_Entry *fe = req->fe;
Font_Cache *fc = NULL;
unsigned int i = 0;
fe->gl_slave_time += msg->gl_slave_time;
#endif
- _glyphs_loaded_send(req, rid);
_font_shm_lru_flush();
+
+ return _glyphs_loaded_msg_create(req, size);
}
static void
-_glyphs_load_request_failed(Client *client __UNUSED__, void *data __UNUSED__, Error_Type error __UNUSED__, unsigned int rid __UNUSED__)
+_glyphs_load_request_failed(void *data __UNUSED__, Error_Type error __UNUSED__)
{
}
Eina_List *l, *l_next;
Waiter *w;
+ if (req->funcs && req->funcs->error)
+ req->funcs->error(req->data, err);
+
EINA_LIST_FOREACH_SAFE(req->waiters, l, l_next, w)
{
if (w->client->id == client->id)
{
DBG("Removing answer from waiter client: %d, rid: %d",
client->id, w->rid);
- if (req->funcs && req->funcs->error)
- req->funcs->error(client, req->data, err, w->rid);
+ cserve2_client_error_send(w->client, w->rid, err);
req->waiters = eina_list_remove_list(req->waiters, l);
free(w);
}
DBG("Removing all answers.");
+ if (req->funcs && req->funcs->error)
+ req->funcs->error(req->data, err);
+
EINA_LIST_FREE(req->waiters, w)
{
DBG("Removing answer from waiter client: %d, rid: %d",
w->client->id, w->rid);
- if (req->funcs && req->funcs->error)
- req->funcs->error(w->client, req->data, err, w->rid);
+ cserve2_client_error_send(w->client, w->rid, err);
free(w);
}
{
Waiter *w;
+ req->funcs->error(req->data, type);
+
EINA_LIST_FREE(req->waiters, w)
{
- req->funcs->error(w->client, req->data, type, w->rid);
+ cserve2_client_error_send(w->client, w->rid, type);
free(w);
}
Font_Request *dep, *req = sw->data;
Eina_List **working, **idle;
Waiter *w;
+ Msg_Base *resp = NULL;
+ int resp_size;
+
+ if (cmd == ERROR)
+ {
+ Error_Type *err = msg;
+ req->funcs->error(req->data, *err);
+ }
+ else
+ resp = req->funcs->response(req->data, msg, &resp_size);
EINA_LIST_FREE(req->waiters, w)
{
if (cmd == ERROR)
{
Error_Type *err = msg;
- req->funcs->error(w->client, req->data, *err, w->rid);
+ cserve2_client_error_send(w->client, w->rid, *err);
}
else
- req->funcs->response(w->client, req->data, msg, w->rid);
+ {
+ resp->rid = w->rid;
+ cserve2_client_send(w->client, &resp_size, sizeof(resp_size));
+ cserve2_client_send(w->client, resp, resp_size);
+ }
free(w);
}
+ free(resp);
+
req->funcs->msg_free(req->msg, req->data);
// FIXME: We shouldn't free this message directly, it must be freed by a
// callback.