messagesession.cpp

00001 /*
00002   Copyright (c) 2005-2008 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 "messagesession.h"
00015 
00016 #include "messagefilter.h"
00017 #include "messagehandler.h"
00018 #include "clientbase.h"
00019 #include "disco.h"
00020 #include "stanza.h"
00021 #include "tag.h"
00022 
00023 namespace gloox
00024 {
00025 
00026   MessageSession::MessageSession( ClientBase *parent, const JID& jid, bool wantUpgrade, int types )
00027     : m_parent( parent ), m_target( jid ), m_messageHandler( 0 ),
00028       m_types( types ), m_wantUpgrade( wantUpgrade ), m_hadMessages( false )
00029   {
00030     if( m_parent )
00031       m_parent->registerMessageSession( this );
00032   }
00033 
00034   MessageSession::~MessageSession()
00035   {
00036     MessageFilterList::const_iterator it = m_messageFilterList.begin();
00037     for( ; it != m_messageFilterList.end(); ++it )
00038       delete (*it);
00039   }
00040 
00041   void MessageSession::handleMessage( Stanza *stanza )
00042   {
00043     if( m_wantUpgrade && stanza->from().bare() == m_target.full() )
00044       setResource( stanza->from().resource() );
00045 
00046     if( !m_hadMessages )
00047     {
00048       m_hadMessages = true;
00049       if( stanza->thread().empty() )
00050       {
00051         m_thread = "gloox" + m_parent->getID();
00052         stanza->setThread( m_thread );
00053       }
00054       else
00055         m_thread = stanza->thread();
00056     }
00057 
00058     MessageFilterList::const_iterator it = m_messageFilterList.begin();
00059     for( ; it != m_messageFilterList.end(); ++it )
00060     {
00061       (*it)->filter( stanza );
00062     }
00063 
00064     if( m_messageHandler && !stanza->body().empty() )
00065       m_messageHandler->handleMessage( stanza, this );
00066   }
00067 
00068   void MessageSession::send( const std::string& message, const std::string& subject )
00069   {
00070     if( !m_hadMessages )
00071     {
00072       m_thread = "gloox" + m_parent->getID();
00073       m_hadMessages = true;
00074     }
00075 
00076     Tag *m = new Tag( "message" );
00077     m->addAttribute( "type", "chat" );
00078     new Tag( m, "body", message );
00079     if( !subject.empty() )
00080       new Tag( m, "subject", subject );
00081 
00082     m->addAttribute( "from", m_parent->jid().full() );
00083     m->addAttribute( "to", m_target.full() );
00084     m->addAttribute( "id", m_parent->getID() );
00085     new Tag( m, "thread", m_thread );
00086 
00087     decorate( m );
00088 
00089     m_parent->send( m );
00090   }
00091 
00092   void MessageSession::send( Tag *tag )
00093   {
00094     m_parent->send( tag );
00095   }
00096 
00097   void MessageSession::decorate( Tag *tag )
00098   {
00099     MessageFilterList::const_iterator it = m_messageFilterList.begin();
00100     for( ; it != m_messageFilterList.end(); ++it )
00101     {
00102       (*it)->decorate( tag );
00103     }
00104   }
00105 
00106   void MessageSession::resetResource()
00107   {
00108     m_wantUpgrade = true;
00109     m_target.setResource( "" );
00110   }
00111 
00112   void MessageSession::setResource( const std::string& resource )
00113   {
00114     m_target.setResource( resource );
00115   }
00116 
00117   void MessageSession::registerMessageHandler( MessageHandler *mh )
00118   {
00119     m_messageHandler = mh;
00120   }
00121 
00122   void MessageSession::removeMessageHandler()
00123   {
00124     m_messageHandler = 0;
00125   }
00126 
00127   void MessageSession::registerMessageFilter( MessageFilter *mf )
00128   {
00129     m_messageFilterList.push_back( mf );
00130   }
00131 
00132   void MessageSession::removeMessageFilter( MessageFilter *mf )
00133   {
00134     m_messageFilterList.remove( mf );
00135   }
00136 
00137   void MessageSession::disposeMessageFilter( MessageFilter *mf )
00138   {
00139     removeMessageFilter( mf );
00140     delete mf;
00141   }
00142 
00143 }

Generated on Sun Apr 27 11:08:13 2008 for gloox by  doxygen 1.5.5