在DBUS
,XML
文件中,如果我提供以下代码,为什么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;
答案 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调用,而不是调用方法的结果。