summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2012-12-13 13:35:53 (GMT)
committerRemko Tronçon <git@el-tramo.be>2013-04-06 20:22:02 (GMT)
commit9eff25182d1bea576d1910200909384ce79d90fe (patch)
treef5dadbce5fa2c37c34fcc6bb32550e6930abce14 /Swiften/JID/JID.cpp
parente9f2f7675b11ce36b3f66250156b78fae524a351 (diff)
downloadswift-9eff25182d1bea576d1910200909384ce79d90fe.zip
swift-9eff25182d1bea576d1910200909384ce79d90fe.tar.bz2
Make IDN implementation abstract.
Change-Id: I4c64f954ddeca7147d729b8be07237baa15c1795
Diffstat (limited to 'Swiften/JID/JID.cpp')
-rw-r--r--Swiften/JID/JID.cpp35
1 files changed, 28 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;