簡體   English   中英

DBus:連接在收到回復之前斷開

[英]DBus: Connection was disconnected before a reply was received

我想通過 org.freedesktop.Notifications 服務向 linux 的 window 經理發送通知。 在 d-feet 中這有效,但在 C 中,我收到錯誤消息“在收到回復之前連接已斷開”

#include <stdio.h>
#include <dbus/dbus.h>

int main() {
    DBusError error;
    DBusConnection *conn;
    dbus_uint32_t serial = 0;
    char *app_name = "My App";
    dbus_uint32_t replaces_id = 0;
    char *app_icon = "";
    char *summary = "Notification from My App";
    char *body = "This is a test notification from My App.";
    char **actions = NULL;
    dbus_int32_t timeout = -1;
    dbus_uint32_t notification_id = 0;

    dbus_error_init(&error);

    conn = dbus_bus_get(DBUS_BUS_SESSION, &error);
    if (dbus_error_is_set(&error)) {
        fprintf(stderr, "Error connecting to the D-Bus session bus: %s\n", error.message);
        dbus_error_free(&error);
        return 1;
    }

    DBusMessage *message = dbus_message_new_method_call("org.freedesktop.Notifications",
                                                        "/org/freedesktop/Notifications",
                                                        "org.freedesktop.Notifications",
                                                        "Notify");
    DBusMessageIter args, array;
    dbus_message_iter_init_append(message, &args);
    dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &app_name);
    dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &notification_id);
    dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &app_icon);
    dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &summary);
    dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &body);
    dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &array);
    dbus_message_iter_close_container(&args, &array);
    DBusMessageIter dict_entry;
    const char *key = "";
    dbus_uint32_t value = 0;
    dbus_message_iter_open_container(&args, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry);
    dbus_message_iter_append_basic(&dict_entry, DBUS_TYPE_STRING, &key);
    DBusMessageIter variant;
    dbus_message_iter_open_container(&dict_entry, DBUS_TYPE_VARIANT, DBUS_TYPE_UINT32_AS_STRING, &variant);
    dbus_message_iter_append_basic(&variant, DBUS_TYPE_UINT32, &value);
    dbus_message_iter_close_container(&dict_entry, &variant);
    dbus_message_iter_close_container(&args, &dict_entry);
    dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &timeout);
    DBusPendingCall* pending;
    
    dbus_connection_send_with_reply(conn, message, &pending, DBUS_TIMEOUT_INFINITE);
    dbus_connection_flush(conn);
    dbus_message_unref(message);
    dbus_pending_call_block(pending);
    message = dbus_pending_call_steal_reply(pending);
    dbus_pending_call_unref(pending);
    DBusMessageIter args2;
    int arg, id;
    if(!dbus_message_iter_init(message, &args2))
        fprintf(stderr, "message has no arugments!\n");
    else if (DBUS_TYPE_UINT32 != (arg=dbus_message_iter_get_arg_type(&args2))) {
        fprintf(stderr, "Argument is not int!\n");
        switch(arg){
            case DBUS_TYPE_STRING:
                char *string;
                dbus_message_iter_get_basic(&args2, &string);
                fprintf(stderr, "ITS A STRING: %s\n", string);
                break;
    }}
    else { 
        dbus_message_iter_get_basic(&args2, &id);
        printf("ID: %d\n", id);
    }

    dbus_message_unref(message);
    dbus_connection_close(conn);

    return 0;
}


編輯:我修復了段錯誤,但現在我在閱讀回復 arguments 時從 dbus 得到了一個更加模糊的回復

雖然這不能直接回答您的問題,但從長遠來看會有所幫助:您可能不想使用 dbus-glib 或 libdbus 連接到 D-Bus。 兩者都很舊,並且 API 設計很差,這使得它們很難使用。 使用具有更好設計的 API 的 D-Bus 綁定,從長遠來看將使您的代碼更易於編寫和維護。

請參閱此答案以比較您可用的更易於使用的 D-Bus 綁定。 不幸的是,有如此多的綁定並且不推薦使用其中的一些綁定,這讓人很困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM