};
/**
-Base class for string codecs. Mostly abstract. Use one of the derived classes
-or the function create_codec to create a specific codec.
+Base class for string codecs. Use one of the derived classes or the function
+create_codec to create a specific codec.
For the purposes of this class, an std::wstring is considered to contain
Unicode characters and an std::string is considered to be an encoded sequence
-of bytes. Codecs are able to determine if an encoded string could be
+of bytes. A codec is able to determine if an encoded string could be decoded
+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.
function to put the result into the internal buffer.
*/
virtual void encode_char(wchar_t) =0;
-
+
/**
Encodes a string.
*/
virtual void encode(const std::wstring &s)
{ for(std::wstring::const_iterator i=s.begin(); i!=s.end(); ++i) encode_char(*i); }
-
+
/**
Brings the encoder back to its initial state. This allows the encoded
sequence to be extracted or flushed without loss of integrity.
Returns the number of bytes in the output buffer.
*/
unsigned size() const { return buffer_.size(); }
-
+
/**
Clears the encoded sequence. Encoder state is left intact.
*/
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_;
};
{ for(std::string::const_iterator i=s.begin(); i!=s.end(); ) decode_char(s, i); }
/**
- Ensures that all input has been processed. An exception is thrown if
- this is not the case.
+ Ensures that all input has been processed. If this is not the case any
+ buffers are cleared and an error is triggered.
*/
virtual void sync() { }
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:
};
/**
-Convenience function that decodes a string using the given codec.
+Convenience function that decodes a string using the given codec.
*/
template<class C>
std::wstring decode(const std::string &s)