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