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 "message.h"
00018 #include "messageevent.h"
00019 #include "error.h"
00020
00021 namespace gloox
00022 {
00023
00024 MessageEventFilter::MessageEventFilter( MessageSession* parent )
00025 : MessageFilter( parent ), m_messageEventHandler( 0 ), m_requestedEvents( 0 ),
00026 m_lastSent( MessageEventCancel ), m_disable( false )
00027 {
00028 }
00029
00030 MessageEventFilter::~MessageEventFilter()
00031 {
00032 }
00033
00034 void MessageEventFilter::filter( Message& msg )
00035 {
00036 if( m_disable || !m_messageEventHandler )
00037 return;
00038
00039 if( msg.subtype() == Message::Error )
00040 {
00041 if( msg.error() && msg.error()->error() == StanzaErrorFeatureNotImplemented )
00042 m_disable = true;
00043
00044 return;
00045 }
00046
00047 const MessageEvent* me = msg.findExtension<MessageEvent>( ExtMessageEvent );
00048 if( !me )
00049 {
00050 m_requestedEvents = 0;
00051 m_lastID = EmptyString;
00052 return;
00053 }
00054
00055 if( msg.body().empty() )
00056 m_messageEventHandler->handleMessageEvent( msg.from(), (MessageEventType)me->event() );
00057 else
00058 {
00059 m_lastID = msg.id();
00060 m_requestedEvents = 0;
00061 m_requestedEvents = me->event();
00062 }
00063 }
00064
00065 void MessageEventFilter::raiseMessageEvent( MessageEventType event )
00066 {
00067 if( m_disable || ( !( m_requestedEvents & event ) && ( event != MessageEventCancel ) ) )
00068 return;
00069
00070 switch( event )
00071 {
00072 case MessageEventOffline:
00073 case MessageEventDelivered:
00074 case MessageEventDisplayed:
00075 m_requestedEvents &= ~event;
00076 break;
00077 case MessageEventComposing:
00078 if( m_lastSent == MessageEventComposing )
00079 return;
00080 break;
00081 case MessageEventCancel:
00082 default:
00083 break;
00084 }
00085
00086 m_lastSent = event;
00087 Message m( Message::Normal, m_parent->target() );
00088 m.addExtension( new MessageEvent( event, m_lastID ) );
00089 send( m );
00090 }
00091
00092 void MessageEventFilter::decorate( Message& msg )
00093 {
00094 if( m_disable )
00095 return;
00096
00097 msg.addExtension( new MessageEvent( MessageEventOffline | MessageEventDelivered |
00098 MessageEventDisplayed | MessageEventComposing ) );
00099 m_lastSent = MessageEventCancel;
00100 }
00101
00102 void MessageEventFilter::registerMessageEventHandler( MessageEventHandler* meh )
00103 {
00104 m_messageEventHandler = meh;
00105 }
00106
00107 void MessageEventFilter::removeMessageEventHandler()
00108 {
00109 m_messageEventHandler = 0;
00110 }
00111
00112 }