X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstream.h;h=c3db04c58a3a2d2083c55160f6fccc01ee3bdaad;hb=e54ae72e5fac6f750c3f7972c74bb42b57f3a049;hp=c1f4f1ad8b056bbfcdd8930b36f77519021fd9d6;hpb=0d449056ef9ace3ef737e4b9aba8d3994615dc18;p=lyx.git diff --git a/src/support/docstream.h b/src/support/docstream.h index c1f4f1ad8b..c3db04c58a 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -19,6 +19,12 @@ namespace lyx { +class iconv_codecvt_facet_exception : public std::exception { +public: + virtual ~iconv_codecvt_facet_exception() throw() {} + virtual const char * what() const throw(); +}; + /// Base class for UCS4 input streams typedef std::basic_istream idocstream; @@ -39,20 +45,22 @@ typedef std::basic_ostream odocstream; class idocfstream : public std::basic_ifstream { typedef std::basic_ifstream base; public: - idocfstream(); + idocfstream(std::string const & encoding = "UTF-8"); explicit idocfstream(const char* s, - std::ios_base::openmode mode = std::ios_base::in); + std::ios_base::openmode mode = std::ios_base::in, + std::string const & encoding = "UTF-8"); ~idocfstream() {} }; -/// File stream for writing UTF8-encoded files with automatic conversion from -/// UCS4. +/// File stream for writing files in 8bit encoding \p encoding with automatic +/// conversion from UCS4. class odocfstream : public std::basic_ofstream { typedef std::basic_ofstream base; public: - odocfstream(); + odocfstream(std::string const & encoding = "UTF-8"); explicit odocfstream(const char* s, - std::ios_base::openmode mode = std::ios_base::out|std::ios_base::trunc); + std::ios_base::openmode mode = std::ios_base::out|std::ios_base::trunc, + std::string const & encoding = "UTF-8"); ~odocfstream() {} }; @@ -69,6 +77,25 @@ odocstream & operator<<(odocstream & os, char c) return os; } +/// Helper struct for changing stream encoding +struct SetEnc { + SetEnc(std::string const & e) : encoding(e) {} + std::string encoding; +}; + +/// Helper function for changing stream encoding +SetEnc setEncoding(std::string const & encoding); + +/** Change the encoding of \p os to \p e.encoding. + \p e.encoding must be a valid iconv name of an 8bit encoding. + This does nothing if the stream is not a file stream, since only + file streams do have an associated 8bit encoding. + Usage: \code + os << setEncoding("ISO-8859-1"); + \endcode + */ +odocstream & operator<<(odocstream & os, SetEnc e); + } #endif