* 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
string const encoding = runparams.encoding->iconvName();
LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << "...");
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;
if (!openFileWrite(ofs, fname))
return false;
void writePlaintextFile(Buffer const & buf, FileName const & fname,
OutputParams const & runparams)
{
void writePlaintextFile(Buffer const & buf, FileName const & fname,
OutputParams const & runparams)
{
+ odocfstream ofs("UTF-8");
if (!openFileWrite(ofs, fname))
return;
writePlaintextFile(buf, ofs, runparams);
if (!openFileWrite(ofs, fname))
return;
writePlaintextFile(buf, ofs, runparams);
+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()
{
const char * iconv_codecvt_facet_exception::what() const throw()
{
idocfstream::idocfstream(string const & encoding) : base()
{
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);
string const & encoding)
: base()
{
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);
+odocfstream::odocfstream(): base()
+{
+}
+
+
odocfstream::odocfstream(string const & encoding) : 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);
string const & encoding)
: base()
{
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);
+void odocfstream::reset(string const & encoding)
+{
+ setEncoding(*this, encoding, out);
+}
+
+
+
SetEnc setEncoding(string const & encoding)
{
return SetEnc(encoding);
SetEnc setEncoding(string const & encoding)
{
return SetEnc(encoding);
class odocfstream : public std::basic_ofstream<char_type> {
typedef std::basic_ofstream<char_type> base;
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() {}
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
};
/// UCS4 input stringstream