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 }