00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "messageeventfilter.h"
00015 #include "messageeventhandler.h"
00016 #include "messagesession.h"
00017 #include "stanza.h"
00018
00019 namespace gloox
00020 {
00021
00022 MessageEventFilter::MessageEventFilter( MessageSession *parent, int defaultEvents )
00023 : MessageFilter( parent ), m_messageEventHandler( 0 ), m_requestedEvents( 0 ),
00024 m_defaultEvents( defaultEvents ), m_lastSent( MessageEventCancel )
00025 {
00026 }
00027
00028 MessageEventFilter::~MessageEventFilter()
00029 {
00030 }
00031
00032 void MessageEventFilter::filter( Stanza *stanza )
00033 {
00034 Tag *x = stanza->findChild( "x", "xmlns", XMLNS_X_EVENT );
00035 if( x && m_messageEventHandler )
00036 {
00037 if( stanza->body().empty() )
00038 {
00039 if( x->hasChild( "offline" ) )
00040 m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventOffline );
00041 else if( x->hasChild( "delivered" ) )
00042 m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventDelivered );
00043 else if( x->hasChild( "displayed" ) )
00044 m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventDisplayed );
00045 else if( x->hasChild( "composing" ) )
00046 m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventComposing );
00047 else
00048 m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventCancel );
00049 }
00050 else
00051 {
00052 m_lastID = stanza->findAttribute( "id" );
00053 m_requestedEvents = 0;
00054 Tag *x = stanza->findChild( "x" );
00055 if( x->hasChild( "offline" ) )
00056 m_requestedEvents |= MessageEventOffline;
00057 if( x->hasChild( "delivered" ) )
00058 m_requestedEvents |= MessageEventDelivered;
00059 if( x->hasChild( "displayed" ) )
00060 m_requestedEvents |= MessageEventDisplayed;
00061 if( x->hasChild( "composing" ) )
00062 m_requestedEvents |= MessageEventComposing;
00063 }
00064 }
00065 else if( stanza->body().empty() )
00066 {
00067 m_requestedEvents = 0;
00068 m_lastID = "";
00069 }
00070 }
00071
00072 void MessageEventFilter::raiseMessageEvent( MessageEventType event )
00073 {
00074 if( ( m_requestedEvents & event ) || ( event == MessageEventCancel ) )
00075 {
00076 Tag *m = new Tag( "message" );
00077 m->addAttribute( "to", m_parent->target().full() );
00078 Tag *x = new Tag( m, "x" );
00079 x->addAttribute( "xmlns", XMLNS_X_EVENT );
00080 new Tag( x, "id", m_lastID );
00081
00082 bool used = true;
00083 switch( event )
00084 {
00085 case MessageEventOffline:
00086 new Tag( x, "offline" );
00087 m_requestedEvents ^= event;
00088 break;
00089 case MessageEventDelivered:
00090 new Tag( x, "delivered" );
00091 m_requestedEvents ^= event;
00092 break;
00093 case MessageEventDisplayed:
00094 new Tag( x, "displayed" );
00095 m_requestedEvents ^= event;
00096 break;
00097 case MessageEventComposing:
00098 if( m_lastSent != MessageEventComposing )
00099 new Tag( x, "composing" );
00100 else
00101 used = false;
00102 break;
00103 case MessageEventCancel:
00104 break;
00105 }
00106
00107 m_lastSent = event;
00108
00109 if( used )
00110 m_parent->send( m );
00111 else
00112 delete m;
00113 }
00114 }
00115
00116 void MessageEventFilter::decorate( Tag *tag )
00117 {
00118 if( m_defaultEvents != 0 )
00119 {
00120 Tag *x = new Tag( tag, "x" );
00121 x->addAttribute( "xmlns", XMLNS_X_EVENT );
00122
00123 if( m_defaultEvents & MessageEventOffline )
00124 new Tag( x, "offline" );
00125 if( m_defaultEvents & MessageEventDelivered )
00126 new Tag( x, "delivered" );
00127 if( m_defaultEvents & MessageEventDisplayed )
00128 new Tag( x, "displayed" );
00129 if( m_defaultEvents & MessageEventComposing )
00130 new Tag( x, "composing" );
00131 }
00132 m_lastSent = MessageEventCancel;
00133 }
00134
00135 void MessageEventFilter::registerMessageEventHandler( MessageEventHandler *meh )
00136 {
00137 m_messageEventHandler = meh;
00138 }
00139
00140 void MessageEventFilter::removeMessageEventHandler()
00141 {
00142 m_messageEventHandler = 0;
00143 }
00144
00145 }