代码之家  ›  专栏  ›  技术社区  ›  Ahmad Ismail

如何从dbus信号中提取值?

  •  0
  • Ahmad Ismail  · 技术社区  · 3 年前

    我在寻找信号使用:

    dbus-monitor --session > gnome-extension-log.txt
    

    我有这样的信号:

    signal time=1684395360.751890 sender=:1.93 -> destination=(null destination) serial=971 path=/org/gtk/gio/DesktopAppInfo; interface=org.gtk.gio.DesktopAppInfo; member=Launched
       array of bytes "/home/ismail/.local/share/applications/com.github.johnfactotum.Foliate.desktop" + \0
       string ""
       int64 85979
       array [
          string "file:///media/ismail/SSDWorking/book-collection/_Books/Eleven%20Rings%20The%20Soul%20of%20Success%20(Phil%20Jackson,%20Hugh%20Delehanty)%20.epub"
       ]
       array [
          dict entry(
             string "origin-desktop-file"
             variant             array of bytes "/home/ismail/.local/share/applications/nemo.desktop" + \0
          )
          dict entry(
             string "origin-prgname"
             variant             array of bytes "nemo" + \0
          )
          dict entry(
             string "origin-pid"
             variant             int64 4877
          )
       ]
    

    创建信号时,我想提取以下值并将其保存在文件中。

    1. /home/imail/.local/share/applications/com.github.johnfactotum.Foliate.sktop

    2. 85979

    3. file:///media/ismail/SSDWorking/book-collection/_Books/Eleven%20Rings%20The%20Soul%20of%20Success%20(菲尔%20Jackson,%20Hugh%20Delehanty)%20epub

    到目前为止,我所做的是:

    const { Gio, GLib } = imports.gi;
    
    const ExtensionUtils = imports.misc.extensionUtils;
    const Me = ExtensionUtils.getCurrentExtension();
    const connection = Gio.DBus.session;
    var handlerId;
    
    class Extension {
        constructor() {
        }
    
        enable() {
    
            handlerId = connection.signal_subscribe(null, "org.gtk.gio.DesktopAppInfo", "Launched", "/org/gtk/gio/DesktopAppInfo", null, 0, _parseSignal);
    
            function _parseSignal(connection, sender, path, iface, signal, params) {
                log("Calling _parseSignal");
    
                var apppath = params.get_child_value(0).get_bytestring();
                var apppid = params.get_child_value(2).get_int64();
                var openedfilepath = params.get_child_value(3).get_strv();
    
                log("params.get_child_value", apppath);
                log("params.get_child_value", apppid);
                log("params.get_child_value", openedfilepath);
    
                const filepath = GLib.build_filenamev([GLib.get_home_dir(), 'test-file.txt']);
    
    
                log("home: ", GLib.get_home_dir());
                log("filepath: ", filepath);
    
                const file = Gio.File.new_for_path(filepath);
    
                const outputStream = file.create(Gio.FileCreateFlags.NONE, null);
            }
        }
    
        disable() {
            connection.signal_unsubscribe(handlerId);
            log(`disabling ${Me.metadata.name}`);
        }
    }
    
    function init() {
        log(`initializing ${Me.metadata.name}`);
    
        return new Extension();
    }
    

    因此,剩下的唯一问题是,如何将值附加到文件中。

    我正在看:

    https://gjs-docs.gnome.org/gio20~2.0/gio.file#method-append_to

    https://gjs.guide/guides/gio/file-operations.html#creating-files-and-folders

    但不知道如何从这里开始。

    为了清楚起见,我必须将值附加到文件中(之后,我将不得不删除一些行,尽管我还没有达到这一点)。

    0 回复  |  直到 3 年前
        1
  •  0
  •   Ahmad Ismail    3 年前

    OP在这里。解决方案是:

    const { Gio, GLib } = imports.gi;
    
    const ExtensionUtils = imports.misc.extensionUtils;
    const Me = ExtensionUtils.getCurrentExtension();
    const connection = Gio.DBus.session;
    var handlerId;
    
    class Extension {
        constructor() {
        }
    
        enable() {
    
            handlerId = connection.signal_subscribe(null, "org.gtk.gio.DesktopAppInfo", "Launched", "/org/gtk/gio/DesktopAppInfo", null, 0, _parseSignal);
    
            function _parseSignal(connection, sender, path, iface, signal, params) {
                log("Calling _parseSignal");
    
                var apppath = params.get_child_value(0).get_bytestring();
                var apppid = params.get_child_value(2).get_int64();
                var openedfilepath = params.get_child_value(3).get_strv();
    
                log("apppath : " + apppath);
                log("apppid : " + apppid);
                log("openedfilepath : " +  openedfilepath);
    
                const filepath = GLib.build_filenamev([GLib.get_home_dir(), 'test-file.txt']);
    
                const file = Gio.File.new_for_path(filepath);
    
                // const outputStreamCreate = file.create(Gio.FileCreateFlags.NONE, null);
                const outputStreamAppend = file.append_to(Gio.FileCreateFlags.NONE, null);
    
                var to_write = apppath + ' ' + apppid + ' ' + openedfilepath + '\n'
    
                const bytesWritten = outputStreamAppend.write_all(to_write, null);
            }
        }
    
        disable() {
            connection.signal_unsubscribe(handlerId);
            log(`disabling ${Me.metadata.name}`);
        }
    }
    
    function init() {
        log(`initializing ${Me.metadata.name}`);
    
        return new Extension();
    }
    
    推荐文章