src/TextCodec.cpp
branchv_0
changeset 18 9d566568d37c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/TextCodec.cpp	Wed Nov 20 14:56:41 2019 +0100
@@ -0,0 +1,80 @@
+/**
+ * Relational pipes (library)
+ * Copyright © 2019 František Kučera (Frantovo.cz, GlobalCode.info)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the:
+ *  - GNU Lesser General Public License as published by the Free Software Foundation;
+ *    version 3 of the License or (at your option)
+ *  - GNU General Public License as published by the Free Software Foundation;
+ *    version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <memory>
+
+#include "../include/relpipe/common/text/TextCodec.h"
+
+namespace relpipe {
+namespace common {
+namespace text {
+
+class TextCodec::TextCodecInternal {
+private:
+public:
+	static const std::string UTF8;
+	static const std::string DEFAULT;
+	Iconv* bytesToText;
+	Iconv* textToBytes;
+	//std::unique_ptr<Iconv> bytesToText;
+	//std::unique_ptr<Iconv> textToBytes;
+	bool sameEncoding = false;
+
+	TextCodecInternal(const std::string& encoding) {
+		// TODO: set sameEncoding = true if $LANG or current locale is same as encoding
+		bytesToText = new Iconv(encoding, DEFAULT);
+		textToBytes = new Iconv(DEFAULT, encoding);
+		//bytesToText.reset(new Iconv(encoding, DEFAULT));
+		//textToBytes.reset(new Iconv(DEFAULT, encoding));
+	}
+
+	virtual ~TextCodecInternal() {
+		delete bytesToText;
+		delete textToBytes;
+	}
+};
+
+const std::string TextCodec::TextCodecInternal::UTF8 = "UTF-8";
+const std::string TextCodec::TextCodecInternal::DEFAULT = "";
+
+TextCodec::TextCodec(const std::string& encoding) {
+	internal = new TextCodec::TextCodecInternal(encoding);
+}
+
+TextCodec::TextCodec() : TextCodec(TextCodec::TextCodecInternal::UTF8) {
+}
+
+TextCodec::~TextCodec() {
+	delete internal;
+}
+
+std::string TextCodec::fromBytes(std::string bytes) {
+	if (internal->sameEncoding) return bytes;
+	else return internal->bytesToText->convert(bytes);
+}
+
+std::string TextCodec::toBytes(std::string text) {
+	if (internal->sameEncoding) return text;
+	else return internal->textToBytes->convert(text);
+}
+
+}
+}
+}