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 if( ( m_messageEventHandler ) && stanza->hasChild( "x", "xmlns", XMLNS_X_EVENT ) )
00035 {
00036 if( stanza->body().empty() )
00037 {
00038 Tag *x = stanza->findChild( "x" );
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_requestedEvents = 0;
00053 Tag *x = stanza->findChild( "x" );
00054 if( x->hasChild( "offline" ) )
00055 m_requestedEvents |= MessageEventOffline;
00056 if( x->hasChild( "delivered" ) )
00057 m_requestedEvents |= MessageEventDelivered;
00058 if( x->hasChild( "displayed" ) )
00059 m_requestedEvents |= MessageEventDisplayed;
00060 if( x->hasChild( "composing" ) )
00061 m_requestedEvents |= MessageEventComposing;
00062 }
00063 }
00064 else if( stanza->body().empty() )
00065 {
00066 m_requestedEvents = 0;
00067 m_lastID = "";
00068 }
00069 }
00070
00071 void MessageEventFilter::raiseMessageEvent( MessageEventType event )
00072 {
00073 if( ( m_requestedEvents & event ) || ( event == MessageEventCancel ) )
00074 {
00075 Tag *m = new Tag( "message" );
00076 m->addAttribute( "to", m_parent->target().full() );
00077 Tag *x = new Tag( m, "x" );
00078 x->addAttribute( "xmlns", XMLNS_X_EVENT );
00079 new Tag( x, "id", m_lastID );
00080
00081 bool used = false;
00082 switch( event )
00083 {
00084 case MessageEventOffline:
00085 new Tag( x, "offline" );
00086 m_requestedEvents ^= event;
00087 used = true;
00088 break;
00089 case MessageEventDelivered:
00090 new Tag( x, "delivered" );
00091 m_requestedEvents ^= event;
00092 used = true;
00093 break;
00094 case MessageEventDisplayed:
00095 new Tag( x, "displayed" );
00096 m_requestedEvents ^= event;
00097 used = true;
00098 break;
00099 case MessageEventComposing:
00100 if( m_lastSent != MessageEventComposing )
00101 {
00102 new Tag( x, "composing" );
00103 used = true;
00104 }
00105 break;
00106 case MessageEventCancel:
00107 break;
00108 }
00109
00110 m_lastSent = event;
00111
00112 if( used )
00113 m_parent->send( m );
00114 else
00115 delete m;
00116 }
00117 }
00118
00119 void MessageEventFilter::decorate( Tag *tag )
00120 {
00121 if( m_defaultEvents != 0 )
00122 {
00123 Tag *x = new Tag( tag, "x" );
00124 x->addAttribute( "xmlns", XMLNS_X_EVENT );
00125
00126 if( m_defaultEvents & MessageEventOffline )
00127 new Tag( x, "offline" );
00128 if( m_defaultEvents & MessageEventDelivered )
00129 new Tag( x, "delivered" );
00130 if( m_defaultEvents & MessageEventDisplayed )
00131 new Tag( x, "displayed" );
00132 if( m_defaultEvents & MessageEventComposing )
00133 new Tag( x, "composing" );
00134 }
00135 m_lastSent = MessageEventCancel;
00136 }
00137
00138 void MessageEventFilter::registerMessageEventHandler( MessageEventHandler *meh )
00139 {
00140 m_messageEventHandler = meh;
00141 }
00142
00143 void MessageEventFilter::removeMessageEventHandler()
00144 {
00145 m_messageEventHandler = 0;
00146 }
00147
00148 }