|
@@ -33,308 +33,318 @@
|
|
|
#include <QUrl>
|
|
|
|
|
|
|
|
|
- ctkPlugins::ctkPlugins(ctkPluginFrameworkContext* fw) {
|
|
|
- fwCtx = fw;
|
|
|
- plugins.insert(fw->systemPlugin.getLocation(), &fw->systemPlugin);
|
|
|
+ctkPlugins::ctkPlugins(ctkPluginFrameworkContext* fw)
|
|
|
+{
|
|
|
+ fwCtx = fw;
|
|
|
+ plugins.insert(fw->systemPlugin.getLocation(), &fw->systemPlugin);
|
|
|
+}
|
|
|
+
|
|
|
+void ctkPlugins::clear()
|
|
|
+{
|
|
|
+ QWriteLocker lock(&pluginsLock);
|
|
|
+ plugins.clear();
|
|
|
+ fwCtx = 0;
|
|
|
+}
|
|
|
+
|
|
|
+ctkPlugin* ctkPlugins::install(const QUrl& location, QIODevice* in)
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This ctkPlugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::install(location, inputStream) called on closed plugins object.");
|
|
|
}
|
|
|
|
|
|
- void ctkPlugins::clear()
|
|
|
{
|
|
|
QWriteLocker lock(&pluginsLock);
|
|
|
- plugins.clear();
|
|
|
- fwCtx = 0;
|
|
|
- }
|
|
|
|
|
|
- ctkPlugin* ctkPlugins::install(const QUrl& location, QIODevice* in)
|
|
|
- {
|
|
|
- if (!fwCtx)
|
|
|
- { // This ctkPlugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::install(location, inputStream) called on closed plugins object.");
|
|
|
+ QHash<QString, ctkPlugin*>::const_iterator it = plugins.find(location.toString());
|
|
|
+ if (it != plugins.end())
|
|
|
+ {
|
|
|
+ return it.value();
|
|
|
}
|
|
|
|
|
|
+ // install new plugin
|
|
|
+ ctkPluginArchive* pa = 0;
|
|
|
+ QString localPluginPath;
|
|
|
+ try
|
|
|
{
|
|
|
- QWriteLocker lock(&pluginsLock);
|
|
|
-
|
|
|
- QHash<QString, ctkPlugin*>::const_iterator it = plugins.find(location.toString());
|
|
|
- if (it != plugins.end()) {
|
|
|
- return it.value();
|
|
|
- }
|
|
|
-
|
|
|
- // install new plugin
|
|
|
- ctkPluginArchive* pa = 0;
|
|
|
- QString localPluginPath;
|
|
|
- try {
|
|
|
- if (!in) {
|
|
|
- // extract the input stream from the given location
|
|
|
-
|
|
|
-
|
|
|
-// //TODO Support for http proxy authentication
|
|
|
-// //TODO put in update as well
|
|
|
-// String auth = fwCtx.props.getProperty("http.proxyAuth");
|
|
|
-// if (auth != null && !"".equals(auth)) {
|
|
|
-// if ("http".equals(url.getProtocol()) ||
|
|
|
-// "https".equals(url.getProtocol())) {
|
|
|
-// String base64 = Util.base64Encode(auth);
|
|
|
-// conn.setRequestProperty("Proxy-Authorization",
|
|
|
-// "Basic " + base64);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// // Support for http basic authentication
|
|
|
-// String basicAuth = fwCtx.props.getProperty("http.basicAuth");
|
|
|
-// if (basicAuth != null && !"".equals(basicAuth)) {
|
|
|
-// if ("http".equals(url.getProtocol()) ||
|
|
|
-// "https".equals(url.getProtocol())) {
|
|
|
-// String base64 = Util.base64Encode(basicAuth);
|
|
|
-// conn.setRequestProperty("Authorization",
|
|
|
-// "Basic " +base64);
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
- if (location.scheme() != "file")
|
|
|
- {
|
|
|
- throw std::runtime_error(std::string("Unsupported url scheme: ") + qPrintable(location.scheme()));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- qDebug() << QString("Trying to install file:") << location.path();
|
|
|
- localPluginPath = location.toLocalFile();
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!in)
|
|
|
+ {
|
|
|
+ // extract the input stream from the given location
|
|
|
+
|
|
|
+
|
|
|
+ // //TODO Support for http proxy authentication
|
|
|
+ // //TODO put in update as well
|
|
|
+ // String auth = fwCtx.props.getProperty("http.proxyAuth");
|
|
|
+ // if (auth != null && !"".equals(auth)) {
|
|
|
+ // if ("http".equals(url.getProtocol()) ||
|
|
|
+ // "https".equals(url.getProtocol())) {
|
|
|
+ // String base64 = Util.base64Encode(auth);
|
|
|
+ // conn.setRequestProperty("Proxy-Authorization",
|
|
|
+ // "Basic " + base64);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // // Support for http basic authentication
|
|
|
+ // String basicAuth = fwCtx.props.getProperty("http.basicAuth");
|
|
|
+ // if (basicAuth != null && !"".equals(basicAuth)) {
|
|
|
+ // if ("http".equals(url.getProtocol()) ||
|
|
|
+ // "https".equals(url.getProtocol())) {
|
|
|
+ // String base64 = Util.base64Encode(basicAuth);
|
|
|
+ // conn.setRequestProperty("Authorization",
|
|
|
+ // "Basic " +base64);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ if (location.scheme() != "file")
|
|
|
+ {
|
|
|
+ throw std::runtime_error(std::string("Unsupported url scheme: ") + qPrintable(location.scheme()));
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- //TODO copy the QIODevice to a local cache
|
|
|
+ qDebug() << QString("Trying to install file:") << location.path();
|
|
|
+ localPluginPath = location.toLocalFile();
|
|
|
}
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //TODO copy the QIODevice to a local cache
|
|
|
+ }
|
|
|
|
|
|
- pa = fwCtx->storage->insertPlugin(location, localPluginPath);
|
|
|
+ pa = fwCtx->storage->insertPlugin(location, localPluginPath);
|
|
|
|
|
|
- ctkPlugin* res = new ctkPlugin(fwCtx, pa);
|
|
|
- plugins.insert(location.toString(), res);
|
|
|
+ ctkPlugin* res = new ctkPlugin(fwCtx, pa);
|
|
|
+ plugins.insert(location.toString(), res);
|
|
|
|
|
|
- fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
|
|
|
+ fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
|
|
|
|
|
|
- return res;
|
|
|
- }
|
|
|
- catch (const std::exception& e)
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+ catch (const std::exception& e)
|
|
|
+ {
|
|
|
+ if (pa)
|
|
|
{
|
|
|
- if (pa) {
|
|
|
- pa->purge();
|
|
|
- }
|
|
|
- // if (dynamic_cast<const SecurityException&>(e)) {
|
|
|
- // throw;
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- throw ctkPluginException(QString("Failed to install plugin: ") + QString(e.what()),
|
|
|
- ctkPluginException::UNSPECIFIED, &e);
|
|
|
- // }
|
|
|
+ pa->purge();
|
|
|
}
|
|
|
+ // if (dynamic_cast<const SecurityException&>(e)) {
|
|
|
+ // throw;
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ throw ctkPluginException(QString("Failed to install plugin: ") + QString(e.what()),
|
|
|
+ ctkPluginException::UNSPECIFIED, &e);
|
|
|
+ // }
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- void ctkPlugins::remove(const QUrl& location)
|
|
|
- {
|
|
|
- QWriteLocker lock(&pluginsLock);
|
|
|
- delete plugins.take(location.toString());
|
|
|
+}
|
|
|
+
|
|
|
+void ctkPlugins::remove(const QUrl& location)
|
|
|
+{
|
|
|
+ QWriteLocker lock(&pluginsLock);
|
|
|
+ delete plugins.take(location.toString());
|
|
|
+}
|
|
|
+
|
|
|
+ctkPlugin* ctkPlugins::getPlugin(int id) const
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This plugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::getPlugin(id) called on closed plugins object.");
|
|
|
}
|
|
|
|
|
|
- ctkPlugin* ctkPlugins::getPlugin(int id) const
|
|
|
{
|
|
|
- if (!fwCtx)
|
|
|
- { // This plugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::getPlugin(id) called on closed plugins object.");
|
|
|
- }
|
|
|
+ QReadLocker lock(&pluginsLock);
|
|
|
|
|
|
+ QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
+ while (it.hasNext())
|
|
|
{
|
|
|
- QReadLocker lock(&pluginsLock);
|
|
|
-
|
|
|
- QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
- while (it.hasNext())
|
|
|
+ ctkPlugin* plugin = it.next().value();
|
|
|
+ if (plugin->getPluginId() == id)
|
|
|
{
|
|
|
- ctkPlugin* plugin = it.next().value();
|
|
|
- if (plugin->getPluginId() == id) {
|
|
|
- return plugin;
|
|
|
- }
|
|
|
+ return plugin;
|
|
|
}
|
|
|
}
|
|
|
- return 0;
|
|
|
}
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- ctkPlugin* ctkPlugins::getPlugin(const QString& location) const {
|
|
|
- if (!fwCtx)
|
|
|
- { // This plugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::getPlugin(location) called on closed plugins object.");
|
|
|
- }
|
|
|
+ctkPlugin* ctkPlugins::getPlugin(const QString& location) const
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This plugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::getPlugin(location) called on closed plugins object.");
|
|
|
+ }
|
|
|
|
|
|
- QReadLocker lock(&pluginsLock);
|
|
|
- QHash<QString, ctkPlugin*>::const_iterator it = plugins.find(location);
|
|
|
- if (it != plugins.end()) return it.value();
|
|
|
- return 0;
|
|
|
+ QReadLocker lock(&pluginsLock);
|
|
|
+ QHash<QString, ctkPlugin*>::const_iterator it = plugins.find(location);
|
|
|
+ if (it != plugins.end()) return it.value();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+ctkPlugin* ctkPlugins::getPlugin(const QString& name, const ctkVersion& version) const
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This ctkPlugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::getPlugin(name, version) called on closed plugins object.");
|
|
|
}
|
|
|
|
|
|
- ctkPlugin* ctkPlugins::getPlugin(const QString& name, const ctkVersion& version) const
|
|
|
{
|
|
|
- if (!fwCtx)
|
|
|
- { // This ctkPlugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::getPlugin(name, version) called on closed plugins object.");
|
|
|
- }
|
|
|
+ QReadLocker lock(&pluginsLock);
|
|
|
|
|
|
+ QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
+ while (it.hasNext())
|
|
|
{
|
|
|
- QReadLocker lock(&pluginsLock);
|
|
|
-
|
|
|
- QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
- while (it.hasNext())
|
|
|
+ ctkPlugin* plugin = it.next().value();
|
|
|
+ if ((name == plugin->getSymbolicName()) && (version == plugin->getVersion()))
|
|
|
{
|
|
|
- ctkPlugin* plugin = it.next().value();
|
|
|
- if ((name == plugin->getSymbolicName()) && (version == plugin->getVersion()))
|
|
|
- {
|
|
|
- return plugin;
|
|
|
- }
|
|
|
+ return plugin;
|
|
|
}
|
|
|
}
|
|
|
- return 0;
|
|
|
}
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- QList<ctkPlugin*> ctkPlugins::getPlugins() const
|
|
|
- {
|
|
|
- if (!fwCtx)
|
|
|
- { // This plugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::getPlugins() called on closed plugins object.");
|
|
|
- }
|
|
|
-
|
|
|
- {
|
|
|
- QReadLocker lock(&pluginsLock);
|
|
|
- return plugins.values();
|
|
|
- }
|
|
|
+QList<ctkPlugin*> ctkPlugins::getPlugins() const
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This plugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::getPlugins() called on closed plugins object.");
|
|
|
}
|
|
|
|
|
|
- QList<ctkPlugin*> ctkPlugins::getPlugins(const QString& name) const
|
|
|
{
|
|
|
- QList<ctkPlugin*> res;
|
|
|
+ QReadLocker lock(&pluginsLock);
|
|
|
+ return plugins.values();
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
+QList<ctkPlugin*> ctkPlugins::getPlugins(const QString& name) const
|
|
|
+{
|
|
|
+ QList<ctkPlugin*> res;
|
|
|
+
|
|
|
+ {
|
|
|
+ QReadLocker lock(&pluginsLock);
|
|
|
+ QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
+ while (it.hasNext())
|
|
|
{
|
|
|
- QReadLocker lock(&pluginsLock);
|
|
|
- QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
- while (it.hasNext())
|
|
|
+ ctkPlugin* plugin = it.next().value();
|
|
|
+ if (name == plugin->getSymbolicName())
|
|
|
{
|
|
|
- ctkPlugin* plugin = it.next().value();
|
|
|
- if (name == plugin->getSymbolicName())
|
|
|
- {
|
|
|
- res.push_back(plugin);
|
|
|
- }
|
|
|
+ res.push_back(plugin);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return res;
|
|
|
}
|
|
|
|
|
|
- QList<ctkPlugin*> ctkPlugins::getPlugins(const QString& name, const ctkVersionRange& range) const {
|
|
|
- if (!fwCtx)
|
|
|
- { // This plugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::getPlugins(name, versionRange) called on closed plugins object.");
|
|
|
- }
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
+QList<ctkPlugin*> ctkPlugins::getPlugins(const QString& name, const ctkVersionRange& range) const
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This plugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::getPlugins(name, versionRange) called on closed plugins object.");
|
|
|
+ }
|
|
|
|
|
|
- QList<ctkPlugin*> pluginsWithName = getPlugins(name);
|
|
|
- QList<ctkPlugin*> res;
|
|
|
+ QList<ctkPlugin*> pluginsWithName = getPlugins(name);
|
|
|
+ QList<ctkPlugin*> res;
|
|
|
|
|
|
- QListIterator<ctkPlugin*> it(pluginsWithName);
|
|
|
- while (it.hasNext()) {
|
|
|
- ctkPlugin* plugin = it.next();
|
|
|
- if (range.withinRange(plugin->getVersion()))
|
|
|
+ QListIterator<ctkPlugin*> it(pluginsWithName);
|
|
|
+ while (it.hasNext()) {
|
|
|
+ ctkPlugin* plugin = it.next();
|
|
|
+ if (range.withinRange(plugin->getVersion()))
|
|
|
+ {
|
|
|
+ int j = res.size();
|
|
|
+ while (--j >= 0)
|
|
|
{
|
|
|
- int j = res.size();
|
|
|
- while (--j >= 0)
|
|
|
+ if (plugin->getVersion().compare(res.at(j)->getVersion()) <= 0)
|
|
|
{
|
|
|
- if (plugin->getVersion().compare(res.at(j)->getVersion()) <= 0)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ break;
|
|
|
}
|
|
|
- res.insert(j + 1, plugin);
|
|
|
}
|
|
|
+ res.insert(j + 1, plugin);
|
|
|
}
|
|
|
-
|
|
|
- return res;
|
|
|
}
|
|
|
|
|
|
- QList<ctkPlugin*> ctkPlugins::getActivePlugins() const {
|
|
|
- if (!fwCtx)
|
|
|
- { // This plugins instance has been closed!
|
|
|
- throw std::logic_error("ctkPlugins::getActivePlugins() called on closed plugins object.");
|
|
|
- }
|
|
|
+ return res;
|
|
|
+}
|
|
|
|
|
|
- QList<ctkPlugin*> slist;
|
|
|
+QList<ctkPlugin*> ctkPlugins::getActivePlugins() const
|
|
|
+{
|
|
|
+ if (!fwCtx)
|
|
|
+ { // This plugins instance has been closed!
|
|
|
+ throw std::logic_error("ctkPlugins::getActivePlugins() called on closed plugins object.");
|
|
|
+ }
|
|
|
+
|
|
|
+ QList<ctkPlugin*> slist;
|
|
|
+ {
|
|
|
+ QReadLocker lock(&pluginsLock);
|
|
|
+ QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
+ while (it.hasNext())
|
|
|
{
|
|
|
- QReadLocker lock(&pluginsLock);
|
|
|
- QHashIterator<QString, ctkPlugin*> it(plugins);
|
|
|
- while (it.hasNext())
|
|
|
- {
|
|
|
- ctkPlugin* plugin = it.next().value();
|
|
|
- ctkPlugin::State s = plugin->getState();
|
|
|
- if (s == ctkPlugin::ACTIVE || s == ctkPlugin::STARTING) {
|
|
|
- slist.push_back(plugin);
|
|
|
- }
|
|
|
+ ctkPlugin* plugin = it.next().value();
|
|
|
+ ctkPlugin::State s = plugin->getState();
|
|
|
+ if (s == ctkPlugin::ACTIVE || s == ctkPlugin::STARTING) {
|
|
|
+ slist.push_back(plugin);
|
|
|
}
|
|
|
}
|
|
|
- return slist;
|
|
|
}
|
|
|
+ return slist;
|
|
|
+}
|
|
|
|
|
|
- void ctkPlugins::load() {
|
|
|
- QList<ctkPluginArchive*> pas = fwCtx->storage->getAllPluginArchives();
|
|
|
- QListIterator<ctkPluginArchive*> it(pas);
|
|
|
+void ctkPlugins::load()
|
|
|
+{
|
|
|
+ QList<ctkPluginArchive*> pas = fwCtx->storage->getAllPluginArchives();
|
|
|
+ QListIterator<ctkPluginArchive*> it(pas);
|
|
|
|
|
|
+ {
|
|
|
+ QWriteLocker lock(&pluginsLock);
|
|
|
+ while (it.hasNext())
|
|
|
{
|
|
|
- QWriteLocker lock(&pluginsLock);
|
|
|
- while (it.hasNext())
|
|
|
+ ctkPluginArchive* pa = it.next();
|
|
|
+ try
|
|
|
{
|
|
|
- ctkPluginArchive* pa = it.next();
|
|
|
- try
|
|
|
- {
|
|
|
- ctkPlugin* plugin = new ctkPlugin(fwCtx, pa);
|
|
|
- plugins.insert(pa->getPluginLocation().toString(), plugin);
|
|
|
- }
|
|
|
- catch (const std::exception& e)
|
|
|
- {
|
|
|
- pa->setAutostartSetting(-1); // Do not start on launch
|
|
|
- pa->setStartLevel(-2); // Mark as uninstalled
|
|
|
-
|
|
|
- std::cerr << "Error: Failed to load bundle "
|
|
|
- << pa->getPluginId()
|
|
|
- << " (" << qPrintable(pa->getPluginLocation().toString()) << ")"
|
|
|
- << " uninstalled it!\n";
|
|
|
- std::cerr << e.what();
|
|
|
- }
|
|
|
+ ctkPlugin* plugin = new ctkPlugin(fwCtx, pa);
|
|
|
+ plugins.insert(pa->getPluginLocation().toString(), plugin);
|
|
|
+ }
|
|
|
+ catch (const std::exception& e)
|
|
|
+ {
|
|
|
+ pa->setAutostartSetting(-1); // Do not start on launch
|
|
|
+ pa->setStartLevel(-2); // Mark as uninstalled
|
|
|
+
|
|
|
+ std::cerr << "Error: Failed to load bundle "
|
|
|
+ << pa->getPluginId()
|
|
|
+ << " (" << qPrintable(pa->getPluginLocation().toString()) << ")"
|
|
|
+ << " uninstalled it!\n";
|
|
|
+ std::cerr << e.what();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- void ctkPlugins::startPlugins(const QList<ctkPlugin*>& slist) const {
|
|
|
- // Sort in start order
|
|
|
- // Resolve first to avoid dead lock
|
|
|
- QListIterator<ctkPlugin*> it(slist);
|
|
|
- while (it.hasNext())
|
|
|
- {
|
|
|
- ctkPlugin* plugin = it.next();
|
|
|
- ctkPluginPrivate* pp = plugin->d_func();
|
|
|
- pp->getUpdatedState();
|
|
|
- }
|
|
|
+void ctkPlugins::startPlugins(const QList<ctkPlugin*>& slist) const
|
|
|
+{
|
|
|
+ // Sort in start order
|
|
|
+ // Resolve first to avoid dead lock
|
|
|
+ QListIterator<ctkPlugin*> it(slist);
|
|
|
+ while (it.hasNext())
|
|
|
+ {
|
|
|
+ ctkPlugin* plugin = it.next();
|
|
|
+ ctkPluginPrivate* pp = plugin->d_func();
|
|
|
+ pp->getUpdatedState();
|
|
|
+ }
|
|
|
|
|
|
- it.toFront();
|
|
|
- while (it.hasNext())
|
|
|
+ it.toFront();
|
|
|
+ while (it.hasNext())
|
|
|
+ {
|
|
|
+ ctkPlugin* plugin = it.next();
|
|
|
+ ctkPluginPrivate* pp = plugin->d_func();
|
|
|
+ if (pp->getUpdatedState() == ctkPlugin::RESOLVED)
|
|
|
{
|
|
|
- ctkPlugin* plugin = it.next();
|
|
|
- ctkPluginPrivate* pp = plugin->d_func();
|
|
|
- if (pp->getUpdatedState() == ctkPlugin::RESOLVED)
|
|
|
+ try
|
|
|
{
|
|
|
- try
|
|
|
- {
|
|
|
- plugin->start(0);
|
|
|
- }
|
|
|
- catch (const ctkPluginException& pe)
|
|
|
- {
|
|
|
- pp->fwCtx->listeners.frameworkError(plugin, pe);
|
|
|
- }
|
|
|
+ plugin->start(0);
|
|
|
+ }
|
|
|
+ catch (const ctkPluginException& pe)
|
|
|
+ {
|
|
|
+ pp->fwCtx->listeners.frameworkError(plugin, pe);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ }
|
|
|
}
|