00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "jid.h"
00014 #include "prep.h"
00015 #include "gloox.h"
00016 #include "util.h"
00017
00018 namespace gloox
00019 {
00020
00021 bool JID::setJID( const std::string& jid )
00022 {
00023 if ( jid.empty() )
00024 {
00025 m_bare = m_full = m_server = m_username = m_serverRaw = m_resource = EmptyString;
00026 m_valid = false;
00027 return false;
00028 }
00029
00030 const std::string::size_type at = jid.find( '@' );
00031 const std::string::size_type slash = jid.find( '/', at == std::string::npos ? 0 : at );
00032
00033 if( at != std::string::npos && !( m_valid = prep::nodeprep( jid.substr( 0, at ), m_username ) ) )
00034 return false;
00035
00036 m_serverRaw = jid.substr( at == std::string::npos ? 0 : at + 1, slash - at - 1 );
00037 if( !( m_valid = prep::nameprep( m_serverRaw, m_server ) ) )
00038 return false;
00039
00040 if( slash != std::string::npos
00041 && !( m_valid = prep::resourceprep( jid.substr( slash + 1 ), m_resource ) ) )
00042 return false;
00043
00044 setStrings();
00045
00046 return m_valid;
00047 }
00048
00049 bool JID::setUsername( const std::string& uname )
00050 {
00051 m_valid = prep::nodeprep( uname, m_username );
00052 setStrings();
00053 return m_valid;
00054 }
00055
00056 bool JID::setServer( const std::string& serv )
00057 {
00058 m_serverRaw = serv;
00059 m_valid = prep::nameprep( m_serverRaw, m_server );
00060 setStrings();
00061 return m_valid;
00062 }
00063
00064 bool JID::setResource( const std::string& res )
00065 {
00066 m_valid = prep::resourceprep( res, m_resource );
00067 setFull();
00068 return m_valid;
00069 }
00070
00071 void JID::setFull()
00072 {
00073 m_full = bare();
00074 if( !m_resource.empty() )
00075 m_full += '/' + m_resource;
00076 }
00077
00078 void JID::setBare()
00079 {
00080 if( !m_username.empty() )
00081 m_bare = m_username + '@';
00082 else
00083 m_bare = EmptyString;
00084 m_bare += m_server;
00085 }
00086
00087 std::string JID::escapeNode( const std::string& node )
00088 {
00089 std::string escaped = node;
00090
00091 util::replaceAll( escaped, "\\", "\\5c" );
00092 util::replaceAll( escaped, " ", "\\20" );
00093 util::replaceAll( escaped, "\"", "\\22" );
00094 util::replaceAll( escaped, "&", "\\26" );
00095 util::replaceAll( escaped, "'", "\\27" );
00096 util::replaceAll( escaped, "/", "\\2f" );
00097 util::replaceAll( escaped, ":", "\\3a" );
00098 util::replaceAll( escaped, "<", "\\3c" );
00099 util::replaceAll( escaped, ">", "\\3e" );
00100 util::replaceAll( escaped, "@", "\\40" );
00101
00102 return escaped;
00103 }
00104
00105 std::string JID::unescapeNode( const std::string& node )
00106 {
00107 std::string unescaped = node;
00108
00109 util::replaceAll( unescaped, "\\20", " " );
00110 util::replaceAll( unescaped, "\\22", "\"" );
00111 util::replaceAll( unescaped, "\\26", "&" );
00112 util::replaceAll( unescaped, "\\27", "'" );
00113 util::replaceAll( unescaped, "\\2f", "/" );
00114 util::replaceAll( unescaped, "\\3a", ":" );
00115 util::replaceAll( unescaped, "\\3c", "<" );
00116 util::replaceAll( unescaped, "\\3e", ">" );
00117 util::replaceAll( unescaped, "\\40", "@" );
00118 util::replaceAll( unescaped, "\\5c", "\\" );
00119
00120 return unescaped;
00121 }
00122
00123 }