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.
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_;
};
/**
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: