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 )
00025 : m_parent( parent ), m_target( jid ), m_messageHandler( 0 ),
00026 m_types( types ), m_wantUpgrade( wantUpgrade ), m_hadMessages( false )
00027 {
00028 if( m_parent )
00029 m_parent->registerMessageSession( this );
00030 }
00031
00032 MessageSession::~MessageSession()
00033 {
00034
00035
00036 MessageFilterList::iterator it = m_messageFilterList.begin();
00037 MessageFilterList::iterator it2;
00038 while( it != m_messageFilterList.end() )
00039 {
00040 it2 = it++;
00041 delete (*it2);
00042 m_messageFilterList.erase( it2 );
00043 }
00044
00045 }
00046
00047 void MessageSession::handleMessage( Message& msg )
00048 {
00049 printf( "MessageSession::handleMessage\n" );
00050 if( m_wantUpgrade && msg.from().bare() == m_target.full() )
00051 setResource( msg.from().resource() );
00052
00053 if( !m_hadMessages )
00054 {
00055 m_hadMessages = true;
00056 if( msg.thread().empty() )
00057 {
00058 m_thread = "gloox" + m_parent->getID();
00059 msg.setThread( m_thread );
00060 }
00061 else
00062 m_thread = msg.thread();
00063 }
00064
00065 MessageFilterList::const_iterator it = m_messageFilterList.begin();
00066 for( ; it != m_messageFilterList.end(); ++it )
00067 {
00068 (*it)->filter( msg );
00069 }
00070 printf( "body: %s\n", msg.body().c_str() );
00071 if( !m_messageHandler )
00072 printf( "got no m_messageHandler\n ");
00073 if( m_messageHandler && !msg.body().empty() )
00074 {
00075 printf( "calling messagehandler\n" );
00076 m_messageHandler->handleMessage( msg, this );
00077 }
00078 }
00079
00080 void MessageSession::send( const std::string& message, const std::string& subject )
00081 {
00082 if( !m_hadMessages )
00083 {
00084 m_thread = "gloox" + m_parent->getID();
00085 m_hadMessages = true;
00086 }
00087
00088 Message m( Message::Chat, m_target.full(), message, subject, m_thread );
00089 m.setID( m_parent->getID() );
00090 decorate( m );
00091 m_parent->send( m );
00092 }
00093
00094 void MessageSession::send( const Message& msg )
00095 {
00096 m_parent->send( msg );
00097 }
00098
00099 void MessageSession::decorate( Message& msg )
00100 {
00101 util::ForEach( m_messageFilterList, &MessageFilter::decorate, msg );
00102 }
00103
00104 void MessageSession::resetResource()
00105 {
00106 m_wantUpgrade = true;
00107 m_target.setResource( EmptyString );
00108 }
00109
00110 void MessageSession::setResource( const std::string& resource )
00111 {
00112 m_target.setResource( resource );
00113 }
00114
00115 void MessageSession::disposeMessageFilter( MessageFilter* mf )
00116 {
00117 removeMessageFilter( mf );
00118 delete mf;
00119 }
00120
00121 }