forked from enlightenment/efl
parent
f97a64ca03
commit
c958177e51
|
@ -124,12 +124,11 @@ struct _Ethumb_Client
|
||||||
} die;
|
} die;
|
||||||
const char *object_path;
|
const char *object_path;
|
||||||
|
|
||||||
int refcount;
|
EINA_REFCOUNT;
|
||||||
|
|
||||||
Eina_Bool ethumb_dirty : 1;
|
Eina_Bool ethumb_dirty : 1;
|
||||||
Eina_Bool connected : 1;
|
Eina_Bool connected : 1;
|
||||||
Eina_Bool server_started : 1;
|
Eina_Bool server_started : 1;
|
||||||
Eina_Bool delete_me : 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ethumb_pending_add
|
struct _ethumb_pending_add
|
||||||
|
@ -179,7 +178,7 @@ struct _Ethumb_Async_Exists
|
||||||
Eina_List *callbacks;
|
Eina_List *callbacks;
|
||||||
|
|
||||||
Ecore_Thread *thread;
|
Ecore_Thread *thread;
|
||||||
int refcount;
|
EINA_REFCOUNT;
|
||||||
|
|
||||||
Eina_Bool exists : 1;
|
Eina_Bool exists : 1;
|
||||||
};
|
};
|
||||||
|
@ -258,20 +257,105 @@ __dbus_iter_type_check(int type, int expected, const char *expected_name)
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ethumb_client_free(Ethumb_Client *client)
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
|
||||||
|
if (!client->connected)
|
||||||
|
goto end_connection;
|
||||||
|
|
||||||
|
EINA_LIST_FREE(client->pending_add, data)
|
||||||
|
{
|
||||||
|
struct _ethumb_pending_add *pending = data;
|
||||||
|
eina_stringshare_del(pending->file);
|
||||||
|
eina_stringshare_del(pending->key);
|
||||||
|
eina_stringshare_del(pending->thumb);
|
||||||
|
eina_stringshare_del(pending->thumb_key);
|
||||||
|
dbus_pending_call_cancel(pending->pending_call);
|
||||||
|
dbus_pending_call_unref(pending->pending_call);
|
||||||
|
if (pending->free_data)
|
||||||
|
pending->free_data(pending->data);
|
||||||
|
free(pending);
|
||||||
|
}
|
||||||
|
|
||||||
|
EINA_LIST_FREE(client->pending_gen, data)
|
||||||
|
{
|
||||||
|
struct _ethumb_pending_gen *pending = data;
|
||||||
|
eina_stringshare_del(pending->file);
|
||||||
|
eina_stringshare_del(pending->key);
|
||||||
|
eina_stringshare_del(pending->thumb);
|
||||||
|
eina_stringshare_del(pending->thumb_key);
|
||||||
|
if (pending->free_data)
|
||||||
|
pending->free_data(pending->data);
|
||||||
|
free(pending);
|
||||||
|
}
|
||||||
|
|
||||||
|
EINA_LIST_FREE(client->pending_remove, data)
|
||||||
|
{
|
||||||
|
struct _ethumb_pending_remove *pending = data;
|
||||||
|
dbus_pending_call_cancel(pending->pending_call);
|
||||||
|
dbus_pending_call_unref(pending->pending_call);
|
||||||
|
if (pending->free_data)
|
||||||
|
pending->free_data(pending->data);
|
||||||
|
free(pending);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client->pending_clear)
|
||||||
|
{
|
||||||
|
dbus_pending_call_cancel(client->pending_clear);
|
||||||
|
dbus_pending_call_unref(client->pending_clear);
|
||||||
|
}
|
||||||
|
|
||||||
|
end_connection:
|
||||||
|
if (client->object_path)
|
||||||
|
eina_stringshare_del(client->object_path);
|
||||||
|
|
||||||
|
if (client->pending_new)
|
||||||
|
dbus_pending_call_cancel(client->pending_new);
|
||||||
|
|
||||||
|
if (client->unique_name)
|
||||||
|
eina_stringshare_del(client->unique_name);
|
||||||
|
|
||||||
|
if (client->pending_get_name_owner)
|
||||||
|
dbus_pending_call_cancel(client->pending_get_name_owner);
|
||||||
|
|
||||||
|
if (client->pending_start_service_by_name)
|
||||||
|
dbus_pending_call_cancel(client->pending_start_service_by_name);
|
||||||
|
|
||||||
|
ethumb_free(client->ethumb);
|
||||||
|
|
||||||
|
e_dbus_signal_handler_del(client->conn, client->name_owner_changed_handler);
|
||||||
|
if (client->connected)
|
||||||
|
e_dbus_signal_handler_del(client->conn, client->generated_signal);
|
||||||
|
e_dbus_connection_close(client->conn);
|
||||||
|
|
||||||
|
if (client->connect.free_data)
|
||||||
|
client->connect.free_data(client->connect.data);
|
||||||
|
if (client->die.free_data)
|
||||||
|
client->die.free_data(client->die.data);
|
||||||
|
|
||||||
|
free(client);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ethumb_async_delete(void *data)
|
_ethumb_async_delete(void *data)
|
||||||
{
|
{
|
||||||
Ethumb_Async_Exists *async = data;
|
Ethumb_Async_Exists *async = data;
|
||||||
|
|
||||||
ethumb_free(async->dup);
|
ethumb_free(async->dup);
|
||||||
async->source->refcount--;
|
|
||||||
|
|
||||||
if (async->source->delete_me == EINA_TRUE)
|
EINA_REFCOUNT_UNREF(async->source, _ethumb_client_free);
|
||||||
ethumb_client_disconnect(async->source);
|
|
||||||
|
|
||||||
free(async);
|
free(async);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ethumb_async_cancel(Ethumb_Async_Exists *async)
|
||||||
|
{
|
||||||
|
ecore_thread_cancel(async->thread);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ethumb_client_name_owner_changed(void *data, DBusMessage *msg)
|
_ethumb_client_name_owner_changed(void *data, DBusMessage *msg)
|
||||||
{
|
{
|
||||||
|
@ -718,6 +802,8 @@ ethumb_client_connect(Ethumb_Client_Connect_Cb connect_cb, const void *data, Ein
|
||||||
goto connection_err;
|
goto connection_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EINA_REFCOUNT_INIT(eclient);
|
||||||
|
|
||||||
return eclient;
|
return eclient;
|
||||||
|
|
||||||
connection_err:
|
connection_err:
|
||||||
|
@ -743,88 +829,9 @@ err:
|
||||||
EAPI void
|
EAPI void
|
||||||
ethumb_client_disconnect(Ethumb_Client *client)
|
ethumb_client_disconnect(Ethumb_Client *client)
|
||||||
{
|
{
|
||||||
void *data;
|
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN(client);
|
EINA_SAFETY_ON_NULL_RETURN(client);
|
||||||
|
|
||||||
client->delete_me = EINA_TRUE;
|
EINA_REFCOUNT_UNREF(client, _ethumb_client_free);
|
||||||
if (client->refcount > 0)
|
|
||||||
return ;
|
|
||||||
|
|
||||||
if (!client->connected)
|
|
||||||
goto end_connection;
|
|
||||||
|
|
||||||
EINA_LIST_FREE(client->pending_add, data)
|
|
||||||
{
|
|
||||||
struct _ethumb_pending_add *pending = data;
|
|
||||||
eina_stringshare_del(pending->file);
|
|
||||||
eina_stringshare_del(pending->key);
|
|
||||||
eina_stringshare_del(pending->thumb);
|
|
||||||
eina_stringshare_del(pending->thumb_key);
|
|
||||||
dbus_pending_call_cancel(pending->pending_call);
|
|
||||||
dbus_pending_call_unref(pending->pending_call);
|
|
||||||
if (pending->free_data)
|
|
||||||
pending->free_data(pending->data);
|
|
||||||
free(pending);
|
|
||||||
}
|
|
||||||
|
|
||||||
EINA_LIST_FREE(client->pending_gen, data)
|
|
||||||
{
|
|
||||||
struct _ethumb_pending_gen *pending = data;
|
|
||||||
eina_stringshare_del(pending->file);
|
|
||||||
eina_stringshare_del(pending->key);
|
|
||||||
eina_stringshare_del(pending->thumb);
|
|
||||||
eina_stringshare_del(pending->thumb_key);
|
|
||||||
if (pending->free_data)
|
|
||||||
pending->free_data(pending->data);
|
|
||||||
free(pending);
|
|
||||||
}
|
|
||||||
|
|
||||||
EINA_LIST_FREE(client->pending_remove, data)
|
|
||||||
{
|
|
||||||
struct _ethumb_pending_remove *pending = data;
|
|
||||||
dbus_pending_call_cancel(pending->pending_call);
|
|
||||||
dbus_pending_call_unref(pending->pending_call);
|
|
||||||
if (pending->free_data)
|
|
||||||
pending->free_data(pending->data);
|
|
||||||
free(pending);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client->pending_clear)
|
|
||||||
{
|
|
||||||
dbus_pending_call_cancel(client->pending_clear);
|
|
||||||
dbus_pending_call_unref(client->pending_clear);
|
|
||||||
}
|
|
||||||
|
|
||||||
end_connection:
|
|
||||||
if (client->object_path)
|
|
||||||
eina_stringshare_del(client->object_path);
|
|
||||||
|
|
||||||
if (client->pending_new)
|
|
||||||
dbus_pending_call_cancel(client->pending_new);
|
|
||||||
|
|
||||||
if (client->unique_name)
|
|
||||||
eina_stringshare_del(client->unique_name);
|
|
||||||
|
|
||||||
if (client->pending_get_name_owner)
|
|
||||||
dbus_pending_call_cancel(client->pending_get_name_owner);
|
|
||||||
|
|
||||||
if (client->pending_start_service_by_name)
|
|
||||||
dbus_pending_call_cancel(client->pending_start_service_by_name);
|
|
||||||
|
|
||||||
ethumb_free(client->ethumb);
|
|
||||||
|
|
||||||
e_dbus_signal_handler_del(client->conn, client->name_owner_changed_handler);
|
|
||||||
if (client->connected)
|
|
||||||
e_dbus_signal_handler_del(client->conn, client->generated_signal);
|
|
||||||
e_dbus_connection_close(client->conn);
|
|
||||||
|
|
||||||
if (client->connect.free_data)
|
|
||||||
client->connect.free_data(client->connect.data);
|
|
||||||
if (client->die.free_data)
|
|
||||||
client->die.free_data(client->die.data);
|
|
||||||
|
|
||||||
free(client);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2167,7 +2174,7 @@ ethumb_client_thumb_exists(Ethumb_Client *client, Ethumb_Client_Thumb_Exists_Cb
|
||||||
async = eina_hash_find(_exists_request, client->ethumb);
|
async = eina_hash_find(_exists_request, client->ethumb);
|
||||||
if (async)
|
if (async)
|
||||||
{
|
{
|
||||||
async->refcount++;
|
EINA_REFCOUNT_REF(async);
|
||||||
async->callbacks = eina_list_append(async->callbacks, cb);
|
async->callbacks = eina_list_append(async->callbacks, cb);
|
||||||
return (Ethumb_Exists*) async;
|
return (Ethumb_Exists*) async;
|
||||||
}
|
}
|
||||||
|
@ -2182,12 +2189,12 @@ ethumb_client_thumb_exists(Ethumb_Client *client, Ethumb_Client_Thumb_Exists_Cb
|
||||||
|
|
||||||
async->dup = ethumb_dup(client->ethumb);
|
async->dup = ethumb_dup(client->ethumb);
|
||||||
async->source = client;
|
async->source = client;
|
||||||
async->source->refcount++;
|
EINA_REFCOUNT_REF(async->source);
|
||||||
async->exists = EINA_FALSE;
|
async->exists = EINA_FALSE;
|
||||||
|
|
||||||
async->callbacks = eina_list_append(NULL, cb);
|
async->callbacks = eina_list_append(NULL, cb);
|
||||||
|
|
||||||
async->refcount = 1;
|
EINA_REFCOUNT_INIT(async);
|
||||||
async->thread = ecore_thread_run(_ethumb_client_exists_heavy,
|
async->thread = ecore_thread_run(_ethumb_client_exists_heavy,
|
||||||
_ethumb_client_exists_end,
|
_ethumb_client_exists_end,
|
||||||
_ethumb_client_exists_cancel,
|
_ethumb_client_exists_cancel,
|
||||||
|
@ -2208,11 +2215,7 @@ ethumb_client_thumb_exists_cancel(Ethumb_Exists *exists)
|
||||||
{
|
{
|
||||||
Ethumb_Async_Exists *async = (Ethumb_Async_Exists*) exists;
|
Ethumb_Async_Exists *async = (Ethumb_Async_Exists*) exists;
|
||||||
|
|
||||||
async->refcount--;
|
EINA_REFCOUNT_UNREF(async, _ethumb_async_cancel);
|
||||||
|
|
||||||
if (async->refcount > 0) return ;
|
|
||||||
|
|
||||||
ecore_thread_cancel(async->thread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue