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_pending_call_unref(pending);
27 dbus_error_init(&err);
28 msg = dbus_pending_call_steal_reply(pending);
33 dbus_set_error(&err, "org.enlightenment.DBus.NoReply", "There was no reply to this method call.");
34 data->cb_return(data->data, NULL, &err);
35 dbus_error_free(&err);
40 if (dbus_set_error_from_message(&err, msg))
43 data->cb_return(data->data, NULL, &err);
44 dbus_error_free(&err);
49 data->cb_return(data->data, msg, &err);
52 dbus_message_unref(msg);
53 dbus_pending_call_unref(pending);
58 * @brief Send a DBus message with callbacks
59 * @param conn The DBus connection
60 * @param msg The message to send
61 * @param cb_return A callback function for returns (only used if @a msg is a method-call)
62 * @param timeout A timeout in milliseconds, after which a synthetic error will be generated
63 * @return a DBusPendingCall that can be used to cancel the current call
65 EAPI DBusPendingCall *
66 e_dbus_message_send(E_DBus_Connection *conn, DBusMessage *msg, E_DBus_Method_Return_Cb cb_return, int timeout, void *data)
68 DBusPendingCall *pending;
70 if (!dbus_connection_send_with_reply(conn->conn, msg, &pending, timeout))
73 if (cb_return && pending)
75 E_DBus_Pending_Call_Data *pdata;
77 pdata = malloc(sizeof(E_DBus_Pending_Call_Data));
78 pdata->cb_return = cb_return;
81 if (!dbus_pending_call_set_notify(pending, cb_pending, pdata, free))
84 dbus_message_unref(msg);
85 dbus_pending_call_cancel(pending);
94 cb_method_call(void *data, DBusMessage *msg, DBusError *err)
96 E_DBus_Callback *cb = data;
97 void *method_return = NULL;
101 dbus_error_init(&new_err);
102 if (!dbus_error_is_set(err))
103 method_return = e_dbus_callback_unmarshal(cb, msg, &new_err);
105 dbus_move_error(err, &new_err);
107 e_dbus_callback_call(cb, method_return, &new_err);
108 e_dbus_callback_return_free(cb, method_return);
110 if (dbus_error_is_set(&new_err))
111 dbus_error_free(&new_err);
113 e_dbus_callback_free(cb);
116 EAPI DBusPendingCall *
117 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)
120 cb = e_dbus_callback_new(cb_func, unmarshal_func, free_func, data);
121 return e_dbus_message_send(conn, msg, cb_method_call, timeout, cb);