Eldbus_Message * _eldbus_connection_send_and_block(Eldbus_Connection *conn, Eldbus_Message *msg, double timeout) { Eldbus_Message *reply = NULL; DBusError err; DBusMessage *dbus_msg; if (ecore_main_loop_nested_get()) WRN("Calling this function may result in dropped frames because the main loop is running"); dbus_error_init(&err); dbus_msg = dbus_connection_send_with_reply_and_block(conn->dbus_conn, msg->dbus_msg, timeout, &err); EINA_SAFETY_ON_TRUE_GOTO(dbus_error_is_set(&err), dbus_error_set); dbus_error_free(&err); reply = eldbus_message_new(EINA_FALSE); EINA_SAFETY_ON_NULL_GOTO(reply, fail); reply->dbus_msg = dbus_msg; dbus_message_iter_init(reply->dbus_msg, &reply->iterator->dbus_iterator); eldbus_message_unref(msg); return reply; dbus_error_set: reply = eldbus_message_error_new(msg, err.name, err.message); dbus_error_free(&err); fail: eldbus_message_unref(msg); return reply; }
EAPI Eldbus_Message * eldbus_message_method_return_new(const Eldbus_Message *msg) { Eldbus_Message *reply; ELDBUS_MESSAGE_CHECK_RETVAL(msg, NULL); reply = eldbus_message_new(EINA_TRUE); reply->dbus_msg = dbus_message_new_method_return(msg->dbus_msg); dbus_message_iter_init_append(reply->dbus_msg, &reply->iterator->dbus_iterator); return reply; }
EAPI Eldbus_Message * eldbus_message_signal_new(const char *path, const char *interface, const char *name) { Eldbus_Message *msg; EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(interface, NULL); EINA_SAFETY_ON_FALSE_RETURN_VAL(name, NULL); msg = eldbus_message_new(EINA_TRUE); EINA_SAFETY_ON_NULL_RETURN_VAL(msg, NULL); msg->dbus_msg = dbus_message_new_signal(path, interface, name); dbus_message_iter_init_append(msg->dbus_msg, &msg->iterator->dbus_iterator); return msg; }
EAPI Eldbus_Message * eldbus_message_error_new(const Eldbus_Message *msg, const char *error_name, const char *error_msg) { Eldbus_Message *reply; ELDBUS_MESSAGE_CHECK_RETVAL(msg, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_name, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_msg, NULL); reply = eldbus_message_new(EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(reply, NULL); reply->dbus_msg = dbus_message_new_error(msg->dbus_msg, error_name, error_msg); dbus_message_iter_init(reply->dbus_msg, &reply->iterator->dbus_iterator); return reply; }
EAPI Eldbus_Message * eldbus_message_method_call_new(const char *dest, const char *path, const char *iface, const char *method) { Eldbus_Message *msg; EINA_SAFETY_ON_NULL_RETURN_VAL(dest, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(method, NULL); #ifdef DBUS_SYNTAX_H // added to libdbus: // f426c6cddd158d6324923f28117bc8e512d6f64f Fri Feb 24 12:43:55 2012 +0000 if (!dbus_validate_bus_name(dest, NULL)) { ERR("Invalid bus name '%s'", dest); return NULL; } if (!dbus_validate_path(path, NULL)) { ERR("Invalid path '%s'", path); return NULL; } if (!dbus_validate_interface(iface, NULL)) { ERR("Invalid interface '%s'", iface); return NULL; } #endif msg = eldbus_message_new(EINA_TRUE); EINA_SAFETY_ON_NULL_GOTO(msg, fail); msg->dbus_msg = dbus_message_new_method_call(dest, path, iface, method); dbus_message_iter_init_append(msg->dbus_msg, &msg->iterator->dbus_iterator); return msg; fail: eldbus_message_unref(msg); return NULL; }
static void cb_pending(DBusPendingCall *dbus_pending, void *user_data) { Eldbus_Message *msg; Eldbus_Pending *pending = user_data; if (!dbus_pending_call_get_completed(dbus_pending)) { INF("timeout to pending %p", pending); dbus_pending_call_cancel(dbus_pending); msg = eldbus_message_error_new(pending->msg_sent, ELDBUS_ERROR_PENDING_TIMEOUT, "This call was not completed in time."); eldbus_pending_dispatch(pending, msg); return; } msg = eldbus_message_new(EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN(msg); msg->dbus_msg = dbus_pending_call_steal_reply(dbus_pending); if (!msg->dbus_msg) { EINA_SAFETY_ON_NULL_GOTO(pending->cb, cleanup); msg->dbus_msg = dbus_message_new_error(NULL, "org.enlightenment.DBus.NoReply", "There was no reply to this method call."); EINA_SAFETY_ON_NULL_GOTO(msg->dbus_msg, cleanup); } dbus_message_iter_init(msg->dbus_msg, &msg->iterator->dbus_iterator); eldbus_pending_dispatch(pending, msg); return; cleanup: eldbus_message_unref(msg); }