首页 > 解决方案 > 当使用 gdbus emit 发出信号时,Gio::DBus 的子类不会调用 on_signal()

问题描述

我正在尝试在 linux 上用 C++ 实现一个简单的 dbus 本地 IPC 示例。现在我想简单地处理一个在总线上发出的信号:

gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived

为了处理这个信号,我按照以下示例实现了一个简单的 dbus 应用程序:

https://github.com/GNOME/glibmm:
~/repos/glibmm/examples/dbus/client_bus_listnames.cc

这是应用程序源代码:

#include "giomm/asyncresult.h"
#include "glibmm/refptr.h"
#include "glibmm/ustring.h"
#include "sigc++/functors/ptr_fun.h"
#include <iostream>

using std::cout;

using gstr = Glib::ustring;
namespace gl = Glib;

// =================================
using str = std::string;

// =================================
#include <glibmm.h>
#include <giomm.h>

namespace gd = Gio::DBus;

class DBob : public gd::Proxy
{
public:

    DBob(gd::BusType bus_type,
        const Glib::ustring& busname,
        const Glib::ustring& object_path,
        const Glib::ustring& interface_name
        ): gd::Proxy (
                bus_type, busname, object_path, interface_name
              )
        {  }

protected:

    void on_signal(const Glib::ustring& sender_name,
            const Glib::ustring& signal_name,
            const Glib::VariantContainerBase& parameters) override
    {
        std::cout <<"on_signal\n";
    }
};

// =================================
str busname {"com.wp.sink"};
gd::BusType bustype = gd::BUS_TYPE_SYSTEM;
str objectpath {"/com/wp/sink"};
str ifname {busname};

// =================================
#include <memory>
template <typename T>
using uptr = std::unique_ptr<T>;
uptr<DBob> dbus_object{nullptr};

// main loop.
Glib::RefPtr<Glib::MainLoop> loop;

void run()
{
    dbus_object = std::make_unique<DBob>( bustype, busname, objectpath, ifname );
    std::cout << "running\n";
    loop->run();
}

void gioinit()
{
  Gio::init();
  loop = Glib::MainLoop::create();
}

int main()
{
    gioinit();
    run();

  return 0;
}

我的主要问题是当 gdbus发出信号时应用程序不会触发on_signal回调:

    gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived
    str busname {"com.wp.sink"};
    gd::BusType bustype = gd::BUS_TYPE_SYSTEM;
    str objectpath {"/com/wp/sink"};
    str ifname {busname};

我有点困惑gdbus emit不包含 busname 的参数,但我希望这可以工作,并且我正在尝试找到丢失的部分。

我会很感激任何建议。

标签: c++dbusgdbusglibmm

解决方案


推荐阅读