Add error callback

SVN revision: 24237
This commit is contained in:
sebastid 2006-07-27 15:28:44 +00:00 committed by sebastid
parent 0df8ad55dd
commit 48e23af633
7 changed files with 130 additions and 73 deletions

View File

@ -8,10 +8,9 @@
static int ecore_dbus_event_server_add(void *udata, int ev_type, void *ev);
static int ecore_dbus_event_server_del(void *udata, int ev_type, void *ev);
static void ecore_dbus_method_name_has_owner_cb(void *data, Ecore_DBus_Message_Type type,
Ecore_DBus_Method_Return *reply);
static void ecore_dbus_method_add_match_cb(void *data, Ecore_DBus_Message_Type type,
Ecore_DBus_Method_Return *reply);
static void ecore_dbus_method_name_has_owner_cb(void *data, Ecore_DBus_Method_Return *reply);
static void ecore_dbus_method_add_match_cb(void *data, Ecore_DBus_Method_Return *reply);
static void ecore_dbus_method_error_cb(void *data, const char *error);
static int ecore_dbus_event_server_signal(void *udata, int ev_type, void *ev);
@ -63,7 +62,8 @@ ecore_dbus_event_server_add(void *udata, int ev_type, void *ev)
event = ev;
printf("ecore_dbus_event_server_add\n");
ecore_dbus_method_name_has_owner(event->server, "org.freedesktop.Hal",
ecore_dbus_method_name_has_owner_cb, NULL);
ecore_dbus_method_name_has_owner_cb,
ecore_dbus_method_error_cb, NULL);
return 0;
}
@ -80,15 +80,9 @@ ecore_dbus_event_server_del(void *udata, int ev_type, void *ev)
}
static void
ecore_dbus_method_name_has_owner_cb(void *data, Ecore_DBus_Message_Type type,
Ecore_DBus_Method_Return *reply)
ecore_dbus_method_name_has_owner_cb(void *data, Ecore_DBus_Method_Return *reply)
{
unsigned int *exists;
if (type != ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
ecore_main_loop_quit();
return;
}
printf("ecore_dbus_event_server_method_return %s %s.%s\n", event_type_get(reply->type),
reply->header.interface,
reply->header.member);
@ -107,26 +101,28 @@ ecore_dbus_method_name_has_owner_cb(void *data, Ecore_DBus_Message_Type type,
"interface='org.freedesktop.Hal.Manager',"
"sender='org.freedesktop.Hal',"
"path='/org/freedesktop/Hal/Manager'",
ecore_dbus_method_add_match_cb, NULL);
ecore_dbus_method_add_match_cb,
ecore_dbus_method_error_cb, NULL);
}
}
static void
ecore_dbus_method_add_match_cb(void *data, Ecore_DBus_Message_Type type,
Ecore_DBus_Method_Return *reply)
ecore_dbus_method_add_match_cb(void *data, Ecore_DBus_Method_Return *reply)
{
if (type != ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
ecore_main_loop_quit();
return;
}
printf("ecore_dbus_event_server_method_return %s %s.%s\n", event_type_get(reply->type),
reply->header.interface,
reply->header.member);
printf("Should be listening for device changes!\n");
}
static void
ecore_dbus_method_error_cb(void *data, const char *error)
{
printf("Error: %s\n", error);
ecore_main_loop_quit();
}
static int
ecore_dbus_event_server_signal(void *udata, int ev_type, void *ev)
{

View File

@ -8,11 +8,10 @@
static int ecore_dbus_event_server_add(void *udata, int ev_type, void *ev);
static int ecore_dbus_event_server_del(void *udata, int ev_type, void *ev);
static void ecore_dbus_method_list_names_cb(void *data,
Ecore_DBus_Message_Type type,
Ecore_DBus_Method_Return *ev);
static void ecore_dbus_method_list_names_cb(void *data, Ecore_DBus_Method_Return *reply);
static void ecore_dbus_method_error_cb(void *data, const char *error);
static const char * event_type_get(Ecore_DBus_Message_Type type);
static const char *event_type_get(Ecore_DBus_Message_Type type);
static Ecore_DBus_Server *svr = NULL;
@ -56,7 +55,9 @@ ecore_dbus_event_server_add(void *udata, int ev_type, void *ev)
event = ev;
printf("ecore_dbus_event_server_add\n");
ecore_dbus_method_list_names(event->server, ecore_dbus_method_list_names_cb, NULL);
ecore_dbus_method_list_names(event->server,
ecore_dbus_method_list_names_cb,
ecore_dbus_method_error_cb, NULL);
return 0;
}
@ -74,7 +75,6 @@ ecore_dbus_event_server_del(void *udata, int ev_type, void *ev)
static void
ecore_dbus_method_list_names_cb(void *data,
Ecore_DBus_Message_Type type,
Ecore_DBus_Method_Return *reply)
{
Ecore_List *names;
@ -96,7 +96,13 @@ ecore_dbus_method_list_names_cb(void *data,
ecore_list_destroy(names);
}
ecore_main_loop_quit();
return 0;
}
static void
ecore_dbus_method_error_cb(void *data, const char *error)
{
printf("Error: %s\n", error);
ecore_main_loop_quit();
}
static const char *

View File

@ -135,7 +135,8 @@ extern "C" {
EAPI extern int ECORE_DBUS_EVENT_SERVER_SIGNAL;
/* callback */
typedef void (*Ecore_DBus_Method_Cb)(void *data, Ecore_DBus_Message_Type type, Ecore_DBus_Method_Return *reply);
typedef void (*Ecore_DBus_Method_Return_Cb)(void *data, Ecore_DBus_Method_Return *reply);
typedef void (*Ecore_DBus_Error_Cb)(void *data, const char *error);
/* init */
EAPI int ecore_dbus_init(void);
@ -151,9 +152,8 @@ extern "C" {
EAPI unsigned int ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr,
char *destination, char *path,
char *interface, char *method,
void (*method_cb)(void *udata,
Ecore_DBus_Message_Type type,
Ecore_DBus_Event_Server_Data *data),
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data,
char *fmt, ...);
EAPI void ecore_dbus_message_del(Ecore_DBus_Message *msg);
@ -162,14 +162,14 @@ extern "C" {
EAPI void *ecore_dbus_message_body_field_get(Ecore_DBus_Message *msg, unsigned int pos);
/* methods */
EAPI int ecore_dbus_method_hello(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_list_names(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char *name, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, char *name, unsigned int flags, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char *name, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, char *connection, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char *match, Ecore_DBus_Method_Cb method_cb, void *data);
EAPI int ecore_dbus_method_hello(Ecore_DBus_Server *svr, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_list_names(Ecore_DBus_Server *svr, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char *name, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, char *name, unsigned int flags, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char *name, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, char *connection, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
EAPI int ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char *match, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
#ifdef __cplusplus
}

View File

@ -60,7 +60,8 @@ static void _ecore_dbus_event_server_data_free(void *data, void *ev);
static Ecore_DBus_Event_Server_Data *_ecore_dbus_event_create(Ecore_DBus_Server *svr, Ecore_DBus_Message *msg);
static void _ecore_dbus_method_hello_cb(void *data, Ecore_DBus_Message_Type type, Ecore_DBus_Method_Return *reply);
static void _ecore_dbus_method_hello_cb(void *data, Ecore_DBus_Method_Return *reply);
static void _ecore_dbus_method_error_cb(void *data, const char *error);
/* local variables */
@ -316,7 +317,7 @@ _ecore_dbus_event_server_data(void *udata, int ev_type, void *ev)
ecore_dbus_server_send(svr, "BEGIN\r\n", 7);
svr->authenticated = 1;
/* Register on the bus */
ecore_dbus_method_hello(svr, _ecore_dbus_method_hello_cb, svr);
ecore_dbus_method_hello(svr, _ecore_dbus_method_hello_cb, _ecore_dbus_method_error_cb, svr);
}
else if (!strncmp(e->data, "DATA", 4))
{
@ -362,20 +363,38 @@ _ecore_dbus_event_server_data(void *udata, int ev_type, void *ev)
/* Trap known messages */
ev2 = _ecore_dbus_event_create(svr, msg);
if (!ev2) break;
if ((msg->type == ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN) ||
(msg->type == ECORE_DBUS_MESSAGE_TYPE_ERROR))
if (msg->type == ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
Ecore_DBus_Message *sent;
sent = ecore_hash_remove(svr->messages, (void *)(ev2->header.reply_serial));
if ((sent) && (sent->cb.func))
if ((sent) && (sent->cb.method_return))
{
sent->cb.func(sent->cb.data, msg->type, ev2);
_ecore_dbus_event_server_data_free(NULL, ev2);
sent->cb.method_return(sent->cb.data, ev2);
}
else
{
printf("Ecore_DBus: Reply without reply serial!\n");
}
if (sent) _ecore_dbus_message_free(sent);
_ecore_dbus_event_server_data_free(NULL, ev2);
}
else if (msg->type == ECORE_DBUS_MESSAGE_TYPE_ERROR)
{
Ecore_DBus_Message *sent;
sent = ecore_hash_remove(svr->messages, (void *)(ev2->header.reply_serial));
if ((sent) && (sent->cb.error))
{
char *error = NULL;
if (ev2->args)
error = ev2->args[0].value;
sent->cb.error(sent->cb.data, error);
}
else
{
printf("Ecore_DBus: Error without reply serial!\n");
}
if (sent) _ecore_dbus_message_free(sent);
_ecore_dbus_event_server_data_free(NULL, ev2);
}
else if (msg->type == ECORE_DBUS_MESSAGE_TYPE_SIGNAL)
{
@ -454,18 +473,12 @@ _ecore_dbus_event_create(Ecore_DBus_Server *svr, Ecore_DBus_Message *msg)
}
static void
_ecore_dbus_method_hello_cb(void *data, Ecore_DBus_Message_Type type, Ecore_DBus_Method_Return *reply)
_ecore_dbus_method_hello_cb(void *data, Ecore_DBus_Method_Return *reply)
{
Ecore_DBus_Event_Server_Add *svr_add;
Ecore_DBus_Server *svr;
char *name;
if (type != ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
printf("Ecore_DBus: Could not register on the message bus\n");
return;
}
svr = data;
name = reply->args[0].value;
printf("Got unique name: %s\n", name);
@ -481,3 +494,18 @@ _ecore_dbus_method_hello_cb(void *data, Ecore_DBus_Message_Type type, Ecore_DBus
svr_add->server = svr;
ecore_event_add(ECORE_DBUS_EVENT_SERVER_ADD, svr_add, NULL, NULL);
}
static void
_ecore_dbus_method_error_cb(void *data, const char *error)
{
Ecore_DBus_Event_Server_Del *ev;
Ecore_DBus_Server *svr;
svr = data;
printf("Ecore_DBus: error %s\n", error);
ev = malloc(sizeof(Ecore_DBus_Event_Server_Del));
if (!ev) return;
ev->server = svr;
ecore_event_add(ECORE_DBUS_EVENT_SERVER_DEL, ev, _ecore_dbus_event_server_del_free, NULL);
}

View File

@ -19,7 +19,8 @@ static void _ecore_dbus_message_print_raw(Ecore_DBus_Message *msg);
EAPI unsigned int
ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *destination,
char *path, char *interface, char *method,
Ecore_DBus_Method_Cb method_cb,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data,
char *fmt, ...)
{
@ -33,7 +34,8 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *destination,
Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr);
if (method_cb)
{
msg->cb.func = method_cb;
msg->cb.method_return = method_cb;
msg->cb.error = error_cb;
msg->cb.data = data;
}

View File

@ -9,7 +9,10 @@
#include "ecore_dbus_private.h"
EAPI int
ecore_dbus_method_hello(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_hello(Ecore_DBus_Server *svr,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
if (svr->unique_name)
{
@ -21,90 +24,111 @@ ecore_dbus_method_hello(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb method_cb,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"Hello" /*method*/,
method_cb, data,
method_cb, error_cb, data,
NULL /*fmt*/);
}
EAPI int
ecore_dbus_method_list_names(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_list_names(Ecore_DBus_Server *svr,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"ListNames" /*method*/,
method_cb, data,
method_cb, error_cb, data,
NULL /*fmt*/);
}
EAPI int
ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char *name, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char *name,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"NameHasOwner" /*method*/,
method_cb, data,
method_cb, error_cb, data,
"s" /*fmt*/, name);
}
EAPI int
ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, char *name, unsigned int flags, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, char *name, unsigned int flags,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"StartServiceByName" /*method*/,
method_cb, data,
method_cb, error_cb, data,
"su" /*fmt*/, name, flags);
}
EAPI int
ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char *name, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char *name,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"GetNameOwner" /*method*/,
method_cb, data,
method_cb, error_cb, data,
"s" /*fmt*/, name);
}
EAPI int
ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, char *connection, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, char *connection,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"GetConnectionUnixUser" /*method*/,
method_cb, data,
method_cb, error_cb, data,
"s" /*fmt*/, connection);
}
EAPI int
ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"AddMatch" /*method*/,
method_cb, data,
method_cb, error_cb, data,
"s" /*fmt*/, match);
}
EAPI int
ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char *match, Ecore_DBus_Method_Cb method_cb, void *data)
ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char *match,
Ecore_DBus_Method_Return_Cb method_cb,
Ecore_DBus_Error_Cb error_cb,
void *data)
{
return ecore_dbus_message_new_method_call(svr,
"org.freedesktop.DBus" /*destination*/,
"/org/freedesktop/DBus" /*path*/,
"org.freedesktop.DBus" /*interface*/,
"RemoveMatch" /*method*/,
method_cb, data,
method_cb, error_cb, data,
"s" /*fmt*/, match);
}

View File

@ -74,8 +74,9 @@ struct _Ecore_DBus_Message
/* callback */
struct {
Ecore_DBus_Method_Cb func;
void *data;
Ecore_DBus_Method_Return_Cb method_return;
Ecore_DBus_Error_Cb error;
void *data;
} cb;
/* header fields */