Skype不会使用
Invoke
的返回值。
事实上,当Skype有太多的数据需要在请求后准备和传输时,它会自动向
援引
呼叫这个
真的,沉重的
然后,Skype异步地准备回复,客户端程序必须准备好在它最终到达时接收它。
每当您通过DBus与Skype通信时,您的应用程序必须同时充当客户端(呼叫
援引
),和服务器(为Skype提供DBus对象)。这个设计有点出乎意料(我想我们可能会对它的质量进行争论),但这是它需要你做的:
-
使您的程序成为DBus“服务器”(提供可访问的对象)。通过Skype的总线名称,注册一个名为
/com/Skype/Client
实施
com.Skype.API.Client
界面
-
为此接口的唯一方法准备消息处理程序:
Notify(s)
。这是Skype将尝试调用的方法,以向您发送对您先前请求的沉重答复。
-
编程自己的机制以匹配
援引
异步请求
Notify
稍后会有消息作为答复。
对象的创建可以通过
dbus_connection_register_object_path
,其参数为:
-
这个
DBusConnection
表示总线名称的结构。
-
您正在注册的对象路径,此处
/com/Skype/客户端
.
-
消息处理程序表(
DBusObjectPathVTable
)用于处理所有传入请求。
-
调用这些处理程序时要发送给它们的数据。
这是额外的数据,而不是实际收到的消息,因为您只是在这里设置处理程序。
例如。。。
DBusHandlerResult notify_handler(DBusConnection *connection,
DBusMessage *message,
void *user_data){
return DBUS_HANDLER_RESULT_HANDLED;
}
void unregister_handler(DBusConnection *connection,
void *user_data){}
DBusObjectPathVTable vtable = {
unregister_handler,
message_handler,
NULL
};
if(!dbus_connection_register_object_path(connection,
"/com/Skype/Client",
&vtable, NULL)){
// Error...
}
注意,这只是一个对象的定义。为了
钩
上
通知
电话,你必须
select()
在
DBusWatch
文件描述符,并分派传入的
DBusMessage
以便调用消息处理程序。
如果您正在使用其他绑定,您可能会找到更快的方法来设置对象并开始作为客户端应用程序工作。参见: