diff --git a/honoka/src/honoka_imengine.cpp b/honoka/src/honoka_imengine.cpp index 1fe9a11..a253258 100644 --- a/honoka/src/honoka_imengine.cpp +++ b/honoka/src/honoka_imengine.cpp @@ -202,18 +202,24 @@ void* plugin = dlopen(d.c_str(), RTLD_LAZY); if (!plugin) continue; createInstanceFunc *getInstance = (createInstanceFunc *)dlsym(plugin,"getHonokaPluginInstance"); - if (!getInstance) { + deleteInstanceFunc *deleteInstance = (deleteInstanceFunc *)dlsym(plugin,"deleteHonokaPluginInstance"); + getPluginVersionFunc *getPluginVersion = (getPluginVersionFunc *)dlsym(plugin,"getHonokaPluginVersion"); + if ((!getInstance) || (!deleteInstance) || (!getPluginVersion)) { dlclose(plugin); continue; } - HonokaPluginBase *p = getInstance(_scim_config); - if (p->getPluginType() == "Convertor") { - convertors.push_back(static_cast(p)); - } else - if (p->getPluginType() == "PreEditor") { - preeditors.push_back(static_cast(p)); + if (getPluginVersion() == HONOKA_PLUGIN_VERSION) { + HonokaPluginBase *p = getInstance(_scim_config); + if (p->getPluginType() == "Convertor") { + convertors.push_back(static_cast(p)); + } else + if (p->getPluginType() == "PreEditor") { + preeditors.push_back(static_cast(p)); + } else { + deleteInstance(p); + dlclose(plugin); + } } else { - delete p; dlclose(plugin); } } diff --git a/honoka/src/honoka_imengine.h b/honoka/src/honoka_imengine.h index 4370d9f..1200397 100644 --- a/honoka/src/honoka_imengine.h +++ b/honoka/src/honoka_imengine.h @@ -36,6 +36,8 @@ #include typedef HonokaPluginBase* createInstanceFunc(ConfigPointer); +typedef void deleteInstanceFunc(HonokaPluginBase *); +typedef int getPluginVersionFunc(); using namespace scim; using namespace std; diff --git a/honoka/src/honokapluginbase.h b/honoka/src/honokapluginbase.h index dccd9aa..169f0ad 100644 --- a/honoka/src/honokapluginbase.h +++ b/honoka/src/honokapluginbase.h @@ -27,6 +27,8 @@ #include #define Uses_SCIM_CONFIG_BASE +#define HONOKA_PLUGIN_VERSION 1 + using namespace std; using namespace scim; @@ -34,14 +36,19 @@ @author TAM (Teppei Tamra) */ -#define HonokaPluginRegister(pName) extern "C" {HonokaPluginBase *getHonokaPluginInstance(ConfigPointer cfg){return new pName(cfg);}} +#define HonokaPluginRegister(pName) \ + extern "C" { \ + HonokaPluginBase *getHonokaPluginInstance(ConfigPointer cfg) { return new pName(cfg); } \ + void deleteHonokaPluginInstance(HonokaPluginBase *o) { delete static_cast(o); } \ + int getHonokaPluginVersion() { return(HONOKA_PLUGIN_VERSION); } \ + } class HonokaPluginBase{ protected: HonokaPluginBase(const String pluginType); + ~HonokaPluginBase(); public: - ~HonokaPluginBase(); String getPluginType();