소스 검색

ENH: implementation of example hosted application. DicomAppServer/DicomHostService commented out, because not yet existant.

ivowolf 14 년 전
부모
커밋
212bb4950a

+ 5 - 1
Applications/ctkExampleHost/ctkExampleHostMain.cpp

@@ -87,11 +87,15 @@ int main(int argv, char** argc)
 
   framework->start();
 
+
+  ctkDicomExampleHost* host = new ctkDicomExampleHost();
+
+
   QMainWindow mainWindow;
   Ui::MainWindow ui;
   ui.setupUi(&mainWindow);
 
- // mainWindow.addDockWidget(static_cast<Qt::DockWidgetArea>(4),new ctkHostAppExampleWidget());
+  mainWindow.addDockWidget(static_cast<Qt::DockWidgetArea>(4),new ctkHostAppExampleWidget());
 
 //  QVBoxLayout* layout = new QVBoxLayout(&mainWindow);
 

+ 52 - 0
Applications/ctkExampleHostedApp/CMakeLists.txt

@@ -0,0 +1,52 @@
+PROJECT(ctkExampleHostedApp)
+
+#
+# See CTK/CMake/ctkMacroBuildApp.cmake for details
+#
+
+SET(KIT_SRCS
+  ctkExampleHostedAppMain.cpp
+)
+
+# Headers that should run through moc
+SET(KIT_MOC_SRCS
+
+)
+
+# UI files
+SET(KIT_UI_FORMS
+  
+)
+
+# Resources
+SET(KIT_resources
+  
+)
+
+# Target libraries - See CMake/ctkMacroGetTargetLibraries.cmake
+# The following macro will read the target libraries from the file 'target_libraries.cmake'
+ctkMacroGetTargetLibraries(KIT_target_libraries)
+
+# Additional directories to include - Note that CTK_INCLUDE_LIBRARIES is already included
+SET(KIT_include_directories
+)
+
+# Fix this after having discussed include dependencies with Jc
+FOREACH(_dep ${${PROJECT_NAME}_DEPENDENCIES})
+  INCLUDE_DIRECTORIES(${${_dep}_SOURCE_DIR} ${${_dep}_BINARY_DIR})
+ENDFOREACH()
+
+ctkMacroBuildApp(
+  NAME ${PROJECT_NAME}
+  INCLUDE_DIRECTORIES ${KIT_include_directories}
+  SRCS ${KIT_SRCS}
+  MOC_SRCS ${KIT_MOC_SRCS}
+  UI_FORMS ${KIT_UI_FORMS}
+  TARGET_LIBRARIES ${KIT_target_libraries}
+  RESOURCES ${KIT_resources}
+  )
+
+# Testing
+IF(BUILD_TESTING)
+#   ADD_SUBDIRECTORY(Testing)
+ENDIF(BUILD_TESTING)

+ 172 - 0
Applications/ctkExampleHostedApp/ctkExampleHostedAppMain.cpp

@@ -0,0 +1,172 @@
+/*=============================================================================
+
+  Library: CTK
+
+  Copyright (c) 2010 German Cancer Research Center,
+    Division of Medical and Biological Informatics
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=============================================================================*/
+
+#include <ctkPluginFrameworkFactory.h>
+#include <ctkPluginFramework.h>
+#include <ctkPluginException.h>
+
+// replace "//$" with nothing as soon as ctkDicomAppServer/ctkDicomHostService exist
+//$#include <ctkDicomAppServer.h>
+//$#include <ctkDicomHostService.h>
+
+#include <QApplication>
+#include <QString>
+#include <QStringList>
+#include <QDirIterator>
+#include <QWidget>
+#include <QFileInfo>
+
+void print_usage()
+{
+  qCritical() << "Usage:";
+  qCritical() << "  " << QFileInfo(qApp->arguments().at(0)).fileName() << " --hostURL url1 --applicationURL url2 <plugin-name>";
+}
+
+int main(int argv, char** argc)
+{
+  QApplication app(argv, argc);
+
+  qApp->setOrganizationName("CTK");
+  qApp->setOrganizationDomain("commontk.org");
+  qApp->setApplicationName("ctkExampleHost");
+
+  // parse the command line
+
+  if(qApp->arguments().size() < 5)
+  {
+    qCritical() << "Wrong number of command line arguments.";
+    print_usage();
+    exit(1);
+  }
+
+  if(qApp->arguments().at(1) != "--hostURL")
+  {
+    qCritical() << "First argument must be --hostURL.";
+    print_usage();
+    exit(1);
+  }
+  QString hostURL = qApp->arguments().at(2);
+
+  if(qApp->arguments().at(3) != "--applicationURL")
+  {
+    qCritical() << "First argument must be --applicationURL.";
+    print_usage();
+    exit(1);
+  }
+  QString appURL = qApp->arguments().at(4);
+
+  // setup the plugin framework
+
+  ctkPluginFrameworkFactory fwFactory;
+  ctkPluginFramework* framework = fwFactory.getFramework();
+
+  try {
+    framework->init();
+  }
+  catch (const ctkPluginException& exc)
+  {
+    qCritical() << "Failed to initialize the plug-in framework:" << exc;
+    exit(2);
+  }
+
+#ifdef CMAKE_INTDIR
+  QString pluginPath = qApp->applicationDirPath() + "/../plugins/" CMAKE_INTDIR "/";
+#else
+  QString pluginPath = qApp->applicationDirPath() + "/plugins/";
+#endif
+
+  qApp->addLibraryPath(pluginPath);
+
+  // construct the name of the plugin with the business logic
+  // (thus the actual logic of the hosted app)
+  QString pluginName;
+  if(qApp->arguments().size()>5)
+  {
+    pluginName = qApp->arguments().at(5);
+  }
+  else
+  {
+    pluginName = "org_commontk_dicomhosting_app_";
+    pluginName += QFileInfo(qApp->arguments().at(0)).fileName();
+  }
+
+  // try to find the plugin and install all plugins available in 
+  // pluginPath (but do not start them)
+  QStringList libFilter;
+  libFilter << "*.dll" << "*.so" << "*.dylib";
+  QDirIterator dirIter(pluginPath, libFilter, QDir::Files);
+  bool pluginFound = false;
+  QString pluginFileLocation;
+  while(dirIter.hasNext())
+  {
+    try
+    {
+      QString fileLocation = dirIter.next();
+      if (fileLocation.contains("org_commontk_dicom_wg23"))
+      {
+        ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
+      }
+      if (fileLocation.contains(pluginName))
+      {
+        pluginFound = true;
+        pluginFileLocation = fileLocation;
+      }
+    }
+    catch (const ctkPluginException& e)
+    {
+      qCritical() << e.what();
+    }
+  }
+
+  // if we did not find the business logic: abort
+  if(!pluginFound)
+  {
+    qCritical() << "Could not find plugin.";
+    qCritical() << "  Plugin name: " << pluginName;
+    qCritical() << "  Plugin path: " << pluginPath;
+    exit(3);
+  }
+
+  // setup the communication infrastructure: DicomAppServer and DicomHostService
+
+//$  ctkDicomAppServer * appServer = new ctkDicomAppServer(appURL);
+
+//$  ctkDicomHostInterface * hostInterface = new ctkDicomHostService(hostURL);
+//$  framework->getPluginContext()->registerService(QStringList("ctkDicomHostInterface"), hostInterface);
+
+  // start the plugin with the business logic
+  try
+  {
+    ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(pluginFileLocation));
+    plugin->start(ctkPlugin::START_TRANSIENT);
+  }
+  catch (const ctkPluginException& e)
+  {
+    qCritical() << e.what();
+  }
+
+  framework->start();
+
+  QWidget placeholder;
+  placeholder.show();
+
+  return app.exec();
+}

+ 10 - 0
Applications/ctkExampleHostedApp/target_libraries.cmake

@@ -0,0 +1,10 @@
+#
+# See CMake/ctkMacroGetTargetLibraries.cmake
+# 
+# This file should list the libraries required to build the current CTK application.
+# 
+
+SET(target_libraries
+  CTKPluginFramework
+  org_commontk_dicom_wg23_app
+  )

+ 1 - 0
CMakeLists.txt

@@ -308,6 +308,7 @@ SET(CTK_APPLICATIONS
   ctkDICOMQuery:OFF
   ctkDICOMRetrieve:OFF
   ctkExampleHost:OFF
+  ctkExampleHostedApp:OFF
   ctkPluginBrowser:OFF
   ctkPluginGenerator:OFF
   ctkSimplePythonShell:OFF