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

Generated on Tue May 1 14:20:20 2007 for gloox by  doxygen 1.5.1