微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gio::DBus 的子类在使用 gdbus 发射信号时不调用 on_signal() 发射

如何解决Gio::DBus 的子类在使用 gdbus 发射信号时不调用 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,objectpath,ifname );
    std::cout << "running\n";
    loop->run();
}

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

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

  return 0;
}

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

    gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived
  • 以下是应用程序使用的 dbus 连接的详细信息:
    str busname {"com.wp.sink"};
    gd::BusType bustype = gd::BUS_TYPE_SYstem;
    str objectpath {"/com/wp/sink"};
    str ifname {busname};

我有点困惑 gdbus 发出 不包含 busname 的参数,但是 我希望这能奏效,我正在努力寻找缺失的部分。

如果您有任何建议,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。