gloox 1.0
jid.cpp
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 "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 }