DBUS返回值

时间:2013-03-22 07:29:43

标签: xml dbus

DBUSXML文件中,如果我提供以下代码,为什么proxy会生成void返回类型的函数?

    <method name="getLocalTime">
        <arg type="s" name="timeString" direction="out" />
        <arg type="s" name="dateString" direction="out" />
    </method>


virtual void getMyTime(std::string& time, std::string& date) = 0;

1 个答案:

答案 0 :(得分:1)

在DBus中,方法调用的输出通过参数列表传递,而不是传统的C函数返回机制。此外,如果该方法不是异步的,则只允许返回单个true / false布尔结果(在经典C函数返回样式中返回)。在内省中,必须将此方法注释为异步,因为它返回多个字符串值。您的代理方法调用将传递指向两个字符串变量的指针以接收结果。

如果我使用dbus-glib作为例子......

<method name="getLocalTime">
    <arg type="s" name="timeString" direction="out" />
    <arg type="s" name="dateString" direction="out" />
    <annotate name="org.freedesktop.DBus.GLib.Async" />
</method>

然后在我实施该方法......

void 
dbus_service_get_local_time( 
    MyGObject* self, 
    DBusGMethodInvocation* context 
)
{
    char* timeString;
    char* dateString;

    // do stuff to create your two strings...

    dbus_g_method_return( context, timeString, dateString );

    // clean up allocated memory, etc...
}

从调用者的角度来看,代理方法调用看起来像这样......

gboolean 
dbus_supplicant_get_local_time( 
    DBusProxy* proxy, 
    char* OUT_timeString, 
    char* OUT_dateString, 
    GError** error 
);

请注意,在代理方法中,gboolean结果是是否可以进行D-Bus调用,而不是调用方法的结果。