00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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 }