From 08380ca4915771c207c2d7c90d21667d28661eca Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Wed, 18 Apr 2007 12:59:07 +0000 Subject: [PATCH] Fix bug 3454 and 3463: Don't allow ill-formed commands. With this commit an error dialog will be shown to the user if the inset parameters were wrong upon creation. This patch uses exceptions. * factory.C::createInset(): catch eventual exception. * InsetCommandParams::read(): throw warning exception in case of errors. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@17850 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/factory.C | 487 +++++++++++++++++--------------- src/insets/insetcommandparams.C | 19 +- 2 files changed, 270 insertions(+), 236 deletions(-) diff --git a/src/factory.C b/src/factory.C index 5812e339c0..553b280fc9 100644 --- a/src/factory.C +++ b/src/factory.C @@ -20,6 +20,7 @@ #include "funcrequest.h" #include "LColor.h" #include "lyxlex.h" +#include "lyx_main.h" #include "paragraph.h" #include "insets/insetbibitem.h" @@ -57,7 +58,10 @@ #include "mathed/MathMacroTemplate.h" #include "mathed/InsetMathHull.h" +#include "frontends/Alert.h" + #include "support/lstrings.h" +#include "support/ExceptionMessage.h" #include #include @@ -67,6 +71,8 @@ namespace lyx { +namespace Alert = frontend::Alert; + using support::compare_ascii_no_case; using std::auto_ptr; @@ -78,276 +84,289 @@ InsetBase * createInset(BufferView * bv, FuncRequest const & cmd) { BufferParams const & params = bv->buffer()->params(); - switch (cmd.action) { - case LFUN_HFILL_INSERT: - return new InsetHFill; + try { - case LFUN_LINE_INSERT: - return new InsetLine; + switch (cmd.action) { + case LFUN_HFILL_INSERT: + return new InsetHFill; - case LFUN_PAGEBREAK_INSERT: - return new InsetPagebreak; + case LFUN_LINE_INSERT: + return new InsetLine; - case LFUN_CLEARPAGE_INSERT: - return new InsetClearPage; + case LFUN_PAGEBREAK_INSERT: + return new InsetPagebreak; - case LFUN_CLEARDOUBLEPAGE_INSERT: - return new InsetClearDoublePage; + case LFUN_CLEARPAGE_INSERT: + return new InsetClearPage; - case LFUN_CHARSTYLE_INSERT: { - string s = cmd.getArg(0); - LyXTextClass tclass = params.getLyXTextClass(); - CharStyles::iterator found_cs = tclass.charstyle(s); - if (found_cs != tclass.charstyles().end()) - return new InsetCharStyle(params, found_cs); - else - return new InsetCharStyle(params, s); - } + case LFUN_CLEARDOUBLEPAGE_INSERT: + return new InsetClearDoublePage; - case LFUN_NOTE_INSERT: { - string arg = cmd.getArg(0); - if (arg.empty()) - arg = "Note"; - return new InsetNote(params, arg); - } + case LFUN_CHARSTYLE_INSERT: { + string s = cmd.getArg(0); + LyXTextClass tclass = params.getLyXTextClass(); + CharStyles::iterator found_cs = tclass.charstyle(s); + if (found_cs != tclass.charstyles().end()) + return new InsetCharStyle(params, found_cs); + else + return new InsetCharStyle(params, s); + } - case LFUN_BOX_INSERT: { - string arg = cmd.getArg(0); - if (arg.empty()) - arg = "Boxed"; - return new InsetBox(params, arg); - } + case LFUN_NOTE_INSERT: { + string arg = cmd.getArg(0); + if (arg.empty()) + arg = "Note"; + return new InsetNote(params, arg); + } - case LFUN_BRANCH_INSERT: { - docstring arg = cmd.argument(); - if (arg.empty()) - arg = from_ascii("none"); - return new InsetBranch(params, InsetBranchParams(arg)); - } + case LFUN_BOX_INSERT: { + string arg = cmd.getArg(0); + if (arg.empty()) + arg = "Boxed"; + return new InsetBox(params, arg); + } - case LFUN_ERT_INSERT: - return new InsetERT(params); + case LFUN_BRANCH_INSERT: { + docstring arg = cmd.argument(); + if (arg.empty()) + arg = from_ascii("none"); + return new InsetBranch(params, InsetBranchParams(arg)); + } - case LFUN_FOOTNOTE_INSERT: - return new InsetFoot(params); + case LFUN_ERT_INSERT: + return new InsetERT(params); - case LFUN_MARGINALNOTE_INSERT: - return new InsetMarginal(params); + case LFUN_FOOTNOTE_INSERT: + return new InsetFoot(params); - case LFUN_OPTIONAL_INSERT: - return new InsetOptArg(params); + case LFUN_MARGINALNOTE_INSERT: + return new InsetMarginal(params); - case LFUN_BIBITEM_INSERT: - return new InsetBibitem(InsetCommandParams("bibitem")); + case LFUN_OPTIONAL_INSERT: + return new InsetOptArg(params); - case LFUN_FLOAT_INSERT: { - // check if the float type exists - string const argument = to_utf8(cmd.argument()); - if (params.getLyXTextClass().floats().typeExist(argument)) - return new InsetFloat(params, argument); - lyxerr << "Non-existent float type: " << argument << endl; - return 0; - } + case LFUN_BIBITEM_INSERT: + return new InsetBibitem(InsetCommandParams("bibitem")); - case LFUN_FLOAT_WIDE_INSERT: { - // check if the float type exists - string const argument = to_utf8(cmd.argument()); - if (params.getLyXTextClass().floats().typeExist(argument)) { - auto_ptr p(new InsetFloat(params, argument)); - p->wide(true, params); - return p.release(); + case LFUN_FLOAT_INSERT: { + // check if the float type exists + string const argument = to_utf8(cmd.argument()); + if (params.getLyXTextClass().floats().typeExist(argument)) + return new InsetFloat(params, argument); + lyxerr << "Non-existent float type: " << argument << endl; + return 0; } - lyxerr << "Non-existent float type: " << argument << endl; - return 0; - } - - case LFUN_WRAP_INSERT: { - string const argument = to_utf8(cmd.argument()); - if (argument == "figure") - return new InsetWrap(params, argument); - lyxerr << "Non-existent floatflt type: " << argument << endl; - return 0; - } - case LFUN_INDEX_INSERT: { - // Try and generate a valid index entry. - InsetCommandParams icp("index"); - icp["name"] = cmd.argument().empty() ? - bv->cursor().innerText()->getStringToIndex(bv->cursor()) : - cmd.argument(); - return new InsetIndex(icp); - } - - case LFUN_NOMENCL_INSERT: { - InsetCommandParams icp("nomenclature"); - icp["symbol"] = cmd.argument().empty() ? - bv->cursor().innerText()->getStringToIndex(bv->cursor()) : - cmd.argument(); - return new InsetNomencl(icp); - } + case LFUN_FLOAT_WIDE_INSERT: { + // check if the float type exists + string const argument = to_utf8(cmd.argument()); + if (params.getLyXTextClass().floats().typeExist(argument)) { + auto_ptr p(new InsetFloat(params, argument)); + p->wide(true, params); + return p.release(); + } + lyxerr << "Non-existent float type: " << argument << endl; + return 0; + } - case LFUN_TABULAR_INSERT: { - if (cmd.argument().empty()) + case LFUN_WRAP_INSERT: { + string const argument = to_utf8(cmd.argument()); + if (argument == "figure") + return new InsetWrap(params, argument); + lyxerr << "Non-existent floatflt type: " << argument << endl; return 0; - std::istringstream ss(to_utf8(cmd.argument())); - int r = 0, c = 0; - ss >> r >> c; - if (r <= 0) - r = 2; - if (c <= 0) - c = 2; - return new InsetTabular(*bv->buffer(), r, c); - } + } - case LFUN_CAPTION_INSERT: { - auto_ptr inset(new InsetCaption(params)); - inset->setAutoBreakRows(true); - inset->setDrawFrame(true); - inset->setFrameColor(LColor::captionframe); - return inset.release(); - } + case LFUN_INDEX_INSERT: { + // Try and generate a valid index entry. + InsetCommandParams icp("index"); + icp["name"] = cmd.argument().empty() ? + bv->cursor().innerText()->getStringToIndex(bv->cursor()) : + cmd.argument(); + return new InsetIndex(icp); + } - case LFUN_INDEX_PRINT: - return new InsetPrintIndex(InsetCommandParams("printindex")); + case LFUN_NOMENCL_INSERT: { + InsetCommandParams icp("nomenclature"); + icp["symbol"] = cmd.argument().empty() ? + bv->cursor().innerText()->getStringToIndex(bv->cursor()) : + cmd.argument(); + return new InsetNomencl(icp); + } - case LFUN_NOMENCL_PRINT: - return new InsetPrintNomencl(InsetCommandParams("printnomenclature")); + case LFUN_TABULAR_INSERT: { + if (cmd.argument().empty()) + return 0; + std::istringstream ss(to_utf8(cmd.argument())); + int r = 0, c = 0; + ss >> r >> c; + if (r <= 0) + r = 2; + if (c <= 0) + c = 2; + return new InsetTabular(*bv->buffer(), r, c); + } - case LFUN_TOC_INSERT: - return new InsetTOC(InsetCommandParams("tableofcontents")); + case LFUN_CAPTION_INSERT: { + auto_ptr inset(new InsetCaption(params)); + inset->setAutoBreakRows(true); + inset->setDrawFrame(true); + inset->setFrameColor(LColor::captionframe); + return inset.release(); + } - case LFUN_ENVIRONMENT_INSERT: - return new InsetEnvironment(params, to_utf8(cmd.argument())); + case LFUN_INDEX_PRINT: + return new InsetPrintIndex(InsetCommandParams("printindex")); -#if 0 - case LFUN_LIST_INSERT: - return new InsetList; + case LFUN_NOMENCL_PRINT: + return new InsetPrintNomencl(InsetCommandParams("printnomenclature")); - case LFUN_THEOREM_INSERT: - return new InsetTheorem; -#endif + case LFUN_TOC_INSERT: + return new InsetTOC(InsetCommandParams("tableofcontents")); - case LFUN_INSET_INSERT: { - string const name = cmd.getArg(0); - - if (name == "bibitem") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetBibitem(icp); - - } else if (name == "bibtex") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetBibtex(icp); - - } else if (name == "citation") { - InsetCommandParams icp("cite"); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetCitation(icp); - - } else if (name == "ert") { - InsetCollapsable::CollapseStatus st; - InsetERTMailer::string2params(to_utf8(cmd.argument()), st); - return new InsetERT(params, st); - - } else if (name == "external") { - Buffer const & buffer = *bv->buffer(); - InsetExternalParams iep; - InsetExternalMailer::string2params(to_utf8(cmd.argument()), - buffer, iep); - auto_ptr inset(new InsetExternal); - inset->setParams(iep, buffer); - return inset.release(); + case LFUN_ENVIRONMENT_INSERT: + return new InsetEnvironment(params, to_utf8(cmd.argument())); - } else if (name == "graphics") { - Buffer const & buffer = *bv->buffer(); - InsetGraphicsParams igp; - InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), - buffer, igp); - auto_ptr inset(new InsetGraphics); - inset->setParams(igp); - return inset.release(); +#if 0 + case LFUN_LIST_INSERT: + return new InsetList; - } else if (name == "include") { - InsetCommandParams iip(name); - InsetIncludeMailer::string2params(to_utf8(cmd.argument()), iip); - return new InsetInclude(iip); + case LFUN_THEOREM_INSERT: + return new InsetTheorem; +#endif - } else if (name == "index") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetIndex(icp); + case LFUN_INSET_INSERT: { + string const name = cmd.getArg(0); + + if (name == "bibitem") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetBibitem(icp); + + } else if (name == "bibtex") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetBibtex(icp); + + } else if (name == "citation") { + InsetCommandParams icp("cite"); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetCitation(icp); + + } else if (name == "ert") { + InsetCollapsable::CollapseStatus st; + InsetERTMailer::string2params(to_utf8(cmd.argument()), st); + return new InsetERT(params, st); + + } else if (name == "external") { + Buffer const & buffer = *bv->buffer(); + InsetExternalParams iep; + InsetExternalMailer::string2params(to_utf8(cmd.argument()), + buffer, iep); + auto_ptr inset(new InsetExternal); + inset->setParams(iep, buffer); + return inset.release(); + + } else if (name == "graphics") { + Buffer const & buffer = *bv->buffer(); + InsetGraphicsParams igp; + InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), + buffer, igp); + auto_ptr inset(new InsetGraphics); + inset->setParams(igp); + return inset.release(); + + } else if (name == "include") { + InsetCommandParams iip(name); + InsetIncludeMailer::string2params(to_utf8(cmd.argument()), iip); + return new InsetInclude(iip); + + } else if (name == "index") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetIndex(icp); + + } else if (name == "nomenclature") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, lyx::to_utf8(cmd.argument()), + icp); + return new InsetNomencl(icp); + + } else if (name == "label") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetLabel(icp); + + } else if (name == "ref") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetRef(icp, *bv->buffer()); + + } else if (name == "toc") { + InsetCommandParams icp("tableofcontents"); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetTOC(icp); + + } else if (name == "url") { + InsetCommandParams icp(name); + InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), + icp); + return new InsetUrl(icp); + + } else if (name == "vspace") { + VSpace vspace; + InsetVSpaceMailer::string2params(to_utf8(cmd.argument()), vspace); + return new InsetVSpace(vspace); + } + } - } else if (name == "nomenclature") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, lyx::to_utf8(cmd.argument()), - icp); - return new InsetNomencl(icp); + case LFUN_SPACE_INSERT: { + string const name = to_utf8(cmd.argument()); + if (name == "normal") + return new InsetSpace(InsetSpace::NORMAL); + else if (name == "protected") + return new InsetSpace(InsetSpace::PROTECTED); + else if (name == "thin") + return new InsetSpace(InsetSpace::THIN); + else if (name == "quad") + return new InsetSpace(InsetSpace::QUAD); + else if (name == "qquad") + return new InsetSpace(InsetSpace::QQUAD); + else if (name == "enspace") + return new InsetSpace(InsetSpace::ENSPACE); + else if (name == "enskip") + return new InsetSpace(InsetSpace::ENSKIP); + else if (name == "negthinspace") + return new InsetSpace(InsetSpace::NEGTHIN); + else if (name.empty()) + lyxerr << "LyX function 'space' needs an argument." << endl; + else + lyxerr << "Wrong argument for LyX function 'space'." << endl; + } + break; - } else if (name == "label") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetLabel(icp); - - } else if (name == "ref") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetRef(icp, *bv->buffer()); - - } else if (name == "toc") { - InsetCommandParams icp("tableofcontents"); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetTOC(icp); - - } else if (name == "url") { - InsetCommandParams icp(name); - InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), - icp); - return new InsetUrl(icp); - - } else if (name == "vspace") { - VSpace vspace; - InsetVSpaceMailer::string2params(to_utf8(cmd.argument()), vspace); - return new InsetVSpace(vspace); + default: + break; } - } - case LFUN_SPACE_INSERT: { - string const name = to_utf8(cmd.argument()); - if (name == "normal") - return new InsetSpace(InsetSpace::NORMAL); - else if (name == "protected") - return new InsetSpace(InsetSpace::PROTECTED); - else if (name == "thin") - return new InsetSpace(InsetSpace::THIN); - else if (name == "quad") - return new InsetSpace(InsetSpace::QUAD); - else if (name == "qquad") - return new InsetSpace(InsetSpace::QQUAD); - else if (name == "enspace") - return new InsetSpace(InsetSpace::ENSPACE); - else if (name == "enskip") - return new InsetSpace(InsetSpace::ENSKIP); - else if (name == "negthinspace") - return new InsetSpace(InsetSpace::NEGTHIN); - else if (name.empty()) - lyxerr << "LyX function 'space' needs an argument." << endl; - else - lyxerr << "Wrong argument for LyX function 'space'." << endl; + } catch (support::ExceptionMessage const & message) { + if (message.type_ == support::ErrorException) { + Alert::error(message.title_, message.details_); + LyX::cref().emergencyCleanup(); + abort(); + } else if (message.type_ == support::WarningException) { + Alert::warning(message.title_, message.details_); + return 0; + } } - break; - - default: - break; - } return 0; } diff --git a/src/insets/insetcommandparams.C b/src/insets/insetcommandparams.C index 713ad3c673..fd1f9a8a47 100644 --- a/src/insets/insetcommandparams.C +++ b/src/insets/insetcommandparams.C @@ -14,8 +14,10 @@ #include "insetcommandparams.h" #include "debug.h" +#include "gettext.h" #include "lyxlex.h" +#include "support/ExceptionMessage.h" #include "support/lstrings.h" #include @@ -29,6 +31,8 @@ using std::string; using std::endl; using std::ostream; +using support::ExceptionMessage; +using support::WarningException; InsetCommandParams::InsetCommandParams(string const & name) : name_(name), preview_(false) @@ -258,8 +262,12 @@ void InsetCommandParams::read(LyXLex & lex) lex.next(); name_ = lex.getString(); info_ = findInfo(name_); - if (!info_) + if (!info_) { lex.printError("InsetCommand: Unknown inset name `$$Token'"); + throw ExceptionMessage(WarningException, + _("Unknown inset name: "), + from_utf8(name_)); + } } string token; @@ -278,12 +286,19 @@ void InsetCommandParams::read(LyXLex & lex) if (i >= 0) { lex.next(true); params_[i] = lex.getDocString(); - } else + } else { lex.printError("Unknown parameter name `$$Token' for command " + name_); + throw ExceptionMessage(WarningException, + _("Inset Command :") + from_ascii(name_), + _("Unknown parameter name: ") + from_utf8(token)); + } } if (token != "\\end_inset") { lex.printError("Missing \\end_inset at this point. " "Read: `$$Token'"); + throw ExceptionMessage(WarningException, + _("Missing \\end_inset at this point."), + from_utf8(token)); } } -- 2.39.2