From 11081edf268e40b9667310359bc245e83318ac73 Mon Sep 17 00:00:00 2001 From: Alexey Uzhva Date: Mon, 16 Apr 2007 06:31:26 +0000 Subject: some cosmetic fixes and better internal api git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@492 17fca916-40b9-46aa-a4ea-0a15b648b75c --- src/modules/system/plugin.cpp | 121 ++++++++++++++++++++---------------------- src/modules/system/plugin.h | 45 ++++++++-------- 2 files changed, 82 insertions(+), 84 deletions(-) (limited to 'src/modules/system') diff --git a/src/modules/system/plugin.cpp b/src/modules/system/plugin.cpp index e92c0de53..faff43612 100644 --- a/src/modules/system/plugin.cpp +++ b/src/modules/system/plugin.cpp @@ -48,31 +48,35 @@ TODO */ -KviPlugin::KviPlugin() +KviPlugin::KviPlugin(kvi_library_t pLib, const QString& name) { + m_Plugin = pLib; + m_szName = name; } KviPlugin::~KviPlugin() { } -bool KviPlugin::load(QString& pszPluginName) +KviPlugin* KviPlugin::load(const QString& szFileName) { - m_Plugin = kvi_library_open(pszPluginName.local8Bit()); - if (!m_Plugin) + kvi_library_t pLibrary = kvi_library_open(szFileName.local8Bit()); + if (!pLibrary) { - return false; + return 0; } + + KviPlugin* pPlugin = new KviPlugin(pLibrary,KviFileUtils::extractFileName(szFileName)); plugin_load function_load; - function_load = (plugin_unload)kvi_library_symbol(m_Plugin,"_load"); + function_load = (plugin_unload)kvi_library_symbol(pLibrary,"_load"); if (function_load) { //TODO: THREAD function_load(); } - return true; + return pPlugin; } bool KviPlugin::unload(bool forced) @@ -97,7 +101,7 @@ bool KviPlugin::unload(bool forced) return true; } -int KviPlugin::call(QString& pszFunctionName, int argc, char * argv[], char ** pBuffer) +int KviPlugin::call(const QString& pszFunctionName, int argc, char * argv[], char ** pBuffer) { int r; plugin_function function_call; @@ -113,12 +117,12 @@ int KviPlugin::call(QString& pszFunctionName, int argc, char * argv[], char ** p return r; } -KviStr KviPlugin::name() +QString KviPlugin::name() { return m_szName; } -void KviPlugin::setName(QString& Name) +void KviPlugin::setName(const QString& Name) { m_szName = Name; } @@ -126,7 +130,7 @@ void KviPlugin::setName(QString& Name) KviPluginManager::KviPluginManager() { - m_pPluginDict = new KviAsciiDict(17,false); + m_pPluginDict = new KviDict(5,false); m_pPluginDict->setAutoDelete(false); m_bCanUnload = true; @@ -139,31 +143,26 @@ KviPluginManager::~KviPluginManager() bool KviPluginManager::pluginCall(KviKvsModuleFunctionCall *c) { - QString szPluginName; //contains full path and plugin name like "c:/plugin.dll" - QString szSinglePluginName; // contains only the name of the plugin like "plugin.dll" + QString szPluginPath; //contains full path and plugin name like "c:/plugin.dll" QString szFunctionName; KVSM_PARAMETERS_BEGIN(c) - KVSM_PARAMETER("plugin",KVS_PT_NONEMPTYSTRING,0,szPluginName) + KVSM_PARAMETER("plugin_path",KVS_PT_NONEMPTYSTRING,0,szPluginPath) KVSM_PARAMETER("function",KVS_PT_NONEMPTYSTRING,0,szFunctionName) KVSM_PARAMETERS_END(c) //Check if there is such a plugin - if(!findPlugin(szPluginName, szSinglePluginName)) + if(!findPlugin(szPluginPath)) { c->error(__tr2qs("Plugin not found. Please check the plugin-name and path.")); return true; } - // Check if plugin is already loaded - if(!pluginIsLoaded(szSinglePluginName)) + //Load plugin or check it in cache + if(!loadPlugin(szPluginPath)) { - //If not loaded try to load now - if(!loadPlugin(szPluginName,szSinglePluginName)) - { - c->error(__tr2qs("Error while loading plugin.")); - return true; - } + c->error(__tr2qs("Error while loading plugin.")); + return true; } //Parsing more Parameters @@ -223,7 +222,7 @@ bool KviPluginManager::pluginCall(KviKvsModuleFunctionCall *c) KviPlugin * plugin; - plugin = getPlugin(szSinglePluginName); + plugin = getPlugin(szPluginPath); int r = plugin->call(szFunctionName,iArgc,ppArgv,&returnBuffer); if(r == -1) @@ -249,7 +248,7 @@ bool KviPluginManager::checkUnload() Always called when system module should be unloaded Checking here if all small "modules" can be unloaded */ - KviAsciiDictIterator it(*m_pPluginDict); + KviDictIterator it(*m_pPluginDict); m_bCanUnload = true; @@ -257,7 +256,7 @@ bool KviPluginManager::checkUnload() { if(it.current()->unload(false)) { - m_pPluginDict->remove(it.current()->name()); + m_pPluginDict->remove(it.currentKey()); } else { m_bCanUnload = false; } @@ -268,71 +267,67 @@ bool KviPluginManager::checkUnload() void KviPluginManager::unloadAll(bool forced) { - KviAsciiDictIterator it(*m_pPluginDict); + KviDictIterator it(*m_pPluginDict); while(it.current()) { it.current()->unload(true); - m_pPluginDict->remove(it.current()->name()); + m_pPluginDict->remove(it.currentKey()); } } -bool KviPluginManager::findPlugin(QString& pName, QString& pSingleName) +bool KviPluginManager::findPlugin(QString& szPath) { - QDir d; - QString szPath; - - //Trying to find the plugin directly - d.setPath(pName); - d.convertToAbs(); // To be sure that path is completly absolute! - - if(!KviFileUtils::fileExists(d.path())) + QString szFileName=KviFileUtils::extractFileName(szPath); + if(KviFileUtils::isAbsolutePath(szPath) && KviFileUtils::fileExists(szPath)) { + // Ok, + return true; + } else { //Plugin not found in direct way. Looking in kvirc local dir - g_pApp->getGlobalKvircDirectory(szPath,KviApp::None,"easyplugins/"+pName); - - d.setPath(szPath); - d.convertToAbs(); // To be sure that path is completly absolute! + g_pApp->getGlobalKvircDirectory(szPath,KviApp::EasyPlugins,szFileName); - if(!KviFileUtils::fileExists(d.path())) + if(!KviFileUtils::fileExists(szPath)) { //Plugin not found in kvirc local dir. Looking in kvirc global dir - g_pApp->getLocalKvircDirectory(szPath,KviApp::None,"easyplugins/"+pName); - - d.setPath(szPath); - d.convertToAbs(); // To be sure that path is completly absolute! + g_pApp->getLocalKvircDirectory(szPath,KviApp::EasyPlugins,szFileName); - if(!KviFileUtils::fileExists(d.path())) + if(!KviFileUtils::fileExists(szPath)) { return false; } } } - - pName = d.path(); - pSingleName = KviFileUtils::extractFileName(pName); //TODO - - return true; } -bool KviPluginManager::pluginIsLoaded(QString& pSingleName) +bool KviPluginManager::isPluginLoaded(const QString& pSingleName) { - KviPlugin * p = m_pPluginDict->find(pSingleName.local8Bit()); - if (!p) return false; else return true; + KviPlugin * p = m_pPluginDict->find(pSingleName); + if (!p) + return false; + else + return true; } -bool KviPluginManager::loadPlugin(QString& pName, QString& pSingleName) +bool KviPluginManager::loadPlugin(const QString& szPluginPath) { - KviPlugin * plugin = new KviPlugin(); - if(!plugin->load(pName)) return false; - plugin->setName(pSingleName); - m_pPluginDict->insert(pSingleName.local8Bit(),plugin); - return true; + if(isPluginLoaded(szPluginPath)) + { + return getPlugin(szPluginPath)!=0; + } else { + KviPlugin * plugin = KviPlugin::load(szPluginPath); + if(plugin) + { + m_pPluginDict->insert(szPluginPath,plugin); + return true; + } + } + return false; } -KviPlugin * KviPluginManager::getPlugin(QString& pSingleName) +KviPlugin * KviPluginManager::getPlugin(const QString& szPluginPath) { - KviPlugin * p = m_pPluginDict->find(pSingleName.local8Bit()); + KviPlugin * p = m_pPluginDict->find(szPluginPath); return p; } \ No newline at end of file diff --git a/src/modules/system/plugin.h b/src/modules/system/plugin.h index f2b532313..c931a59c5 100644 --- a/src/modules/system/plugin.h +++ b/src/modules/system/plugin.h @@ -25,7 +25,7 @@ //============================================================================= #include "kvi_module.h" -#include "kvi_asciidict.h" +#include "kvi_dict.h" #define MAX_RETURN_BUFFER 512 @@ -35,21 +35,24 @@ typedef int (*plugin_load)(); class KviPlugin { - public: - KviPlugin(); - ~KviPlugin(); - private: - // shared - // internal - QString m_szName; - kvi_library_t m_Plugin; - public: - bool load(QString& pszPluginName); - bool unload(bool forced); - int call(QString& pszFunctionName, int argc, char * argv[], char ** pBuffer); - KviStr name(); - void setName(QString& Name); - protected: +protected: + // You have to create plugin instance by calling KviPlugin::load() + KviPlugin(kvi_library_t pLib, const QString& name); +public: + ~KviPlugin(); +private: + // shared + // internal + kvi_library_t m_Plugin; + QString m_szName; +public: + static KviPlugin* load(const QString& szFileName); + + bool unload(bool forced); + int call(const QString& szFunctionName, int argc, char * argv[], char ** pBuffer); + QString name(); + void setName(const QString& szName); +protected: }; class KviPluginManager @@ -61,16 +64,16 @@ class KviPluginManager // shared bool m_bCanUnload; // internal - KviAsciiDict * m_pPluginDict; + KviDict * m_pPluginDict; public: bool pluginCall(KviKvsModuleFunctionCall *c); bool checkUnload(); void unloadAll(bool forced); protected: - bool findPlugin(QString& pName, QString& pSingleName); - bool pluginIsLoaded(QString& pSingleName); - bool loadPlugin(QString& pName, QString& pSingleName); - KviPlugin * getPlugin(QString& pSingleName); + bool findPlugin(QString& szName); + bool isPluginLoaded(const QString& szFileNameOrPathToLoad); + bool loadPlugin(const QString& szPluginPath); + KviPlugin * getPlugin(const QString& szPluginPath); }; #endif //_PLUGIN_H_ \ No newline at end of file -- cgit v1.3.1-10-gc9f91