123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- /*=============================================================================
- Library: CTK
- Copyright (c) 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>
- // for testing purposes use:
- // --hostURL http://localhost:8081/host --applicationURL http://localhost:8082/app dicomapp
- // replace "//$" with nothing as soon as ctkDicomAppServer/ctkDicomHostService exist
- #include <ctkDicomAppServer.h>
- #include <ctkDicomHostService.h>
- #include <ctkDicomHostInterface.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);
- qDebug() << "################################################################";
- qApp->setOrganizationName("CTK");
- qApp->setOrganizationDomain("commontk.org");
- qApp->setApplicationName("ctkExampleHostedApp");
- // parse the command line
- qDebug() << "################################################################";
- 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);
- qDebug() << "hostURL is: " << hostURL << " . Extracted port is: " << QUrl(hostURL).port();
- if(qApp->arguments().at(3) != "--applicationURL")
- {
- qCritical() << "First argument must be --applicationURL.";
- print_usage();
- exit(1);
- }
- QString appURL = qApp->arguments().at(4);
- qDebug() << "appURL is: " << appURL << " . Extracted port is: " << QUrl(appURL).port();
- // 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_dah_exampleapp";
- }
- // 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;
- QList<ctkPlugin*> installedPlugins;
- while(dirIter.hasNext())
- {
- try
- {
- QString fileLocation = dirIter.next();
- if (fileLocation.contains("org_commontk_dah") && !fileLocation.contains(pluginName))
- {
- ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
- installedPlugins << plugin;
- //plugin->start(ctkPlugin::START_TRANSIENT);
- }
- if (fileLocation.contains(pluginName))
- {
- pluginFound = true;
- pluginFileLocation = fileLocation;
- }
- }
- catch (const ctkPluginException& e)
- {
- qCritical() << e.what();
- }
- }
- try
- {
- foreach(ctkPlugin* plugin, installedPlugins)
- {
- plugin->start(ctkPlugin::START_TRANSIENT);
- }
- }
- 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);
- }
- qCritical() << "app about to start 1";
- // setup the communication infrastructure: DicomAppServer and DicomHostService
- /*ctkDicomAppServer * appServer =*/ new ctkDicomAppServer(QUrl(appURL).port()); // accesses the app-plugin via getService("ctkDicomAppInterface");
- ctkDicomHostInterface * hostInterface = new ctkDicomHostService(QUrl(hostURL).port(), "/HostInterface");
- framework->getPluginContext()->registerService(QStringList("ctkDicomHostInterface"), hostInterface);
- qCritical() << "app about to start 2";
- // install and start the plugin with the business logic and remember pointer to start it later
- //ctkPlugin* plugin;
- try
- {
- ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(pluginFileLocation));
- plugin->start(ctkPlugin::START_TRANSIENT);
- }
- catch (const ctkPluginException& e)
- {
- qCritical() << e.what();
- }
- qCritical() << "app about to start 3";
- framework->start();
- qCritical() << "app about to start 4";
- //QWidget placeholder;
- //placeholder.show();
- return app.exec();
- }
|