stanza.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "stanza.h"
00015 #include "error.h"
00016 #include "jid.h"
00017 #include "util.h"
00018 #include "stanzaextension.h"
00019 #include "stanzaextensionfactory.h"
00020
00021 #include <cstdlib>
00022
00023 namespace gloox
00024 {
00025
00026 Stanza::Stanza( const JID& to )
00027 : m_xmllang( "default" ), m_to( to )
00028 {
00029 }
00030
00031 Stanza::Stanza( Tag* tag )
00032 : m_xmllang( "default" )
00033 {
00034 if( !tag )
00035 return;
00036
00037 m_from.setJID( tag->findAttribute( "from" ) );
00038 m_to.setJID( tag->findAttribute( "to" ) );
00039 m_id = tag->findAttribute( "id" );
00040 }
00041
00042 Stanza::~Stanza()
00043 {
00044 removeExtensions();
00045 }
00046
00047 const Error* Stanza::error() const
00048 {
00049 return findExtension<Error>( ExtError );
00050 }
00051
00052 void Stanza::addExtension( const StanzaExtension* se )
00053 {
00054 m_extensionList.push_back( se );
00055 }
00056
00057 const StanzaExtension* Stanza::findExtension( int type ) const
00058 {
00059 StanzaExtensionList::const_iterator it = m_extensionList.begin();
00060 for( ; it != m_extensionList.end() && (*it)->extensionType() != type; ++it ) ;
00061 return it != m_extensionList.end() ? (*it) : 0;
00062 }
00063
00064 void Stanza::removeExtensions()
00065 {
00066 util::clearList( m_extensionList );
00067 }
00068
00069 void Stanza::setLang( StringMap** map,
00070 std::string& defaultLang,
00071 const Tag* tag )
00072 {
00073 const std::string& lang = tag ? tag->findAttribute( "xml:lang" ) : EmptyString;
00074 setLang( map, defaultLang, tag ? tag->cdata() : EmptyString, lang );
00075 }
00076
00077 void Stanza::setLang( StringMap** map,
00078 std::string& defaultLang,
00079 const std::string& data,
00080 const std::string& xmllang )
00081 {
00082 if( data.empty() )
00083 return;
00084
00085 if( xmllang.empty() )
00086 defaultLang = data;
00087 else
00088 {
00089 if( !*map )
00090 *map = new StringMap();
00091 (**map)[xmllang] = data;
00092 }
00093 }
00094
00095 const std::string& Stanza::findLang( const StringMap* map,
00096 const std::string& defaultData,
00097 const std::string& lang )
00098 {
00099 if( map && lang != "default" )
00100 {
00101 StringMap::const_iterator it = map->find( lang );
00102 if( it != map->end() )
00103 return (*it).second;
00104 }
00105 return defaultData;
00106 }
00107
00108 void Stanza::getLangs( const StringMap* map,
00109 const std::string& defaultData,
00110 const std::string& name,
00111 Tag* tag )
00112 {
00113 if( !defaultData.empty() )
00114 new Tag( tag, name, defaultData );
00115
00116 if( !map )
00117 return;
00118
00119 StringMap::const_iterator it = map->begin();
00120 for( ; it != map->end(); ++it )
00121 {
00122 Tag* t = new Tag( tag, name, "xml:lang", (*it).first );
00123 t->setCData( (*it).second );
00124 }
00125 }
00126
00127 }