messagesession.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 "messagesession.h"
00015 
00016 #include "messagefilter.h"
00017 #include "clientbase.h"
00018 #include "client.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 )
00027     : m_parent( parent ), m_target( jid ), m_messageHandler( 0 ), m_wantUpgrade( wantUpgrade )
00028   {
00029     if( m_parent )
00030       m_parent->registerMessageHandler( m_target.full(), this, wantUpgrade );
00031 
00032     m_thread = "gloox" + m_parent->getID();
00033   }
00034 
00035   MessageSession::~MessageSession()
00036   {
00037     if( m_parent )
00038       m_parent->removeMessageHandler( m_target.full() );
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     MessageFilterList::const_iterator it = m_messageFilterList.begin();
00047     for( ; it != m_messageFilterList.end(); ++it )
00048     {
00049       (*it)->filter( stanza );
00050     }
00051 
00052     if( !m_messageHandler || stanza->body().empty() )
00053       return;
00054     else
00055       m_messageHandler->handleMessage( stanza );
00056   }
00057 
00058   void MessageSession::send( const std::string& message, const std::string& subject )
00059   {
00060     Tag *m = new Tag( "message" );
00061     m->addAttribute( "type", "chat" );
00062     new Tag( m, "body", message );
00063     if( !subject.empty() )
00064       new Tag( m, "subject", subject );
00065 
00066     m->addAttribute( "from", m_parent->jid().full() );
00067     m->addAttribute( "to", m_target.full() );
00068     new Tag( m, "thread", m_thread );
00069 
00070     MessageFilterList::const_iterator it = m_messageFilterList.begin();
00071     for( ; it != m_messageFilterList.end(); ++it )
00072     {
00073       (*it)->decorate( m );
00074     }
00075 
00076     m_parent->send( m );
00077   }
00078 
00079   void MessageSession::send( Tag *tag )
00080   {
00081     m_parent->send( tag );
00082   }
00083 
00084   void MessageSession::setResource( const std::string& resource )
00085   {
00086     m_parent->removeMessageHandler( m_target.full() );
00087     m_target.setResource( resource );
00088     m_parent->registerMessageHandler( m_target.full(), this, false );
00089   }
00090 
00091   void MessageSession::registerMessageHandler( MessageHandler *mh )
00092   {
00093     m_messageHandler = mh;
00094   }
00095 
00096   void MessageSession::removeMessageHandler()
00097   {
00098     m_messageHandler = 0;
00099   }
00100 
00101   void MessageSession::registerMessageFilter( MessageFilter *mf )
00102   {
00103     m_messageFilterList.push_back( mf );
00104   }
00105 
00106   void MessageSession::removeMessageFilter( MessageFilter *mf )
00107   {
00108     m_messageFilterList.remove( mf );
00109   }
00110 
00111 }

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