]> git.lyx.org Git - features.git/commitdiff
Fix bug 3454 and 3463: Don't allow ill-formed commands. With this commit an error...
authorAbdelrazak Younes <younes@lyx.org>
Wed, 18 Apr 2007 12:59:07 +0000 (12:59 +0000)
committerAbdelrazak Younes <younes@lyx.org>
Wed, 18 Apr 2007 12:59:07 +0000 (12:59 +0000)
* 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
src/insets/insetcommandparams.C

index 5812e339c082312a6c9e600dd32b62f1b4b77f7a..553b280fc9084351dd7f0502212e0b84632e1649 100644 (file)
@@ -20,6 +20,7 @@
 #include "funcrequest.h"
 #include "LColor.h"
 #include "lyxlex.h"
+#include "lyx_main.h"
 #include "paragraph.h"
 
 #include "insets/insetbibitem.h"
 #include "mathed/MathMacroTemplate.h"
 #include "mathed/InsetMathHull.h"
 
+#include "frontends/Alert.h"
+
 #include "support/lstrings.h"
+#include "support/ExceptionMessage.h"
 
 #include <boost/assert.hpp>
 #include <boost/current_function.hpp>
@@ -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<InsetFloat> 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<InsetFloat> 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<InsetCaption> 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<InsetCaption> 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<InsetExternal> 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<InsetGraphics> 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<InsetExternal> 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<InsetGraphics> 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;
 }
index 713ad3c67394154ca05c3dd3537fbd4f50664366..fd1f9a8a47c620c3166ae71a5dee811bc27b5d45 100644 (file)
 #include "insetcommandparams.h"
 
 #include "debug.h"
+#include "gettext.h"
 #include "lyxlex.h"
 
+#include "support/ExceptionMessage.h"
 #include "support/lstrings.h"
 
 #include <boost/assert.hpp>
@@ -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));
        }
 }