123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /*=============================================================================
- 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.
- =============================================================================*/
- #ifndef CTKPLUGINPRIVATE_P_H
- #define CTKPLUGINPRIVATE_P_H
- #include "ctkPlugin.h"
- #include "ctkPluginException.h"
- #include "ctkRequirePlugin_p.h"
- #include <QHash>
- #include <QPluginLoader>
- #include <QDateTime>
- #include <QFileInfo>
- #include <QMutex>
- #include <QWaitCondition>
- class ctkPluginActivator;
- class ctkPluginArchive;
- class ctkPluginFrameworkContext;
- /**
- * \ingroup PluginFramework
- */
- class ctkPluginPrivate {
- protected:
- const QWeakPointer<ctkPlugin> q_ptr;
- class LockObject
- {
- public:
- LockObject() {};
- void lock();
- bool tryLock();
- bool tryLock(int timeout);
- void unlock();
- bool wait(unsigned long time = ULONG_MAX);
- void wakeAll();
- void wakeOne();
- private:
- Q_DISABLE_COPY(LockObject)
- QMutex m_Lock;
- QWaitCondition m_Condition;
- };
- public:
- inline QWeakPointer<ctkPlugin> q_func() { return q_ptr; }
- inline QWeakPointer<const ctkPlugin> q_func() const { return q_ptr; }
- friend class ctkPlugin;
- struct Locker
- {
- Locker(LockObject* obj) : m_Obj(obj) { m_Obj->lock(); }
- ~Locker() { m_Obj->unlock(); }
- private:
- LockObject* m_Obj;
- };
- /**
- * Construct a new plugin based on a ctkPluginArchive.
- *
- * @param fw ctkPluginFrameworkContext for this plugin.
- * @param ba ctkPlugin archive representing the shared library and cached data
- * @param checkContext AccessConrolContext to do permission checks against.
- * @exception ctkInvalidArgumentException Faulty manifest for bundle
- */
- ctkPluginPrivate(QWeakPointer<ctkPlugin> qq, ctkPluginFrameworkContext* fw,
- QSharedPointer<ctkPluginArchive> pa /*, Object checkContext*/);
- /**
- * Construct a new empty ctkPlugin.
- *
- * Only called for the system plugin
- *
- * @param fw Framework for this plugin.
- */
- ctkPluginPrivate(QWeakPointer<ctkPlugin> qq,
- ctkPluginFrameworkContext* fw,
- long id,
- const QString& loc,
- const QString& sym,
- const ctkVersion& ver);
- virtual ~ctkPluginPrivate();
- /**
- * Get updated plugin state. That means check if an installed
- * plugin has been resolved.
- *
- * @return ctkPlugin state
- */
- ctkPlugin::State getUpdatedState();
- /**
- * Get root for persistent storage area for this plugin.
- *
- * @return A QDir object representing the data root.
- */
- QFileInfo getDataRoot();
- /**
- * Set state to INSTALLED. We assume that the plug-in is resolved
- * when entering this method.
- */
- void setStateInstalled(bool sendEvent);
- /**
- * Purge any old files associated with this plug-in.
- */
- void purge();
- /**
- * Save the autostart setting to the persistent plugin storage.
- *
- * @param setting The autostart options to save.
- */
- void setAutostartSetting(const ctkPlugin::StartOptions& setting);
- void ignoreAutostartSetting();
- void modified();
- /**
- * Performs the actual activation.
- */
- void finalizeActivation();
- const ctkRuntimeException* stop0();
- /**
- * Stop code that is executed in the pluginThread without holding the
- * operationLock.
- */
- const ctkRuntimeException* stop1();
- /**
- *
- */
- void update0(const QUrl &updateLocation, bool wasActive);
- /**
- *
- */
- int getStartLevel();
- /**
- * Wait for an ongoing operation to finish.
- *
- * @param lock QMutex used for locking.
- * @param src Caller to include in exception message.
- * @param longWait True, if we should wait extra long before aborting.
- * @throws ctkPluginException if the ongoing (de-)activation does not finish
- * within reasonable time.
- */
- void waitOnOperation(LockObject* lock, const QString& src, bool longWait);
- /**
- *
- */
- QStringList findResourceEntries(const QString& path,
- const QString& pattern, bool recurse) const;
- /**
- * Union of flags allowing plugin class access
- */
- static const ctkPlugin::States RESOLVED_FLAGS;
- ctkPluginFrameworkContext * const fwCtx;
- /**
- * ctkPlugin identifier
- */
- const long id;
- /**
- * ctkPlugin location identifier
- */
- const QString location;
- /**
- * ctkPlugin symbolic name
- */
- QString symbolicName;
- /**
- * ctkPlugin version
- */
- ctkVersion version;
- /**
- * State of the plugin
- */
- ctkPlugin::State state;
- /**
- * ctkPlugin archive
- */
- QSharedPointer<ctkPluginArchive> archive;
- /**
- * Directory for plugin data
- */
- QFileInfo pluginDir;
- /**
- * ctkPluginContext for the plugin
- */
- QScopedPointer<ctkPluginContext> pluginContext;
- /**
- * ctkPluginActivator for the plugin
- */
- ctkPluginActivator* pluginActivator;
- /**
- * The Qt plugin loader for the plugin
- */
- QPluginLoader pluginLoader;
- /**
- * Time when the plugin was last modified
- */
- QDateTime lastModified;
- /**
- * Stores the default locale entries when uninstalled
- */
- QHash<QString, QString> cachedHeaders;
- /**
- * Stores the raw manifest headers
- */
- QHash<QString, QString> cachedRawHeaders;
- /**
- * Type of operation in progress. Blocks bundle calls during activator and
- * listener calls
- */
- QAtomicInt operation;
- static const int IDLE = 0;
- static const int ACTIVATING = 1;
- static const int DEACTIVATING = 2;
- static const int RESOLVING = 3;
- static const int UNINSTALLING = 4;
- static const int UNRESOLVING = 5;
- static const int UPDATING = 6;
- LockObject operationLock;
- /** Saved exception of resolve failure. */
- ctkPluginException* resolveFailException;
- /**
- * True when this plugin has its activation policy
- * set to "eager"
- */
- bool eagerActivation;
- /** List of ctkRequirePlugin entries. */
- QList<ctkRequirePlugin*> require;
- private:
- /** Rember if plugin was started */
- bool wasStarted;
- /**
- * Check manifest and cache certain manifest headers as variables.
- */
- void checkManifestHeaders();
- // This could potentially be run in its own thread,
- // parallelizing plugin activations
- ctkPluginException* start0();
- void startDependencies();
- /**
- * Remove a plugins registered listeners, registered services and
- * used services.
- *
- */
- void removePluginResources();
- ctkPlugin::State getUpdatedState_unlocked();
- };
- #endif // CTKPLUGINPRIVATE_P_H
|