diff options
Diffstat (limited to 'Swiften/IDN/StringPrep.cpp')
| -rw-r--r-- | Swiften/IDN/StringPrep.cpp | 53 | 
1 files changed, 33 insertions, 20 deletions
| diff --git a/Swiften/IDN/StringPrep.cpp b/Swiften/IDN/StringPrep.cpp index ff01eed..140e130 100644 --- a/Swiften/IDN/StringPrep.cpp +++ b/Swiften/IDN/StringPrep.cpp @@ -4,37 +4,50 @@   * See Documentation/Licenses/GPLv3.txt for more information.   */ -#include "Swiften/IDN/StringPrep.h" +#include <Swiften/IDN/StringPrep.h>  #include <stringprep.h>  #include <vector>  #include <cassert> +#include <Swiften/Base/SafeAllocator.h> -namespace Swift { +using namespace Swift; + +	namespace { +	static const int MAX_STRINGPREP_SIZE = 1024; -static const int MAX_STRINGPREP_SIZE = 1024; +	const Stringprep_profile* getLibIDNProfile(StringPrep::Profile profile) { +		switch(profile) { +			case StringPrep::NamePrep: return stringprep_nameprep; break; +			case StringPrep::XMPPNodePrep: return stringprep_xmpp_nodeprep; break; +			case StringPrep::XMPPResourcePrep: return stringprep_xmpp_resourceprep; break; +			case StringPrep::SASLPrep: return stringprep_saslprep; break; +		} +		assert(false); +		return 0; +	} -const Stringprep_profile* getLibIDNProfile(StringPrep::Profile profile) { -	switch(profile) { -		case StringPrep::NamePrep: return stringprep_nameprep; break; -		case StringPrep::XMPPNodePrep: return stringprep_xmpp_nodeprep; break; -		case StringPrep::XMPPResourcePrep: return stringprep_xmpp_resourceprep; break; -		case StringPrep::SASLPrep: return stringprep_saslprep; break; +	template<typename StringType, typename ContainerType> +	ContainerType getStringPrepared(const StringType& s, StringPrep::Profile profile) { +		ContainerType input(s.begin(), s.end()); +		input.resize(MAX_STRINGPREP_SIZE); +		if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), getLibIDNProfile(profile)) == 0) { +			return input; +		} +		else { +			return ContainerType(); +		}  	} -	assert(false); -	return 0;  } +namespace Swift { +  std::string StringPrep::getPrepared(const std::string& s, Profile profile) { -	 -	std::vector<char> input(s.begin(), s.end()); -	input.resize(MAX_STRINGPREP_SIZE); -	if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), getLibIDNProfile(profile)) == 0) { -		return std::string(&input[0]); -	} -	else { -		return ""; -	} +	return std::string(vecptr(getStringPrepared< std::string, std::vector<char> >(s, profile))); +} + +SafeByteArray StringPrep::getPrepared(const SafeByteArray& s, Profile profile) { +	return createSafeByteArray(reinterpret_cast<const char*>(vecptr(getStringPrepared<SafeByteArray, std::vector<char, SafeAllocator<char> > >(s, profile))));  }  } | 
 Swift
 Swift