From 2df5e148de44c6c91c5a28d197b8b2b913ca80d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sun, 22 Nov 2009 11:21:50 +0100
Subject: Moved stringprepping to a separate module.


diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp
index dcd6dd1..3be8386 100644
--- a/Swiften/JID/JID.cpp
+++ b/Swiften/JID/JID.cpp
@@ -3,40 +3,10 @@
 #include <iostream>
 
 #include "Swiften/JID/JID.h"
+#include "Swiften/StringPrep/StringPrep.h"
 
 namespace Swift {
 
-
-class StringPrepper {
-	private:
-		static const int MAX_STRINGPREP_SIZE = 1024;
-
-	public:
-		static String getNamePrepped(const String& name) {
-			return getStringPrepped(name, stringprep_nameprep);
-		}
-
-		static String getNodePrepped(const String& node) {
-			return getStringPrepped(node, stringprep_xmpp_nodeprep);
-		}
-
-		static String getResourcePrepped(const String& resource) {
-			return getStringPrepped(resource, stringprep_xmpp_resourceprep);
-		}
-
-		static String getStringPrepped(const String& s, const Stringprep_profile profile[]) {
-			std::vector<char> input(s.getUTF8String().begin(), s.getUTF8String().end());
-			input.resize(MAX_STRINGPREP_SIZE);
-			if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), profile) == 0) {
-				return String(&input[0]);
-			}
-			else {
-				return "";
-			}
-		}
-};
-
-
 JID::JID(const char* jid) {
 	initializeFromString(String(jid));
 }
@@ -80,9 +50,9 @@ void JID::initializeFromString(const String& jid) {
 
 
 void JID::nameprepAndSetComponents(const String& node, const String& domain, const String& resource) {
-	node_ = StringPrepper::getNamePrepped(node);
-	domain_ = StringPrepper::getNodePrepped(domain);
-	resource_ = StringPrepper::getResourcePrepped(resource);
+	node_ = StringPrep::getPrepared(node, StringPrep::NamePrep);
+	domain_ = StringPrep::getPrepared(domain, StringPrep::XMPPNodePrep);
+	resource_ = StringPrep::getPrepared(resource, StringPrep::XMPPResourcePrep);
 }
 
 String JID::toString() const {
diff --git a/Swiften/SConscript b/Swiften/SConscript
index 3b37f90..af3ac97 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -94,6 +94,7 @@ if myenv.get("HAVE_OPENSSL", 0) :
 
 SConscript(dirs = [
 		"Base",
+		"StringPrep",
 		"Application",
 		"EventLoop",
 		"Parser",
diff --git a/Swiften/StringPrep/SConscript b/Swiften/StringPrep/SConscript
new file mode 100644
index 0000000..480d81a
--- /dev/null
+++ b/Swiften/StringPrep/SConscript
@@ -0,0 +1,9 @@
+Import("swiften_env")
+
+myenv = swiften_env.Clone()
+myenv.MergeFlags(swiften_env["LIBIDN_FLAGS"])
+
+objects = myenv.StaticObject([
+			"StringPrep.cpp"
+		])
+swiften_env.Append(SWIFTEN_OBJECTS = [objects])
diff --git a/Swiften/StringPrep/StringPrep.cpp b/Swiften/StringPrep/StringPrep.cpp
new file mode 100644
index 0000000..3e85177
--- /dev/null
+++ b/Swiften/StringPrep/StringPrep.cpp
@@ -0,0 +1,31 @@
+#include "Swiften/StringPrep/StringPrep.h"
+
+#include <stringprep.h>
+#include <vector>
+
+namespace Swift {
+
+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;
+	}
+}
+
+String StringPrep::getPrepared(const String& s, Profile profile) {
+	
+	std::vector<char> input(s.getUTF8String().begin(), s.getUTF8String().end());
+	input.resize(MAX_STRINGPREP_SIZE);
+	if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), getLibIDNProfile(profile)) == 0) {
+		return String(&input[0]);
+	}
+	else {
+		return "";
+	}
+}
+
+}
diff --git a/Swiften/StringPrep/StringPrep.h b/Swiften/StringPrep/StringPrep.h
new file mode 100644
index 0000000..7dbb03a
--- /dev/null
+++ b/Swiften/StringPrep/StringPrep.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "Swiften/Base/String.h"
+
+namespace Swift {
+	class StringPrep {
+		public:
+			enum Profile {
+				NamePrep,
+				XMPPNodePrep,
+				XMPPResourcePrep,
+				SASLPrep,
+			};
+
+			static String getPrepared(const String& s, Profile profile);
+	};
+}
-- 
cgit v0.10.2-6-g49f6