X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcodec.h;h=b194c3f46b56b4be503ff63e2741f8243f43c3fa;hb=3ab2746e9f0626d691d8946d50ed399d45e9f770;hp=5fb29db29b305577582e6ed56c58f3bda61d823c;hpb=51b84c0c2c3abb0cf7e815c5ae259face40ac977;p=libs%2Fcore.git diff --git a/source/codec.h b/source/codec.h index 5fb29db..b194c3f 100644 --- a/source/codec.h +++ b/source/codec.h @@ -1,8 +1,15 @@ +/* $Id$ + +This file is part of libmspstrings +Copyright © 2006-2007 Mikko Rasa +Distributed under the LGPL +*/ + #ifndef MSP_STRINGS_CODEC_H_ #define MSP_STRINGS_CODEC_H_ #include -#include +#include namespace Msp { @@ -28,6 +35,13 @@ with it. class StringCodec { public: + enum ErrorMode + { + THROW_ON_ERROR, + IGNORE_ERRORS, + REPLACE_ERRORS + }; + /** Base class for string encoder. Each codec class should contain an Encoder class derived from this. @@ -71,11 +85,14 @@ public: virtual ~Encoder() { } protected: - Encoder() { } + Encoder(ErrorMode em=THROW_ON_ERROR): err_mode_(em) { } void append(char c) { buffer_+=c; } void append(const char *s, unsigned l) { buffer_.append(s, l); } void append(const std::string &s) { buffer_+=s; } + void error(const std::string &); + virtual void append_replacement() { } private: + ErrorMode err_mode_; std::string buffer_; }; @@ -92,30 +109,26 @@ public: /** Ensures that all input has been processed. If this is not the case any - buffers are cleared and an exception is thrown, + buffers are cleared and an error is triggered. */ virtual void sync() { } - /** - Resets the decoder, clearing a possibly erroneus state. Does not flush - the internal buffer. - */ - virtual void reset() { } - const std::wstring &get() const { return buffer_; } unsigned size() const { return buffer_.size(); } void flush() { buffer_.clear(); } virtual ~Decoder() { } protected: - Decoder() { } + Decoder(ErrorMode em): err_mode_(em) { } void append(wchar_t c) { buffer_+=c; } void append(const std::wstring &s) { buffer_+=s; } + void error(const std::string &); private: + ErrorMode err_mode_; std::wstring buffer_; }; - virtual Encoder *create_encoder() const =0; - virtual Decoder *create_decoder() const =0; + virtual Encoder *create_encoder(ErrorMode =THROW_ON_ERROR) const =0; + virtual Decoder *create_decoder(ErrorMode =THROW_ON_ERROR) const =0; virtual bool detect(const std::string &) const; virtual ~StringCodec() { } protected: