messagesession.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 #include "messagesession.h"
00014 #include "messagefilter.h"
00015 #include "messagehandler.h"
00016 #include "clientbase.h"
00017 #include "disco.h"
00018 #include "message.h"
00019 #include "util.h"
00020 
00021 namespace gloox
00022 {
00023 
00024   MessageSession::MessageSession( ClientBase* parent, const JID& jid, bool wantUpgrade, int types, bool honorTID )
00025     : m_parent( parent ), m_target( jid ), m_messageHandler( 0 ),
00026       m_types( types ), m_wantUpgrade( wantUpgrade ), m_hadMessages( false ), m_honorThreadID( honorTID )
00027   {
00028     if( m_parent )
00029       m_parent->registerMessageSession( this );
00030   }
00031 
00032   MessageSession::~MessageSession()
00033   {
00034     util::clearList( m_messageFilterList );
00035   }
00036 
00037   void MessageSession::handleMessage( Message& msg )
00038   {
00039     if( m_wantUpgrade && msg.from().bare() == m_target.full() )
00040       setResource( msg.from().resource() );
00041 
00042     if( !m_hadMessages )
00043     {
00044       m_hadMessages = true;
00045       if( msg.thread().empty() )
00046       {
00047         m_thread = "gloox" + m_parent->getID();
00048         msg.setThread( m_thread );
00049       }
00050       else
00051         m_thread = msg.thread();
00052     }
00053 
00054     MessageFilterList::const_iterator it = m_messageFilterList.begin();
00055     for( ; it != m_messageFilterList.end(); ++it )
00056       (*it)->filter( msg );
00057 
00058     if( m_messageHandler && !msg.body().empty() )
00059       m_messageHandler->handleMessage( msg, this );
00060   }
00061 
00062   void MessageSession::send( const std::string& message, const std::string& subject, const StanzaExtensionList& sel )
00063   {
00064     if( !m_hadMessages )
00065     {
00066       m_thread = "gloox" + m_parent->getID();
00067       m_hadMessages = true;
00068     }
00069 
00070     Message m( Message::Chat, m_target.full(), message, subject, m_thread );
00071     m.setID( m_parent->getID() );
00072     decorate( m );
00073 
00074     if( sel.size() )
00075     {
00076       StanzaExtensionList::const_iterator it = sel.begin();
00077       for( ; it != sel.end(); ++it )
00078         m.addExtension( (*it));
00079     }
00080 
00081     m_parent->send( m );
00082   }
00083 
00084   void MessageSession::send( const Message& msg )
00085   {
00086     m_parent->send( msg );
00087   }
00088 
00089   void MessageSession::decorate( Message& msg )
00090   {
00091     util::ForEach( m_messageFilterList, &MessageFilter::decorate, msg );
00092   }
00093 
00094   void MessageSession::resetResource()
00095   {
00096     m_wantUpgrade = true;
00097     m_target.setResource( EmptyString );
00098   }
00099 
00100   void MessageSession::setResource( const std::string& resource )
00101   {
00102     m_target.setResource( resource );
00103   }
00104 
00105   void MessageSession::disposeMessageFilter( MessageFilter* mf )
00106   {
00107     removeMessageFilter( mf );
00108     delete mf;
00109   }
00110 
00111 }

Generated by  doxygen 1.6.2