From 974f44ea79acb58808f45e9a417e651b764de2ba Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Wed, 5 Dec 2007 13:56:53 +0000 Subject: [PATCH] * docstream: factorize out some code and introduce odocfstream::reset() * Buffer::makeLaTeXFile(): try to catch one more iconv exception. Fix bug 4385 (http://bugzilla.lyx.org/show_bug.cgi?id=4385) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21967 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Buffer.cpp | 10 +++++++++- src/output_plaintext.cpp | 2 +- src/support/docstream.cpp | 39 +++++++++++++++++++++++++-------------- src/support/docstream.h | 5 ++++- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 0b2c71b1cc..7ab95e8f0e 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1009,7 +1009,15 @@ bool Buffer::makeLaTeXFile(FileName const & fname, string const encoding = runparams.encoding->iconvName(); LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << "..."); - odocfstream ofs(encoding); + odocfstream ofs; + try { ofs.reset(encoding); } + catch (iconv_codecvt_facet_exception & e) { + lyxerr << "Caught iconv exception: " << e.what() << endl; + Alert::error(_("Iconv software exception Detected"), bformat(_("Please " + "verify that the support software for your encoding (%1$s) is " + "properly installed"), from_ascii(encoding))); + return false; + } if (!openFileWrite(ofs, fname)) return false; diff --git a/src/output_plaintext.cpp b/src/output_plaintext.cpp index 0ab78d17f9..eb11c57660 100644 --- a/src/output_plaintext.cpp +++ b/src/output_plaintext.cpp @@ -42,7 +42,7 @@ using std::string; void writePlaintextFile(Buffer const & buf, FileName const & fname, OutputParams const & runparams) { - odocfstream ofs; + odocfstream ofs("UTF-8"); if (!openFileWrite(ofs, fname)) return; writePlaintextFile(buf, ofs, runparams); diff --git a/src/support/docstream.cpp b/src/support/docstream.cpp index 69de4160d0..481fd8555a 100644 --- a/src/support/docstream.cpp +++ b/src/support/docstream.cpp @@ -267,6 +267,15 @@ private: namespace lyx { +template +void setEncoding(Ios & ios, string const & encoding, std::ios_base::openmode mode) +{ + // We must imbue the stream before openening the file + std::locale global; + std::locale locale(global, new iconv_codecvt_facet(encoding, mode)); + ios.imbue(locale); +} + const char * iconv_codecvt_facet_exception::what() const throw() { @@ -276,9 +285,7 @@ const char * iconv_codecvt_facet_exception::what() const throw() idocfstream::idocfstream(string const & encoding) : base() { - std::locale global; - std::locale locale(global, new iconv_codecvt_facet(encoding, in)); - imbue(locale); + setEncoding(*this, encoding, in); } @@ -286,19 +293,19 @@ idocfstream::idocfstream(const char* s, std::ios_base::openmode mode, string const & encoding) : base() { - // We must imbue the stream before openening the file - std::locale global; - std::locale locale(global, new iconv_codecvt_facet(encoding, in)); - imbue(locale); + setEncoding(*this, encoding, in); open(s, mode); } +odocfstream::odocfstream(): base() +{ +} + + odocfstream::odocfstream(string const & encoding) : base() { - std::locale global; - std::locale locale(global, new iconv_codecvt_facet(encoding, out)); - imbue(locale); + setEncoding(*this, encoding, out); } @@ -306,14 +313,18 @@ odocfstream::odocfstream(const char* s, std::ios_base::openmode mode, string const & encoding) : base() { - // We must imbue the stream before openening the file - std::locale global; - std::locale locale(global, new iconv_codecvt_facet(encoding, out)); - imbue(locale); + setEncoding(*this, encoding, out); open(s, mode); } +void odocfstream::reset(string const & encoding) +{ + setEncoding(*this, encoding, out); +} + + + SetEnc setEncoding(string const & encoding) { return SetEnc(encoding); diff --git a/src/support/docstream.h b/src/support/docstream.h index ed49a726cf..50fb82b7bc 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -57,11 +57,14 @@ public: class odocfstream : public std::basic_ofstream { typedef std::basic_ofstream base; public: - odocfstream(std::string const & encoding = "UTF-8"); + odocfstream(); + odocfstream(std::string const & encoding); explicit odocfstream(const char* s, std::ios_base::openmode mode = std::ios_base::out|std::ios_base::trunc, std::string const & encoding = "UTF-8"); ~odocfstream() {} + /// + void reset(std::string const & encoding); }; /// UCS4 input stringstream -- 2.39.2