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

时间:2019-02-08 16:14:42

标签: glib dbus gdbus connman

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

concatenated_data['A'].count()

告诉我GVariant *对象包含的子代数完全错误。例如,我的反馈:

category    count
standard    0
quad        0
family      0
barkada     0

on_manager_properties_changed     儿童:139764141513856     on_manager_properties_changed     儿童:145

这两个值都偏离了标准,一个比另一个更重要。更重要的是,如果我尝试从GVariant对象中解析出这些值,那么即使尝试调用g_variant_get_type_string也会导致seg错误。 为什么我的回调函数返回的都是垃圾数据指针?似乎没有任何内容,至少应该返回空指针。

修改:Source Code https://drive.google.com/file/d/1E0Kg9JKW54gghUHbVyBJ0ysBIdqBlpVA/view?usp=sharing

一些dbus-monitor --system输出:

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;
    }    
}

Capture of object in memory

1 个答案:

答案 0 :(得分:1)

解决了!

在我的XML文件中,我正在注意的信号是:

  <signal name="PropertyChanged">
     <arg name="name" type="s" />
     <arg name="value" type="v" />
  </signal>

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

static void on_manager_properties_changed (
                       GDBusProxy          *proxy,
                       GVariant            *changed_properties,
                       const gchar* const  *invalidated_properties,
                       gpointer             user_data);

收件人:

static void on_manager_properties_changed (
                       GDBusProxy          *proxy,
                       const gchar* const  *invalidated_properties, //(name)
                       GVariant            *changed_properties, //(value)
                       gpointer             user_data);

这样,在回调函数中,type =的出现在type ='v'之前。之后,一切都很好。我认为,无论freedesktop的示例正在观看什么信号,它可能都是与我想要的信息不同的元素。