forked from enlightenment/efl
edbus: Call callback if already have a unique id when
another callback is added Patch by: José Roberto de Souza <zehortigoza@profusion.mobi> SVN revision: 77337
This commit is contained in:
parent
4be3f1e204
commit
c2e818bd3f
|
@ -218,6 +218,27 @@ _on_async_test(void *data, const EDBus_Message *msg, EDBus_Pending *pending)
|
||||||
printf("%s\n", str);
|
printf("%s\n", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_name_owner_changed2(void *data, const char *bus, const char *old_id, const char *new_id)
|
||||||
|
{
|
||||||
|
printf("2 - Bus=%s | old=%s | new=%s\n", bus, old_id, new_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_name_owner_changed(void *data, const char *bus, const char *old_id, const char *new_id)
|
||||||
|
{
|
||||||
|
printf("Bus=%s | old=%s | new=%s\n", bus, old_id, new_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
add_name_owner2(void *data)
|
||||||
|
{
|
||||||
|
EDBus_Connection *conn = data;
|
||||||
|
edbus_name_owner_changed_callback_add(conn, BUS, on_name_owner_changed2,
|
||||||
|
NULL);
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
|
@ -245,8 +266,14 @@ main(void)
|
||||||
edbus_proxy_call(proxy, "SendString", _on_send_string, NULL, -1, "s", string_value);
|
edbus_proxy_call(proxy, "SendString", _on_send_string, NULL, -1, "s", string_value);
|
||||||
edbus_proxy_call(proxy, "AsyncTest", _on_async_test, NULL, -1, "");
|
edbus_proxy_call(proxy, "AsyncTest", _on_async_test, NULL, -1, "");
|
||||||
|
|
||||||
|
edbus_name_owner_changed_callback_add(conn, BUS, on_name_owner_changed, conn);
|
||||||
|
ecore_timer_add(3, add_name_owner2, conn);
|
||||||
|
|
||||||
ecore_main_loop_begin();
|
ecore_main_loop_begin();
|
||||||
|
|
||||||
|
edbus_name_owner_changed_callback_del(conn, BUS, on_name_owner_changed, conn);
|
||||||
|
edbus_name_owner_changed_callback_del(conn, BUS, on_name_owner_changed2,
|
||||||
|
NULL);
|
||||||
edbus_connection_unref(conn);
|
edbus_connection_unref(conn);
|
||||||
|
|
||||||
edbus_shutdown();
|
edbus_shutdown();
|
||||||
|
|
|
@ -48,6 +48,7 @@ typedef struct _EDBus_Connection_Context_NOC_Cb
|
||||||
EDBus_Name_Owner_Changed_Cb cb;
|
EDBus_Name_Owner_Changed_Cb cb;
|
||||||
const void *cb_data;
|
const void *cb_data;
|
||||||
Eina_Bool deleted : 1;
|
Eina_Bool deleted : 1;
|
||||||
|
Ecore_Idler *idler;
|
||||||
} EDBus_Connection_Context_NOC_Cb;
|
} EDBus_Connection_Context_NOC_Cb;
|
||||||
|
|
||||||
typedef struct _EDBus_Handler_Data
|
typedef struct _EDBus_Handler_Data
|
||||||
|
@ -1165,6 +1166,23 @@ edbus_dispatch_name_owner_change(EDBus_Connection_Name *cn, const char *old_id)
|
||||||
cn->event_handlers.walking--;
|
cn->event_handlers.walking--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct _dispach_name_owner_data
|
||||||
|
{
|
||||||
|
EDBus_Connection_Context_NOC_Cb *ctx;
|
||||||
|
const EDBus_Connection_Name *cn;
|
||||||
|
} dispatch_name_owner_data;
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
dispach_name_owner_cb(void *context)
|
||||||
|
{
|
||||||
|
dispatch_name_owner_data *data = context;
|
||||||
|
data->ctx->cb((void *)data->ctx->cb_data, data->cn->name, "",
|
||||||
|
data->cn->unique_id);
|
||||||
|
data->ctx->idler = NULL;
|
||||||
|
free(data);
|
||||||
|
return ECORE_CALLBACK_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
edbus_name_owner_changed_callback_add(EDBus_Connection *conn, const char *bus, EDBus_Name_Owner_Changed_Cb cb, const void *cb_data)
|
edbus_name_owner_changed_callback_add(EDBus_Connection *conn, const char *bus, EDBus_Name_Owner_Changed_Cb cb, const void *cb_data)
|
||||||
{
|
{
|
||||||
|
@ -1194,6 +1212,15 @@ edbus_name_owner_changed_callback_add(EDBus_Connection *conn, const char *bus, E
|
||||||
|
|
||||||
cn->event_handlers.list = eina_inlist_append(cn->event_handlers.list,
|
cn->event_handlers.list = eina_inlist_append(cn->event_handlers.list,
|
||||||
EINA_INLIST_GET(ctx));
|
EINA_INLIST_GET(ctx));
|
||||||
|
if (cn->unique_id)
|
||||||
|
{
|
||||||
|
dispatch_name_owner_data *dispatch_data;
|
||||||
|
dispatch_data = malloc(sizeof(dispatch_name_owner_data));
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(dispatch_data);
|
||||||
|
dispatch_data->cn = cn;
|
||||||
|
dispatch_data->ctx = ctx;
|
||||||
|
ctx->idler = ecore_idler_add(dispach_name_owner_cb, dispatch_data);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -1235,6 +1262,12 @@ edbus_name_owner_changed_callback_del(EDBus_Connection *conn, const char *bus, E
|
||||||
|
|
||||||
cn->event_handlers.list = eina_inlist_remove(cn->event_handlers.list,
|
cn->event_handlers.list = eina_inlist_remove(cn->event_handlers.list,
|
||||||
EINA_INLIST_GET(found));
|
EINA_INLIST_GET(found));
|
||||||
|
if (found->idler)
|
||||||
|
{
|
||||||
|
dispatch_name_owner_data *data;
|
||||||
|
data = ecore_idler_del(found->idler);
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
free(found);
|
free(found);
|
||||||
edbus_connection_name_owner_monitor(conn, cn, EINA_FALSE);
|
edbus_connection_name_owner_monitor(conn, cn, EINA_FALSE);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue