首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代理处理程序上的g_signal_connect导致回调GVariant *数据未初始化

代理处理程序上的g_signal_connect导致回调GVariant *数据未初始化
EN

Stack Overflow用户
提问于 2019-02-08 16:14:42
回答 1查看 649关注 0票数 0

为了在dbus上设置Connman回调,我基本上遵循了https://www.freedesktop.org/software/gstreamer-sdk/data/docs/latest/gio/GDBusProxy.html上的示例,但是在我的回调函数中:

代码语言:javascript
复制
g_signal_connect(
        this->manager_proxy,
        "property-changed",
        G_CALLBACK(on_manager_properties_changed),
        this); //Pass in pointer to self so static function can operate on object.
g_signal_connect(
        this->manager_proxy,
        "technology-added",
        G_CALLBACK(on_manager_tech_added),
        this); //Pass in pointer to self so static function can operate on object.
g_signal_connect(
        this->manager_proxy,
        "technology-removed",
        G_CALLBACK(on_manager_tech_removed),
        this); //Pass in pointer to self so static function can operate on object

void
CM_InterfaceController::on_manager_properties_changed (
                       GDBusProxy          *proxy,
                       GVariant            *changed_properties,
                       const gchar* const  *invalidated_properties,
                       gpointer             user_data)
{
    if(!user_data){CM_ERR("NO THIS * on_manager_properties_changed");return;}
    CM_InterfaceController * ths = static_cast<CM_InterfaceController *>(user_data);
    std::cout<<"on_manager_properties_changed"<<std::endl;
    if(changed_properties){
        std::cout<<"children: "<<g_variant_n_children(changed_properties)<<std::endl;
    }    
}

我被告知GVariant *对象包含的孩子数是完全错误的。例如,我的反馈:

代码语言:javascript
复制
Calling Extraction
Service List Size: 1
Identified Ethernet Link: 
Path: /net/connman/service/ethernet_0800277d326e_cable
        Type: ethernet
        Sate: ready
        Favorite: 0
        Auto Connect: 0
        Name: Wired
        Net Mode: manual
        Iface: eth0
        Mac: 08:00:27:7D:32:6E
        IP Address: 10.0.2.15
        Net Mask: 255.255.255.0
on_manager_properties_changed
children: 139764141513856
on_manager_properties_changed
children: 145

on_manager_properties_changed儿童: 139764141513856 on_manager_properties_changed儿童:145个

这两个价值都偏离了大致的范围,其中一个比另一个更为显著。更重要的是,如果我试图解析出GVariant对象中的值,即使试图调用g_variant_get_type_string,也会导致seg错误。--为什么我的回调是带垃圾数据指针返回的?似乎是,如果它什么都没有,它至少应该返回一个空指针。

编辑: 源代码https://drive.google.com/file/d/1E0Kg9JKW54gghUHbVyBJ0ysBIdqBlpVA/view?usp=sharing

一些dbus监控系统的输出:

代码语言:javascript
复制
signal time=1549641357.679460 sender=:1.3 -> destination=(null destination) serial=488 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "State"
   variant       string "ready"
signal time=1549641357.680844 sender=:1.3 -> destination=(null destination) serial=489 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "Nameservers"
   variant       array [
         string "10.0.2.3"
      ]
signal time=1549641357.681186 sender=:1.3 -> destination=(null destination) serial=490 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "Domains"
   variant       array [
      ]
signal time=1549641357.681601 sender=:1.3 -> destination=(null destination) serial=491 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "Proxy"
   variant       array [
         dict entry(
            string "Method"
            variant                string "direct"
         )
      ]
signal time=1549641357.681780 sender=:1.3 -> destination=(null destination) serial=492 path=/net/connman/technology/ethernet; interface=net.connman.Technology; member=PropertyChanged
   string "Connected"
   variant       boolean true
signal time=1549641357.682210 sender=:1.3 -> destination=(null destination) serial=493 path=/; interface=net.connman.Manager; member=PropertyChanged
   string "State"
   variant       string "ready"
signal time=1549641357.696004 sender=:1.3 -> destination=(null destination) serial=494 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "IPv4"
   variant       array [
         dict entry(
            string "Method"
            variant                string "dhcp"
         )
      ]
signal time=1549641357.696227 sender=:1.3 -> destination=(null destination) serial=495 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "IPv4"
   variant       array [
         dict entry(
            string "Method"
            variant                string "dhcp"
         )
         dict entry(
            string "Address"
            variant                string "10.0.2.15"
         )
         dict entry(
            string "Netmask"
            variant                string "255.255.255.0"
         )
      ]
signal time=1549641357.696454 sender=:1.3 -> destination=(null destination) serial=496 path=/net/connman/service/ethernet_0800277d326e_cable; interface=net.connman.Service; member=PropertyChanged
   string "IPv4"
   variant       array [
         dict entry(
            string "Method"
            variant                string "dhcp"
         )
         dict entry(
            string "Address"
            variant                string "10.0.2.15"
         )
         dict entry(
            string "Netmask"
            variant                string "255.255.255.0"
         )
         dict entry(
            string "Gateway"
            variant                string "10.0.2.2"
         )
      ]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-08 20:47:58

弄明白了!

在我的XML文件中,我正在监视的信号是:

代码语言:javascript
复制
  <signal name="PropertyChanged">
     <arg name="name" type="s" />
     <arg name="value" type="v" />
  </signal>

在我试图弄清楚为什么freedesktop.org上的示例回调函数是相反的时候,我不得不修改以下内容:

代码语言:javascript
复制
static void on_manager_properties_changed (
                       GDBusProxy          *proxy,
                       GVariant            *changed_properties,
                       const gchar* const  *invalidated_properties,
                       gpointer             user_data);

至:

代码语言:javascript
复制
static void on_manager_properties_changed (
                       GDBusProxy          *proxy,
                       const gchar* const  *invalidated_properties, //(name)
                       GVariant            *changed_properties, //(value)
                       gpointer             user_data);

因此,类型=‘s’出现在回调函数中的类型=‘v’之前。之后一切都很好。我想,不管freedesktop的例子是什么信号,都可能是与我想要的不同的信息元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54596348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档