2015-03-02 20 views
0

我正嘗試使用Skype的DBus API來檢索已與聯繫人交換的消息列表(消息ID)。但是,SEARCH CHATMESSAGES <target>(協議> = 3)和SEARCH MESSAGES <target>(協議< 3)命令都會返回意外空結果。Skype通過DBus API返回空CHATMESSAGES結果

以下是我在API中進行的幾次交流的跟蹤。我使用d-feet來發送我的請求,但是當我從我自己的程序發送請求時,結果完全相同。

  • 總線名稱:com.Skype.API
  • 對象:/com/Skype
  • 接口:使用com.Skype.API
  • 方法:Invoke(String request)

跟蹤:

-> NAME dfeet 
<- OK 
-> PROTOCOL 8 
<- PROTOCOL 8 
-> SEARCH CHATMESSAGES mycontact 
<- 

的同樣的事情發生與另外兩個SEARCH命令:

  • SEARCH MESSAGES <target>(與PROTOCOL 2)。 GET CHAT <chat_id> GETMESSAGES
  • SEARCH CHATS

此外,當我嘗試請求基於聊天ID消息列表中我也得到一個空的結果。

然而,命令如SEARCH FRIENDSSEARCH CALLS,或SEARCH ACTIVECHATS工作得很好,並歸還其ID列表(聯繫人的ID,呼叫ID或聊天ID)的預期。

也許值得注意的是,無論我與他們交換了多少條消息,都會發生這種情況(我起初以爲可能會涉及太多的消息,但結果是一樣的,我是否向聯繫人發送了3封或數千封郵件)。

有什麼可以解釋爲什麼我通過DBus獲得這些空的響應,對於這些請求?

回答

2

Skype在回覆過重時不會使用Invoke的返回值。正因爲如此,當Skype有太多的數據準備和傳輸請求後,它會自動返回一個空字符串到Invoke調用。 真正的,重的答覆然後準備Skype異步和客戶端程序必須準備好接收它時,它最終到達。

每當您通過DBus與Skype進行通信時,您的應用程序必須同時充當客戶端(呼叫Invoke)和服務器(爲Skype提供一個DBus對象)。這種設計有點意外(我想我們可以在它的質量爭論),但這裏是它需要你做:

  1. 讓你的程序的DBus「服務器」(提供對象到達)。通過您的總線名稱到Skype,註冊一個名爲/com/Skype/Client的對象路徑,實現com.Skype.API.Client接口。
  2. 爲此接口的唯一方法準備一個消息處理程序:Notify(s)。 Skype將嘗試撥打這個方法,以便將您的重複回覆發送給您之前的某個請求。
  3. 編程您自己的機制,以便將您的Invoke請求與稍後作爲答案輸入的異步Notify消息相匹配。

對象的創建可以通過dbus_connection_register_object_path來完成,該參數分別是:

  • 代表您的總線名DBusConnection結構。
  • 您正在註冊的對象路徑,此處爲/com/Skype/Client
  • 用於處理所有傳入請求的消息處理程序表(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... 
} 

請注意,這只是一個對象的定義。爲了在Notify調用上實際上掛鉤,您必須在DBusWatch文件描述符上配置select(),並調用傳入的DBusMessage以便調用消息處理程序。

如果您正在使用其他綁定,您可能會發現更快的方式來設置對象並開始作爲客戶端應用程序工作。請參閱: