gloox 1.0
|
00001 /* 00002 Copyright (c) 2005-2009 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 #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 }