Added support to free_data callbacks.

Some functions that require callbacks and data passed to them now can
receive a free_data callback as argument too.



SVN revision: 41285
This commit is contained in:
Rafael Antognolli 2009-07-09 19:14:29 +00:00
parent 8f9dc79021
commit 5dc0fa41ef
8 changed files with 35 additions and 19 deletions

View File

@ -234,7 +234,7 @@ main(int argc, char *argv[])
r = 1; r = 1;
} }
else else
r = ethumb_generate(e, _finished_thumb, NULL); r = ethumb_generate(e, _finished_thumb, NULL, NULL);
} }
if (r && !quit_option) if (r && !quit_option)

View File

@ -268,7 +268,7 @@ _ec_op_generate(struct _Ethumbd_Child *ec)
ethumb_file_set(ec->ethumbt[index], path, key); ethumb_file_set(ec->ethumbt[index], path, key);
ethumb_thumb_path_set(ec->ethumbt[index], thumb_path, thumb_key); ethumb_thumb_path_set(ec->ethumbt[index], thumb_path, thumb_key);
ethumb_generate(ec->ethumbt[index], _ec_op_generated_cb, ethumb_generate(ec->ethumbt[index], _ec_op_generated_cb,
ec); ec, NULL);
free(path); free(path);
free(key); free(key);

View File

@ -966,9 +966,12 @@ _ethumb_finished_idler_cb(void *data)
Ethumb *e = data; Ethumb *e = data;
e->finished_cb(e, e->cb_result, e->cb_data); e->finished_cb(e, e->cb_result, e->cb_data);
if (e->cb_data_free)
e->cb_data_free(e->cb_data);
e->finished_idler = NULL; e->finished_idler = NULL;
e->finished_cb = NULL; e->finished_cb = NULL;
e->cb_data = NULL; e->cb_data = NULL;
e->cb_data_free = NULL;
return 0; return 0;
} }
@ -985,7 +988,7 @@ ethumb_finished_callback_call(Ethumb *e, int result)
} }
EAPI Eina_Bool EAPI Eina_Bool
ethumb_generate(Ethumb *e, ethumb_generate_callback_t finished_cb, void *data) ethumb_generate(Ethumb *e, ethumb_generate_callback_t finished_cb, void *data, void (*free_data)(void *))
{ {
int r; int r;
@ -1000,6 +1003,7 @@ ethumb_generate(Ethumb *e, ethumb_generate_callback_t finished_cb, void *data)
} }
e->finished_cb = finished_cb; e->finished_cb = finished_cb;
e->cb_data = data; e->cb_data = data;
e->cb_data_free = free_data;
if (!e->src_path) if (!e->src_path)
{ {

View File

@ -109,7 +109,7 @@ EAPI void ethumb_file_get(const Ethumb *e, const char **path, const char **key)
EAPI void ethumb_file_free(Ethumb *e) EINA_ARG_NONNULL(1); EAPI void ethumb_file_free(Ethumb *e) EINA_ARG_NONNULL(1);
EAPI void ethumb_thumb_path_set(Ethumb *e, const char *path, const char *key) EINA_ARG_NONNULL(1); EAPI void ethumb_thumb_path_set(Ethumb *e, const char *path, const char *key) EINA_ARG_NONNULL(1);
EAPI void ethumb_thumb_path_get(Ethumb *e, const char **path, const char **key) EINA_ARG_NONNULL(1); EAPI void ethumb_thumb_path_get(Ethumb *e, const char **path, const char **key) EINA_ARG_NONNULL(1);
EAPI Eina_Bool ethumb_generate(Ethumb *e, ethumb_generate_callback_t finished_cb, void *data) EINA_ARG_NONNULL(1, 2); EAPI Eina_Bool ethumb_generate(Ethumb *e, ethumb_generate_callback_t finished_cb, void *data, void (*free_data)(void *)) EINA_ARG_NONNULL(1, 2);
EAPI Eina_Bool ethumb_exists(Ethumb *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE; EAPI Eina_Bool ethumb_exists(Ethumb *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -63,6 +63,7 @@ struct _Ethumb_Client
DBusPendingCall *pending_new; DBusPendingCall *pending_new;
ec_connect_callback_t connect_cb; ec_connect_callback_t connect_cb;
void *connect_cb_data; void *connect_cb_data;
void (*connect_cb_free_data)(void *);
Eina_List *pending_add; Eina_List *pending_add;
Eina_List *pending_remove; Eina_List *pending_remove;
Eina_List *pending_gen; Eina_List *pending_gen;
@ -86,6 +87,7 @@ struct _ethumb_pending_add
const char *thumb_key; const char *thumb_key;
generated_callback_t generated_cb; generated_callback_t generated_cb;
void *data; void *data;
void (*free_data)(void *);
DBusPendingCall *pending_call; DBusPendingCall *pending_call;
Ethumb_Client *client; Ethumb_Client *client;
}; };
@ -108,6 +110,7 @@ struct _ethumb_pending_gen
const char *thumb_key; const char *thumb_key;
generated_callback_t generated_cb; generated_callback_t generated_cb;
void *data; void *data;
void (*free_data)(void *);
}; };
static const char _ethumb_dbus_bus_name[] = "org.enlightenment.Ethumb"; static const char _ethumb_dbus_bus_name[] = "org.enlightenment.Ethumb";
@ -248,11 +251,14 @@ _ethumb_client_new_cb(void *data, DBusMessage *msg, DBusError *error)
_ethumb_client_generated_cb, client); _ethumb_client_generated_cb, client);
client->connect_cb(client, 1, client->connect_cb_data); client->connect_cb(client, 1, client->connect_cb_data);
if (client->connect_cb_free_data)
client->connect_cb_free_data(client->connect_cb_data);
return; return;
end_error: end_error:
client->connect_cb(client, 0, client->connect_cb_data); client->connect_cb(client, 0, client->connect_cb_data);
return; if (client->connect_cb_free_data)
client->connect_cb_free_data(client->connect_cb_data);
} }
static void static void
@ -317,6 +323,8 @@ _ethumb_client_start_server_cb(void *data, DBusMessage *msg, DBusError *err)
error: error:
ERR("failed to start Ethumbd DBus service by its name.\n"); ERR("failed to start Ethumbd DBus service by its name.\n");
client->connect_cb(client, 0, client->connect_cb_data); client->connect_cb(client, 0, client->connect_cb_data);
if (client->connect_cb_free_data)
client->connect_cb_free_data(client->connect_cb_data);
} }
static void static void
@ -336,6 +344,8 @@ _ethumb_client_start_server(Ethumb_Client *client)
{ {
ERR("could not start service by name!\n"); ERR("could not start service by name!\n");
client->connect_cb(client, 0, client->connect_cb_data); client->connect_cb(client, 0, client->connect_cb_data);
if (client->connect_cb_free_data)
client->connect_cb_free_data(client->connect_cb_data);
} }
} }
@ -379,6 +389,8 @@ _ethumb_client_get_name_owner(void *data, DBusMessage *msg, DBusError *err)
error: error:
client->connect_cb(client, 0, client->connect_cb_data); client->connect_cb(client, 0, client->connect_cb_data);
if (client->connect_cb_free_data)
client->connect_cb_free_data(client->connect_cb_data);
} }
EAPI int EAPI int
@ -406,7 +418,7 @@ ethumb_client_shutdown(void)
} }
EAPI Ethumb_Client * EAPI Ethumb_Client *
ethumb_client_connect(ec_connect_callback_t connect_cb, void *data) ethumb_client_connect(ec_connect_callback_t connect_cb, void *data, void (*free_data)(void *))
{ {
Ethumb_Client *eclient; Ethumb_Client *eclient;
@ -421,6 +433,7 @@ ethumb_client_connect(ec_connect_callback_t connect_cb, void *data)
eclient->connect_cb = connect_cb; eclient->connect_cb = connect_cb;
eclient->connect_cb_data = data; eclient->connect_cb_data = data;
eclient->connect_cb_free_data = free_data;
eclient->ethumb = ethumb_new(); eclient->ethumb = ethumb_new();
if (!eclient->ethumb) if (!eclient->ethumb)
@ -739,6 +752,8 @@ _ethumb_client_generated_cb(void *data, DBusMessage *msg)
pending->generated_cb(id, pending->file, pending->key, pending->generated_cb(id, pending->file, pending->key,
pending->thumb, pending->thumb_key, pending->thumb, pending->thumb_key,
success, pending->data); success, pending->data);
if (pending->free_data)
pending->free_data(pending->data);
eina_stringshare_del(pending->file); eina_stringshare_del(pending->file);
eina_stringshare_del(pending->key); eina_stringshare_del(pending->key);
eina_stringshare_del(pending->thumb); eina_stringshare_del(pending->thumb);
@ -780,6 +795,7 @@ _ethumb_client_queue_add_cb(void *data, DBusMessage *msg, DBusError *error)
generating->thumb_key = pending->thumb_key; generating->thumb_key = pending->thumb_key;
generating->generated_cb = pending->generated_cb; generating->generated_cb = pending->generated_cb;
generating->data = pending->data; generating->data = pending->data;
generating->free_data = pending->free_data;
client->pending_gen = eina_list_append(client->pending_gen, generating); client->pending_gen = eina_list_append(client->pending_gen, generating);
end: end:
@ -787,7 +803,7 @@ end:
} }
static long static long
_ethumb_client_queue_add(Ethumb_Client *client, const char *file, const char *key, const char *thumb, const char *thumb_key, generated_callback_t generated_cb, void *data) _ethumb_client_queue_add(Ethumb_Client *client, const char *file, const char *key, const char *thumb, const char *thumb_key, generated_callback_t generated_cb, void *data, void (*free_data)(void *))
{ {
DBusMessage *msg; DBusMessage *msg;
DBusMessageIter iter; DBusMessageIter iter;
@ -801,6 +817,7 @@ _ethumb_client_queue_add(Ethumb_Client *client, const char *file, const char *ke
pending->thumb_key = eina_stringshare_add(thumb_key); pending->thumb_key = eina_stringshare_add(thumb_key);
pending->generated_cb = generated_cb; pending->generated_cb = generated_cb;
pending->data = data; pending->data = data;
pending->free_data = free_data;
pending->client = client; pending->client = client;
client->id_count = (client->id_count + 1) % MAX_ID; client->id_count = (client->id_count + 1) % MAX_ID;
@ -1141,7 +1158,7 @@ ethumb_client_thumb_exists(Ethumb_Client *client)
} }
EAPI long EAPI long
ethumb_client_generate(Ethumb_Client *client, generated_callback_t generated_cb, void *data) ethumb_client_generate(Ethumb_Client *client, generated_callback_t generated_cb, void *data, void (*free_data)(void *))
{ {
const char *file, *key, *thumb, *thumb_key; const char *file, *key, *thumb, *thumb_key;
long id; long id;
@ -1159,7 +1176,7 @@ ethumb_client_generate(Ethumb_Client *client, generated_callback_t generated_cb,
if (client->ethumb_dirty) if (client->ethumb_dirty)
ethumb_client_ethumb_setup(client); ethumb_client_ethumb_setup(client);
id = _ethumb_client_queue_add(client, file, key, thumb, thumb_key, id = _ethumb_client_queue_add(client, file, key, thumb, thumb_key,
generated_cb, data); generated_cb, data, free_data);
return id; return id;
} }

View File

@ -46,7 +46,7 @@ typedef void (*generated_callback_t)(long id, const char *file, const char *key,
EAPI int ethumb_client_init(void); EAPI int ethumb_client_init(void);
EAPI int ethumb_client_shutdown(void); EAPI int ethumb_client_shutdown(void);
EAPI Ethumb_Client * ethumb_client_connect(ec_connect_callback_t connect_cb, void *data); EAPI Ethumb_Client * ethumb_client_connect(ec_connect_callback_t connect_cb, void *data, void (*free_data)(void *));
EAPI void ethumb_client_disconnect(Ethumb_Client *client); EAPI void ethumb_client_disconnect(Ethumb_Client *client);
EAPI void ethumb_client_on_server_die_callback_set(Ethumb_Client *client, void (*on_server_die_cb)(Ethumb_Client *client, void *data), void *data); EAPI void ethumb_client_on_server_die_callback_set(Ethumb_Client *client, void (*on_server_die_cb)(Ethumb_Client *client, void *data), void *data);
@ -79,7 +79,7 @@ EAPI void ethumb_client_file_free(Ethumb_Client *client);
EAPI void ethumb_client_thumb_path_set(Ethumb_Client *client, const char *path, const char *key); EAPI void ethumb_client_thumb_path_set(Ethumb_Client *client, const char *path, const char *key);
EAPI void ethumb_client_thumb_path_get(Ethumb_Client *client, const char **path, const char **key); EAPI void ethumb_client_thumb_path_get(Ethumb_Client *client, const char **path, const char **key);
EAPI Eina_Bool ethumb_client_thumb_exists(Ethumb_Client *client); EAPI Eina_Bool ethumb_client_thumb_exists(Ethumb_Client *client);
EAPI long ethumb_client_generate(Ethumb_Client *client, generated_callback_t generated_cb, void *data); EAPI long ethumb_client_generate(Ethumb_Client *client, generated_callback_t generated_cb, void *data, void (*free_data)(void *));
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -39,6 +39,7 @@ struct _Ethumb
Ecore_Idler *finished_idler; Ecore_Idler *finished_idler;
ethumb_generate_callback_t finished_cb; ethumb_generate_callback_t finished_cb;
void *cb_data; void *cb_data;
void (*cb_data_free)(void *);
int cb_result; int cb_result;
}; };

View File

@ -57,7 +57,6 @@ _request_thumbnails(Ethumb_Client *client, void *data)
DIR *dir; DIR *dir;
struct dirent *de; struct dirent *de;
char buf[PATH_MAX]; char buf[PATH_MAX];
int i;
dir = opendir(path); dir = opendir(path);
if (!dir) if (!dir)
@ -78,12 +77,7 @@ _request_thumbnails(Ethumb_Client *client, void *data)
continue; continue;
snprintf(buf, sizeof(buf), "%s/%s", path, de->d_name); snprintf(buf, sizeof(buf), "%s/%s", path, de->d_name);
ethumb_client_file_set(client, buf, NULL); ethumb_client_file_set(client, buf, NULL);
ethumb_client_generate(client, _queue_add_cb, NULL); ethumb_client_generate(client, _queue_add_cb, NULL, NULL);
}
for (i = 100; i < 200; i++)
{
ethumb_client_queue_remove(client, i, NULL, NULL);
} }
closedir(dir); closedir(dir);
@ -115,7 +109,7 @@ main(int argc, char *argv[])
} }
ethumb_client_init(); ethumb_client_init();
client = ethumb_client_connect(_connect_cb, argv[1]); client = ethumb_client_connect(_connect_cb, argv[1], NULL);
if (!client) if (!client)
{ {
fprintf(stderr, "ERROR: couldn't connect to server.\n"); fprintf(stderr, "ERROR: couldn't connect to server.\n");