--- /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);
+}
+
+}
+}
+}