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