Quellcode durchsuchen

Merge pull request #494 from commontk/496-cli-directory-watcher-errors

496 cli directory watcher errors
Sascha Zelzer vor 10 Jahren
Ursprung
Commit
62a5c581ff

+ 5 - 0
Applications/ctkCommandLineModuleExplorer/ctkCmdLineModuleExplorerMainWindow.cpp

@@ -335,6 +335,11 @@ void ctkCLModuleExplorerMainWindow::on_actionReload_Modules_triggered()
     urls.push_back(ref.location());
   }
 
+  foreach (ctkCmdLineModuleReference ref, moduleRefs)
+  {
+    this->moduleManager.unregisterModule(ref);
+  }
+
   QFuture<ctkCmdLineModuleReferenceResult> future = QtConcurrent::mapped(urls, ctkCmdLineModuleConcurrentRegister(&this->moduleManager));
   future.waitForFinished();
 

+ 19 - 3
Libs/CommandLineModules/Core/ctkCmdLineModuleDirectoryWatcher.cpp

@@ -22,6 +22,7 @@
 #include "ctkCmdLineModuleDirectoryWatcher_p.h"
 #include "ctkCmdLineModuleManager.h"
 #include "ctkCmdLineModuleConcurrentHelpers.h"
+#include "ctkCmdLineModuleUtils.h"
 #include "ctkException.h"
 
 #include <QObject>
@@ -41,7 +42,7 @@
 
 //-----------------------------------------------------------------------------
 ctkCmdLineModuleDirectoryWatcher::ctkCmdLineModuleDirectoryWatcher(ctkCmdLineModuleManager* moduleManager)
-  : d(new ctkCmdLineModuleDirectoryWatcherPrivate(moduleManager))
+  : d(new ctkCmdLineModuleDirectoryWatcherPrivate(this, moduleManager))
 {
   Q_ASSERT(moduleManager);
 }
@@ -97,12 +98,22 @@ QStringList ctkCmdLineModuleDirectoryWatcher::commandLineModules() const
 
 
 //-----------------------------------------------------------------------------
+void ctkCmdLineModuleDirectoryWatcher::emitErrorDectectedSignal(const QString& msg)
+{
+  emit errorDetected(msg);
+}
+
+
+//-----------------------------------------------------------------------------
 // ctkCmdLineModuleDirectoryWatcherPrivate methods
 
 
 //-----------------------------------------------------------------------------
-ctkCmdLineModuleDirectoryWatcherPrivate::ctkCmdLineModuleDirectoryWatcherPrivate(ctkCmdLineModuleManager* moduleManager)
-: ModuleManager(moduleManager)
+ctkCmdLineModuleDirectoryWatcherPrivate::ctkCmdLineModuleDirectoryWatcherPrivate(
+    ctkCmdLineModuleDirectoryWatcher* d,
+    ctkCmdLineModuleManager* moduleManager)
+: q(d)
+, ModuleManager(moduleManager)
 , FileSystemWatcher(NULL)
 , Debug(false)
 {
@@ -414,6 +425,11 @@ QList<ctkCmdLineModuleReferenceResult> ctkCmdLineModuleDirectoryWatcherPrivate::
       this->MapFileNameToReferenceResult[executables[i]] = refResults[i];
     }
   }
+
+  // Broadcast error messages.
+  QString errorMessages = ctkCmdLineModuleUtils::errorMessagesFromModuleRegistration(refResults, this->ModuleManager->validationMode());
+  q->emitErrorDectectedSignal(errorMessages);
+
   return refResults;
 }
 

+ 13 - 1
Libs/CommandLineModules/Core/ctkCmdLineModuleDirectoryWatcher.h

@@ -72,7 +72,7 @@ public:
 
   /**
    * \brief Set the watcher into debug mode, for more output.
-   * \param debug if true, you get more output, otherwise, less output.
+   * \param debug if true, you get more output on the console, otherwise, less output.
    */
   void setDebug(bool debug);
 
@@ -107,6 +107,18 @@ public:
    */
   QStringList commandLineModules() const;
 
+  /**
+   * \brief public method to emit the errorDetected signal.
+   */
+  void emitErrorDectectedSignal(const QString&);
+
+Q_SIGNALS:
+
+  /**
+   * \brief Signals that an error was detected, and the caller should raise an error to the user.
+   */
+  void errorDetected(const QString&);
+
 private:
 
   QScopedPointer<ctkCmdLineModuleDirectoryWatcherPrivate> d;

+ 3 - 1
Libs/CommandLineModules/Core/ctkCmdLineModuleDirectoryWatcher_p.h

@@ -46,7 +46,8 @@ class ctkCmdLineModuleDirectoryWatcherPrivate : public QObject
 
 public:
 
-  ctkCmdLineModuleDirectoryWatcherPrivate(ctkCmdLineModuleManager* ModuleManager);
+  ctkCmdLineModuleDirectoryWatcherPrivate(ctkCmdLineModuleDirectoryWatcher* d,
+                                          ctkCmdLineModuleManager* ModuleManager);
   virtual ~ctkCmdLineModuleDirectoryWatcherPrivate();
 
   /**
@@ -165,6 +166,7 @@ private:
    */
   void unloadModules(const QStringList& executables);
 
+  ctkCmdLineModuleDirectoryWatcher* q;
   QHash<QString, ctkCmdLineModuleReferenceResult> MapFileNameToReferenceResult;
   ctkCmdLineModuleManager* ModuleManager;
   QFileSystemWatcher* FileSystemWatcher;

+ 46 - 5
Libs/CommandLineModules/Core/ctkCmdLineModuleUtils.cpp

@@ -27,16 +27,19 @@
 #include <QUrl>
 #include <QString>
 
-void ctkCmdLineModuleUtils::messageBoxModuleRegistration(const QFuture<ctkCmdLineModuleReferenceResult> &moduleRefsFuture,
-                                                                  ctkCmdLineModuleManager::ValidationMode validationMode)
+//-----------------------------------------------------------------------------
+QString ctkCmdLineModuleUtils::errorMessagesFromModuleRegistration(
+    const QList<ctkCmdLineModuleReferenceResult>& moduleRefs,
+    ctkCmdLineModuleManager::ValidationMode validationMode
+    )
 {
   QString errorMsg;
-  QFutureIterator<ctkCmdLineModuleReferenceResult> futureIter(moduleRefsFuture);
-  while(futureIter.hasNext())
+  QListIterator<ctkCmdLineModuleReferenceResult> listIter(moduleRefs);
+  while(listIter.hasNext())
   {
     try
     {
-      const ctkCmdLineModuleReferenceResult& moduleRefResult = futureIter.next();
+      const ctkCmdLineModuleReferenceResult& moduleRefResult = listIter.next();
       if (!moduleRefResult.m_Reference)
       {
         errorMsg += (QObject::tr("Failed to register module:\n%1\n\ndue to:\n%2\n\n").arg(moduleRefResult.m_Url.toString()).arg(moduleRefResult.m_RuntimeError));
@@ -57,7 +60,35 @@ void ctkCmdLineModuleUtils::messageBoxModuleRegistration(const QFuture<ctkCmdLin
       errorMsg += QObject::tr("Failed to register module:\n\n\ndue to:\n") + e.what() + "\n\n";
     }
   }
+  return errorMsg;
+}
+
+
+//-----------------------------------------------------------------------------
+QString ctkCmdLineModuleUtils::errorMessagesFromModuleRegistration(
+    const QFuture<ctkCmdLineModuleReferenceResult>& moduleRefsFuture,
+    ctkCmdLineModuleManager::ValidationMode validationMode
+    )
+{
+  QList<ctkCmdLineModuleReferenceResult> moduleRefs;
+
+  QFutureIterator<ctkCmdLineModuleReferenceResult> futureIter(moduleRefsFuture);
+  while(futureIter.hasNext())
+  {
+    const ctkCmdLineModuleReferenceResult& moduleRefResult = futureIter.next();
+    moduleRefs << moduleRefResult;
+  }
+
+  QString errorMsg = ctkCmdLineModuleUtils::errorMessagesFromModuleRegistration(moduleRefs, validationMode);
+  return errorMsg;
+}
 
+
+//-----------------------------------------------------------------------------
+void ctkCmdLineModuleUtils::messageBoxForModuleRegistration(
+    const QString& errorMsg
+    )
+{
   if (!errorMsg.isEmpty())
   {
     QWidget* widget = QApplication::activeModalWidget();
@@ -65,3 +96,13 @@ void ctkCmdLineModuleUtils::messageBoxModuleRegistration(const QFuture<ctkCmdLin
     QMessageBox::critical(widget, QObject::tr("Failed to register modules"), errorMsg);
   }
 }
+
+
+//-----------------------------------------------------------------------------
+void ctkCmdLineModuleUtils::messageBoxModuleRegistration(const QFuture<ctkCmdLineModuleReferenceResult> &moduleRefsFuture,
+                                                                  ctkCmdLineModuleManager::ValidationMode validationMode)
+{
+
+  const QString errorMsg = ctkCmdLineModuleUtils::errorMessagesFromModuleRegistration(moduleRefsFuture, validationMode);
+  ctkCmdLineModuleUtils::messageBoxForModuleRegistration(errorMsg);
+}

+ 19 - 2
Libs/CommandLineModules/Core/ctkCmdLineModuleUtils.h

@@ -28,11 +28,28 @@
 #include "ctkCmdLineModuleReferenceResult.h"
 
 #include <QFuture>
+#include <QString>
 
 struct CTK_CMDLINEMODULECORE_EXPORT ctkCmdLineModuleUtils
 {
-  static void messageBoxModuleRegistration(const QFuture<ctkCmdLineModuleReferenceResult>& moduleRefsFuture,
-                                           ctkCmdLineModuleManager::ValidationMode validationMode);
+  static QString errorMessagesFromModuleRegistration(
+      const QList<ctkCmdLineModuleReferenceResult>& moduleRefs,
+      ctkCmdLineModuleManager::ValidationMode validationMode
+      );
+
+  static QString errorMessagesFromModuleRegistration(
+      const QFuture<ctkCmdLineModuleReferenceResult>& moduleRefsFuture,
+      ctkCmdLineModuleManager::ValidationMode validationMode
+      );
+
+  static void messageBoxForModuleRegistration(
+      const QString& errorMessages
+      );
+
+  static void messageBoxModuleRegistration(
+      const QFuture<ctkCmdLineModuleReferenceResult>& moduleRefsFuture,
+      ctkCmdLineModuleManager::ValidationMode validationMode
+      );
 };
 
 #endif // CTKCOMMANDLINEMODULEUTILS_H