Pārlūkot izejas kodu

Optimized exception throwing for invalid XML descriptions.

Sascha Zelzer 13 gadi atpakaļ
vecāks
revīzija
ddb92f2407

+ 23 - 2
Libs/CommandLineModules/Core/ctkCmdLineModuleReference.cpp

@@ -22,26 +22,47 @@
 #include "ctkCmdLineModuleReference.h"
 #include "ctkCmdLineModuleReference_p.h"
 #include "ctkCmdLineModuleXmlParser_p.h"
+#include "ctkCmdLineModuleXmlException.h"
 
 #include <QBuffer>
 
 
 //----------------------------------------------------------------------------
 ctkCmdLineModuleReferencePrivate::ctkCmdLineModuleReferencePrivate()
-  : Backend(NULL)
+  : Backend(NULL), XmlException(NULL)
 {
 }
 
 //----------------------------------------------------------------------------
+ctkCmdLineModuleReferencePrivate::~ctkCmdLineModuleReferencePrivate()
+{
+  delete XmlException;
+}
+
+//----------------------------------------------------------------------------
 ctkCmdLineModuleDescription ctkCmdLineModuleReferencePrivate::description() const
 {
+  // If we already got an XML exception just throw it immediately, since
+  // the XML description cannot change for this module reference.
+  if (XmlException)
+  {
+    throw *XmlException;
+  }
+
   // Lazy creation. The title is a required XML element.
   if (Description.title().isNull())
   {
     QByteArray xml(RawXmlDescription);
     QBuffer xmlInput(&xml);
     ctkCmdLineModuleXmlParser parser(&xmlInput, &Description);
-    parser.doParse();
+    try
+    {
+      parser.doParse();
+    }
+    catch (const ctkCmdLineModuleXmlException& e)
+    {
+      XmlException = e.clone();
+    }
   }
   return Description;
 }

+ 1 - 0
Libs/CommandLineModules/Core/ctkCmdLineModuleReference.h

@@ -62,6 +62,7 @@ public:
   /**
    * @brief Get the module description for the parameters.
    * @return The XML description as a class representation.
+   * @throws ctkCmdLineModuleXmlException if the raw XML description cannot be parsed.
    */
   ctkCmdLineModuleDescription description() const;
 

+ 3 - 0
Libs/CommandLineModules/Core/ctkCmdLineModuleReference_p.h

@@ -28,10 +28,12 @@
 #include <QUrl>
 
 struct ctkCmdLineModuleBackend;
+class ctkCmdLineModuleXmlException;
 
 struct ctkCmdLineModuleReferencePrivate : public QSharedData
 {
   ctkCmdLineModuleReferencePrivate();
+  ~ctkCmdLineModuleReferencePrivate();
 
   ctkCmdLineModuleDescription description() const;
 
@@ -43,6 +45,7 @@ struct ctkCmdLineModuleReferencePrivate : public QSharedData
 private:
 
   mutable ctkCmdLineModuleDescription Description;
+  mutable ctkCmdLineModuleXmlException* XmlException;
 };
 
 #endif // CTKCMDLINEMODULEREFERENCEPRIVATE_H