messageeventfilter.cpp

00001 /*
00002   Copyright (c) 2005-2009 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
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 }

Generated by  doxygen 1.6.2