messageeventfilter.cpp

00001 /*
00002   Copyright (c) 2005-2006 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 "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 }

Generated on Sun Sep 24 21:57:32 2006 for gloox by  doxygen 1.4.7