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;
}
else
r = ethumb_generate(e, _finished_thumb, NULL);
r = ethumb_generate(e, _finished_thumb, NULL, NULL);
}
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_thumb_path_set(ec->ethumbt[index], thumb_path, thumb_key);
ethumb_generate(ec->ethumbt[index], _ec_op_generated_cb,
ec);
ec, NULL);
free(path);
free(key);

View File

@ -966,9 +966,12 @@ _ethumb_finished_idler_cb(void *data)
Ethumb *e = 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_cb = NULL;
e->cb_data = NULL;
e->cb_data_free = NULL;
return 0;
}
@ -985,7 +988,7 @@ ethumb_finished_callback_call(Ethumb *e, int result)
}
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;
@ -1000,6 +1003,7 @@ ethumb_generate(Ethumb *e, ethumb_generate_callback_t finished_cb, void *data)
}
e->finished_cb = finished_cb;
e->cb_data = data;
e->cb_data_free = free_data;
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_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 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;
#ifdef __cplusplus

View File

@ -63,6 +63,7 @@ struct _Ethumb_Client
DBusPendingCall *pending_new;
ec_connect_callback_t connect_cb;
void *connect_cb_data;
void (*connect_cb_free_data)(void *);
Eina_List *pending_add;
Eina_List *pending_remove;
Eina_List *pending_gen;
@ -86,6 +87,7 @@ struct _ethumb_pending_add
const char *thumb_key;
generated_callback_t generated_cb;
void *data;
void (*free_data)(void *);
DBusPendingCall *pending_call;
Ethumb_Client *client;
};
@ -108,6 +110,7 @@ struct _ethumb_pending_gen
const char *thumb_key;
generated_callback_t generated_cb;
void *data;
void (*free_data)(void *);
};
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);
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;
end_error:
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
@ -317,6 +323,8 @@ _ethumb_client_start_server_cb(void *data, DBusMessage *msg, DBusError *err)
error:
ERR("failed to start Ethumbd DBus service by its name.\n");
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
@ -336,6 +344,8 @@ _ethumb_client_start_server(Ethumb_Client *client)
{
ERR("could not start service by name!\n");
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:
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
@ -406,7 +418,7 @@ ethumb_client_shutdown(void)
}
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;
@ -421,6 +433,7 @@ ethumb_client_connect(ec_connect_callback_t connect_cb, void *data)
eclient->connect_cb = connect_cb;
eclient->connect_cb_data = data;
eclient->connect_cb_free_data = free_data;
eclient->ethumb = ethumb_new();
if (!eclient->ethumb)
@ -739,6 +752,8 @@ _ethumb_client_generated_cb(void *data, DBusMessage *msg)
pending->generated_cb(id, pending->file, pending->key,
pending->thumb, pending->thumb_key,
success, pending->data);
if (pending->free_data)
pending->free_data(pending->data);
eina_stringshare_del(pending->file);
eina_stringshare_del(pending->key);
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->generated_cb = pending->generated_cb;
generating->data = pending->data;
generating->free_data = pending->free_data;
client->pending_gen = eina_list_append(client->pending_gen, generating);
end:
@ -787,7 +803,7 @@ end:
}
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;
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->generated_cb = generated_cb;
pending->data = data;
pending->free_data = free_data;
pending->client = client;
client->id_count = (client->id_count + 1) % MAX_ID;
@ -1141,7 +1158,7 @@ ethumb_client_thumb_exists(Ethumb_Client *client)
}
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;
long id;
@ -1159,7 +1176,7 @@ ethumb_client_generate(Ethumb_Client *client, generated_callback_t generated_cb,
if (client->ethumb_dirty)
ethumb_client_ethumb_setup(client);
id = _ethumb_client_queue_add(client, file, key, thumb, thumb_key,
generated_cb, data);
generated_cb, data, free_data);
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_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_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_get(Ethumb_Client *client, const char **path, const char **key);
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
}

View File

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

View File

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