3 #include "e_dbus_private.h"
5 typedef struct E_DBus_Pending_Call_Data E_DBus_Pending_Call_Data;
6 struct E_DBus_Pending_Call_Data
8 E_DBus_Method_Return_Cb cb_return;
13 cb_pending(DBusPendingCall *pending, void *user_data)
17 E_DBus_Pending_Call_Data *data = user_data;
19 if (!dbus_pending_call_get_completed(pending))
21 INFO("E-dbus: NOT COMPLETED");
23 dbus_message_unref(msg);
24 dbus_pending_call_unref(pending);
28 dbus_error_init(&err);
29 msg = dbus_pending_call_steal_reply(pending);
34 dbus_set_error(&err, "org.enlightenment.DBus.NoReply", "There was no reply to this method call.");
35 data->cb_return(data->data, NULL, &err);
36 dbus_error_free(&err);
41 if (dbus_set_error_from_message(&err, msg))
44 data->cb_return(data->data, NULL, &err);
45 dbus_error_free(&err);
50 data->cb_return(data->data, msg, &err);
53 dbus_message_unref(msg);
54 dbus_pending_call_unref(pending);
59 * @brief Send a DBus message with callbacks
60 * @param conn The DBus connection
61 * @param msg The message to send
62 * @param cb_return A callback function for returns (only used if @a msg is a method-call)
63 * @param timeout A timeout in milliseconds, after which a synthetic error will be generated
64 * @return a DBusPendingCall that can be used to cancel the current call
66 EAPI DBusPendingCall *
67 e_dbus_message_send(E_DBus_Connection *conn, DBusMessage *msg, E_DBus_Method_Return_Cb cb_return, int timeout, void *data)
69 DBusPendingCall *pending;
71 if (!dbus_connection_send_with_reply(conn->conn, msg, &pending, timeout))
74 if (cb_return && pending)
76 E_DBus_Pending_Call_Data *pdata;
78 pdata = malloc(sizeof(E_DBus_Pending_Call_Data));
79 pdata->cb_return = cb_return;
82 if (!dbus_pending_call_set_notify(pending, cb_pending, pdata, free))
85 dbus_message_unref(msg);
86 dbus_pending_call_cancel(pending);
95 cb_method_call(void *data, DBusMessage *msg, DBusError *err)
97 E_DBus_Callback *cb = data;
98 void *method_return = NULL;
102 dbus_error_init(&new_err);
103 if (!dbus_error_is_set(err))
104 method_return = e_dbus_callback_unmarshal(cb, msg, &new_err);
106 dbus_move_error(err, &new_err);
108 e_dbus_callback_call(cb, method_return, &new_err);
109 e_dbus_callback_return_free(cb, method_return);
111 if (dbus_error_is_set(&new_err))
112 dbus_error_free(&new_err);
114 e_dbus_callback_free(cb);
117 EAPI DBusPendingCall *
118 e_dbus_method_call_send(E_DBus_Connection *conn, DBusMessage *msg, E_DBus_Unmarshal_Func unmarshal_func, E_DBus_Callback_Func cb_func, E_DBus_Free_Func free_func, int timeout, void *data)
121 cb = e_dbus_callback_new(cb_func, unmarshal_func, free_func, data);
122 return e_dbus_message_send(conn, msg, cb_method_call, timeout, cb);