gloox 之 MessageSession

MessageSession類對象是任意兩個實體之間消息會話的抽象。

詳細說明:
MessageSession是原始態和老式消息會話形式的一種替代。
原始的接口,它使用簡單MessageHandler類的派生類,是基於一種全有或全無的方法。
一旦用ClientBase對象註冊此原始接口,則此MessageHandler的派生類會收到發給此ClientBase對象所有的消息節(message stanza),並且不得不自己對消息節進行過慮。
MessageSession向聊天會話中增加了一種抽象。一個MessageSession對象只對一個全JID負責。
此MessageSession對象可以被稱作消息過慮器(messageFilters)擴展,以提供另外的功能,

比如:消息事件(MessageEvents), 聊天狀態通知(ChatState),或帶內字節數據流。

你可以依然使用老式的MessageHandler類,

但是消息不會一起傳遞到MessageHandler和爲那個JID創建的一個MessageSession對象中,
即消息只會遞進其中之一,MessageSession具有較高的優先級,消息被傳遞其中,

而MessageHandler則不會傳進消息。

使用MessageSession比使用老式的MessageHandler有如下優點:
1、MessageSession對象自動創建。
2、以JID過慮
3、消息跟蹤(thread id)的自動處理
4、簡單的消息發送
5、支持消息過慮器(MessageFilters)
用法:
從MessageSessionHandler派生一個對象,重寫handleMessageSession()函數在某種結構中存儲新的會話,或創建一個新的聊天窗口,或其它。

然後用ClientBase對象的registerMessageSessionHandler()函數註冊此對象。例:


void MyClass::myFunc()
 {
   JID jid( "[email protected]/gloox" );
   j = new Client( jid, "password" );          //以前說過,Client繼承自ClientBase類
   [...]
   j->registerMessageSessionHandler( this, 0 );
 }

此時 MyClasss 就是一個MessageSessionHandler。
例子中,MyClass也需要MessageHandler,MessageEventHandler和ChatStateHandler。
以上三種處理器被MessageSession對象註冊用來處理各自的事件

virtual void MyClass::handleMessageSession( MessageSession *session )
 {
   // for this example only, we delete any earlier session
   if( m_session )
     j->disposeMessageSession( m_session );
   m_session = session;
   m_session->registerMessageHandler( this );

   // the following is optional
   m_messageEventFilter = new MessageEventFilter( m_session );
   m_messageEventFilter->registerMessageEventHandler( this );
   m_chatStateFilter = new ChatStateFilter( m_session );
   m_chatStateFilter->registerChatStateHandler( this );
 }


當消息事件(Message Events)和聊天狀態(Chat States)到達時,
MessageEventHandler::handleMessageEvent()和chatStateHandler::handleChatState()就會分別被調用。

 virtual void MyClass::handleMessageEvent( const JID& from, MessageEventType event )
 {
   // display contact's Message Event
 }

 virtual void MyClass::handleChatState( const JID& from, ChatStateType state )
 {
   // display contact's Chat State
 }

想要讓好友知道自己正在輸入信息或己經關閉聊天窗口,

則需要分別調用raiseMessageEvent()和setChatState()函數即可,例如:


// user is typing a message
 m_messageEventFilter->raiseMessageEvent( MessageEventComposing );

 // acknowledge receiving of a message
 m_messageEventFilter->raiseMessageEvent( MessageEventDelivered );

 // user is not actively paying attention to the chat
 m_chatStateFilter->setChatState( ChatStateInactive );

 // user has closed the chat window
 m_chatStateFilter->setChatState( ChatStateGone );

向一個MessageSession代表的一個好友聊天會話發送消息,

使用send(const std::string& message,const std::string& subject)函數。
你不必關心消息頭,消息追蹤(thread id),這些都是自動添加的。


m_session->send( "Hello World!", "No Subject" );

初始化一個聊天會話(chat session),你所做的所有工作就是創建一個MessageSession對象,

並且用它註冊一個MessageHandler對象:
MessageSession* MyClass::newSession( const JID& to )
{
   MessageSession *session = new MessageSession( m_client, to );
   session->registerMessageHandler( this );
   return session;
}


關於帶內字節流(In-Band Bytestreams)的實現方法,參考InBandBytestreamManager類.
 
注意:你永遠不要手工刪除一個MessageSession對象,

而是調用ClientBase::disposeMessageSession()來完成這個工作.
 


MessageSession(  ClientBase*     parent,
                            const JID&      jid,
                            bool                wantUpgrade = true;
                            int                   types = 0
)
爲給定的JID創建一個MessageSession對象.建議提供一個全JID,也即是,它需要設置一個資源.
如果沒有設定資源將導致一個異常.一個消息跟蹤(thread id)將被創建並且在整個會話過程中都會與每一個消息一起發送.
參數:
parent    進行通信的ClientBase對象
jid       遠程聯繫人的全Jid。如果你不知道對方的全Jid(大概是普遍情況),

           但又想用MessageSession迴應此聯繫人,那麼把wantUpgrade參數
          設爲true(或不更改它,即默認true)
wantUpgrade  標示gloox是否儘量匹配發到此MessageSession的一個全JID發來的消息。

                     如果不確定,請使用默認值。
             MesssageSession對象直接與服務器通信或一個沒有資源的組件JID,

            這可能是唯一不使用默認值的場合。
             這樣的“提升(upgrade)”只發生一次 。
types     這個MessageSession對象應該接收的子節類型(StanzaSubType)列表的值。

             只有StanzaMessage* 類型有效。
            默認值0,指所有類型都被接收。

void disposeMessageFilter(MessageFilter *mf)
 從MessageSession對象中刪除一個MessageFilter(消息過濾器)。
  (譯註:ChatStateFilter, InBandBytestream,  MessageEventFilter 都繼承自MessageFilter)
參數:
    mf   要移除和釋放的 MessageFilter對象
注:如果只是移除(不釋放)MessageFilter對象,則使用removeMessageFilter()函數。

void  registerMessageFilter(MessageFilter* mf)
使用此函數向MessageSession對象中註冊一個新的MessageFilter對象。此過濾器有能力讀取和(/或)修改一個消息節的內容。
注意:
    此MessageSession對象將成爲此過濾器的宿主,過濾器對象被MessageSession的析構函數刪除。
    如果在MessageSession銷燬之前,之前擺脫此過濾器,則調用disposeMessageFilter()。


void removeMessageFilter(MessageFilter * mf)
從MessageSession中移除一個MessageFilter對象。

void  registerMessageHandler(MessageHandler* mh)
此函數使MessageSession和一個MessageHandler對象聯合起來。此MessageHandler將要收到此MessageSession遠程聯繫人發來的所有消息。

void removeMessageHandler()
此函數將清除內部指針指向的MesssageHandler對象。並且使消息的遞送無效。

void resetResource()
此函數重置會話的目標JID,重置成隨後發送消息發往的那個JID。服務器確定要遞送的最好資源(the server will determine the best resource to deliver to)。當目標資源改變出席時(如,離開

或下線)有用。(原句:This function resets the session's target JID to its bare form such that subsequently sent messages will be sent to that bare JID. The server will

determine the best resource to deliver to. Useful if the target resource changed presence to e.g. away or offline.)

void send( const std::string & message,
           const std::string & subject=""
)
快速地發送一條消息(可選擇地,下屬內容(subject)),比較方便。這是從MessageSession發送消息的首選方法。
參數:
message 將要發送的消息串
subject 可選擇的,將要發送的下屬內容

void setThreadID( const std::string & thread)
設定一個消息跟蹤的ID值,例如,如果繼續一個特殊的消息跟蹤。不必手動地設置消息跟蹤ID值。


const std::string& threadID()const
默認情況下,一個消息跟蹤ID和每條消息一起發送。
返回此會話對象的消息跟蹤ID值。

const JID& targer()const
返回此會話遠客聯繫人的JID

int types()const
返回此MessageSession對象(即會話對象)要接收的消息類型列表。只對StanzaMessage* 類型有效。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/night_cat/archive/2009/06/03/4240306.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章