summaryrefslogtreecommitdiff
path: root/PluginLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'PluginLoader.cpp')
-rwxr-xr-xPluginLoader.cpp230
1 files changed, 230 insertions, 0 deletions
diff --git a/PluginLoader.cpp b/PluginLoader.cpp
new file mode 100755
index 0000000..2a59cb9
--- /dev/null
+++ b/PluginLoader.cpp
@@ -0,0 +1,230 @@
+/** \file PluginLoader.h
+\brief Define the plugin loader
+\author alpha_one_x86
+\version 0.3
+\date 2010
+\licence GPL3, see the file COPYING */
+
+#include "PluginLoader.h"
+
+PluginLoader::PluginLoader(QObject *parent) :
+ QObject(parent)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //load the overall instance
+ plugins=PluginsManager::getInstance();
+ //load the plugin
+ plugins->lockPluginListEdition();
+ QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_PluginLoader);
+ foreach(PluginsAvailable currentPlugin,list)
+ onePluginAdded(currentPlugin);
+ qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
+ qRegisterMetaType<CatchState>("CatchState");
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)));
+ connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
+ connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()));
+ plugins->unlockPluginListEdition();
+ needEnable=false;
+ last_state=Uncaught;
+ last_have_plugin=false;
+ last_inWaitOfReply=false;
+}
+
+PluginLoader::~PluginLoader()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_PluginLoader);
+ foreach(PluginsAvailable currentPlugin,list)
+ onePluginWillBeRemoved(currentPlugin);
+ PluginsManager::destroyInstanceAtTheLastCall();
+}
+
+void PluginLoader::resendState()
+{
+ sendState(true);
+}
+
+void PluginLoader::onePluginAdded(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_PluginLoader)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QString pluginPath=plugin.path+PluginsManager::getResolvedPluginName("pluginLoader");
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"try load: "+pluginPath);
+ QPluginLoader *pluginLoader= new QPluginLoader(pluginPath);
+ QObject *pluginInstance = pluginLoader->instance();
+ if(pluginInstance)
+ {
+ PluginInterface_PluginLoader *PluginLoader = qobject_cast<PluginInterface_PluginLoader *>(pluginInstance);
+ //check if found
+ index=0;
+ loop_size=pluginList.size();
+ while(index<loop_size)
+ {
+ if(pluginList.at(index).PluginLoaderInterface==PluginLoader)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Plugin already found"));
+ pluginLoader->unload();
+ return;
+ }
+ index++;
+ }
+ if(PluginLoader)
+ {
+ #ifdef ULTRACOPIER_DEBUG
+ connect(PluginLoader,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SLOT(debugInformation(DebugLevel,QString,QString,QString,int)));
+ #endif // ULTRACOPIER_DEBUG
+ LocalPlugin newEntry;
+ newEntry.options=new LocalPluginOptions("PluginLoader-"+plugin.name);
+ newEntry.pluginLoader = pluginLoader;
+ newEntry.PluginLoaderInterface = PluginLoader;
+ newEntry.path = plugin.path;
+ newEntry.state = Uncaught;
+ newEntry.inWaitOfReply = false;
+ pluginList << newEntry;
+ PluginLoader->setResources(newEntry.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ connect(pluginList.last().PluginLoaderInterface,SIGNAL(newState(CatchState)),this,SLOT(newState(CatchState)));
+ if(needEnable)
+ {
+ pluginList.last().inWaitOfReply=true;
+ newEntry.PluginLoaderInterface->setEnabled(needEnable);
+ }
+
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to cast the plugin: "+pluginLoader->errorString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to load the plugin: "+pluginLoader->errorString());
+}
+
+void PluginLoader::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_PluginLoader)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ index=0;
+ loop_size=pluginList.size();
+ while(index<loop_size)
+ {
+ if(plugin.path==pluginList.at(index).path)
+ {
+ pluginList.at(index).PluginLoaderInterface->setEnabled(false);
+ if(!pluginList.at(index).pluginLoader->isLoaded() || pluginList.at(index).pluginLoader->unload())
+ {
+ delete pluginList.at(index).options;
+ pluginList.removeAt(index);
+ }
+ sendState();
+ return;
+ }
+ index++;
+ }
+}
+
+void PluginLoader::load()
+{
+ needEnable=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList[index].inWaitOfReply=true;
+ pluginList.at(index).PluginLoaderInterface->setEnabled(true);
+ index++;
+ }
+}
+
+void PluginLoader::unload()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ needEnable=false;
+ int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList[index].inWaitOfReply=true;
+ pluginList.at(index).PluginLoaderInterface->setEnabled(false);
+ index++;
+ }
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void PluginLoader::debugInformation(DebugLevel level,const QString& fonction,const QString& text,const QString& file,const int& ligne)
+{
+ DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,"Plugin loader plugin");
+}
+#endif // ULTRACOPIER_DEBUG
+
+void PluginLoader::allPluginIsloaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"with value: "+QString::number(pluginList.size()>0));
+ sendState(true);
+}
+
+void PluginLoader::sendState(bool force)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start, pluginList.size(): %1, force: %2").arg(pluginList.size()).arg(force));
+ CatchState current_state=Uncaught;
+ bool found_not_listen=false,found_listen=false,found_inWaitOfReply=false;
+ int index=0;
+ while(index<pluginList.size())
+ {
+ if(current_state==Uncaught)
+ {
+ if(pluginList.at(index).state==Semiuncaught)
+ current_state=Semiuncaught;
+ else if(pluginList.at(index).state==Uncaught)
+ found_not_listen=true;
+ else if(pluginList.at(index).state==Caught)
+ found_listen=true;
+ }
+ if(pluginList.at(index).inWaitOfReply)
+ found_inWaitOfReply=true;
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("current_state: %1").arg(current_state));
+ if(current_state==Uncaught)
+ {
+ if(found_not_listen && !found_listen)
+ current_state=Uncaught;
+ else if(!found_not_listen && found_listen)
+ current_state=Caught;
+ else
+ current_state=Semiuncaught;
+ }
+ bool have_plugin=pluginList.size()>0;
+ if(force || current_state!=last_state || have_plugin!=last_have_plugin || found_inWaitOfReply!=last_inWaitOfReply)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("send pluginLoaderReady(%1,%2,%3)").arg(current_state).arg(have_plugin).arg(found_inWaitOfReply));
+ emit pluginLoaderReady(current_state,have_plugin,found_inWaitOfReply);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Skip the signal sending"));
+ last_state=Uncaught;
+ last_have_plugin=have_plugin;
+ last_inWaitOfReply=found_inWaitOfReply;
+}
+
+void PluginLoader::newState(const CatchState &state)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start, state: %1").arg(state));
+ PluginInterface_PluginLoader *temp=qobject_cast<PluginInterface_PluginLoader *>(QObject::sender());
+ if(temp==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("listener not located!"));
+ return;
+ }
+ int index=0;
+ while(index<pluginList.size())
+ {
+ if(temp==pluginList.at(index).PluginLoaderInterface)
+ {
+ pluginList[index].state=state;
+ pluginList[index].inWaitOfReply=false;
+ sendState(true);
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("listener not found!"));
+}