diff options
Diffstat (limited to 'Swiften/JID')
-rw-r--r-- | Swiften/JID/JID.cpp | 35 | ||||
-rw-r--r-- | Swiften/JID/JID.h | 10 |
2 files changed, 38 insertions, 7 deletions
diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp index 1bdf390..6af3c33 100644 --- a/Swiften/JID/JID.cpp +++ b/Swiften/JID/JID.cpp @@ -23,7 +23,11 @@ #include <Swiften/Base/String.h> #include <Swiften/JID/JID.h> -#include <Swiften/IDN/StringPrep.h> +#include <Swiften/IDN/IDNConverter.h> +#ifndef SWIFTEN_JID_NO_DEFAULT_IDN_CONVERTER +#include <boost/shared_ptr.hpp> +#include <Swiften/IDN/PlatformIDNConverter.h> +#endif using namespace Swift; @@ -38,6 +42,19 @@ static PrepCache resourcePrepCache; static const std::list<char> escapedChars = boost::assign::list_of(' ')('"')('&')('\'')('/')('<')('>')('@')(':'); +static IDNConverter* idnConverter = NULL; + +#ifndef SWIFTEN_JID_NO_DEFAULT_IDN_CONVERTER +namespace { + struct IDNInitializer { + IDNInitializer() : defaultIDNConverter(PlatformIDNConverter::create()) { + idnConverter = defaultIDNConverter.get(); + } + boost::shared_ptr<IDNConverter> defaultIDNConverter; + } initializer; +} +#endif + static std::string getEscaped(char c) { return makeString() << '\\' << std::hex << static_cast<int>(c); } @@ -164,9 +181,9 @@ void JID::nameprepAndSetComponents(const std::string& node, const std::string& d } try { #ifndef SWIFTEN_CACHE_JID_PREP - node_ = StringPrep::getPrepared(node, StringPrep::NamePrep); - domain_ = StringPrep::getPrepared(domain, StringPrep::XMPPNodePrep); - resource_ = StringPrep::getPrepared(resource, StringPrep::XMPPResourcePrep); + node_ = idnConverter->getStringPrepared(node, IDNConverter::NamePrep); + domain_ = idnConverter->getStringPrepared(domain, IDNConverter::XMPPNodePrep); + resource_ = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep); #else boost::mutex::scoped_lock lock(namePrepCacheMutex); @@ -174,19 +191,19 @@ void JID::nameprepAndSetComponents(const std::string& node, const std::string& d r = nodePrepCache.insert(std::make_pair(node, std::string())); if (r.second) { - r.first->second = StringPrep::getPrepared(node, StringPrep::NamePrep); + r.first->second = idnConverter->getStringPrepared(node, IDNConverter::NamePrep); } node_ = r.first->second; r = domainPrepCache.insert(std::make_pair(domain, std::string())); if (r.second) { - r.first->second = StringPrep::getPrepared(domain, StringPrep::XMPPNodePrep); + r.first->second = idnConverter->getStringPrepared(domain, IDNConverter::XMPPNodePrep); } domain_ = r.first->second; r = resourcePrepCache.insert(std::make_pair(resource, std::string())); if (r.second) { - r.first->second = StringPrep::getPrepared(resource, StringPrep::XMPPResourcePrep); + r.first->second = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep); } resource_ = r.first->second; #endif @@ -274,6 +291,10 @@ std::string JID::getUnescapedNode() const { //return boost::find_format_all_copy(node_, EscapedCharacterFinder(), EscapedCharacterFormatter()); } +void JID::setIDNConverter(IDNConverter* converter) { + idnConverter = converter; +} + std::ostream& operator<<(std::ostream& os, const JID& j) { os << j.toString(); return os; diff --git a/Swiften/JID/JID.h b/Swiften/JID/JID.h index ea4bd43..798860d 100644 --- a/Swiften/JID/JID.h +++ b/Swiften/JID/JID.h @@ -13,6 +13,8 @@ namespace Swift { + class IDNConverter; + /** * This represents the JID used in XMPP * (RFC6120 - http://tools.ietf.org/html/rfc6120 ). @@ -156,6 +158,14 @@ namespace Swift { return a.compare(b, Swift::JID::WithResource) != 0; } + + /** + * If Swiften was compiled with SWIFTEN_JID_NO_DEFAULT_IDN_CONVERTER (not default), use this method at + * the beginning of the program to set an IDN converter to use for JID IDN conversions. + * By default, this method shouldn't be used. + */ + static void setIDNConverter(IDNConverter*); + private: void nameprepAndSetComponents(const std::string& node, const std::string& domain, const std::string& resource); void initializeFromString(const std::string&); |