backport revision 21967, from Abdel:

* src/support/docstream.{cpp.h}: 
	- factorize out some code and introduce odocfstream::reset()
* src/output_plaintext.cpp:
	- pass encoding argument.
* src/Buffer.cpp (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/branches/BRANCH_1_5_X@22234 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2007-12-21 17:18:36 +00:00
parent 677689945f
commit 9975b55687
5 changed files with 41 additions and 17 deletions

View File

@ -934,7 +934,15 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
LYXERR(Debug::LATEX) << "makeLaTeXFile encoding: "
<< encoding << "..." << endl;
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;

View File

@ -41,7 +41,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);

View File

@ -267,6 +267,15 @@ private:
namespace lyx {
template<class Ios>
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);

View File

@ -57,11 +57,14 @@ public:
class odocfstream : public std::basic_ofstream<char_type> {
typedef std::basic_ofstream<char_type> 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

View File

@ -54,6 +54,8 @@ What's new
- Fix an assertion when inserting a non-CJK character in a CJK paragraph
(bug 4349).
- Do not exit after catching an iconv exception (bug 4385, part 2).
- Fix access to network drives on Windows.
- "Accept compound words" in Preferences->Spellchecker now also works