diff options
Diffstat (limited to 'src/kvirc/module/kvi_module.h')
-rw-r--r-- | src/kvirc/module/kvi_module.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/src/kvirc/module/kvi_module.h b/src/kvirc/module/kvi_module.h new file mode 100644 index 00000000..7c237643 --- /dev/null +++ b/src/kvirc/module/kvi_module.h @@ -0,0 +1,204 @@ +#ifndef _KVI_MODULE_H_ +#define _KVI_MODULE_H_ + +//============================================================================= +// +// File : kvi_module.h +// Creation date : Sat Aug 12 2000 18:34:22 by Szymon Stefanek +// +// This file is part of the KVirc irc client distribution +// Copyright (C) 2000-2004 Szymon Stefanek (pragma at kvirc dot net) +// +// This program is FREE software. You can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your opinion) any later version. +// +// This program is distributed in the HOPE that it will be USEFUL, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, write to the Free Software Foundation, +// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#include "kvi_settings.h" +#include "kvi_string.h" +//#include "kvi_command.h" +#include "kvi_parameterlist.h" +#include "kvi_library.h" +#include "kvi_pointerlist.h" +#include "kvi_moduleextension.h" +#include "kvi_kvs_moduleinterface.h" + +#include "kvi_pointerhashtable.h" + +#ifdef COMPILE_CRYPT_SUPPORT + #include "kvi_crypt.h" +#endif + + +#ifdef COMPILE_ON_WINDOWS + #define KVIMODULEEXPORT extern "C" __declspec(dllexport) + #define KVIMODULEEXPORTDATA KVIMODULEEXPORT + #define KVIMODULEEXPORTFUNC KVIMODULEEXPORT +#else + #define KVIMODULEEXPORT extern "C" + #define KVIMODULEEXPORTDATA + #define KVIMODULEEXPORTFUNC KVIMODULEEXPORT +#endif + +class KviModule; + + +typedef bool (*KviModuleSystemRoutine)(KviModule *); +typedef bool (*KviModuleCtrlRoutine)(KviModule *,const char *,void *); + + +typedef struct _KviModuleInfo +{ + const char * szKVIrcVersion; // must match KVI_VERSION if module version checking is in force + const char * szModuleName; + const char * szVersion; + const char * szCopyright; + const char * szDescription; + /* + * This routine is called when the module is loaded + */ + KviModuleSystemRoutine init_routine; + /* + * This should return true if the module is actually + * not providing any service and can be unloaded from memory. + * Please note that this is not a mandatory lock: KVIrc may still unload + * the module even when this function returns false. + * The only assumption you can make is that KVIrc will not try + * to unload the module spontaneously: it will do it only if forced to + * (actually only by the user, but maybe later also by constrained resources). + * If this pointer is zero, KVIrc will assume that the module + * does not provide any service and will unload the module at the + * first spontaneous cleanup. + * There is a yet stronger locking method in KviModule::lock() + */ + KviModuleSystemRoutine can_unload; + /* + * This is a generic control routine with prototype + * bool <name>(KviModule * m,const char * operation,void * param) + * KVIrc uses it to comunicate with bundled modules + * in most user-build modules this will be 0 + */ + KviModuleCtrlRoutine ctrl_routine; + /* + * This routine is called when the module is being unloaded + * Note that the module can be unloaded even if can_unload returns false: + * that's the user choice, KVIrc can only forcibly unload the module, + * so better cleanup everything here :) + */ + KviModuleSystemRoutine cleanup_routine; // WARNING : g_pApp may be in the destructor and may have no frames open! +} KviModuleInfo; + +// NOTE: The init and cleanup routines should NEVER rely on g_pApp existing! +// so only "initialization and cleanup INTERNAL to the module" goes there! + +// A module should be prepared to be unloaded at ANY time, even if it is locked +// or if can_unload returns false; locking is only a "suggestion" to the KVIrc core. + +// When unloaded, a module must ensure the destruction of all the resources that depend +// on the module core code + +#define KVIRC_MODULE_STRUCTURE_SYMBOL "KVIrc_module_info" + +#define KVIRC_MODULE(_szModuleName,_szVersion,_szCopyright,_szDescription,_init_routine,_can_unload,_ctrl_routine,_cleanup_routine) \ + \ + KVIMODULEEXPORTDATA KviModuleInfo KVIrc_module_info= \ + { \ + KVI_VERSION, \ + _szModuleName, \ + _szVersion, \ + _szCopyright, \ + _szDescription, \ + _init_routine, \ + _can_unload, \ + _ctrl_routine, \ + _cleanup_routine \ + }; + + +// old type parsing procedures +/* +typedef bool (*KviModuleCommandParseProc)(KviModule *,KviCommand *); +typedef bool (*KviModuleFunctionParseProc)(KviModule *,KviCommand *,KviParameterList *,KviStr &); +typedef bool (*KviModuleEventParseProc)(KviModule *,KviWindow *,KviParameterList *); +*/ + + +class KVIRC_API KviModule : public KviKvsModuleInterface +{ + friend class KviPointerHashTable<const char *,KviModule>; + friend class KviModuleManager; + friend class KviUserParser; +protected: + KviModule(kvi_library_t handle,KviModuleInfo * info,const char * name,const char * filename); +public: + ~KviModule(); // must be public for KviPointerList +private: + KviStr m_szName; + KviStr m_szFileName; + KviModuleInfo * m_pModuleInfo; + kvi_library_t m_dlHandle; + unsigned int m_uLock; + long int m_lastAccessTime; +protected: + void updateAccessTime(); + unsigned int secondsSinceLastAccess(); +public: + // name of this module: always low case , single word + const char * name(){ return m_szName.ptr(); }; + // filename of this module (with NO path): formatted as "libkvi%s.so",name() + const char * filename(){ return m_szFileName.ptr(); }; + kvi_library_t handle(){ return m_dlHandle; }; + KviModuleInfo * moduleInfo(){ return m_pModuleInfo; }; + + // + // This is a locking method a bit stronger than the can_unload routine + // in the descriptor. It will behave in the same way plus + // the user will be unable to unload the module unless he will specify + // the -f switch to the <module>.unload command. Without the -f switch + // he will be just warned that the module is locked in memory and + // don't want to be unloaded. + // The usage of this method is encouraged + // only when you have blocking dialogs inside the module code, like the + // QMessageBox or QFileDialog static methods. + // In this case you're entering a modal event loop that you can't control + // and if some script will attempt to forcibly unload the module + // it will surely lead to a crash when the static method returns (jumping into no mans land). + // <module>.unload -f is in fact undocumented so people will substantially + // not use it (unless they are developers and they are reading this comment). + // + void lock(){ m_uLock++; }; + void unlock(){ if(m_uLock > 0)m_uLock--; }; + bool isLocked(){ return (m_uLock > 0); }; + + void * getSymbol(const char * symname); + bool ctrl(const char * operation,void * param); + + void getDefaultConfigFileName(KviStr &buffer); + void getDefaultConfigFileName(QString &szBuffer); + + static void unregisterMetaObject(const char * metaObjName); + +#ifdef COMPILE_CRYPT_SUPPORT + void registerCryptEngine(KviCryptEngineDescription * d); + void unregisterCryptEngine(const char * szName); + void unregisterCryptEngines(); +#endif + + KviModuleExtensionDescriptor * registerExtension(const KviStr &szType,const KviStr &szName,const QString &szVisibleName,KviModuleExtensionAllocRoutine r); + KviModuleExtensionDescriptor * registerExtension(const KviStr &szType,const KviStr &szName,const QString &szVisibleName,KviModuleExtensionAllocRoutine r,const QPixmap &icon); + KviModuleExtensionDescriptor * findExtensionDescriptor(const KviStr &szType,const KviStr &szName); + void unregisterAllExtensions(); +}; + +#endif //_KVI_MODULE_H_ |