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