uniquemucroom.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "uniquemucroom.h"
00016 #include "clientbase.h"
00017 #include "jid.h"
00018 #include "sha.h"
00019
00020 namespace gloox
00021 {
00022
00023
00024 UniqueMUCRoom::Unique::Unique( const Tag* tag )
00025 : StanzaExtension( ExtMUCUnique )
00026 {
00027 if( !tag || tag->name() != "unique" || tag->xmlns() != XMLNS_MUC_UNIQUE )
00028 return;
00029
00030 m_name = tag->cdata();
00031 }
00032
00033 const std::string& UniqueMUCRoom::Unique::filterString() const
00034 {
00035 static const std::string filter = "/iq/unique[@xmlns='" + XMLNS_MUC_UNIQUE + "']";
00036 return filter;
00037 }
00038
00039 Tag* UniqueMUCRoom::Unique::tag() const
00040 {
00041 Tag* t = new Tag( "unique" );
00042 t->setXmlns( XMLNS_MUC_UNIQUE );
00043 if( !m_name.empty() )
00044 t->setCData( m_name );
00045 return t;
00046 }
00047
00048
00049
00050 UniqueMUCRoom::UniqueMUCRoom( ClientBase* parent, const JID& nick, MUCRoomHandler* mrh )
00051 : InstantMUCRoom( parent, nick, mrh )
00052 {
00053 if( m_parent )
00054 {
00055 m_parent->registerStanzaExtension( new Unique() );
00056 }
00057 }
00058
00059 UniqueMUCRoom::~UniqueMUCRoom()
00060 {
00061 if( m_parent )
00062 {
00063 m_parent->removeIDHandler( this );
00064
00065 }
00066 }
00067
00068 void UniqueMUCRoom::join()
00069 {
00070 if( !m_parent || m_joined )
00071 return;
00072
00073 IQ iq( IQ::Get, m_nick.server() );
00074 iq.addExtension( new Unique() );
00075 m_parent->send( iq, this, RequestUniqueName );
00076 }
00077
00078 void UniqueMUCRoom::handleIqID( const IQ& iq, int context )
00079 {
00080 switch( iq.subtype() )
00081 {
00082 case IQ::Result:
00083 if( context == RequestUniqueName )
00084 {
00085 const Unique* u = iq.findExtension<Unique>( ExtMUCUnique );
00086 if( u )
00087 {
00088 if( !u->name().empty() )
00089 setName( u->name() );
00090 }
00091 }
00092 break;
00093 case IQ::Error:
00094 if( context == RequestUniqueName )
00095 {
00096 SHA s;
00097 s.feed( m_parent->jid().full() );
00098 s.feed( m_parent->getID() );
00099 setName( s.hex() );
00100 }
00101 break;
00102 default:
00103 break;
00104 }
00105
00106 MUCRoom::join();
00107 }
00108
00109 }