1 #include "pluginmanager.h"
5 StarDictPluginBaseObject::StarDictPluginBaseObject(const char *filename, GModule *module_, plugin_configure_func_t configure_func_):
6 plugin_filename(filename), module(module_), configure_func(configure_func_)
10 StarDictPluginBase::StarDictPluginBase(StarDictPluginBaseObject *baseobj_):
15 typedef void (*stardict_plugin_exit_func_t)(void);
17 StarDictPluginBase::~StarDictPluginBase()
20 stardict_plugin_exit_func_t stardict_plugin_exit;
21 gpointer stardict_plugin_exit_avoid_warning;
23 func.stardict_plugin_exit = 0;
24 if (g_module_symbol (baseobj->module, "stardict_plugin_exit", (gpointer *)&(func.stardict_plugin_exit_avoid_warning))) {
25 func.stardict_plugin_exit();
27 g_module_close (baseobj->module);
31 void StarDictPluginBase::configure()
33 if (baseobj->configure_func != NULL)
34 baseobj->configure_func();
37 const char *StarDictPluginBase::get_filename()
39 return baseobj->plugin_filename.c_str();
42 StarDictPlugins::StarDictPlugins(const char *dirpath, const std::list<std::string>& order_list, const std::list<std::string>& disable_list)
44 plugindirpath = dirpath;
45 load(dirpath, order_list, disable_list);
48 StarDictPlugins::~StarDictPlugins()
54 PluginLoader(StarDictPlugins& plugins_): plugins(plugins_) {}
55 void operator()(const std::string& url, bool disable) {
57 plugins.load_plugin(url.c_str());
60 StarDictPlugins& plugins;
63 void StarDictPlugins::load(const char *dirpath, const std::list<std::string>& order_list, const std::list<std::string>& disable_list)
65 std::list<std::string> plugins_dirs;
66 plugins_dirs.push_back(dirpath);
67 for_each_file(plugins_dirs, "."G_MODULE_SUFFIX, order_list, disable_list, PluginLoader(*this));
70 void StarDictPlugins::reorder(const std::list<std::string>& order_list)
72 VirtualDictPlugins.reorder(order_list);
73 NetDictPlugins.reorder(order_list);
74 SpecialDictPlugins.reorder(order_list);
75 TtsPlugins.reorder(order_list);
76 ParseDataPlugins.reorder(order_list);
77 MiscPlugins.reorder(order_list);
80 bool StarDictPlugins::get_loaded(const char *filename)
83 for (std::list<std::string>::iterator iter = loaded_plugin_list.begin(); iter != loaded_plugin_list.end(); ++iter) {
84 if (*iter == filename) {
92 class PluginInfoLoader {
94 PluginInfoLoader(StarDictPlugins& plugins_, std::list<StarDictPluginInfo> &virtualdict_pluginlist_, std::list<StarDictPluginInfo> &netdict_pluginlist_, std::list<StarDictPluginInfo> &specialdict_pluginlist_, std::list<StarDictPluginInfo> &tts_pluginlist_, std::list<StarDictPluginInfo> &parsedata_pluginlist_, std::list<StarDictPluginInfo> &misc_pluginlist_): plugins(plugins_), virtualdict_pluginlist(virtualdict_pluginlist_), netdict_pluginlist(netdict_pluginlist_), specialdict_pluginlist(specialdict_pluginlist_), tts_pluginlist(tts_pluginlist_), parsedata_pluginlist(parsedata_pluginlist_), misc_pluginlist(misc_pluginlist_) {}
95 void operator()(const std::string& url, bool disable) {
97 StarDictPlugInType plugin_type = StarDictPlugInType_UNKNOWN;
100 plugins.get_plugin_info(url.c_str(), plugin_type, info_xml, can_configure);
101 if (plugin_type != StarDictPlugInType_UNKNOWN && (!info_xml.empty())) {
102 StarDictPluginInfo plugin_info;
103 plugin_info.filename = url;
104 plugin_info.plugin_type = plugin_type;
105 plugin_info.info_xml = info_xml;
106 plugin_info.can_configure = can_configure;
107 switch (plugin_type) {
108 case StarDictPlugInType_VIRTUALDICT:
109 virtualdict_pluginlist.push_back(plugin_info);
111 case StarDictPlugInType_NETDICT:
112 netdict_pluginlist.push_back(plugin_info);
114 case StarDictPlugInType_SPECIALDICT:
115 specialdict_pluginlist.push_back(plugin_info);
117 case StarDictPlugInType_TTS:
118 tts_pluginlist.push_back(plugin_info);
120 case StarDictPlugInType_PARSEDATA:
121 parsedata_pluginlist.push_back(plugin_info);
123 case StarDictPlugInType_MISC:
124 misc_pluginlist.push_back(plugin_info);
133 StarDictPlugins& plugins;
134 std::list<StarDictPluginInfo> &virtualdict_pluginlist;
135 std::list<StarDictPluginInfo> &netdict_pluginlist;
136 std::list<StarDictPluginInfo> &specialdict_pluginlist;
137 std::list<StarDictPluginInfo> &tts_pluginlist;
138 std::list<StarDictPluginInfo> &parsedata_pluginlist;
139 std::list<StarDictPluginInfo> &misc_pluginlist;
142 void StarDictPlugins::get_plugin_list(const std::list<std::string>& order_list, std::list<std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> > > &plugin_list)
145 std::list<StarDictPluginInfo> virtualdict_pluginlist;
146 std::list<StarDictPluginInfo> netdict_pluginlist;
147 std::list<StarDictPluginInfo> specialdict_pluginlist;
148 std::list<StarDictPluginInfo> tts_pluginlist;
149 std::list<StarDictPluginInfo> parsedata_pluginlist;
150 std::list<StarDictPluginInfo> misc_pluginlist;
152 std::list<std::string> plugins_dirs;
153 plugins_dirs.push_back(plugindirpath);
154 std::list<std::string> disable_list;
155 for_each_file(plugins_dirs, "."G_MODULE_SUFFIX, order_list, disable_list, PluginInfoLoader(*this, virtualdict_pluginlist, netdict_pluginlist, specialdict_pluginlist, tts_pluginlist, parsedata_pluginlist, misc_pluginlist));
157 if (!virtualdict_pluginlist.empty()) {
158 plugin_list.push_back(std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> >(StarDictPlugInType_VIRTUALDICT, virtualdict_pluginlist));
160 if (!netdict_pluginlist.empty()) {
161 plugin_list.push_back(std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> >(StarDictPlugInType_NETDICT, netdict_pluginlist));
163 if (!specialdict_pluginlist.empty()) {
164 plugin_list.push_back(std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> >(StarDictPlugInType_SPECIALDICT, specialdict_pluginlist));
166 if (!tts_pluginlist.empty()) {
167 plugin_list.push_back(std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> >(StarDictPlugInType_TTS, tts_pluginlist));
169 if (!parsedata_pluginlist.empty()) {
170 plugin_list.push_back(std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> >(StarDictPlugInType_PARSEDATA, parsedata_pluginlist));
172 if (!misc_pluginlist.empty()) {
173 plugin_list.push_back(std::pair<StarDictPlugInType, std::list<StarDictPluginInfo> >(StarDictPlugInType_MISC, misc_pluginlist));
177 typedef bool (*stardict_plugin_init_func_t)(StarDictPlugInObject *obj);
179 void StarDictPlugins::get_plugin_info(const char *filename, StarDictPlugInType &plugin_type, std::string &info_xml, bool &can_configure)
182 module = g_module_open (filename, G_MODULE_BIND_LAZY);
184 g_print("Load %s failed!\n", filename);
188 stardict_plugin_init_func_t stardict_plugin_init;
189 gpointer stardict_plugin_init_avoid_warning;
191 func.stardict_plugin_init = 0;
192 if (!g_module_symbol (module, "stardict_plugin_init", (gpointer *)&(func.stardict_plugin_init_avoid_warning))) {
193 g_print("Load %s failed: No stardict_plugin_init func!\n", filename);
194 g_module_close (module);
197 StarDictPlugInObject *plugin_obj = new StarDictPlugInObject();
198 bool failed = func.stardict_plugin_init(plugin_obj);
200 g_print("Load %s failed!\n", filename);
201 g_module_close (module);
205 plugin_type = plugin_obj->type;
206 info_xml = plugin_obj->info_xml;
207 can_configure = (plugin_obj->configure_func != NULL);
209 g_module_close (module);
212 typedef bool (*stardict_virtualdict_plugin_init_func_t)(StarDictVirtualDictPlugInObject *obj);
213 typedef bool (*stardict_netdict_plugin_init_func_t)(StarDictNetDictPlugInObject *obj);
214 typedef bool (*stardict_specialdict_plugin_init_func_t)(StarDictSpecialDictPlugInObject *obj);
215 typedef bool (*stardict_tts_plugin_init_func_t)(StarDictTtsPlugInObject *obj);
216 typedef bool (*stardict_parsedata_plugin_init_func_t)(StarDictParseDataPlugInObject *obj);
217 typedef bool (*stardict_misc_plugin_init_func_t)(void);
219 void StarDictPlugins::load_plugin(const char *filename)
222 for (std::list<std::string>::iterator iter = loaded_plugin_list.begin(); iter != loaded_plugin_list.end(); ++iter) {
223 if (*iter == filename) {
230 loaded_plugin_list.push_back(filename);
232 module = g_module_open (filename, G_MODULE_BIND_LAZY);
234 g_print("Load %s failed!\n", filename);
238 stardict_plugin_init_func_t stardict_plugin_init;
239 gpointer stardict_plugin_init_avoid_warning;
241 func.stardict_plugin_init = 0;
242 if (!g_module_symbol (module, "stardict_plugin_init", (gpointer *)&(func.stardict_plugin_init_avoid_warning))) {
243 g_print("Load %s failed: No stardict_plugin_init func!\n", filename);
244 g_module_close (module);
247 StarDictPlugInObject *plugin_obj = new StarDictPlugInObject();
248 bool failed = func.stardict_plugin_init(plugin_obj);
250 g_print("Load %s failed!\n", filename);
251 g_module_close (module);
255 StarDictPlugInType ptype = plugin_obj->type;
256 StarDictPluginBaseObject *baseobj = new StarDictPluginBaseObject(filename, module, plugin_obj->configure_func);
258 if (ptype == StarDictPlugInType_VIRTUALDICT) {
260 stardict_virtualdict_plugin_init_func_t stardict_virtualdict_plugin_init;
261 gpointer stardict_virtualdict_plugin_init_avoid_warning;
263 func2.stardict_virtualdict_plugin_init = 0;
264 if (!g_module_symbol (module, "stardict_virtualdict_plugin_init", (gpointer *)&(func2.stardict_virtualdict_plugin_init_avoid_warning))) {
265 printf("Load %s failed: No stardict_virtualdict_plugin_init func!\n", filename);
266 g_module_close (module);
270 StarDictVirtualDictPlugInObject *virtualdict_plugin_obj = new StarDictVirtualDictPlugInObject();
271 failed = func2.stardict_virtualdict_plugin_init(virtualdict_plugin_obj);
273 g_print("Load %s failed!\n", filename);
274 g_module_close (module);
276 delete virtualdict_plugin_obj;
279 VirtualDictPlugins.add(baseobj, virtualdict_plugin_obj);
280 } else if (ptype == StarDictPlugInType_NETDICT) {
282 stardict_netdict_plugin_init_func_t stardict_netdict_plugin_init;
283 gpointer stardict_netdict_plugin_init_avoid_warning;
285 func2.stardict_netdict_plugin_init = 0;
286 if (!g_module_symbol (module, "stardict_netdict_plugin_init", (gpointer *)&(func2.stardict_netdict_plugin_init_avoid_warning))) {
287 printf("Load %s failed: No stardict_netdict_plugin_init func!\n", filename);
288 g_module_close (module);
292 StarDictNetDictPlugInObject *netdict_plugin_obj = new StarDictNetDictPlugInObject();
293 failed = func2.stardict_netdict_plugin_init(netdict_plugin_obj);
295 g_print("Load %s failed!\n", filename);
296 g_module_close (module);
298 delete netdict_plugin_obj;
301 NetDictPlugins.add(baseobj, netdict_plugin_obj);
302 } else if (ptype == StarDictPlugInType_SPECIALDICT) {
304 stardict_specialdict_plugin_init_func_t stardict_specialdict_plugin_init;
305 gpointer stardict_specialdict_plugin_init_avoid_warning;
307 func2.stardict_specialdict_plugin_init = 0;
308 if (!g_module_symbol (module, "stardict_specialdict_plugin_init", (gpointer *)&(func2.stardict_specialdict_plugin_init_avoid_warning))) {
309 printf("Load %s failed: No stardict_specialdict_plugin_init func!\n", filename);
310 g_module_close (module);
314 StarDictSpecialDictPlugInObject *specialdict_plugin_obj = new StarDictSpecialDictPlugInObject();
315 failed = func2.stardict_specialdict_plugin_init(specialdict_plugin_obj);
317 g_print("Load %s failed!\n", filename);
318 g_module_close (module);
320 delete specialdict_plugin_obj;
323 SpecialDictPlugins.add(baseobj, specialdict_plugin_obj);
324 } else if (ptype == StarDictPlugInType_TTS) {
326 stardict_tts_plugin_init_func_t stardict_tts_plugin_init;
327 gpointer stardict_tts_plugin_init_avoid_warning;
329 func2.stardict_tts_plugin_init = 0;
330 if (!g_module_symbol (module, "stardict_tts_plugin_init", (gpointer *)&(func2.stardict_tts_plugin_init_avoid_warning))) {
331 printf("Load %s failed: No stardict_tts_plugin_init func!\n", filename);
332 g_module_close (module);
336 StarDictTtsPlugInObject *tts_plugin_obj = new StarDictTtsPlugInObject();
337 failed = func2.stardict_tts_plugin_init(tts_plugin_obj);
339 g_print("Load %s failed!\n", filename);
340 g_module_close (module);
342 delete tts_plugin_obj;
345 TtsPlugins.add(baseobj, tts_plugin_obj);
346 } else if (ptype == StarDictPlugInType_PARSEDATA) {
348 stardict_parsedata_plugin_init_func_t stardict_parsedata_plugin_init;
349 gpointer stardict_parsedata_plugin_init_avoid_warning;
351 func3.stardict_parsedata_plugin_init = 0;
352 if (!g_module_symbol (module, "stardict_parsedata_plugin_init", (gpointer *)&(func3.stardict_parsedata_plugin_init_avoid_warning))) {
353 printf("Load %s failed: No stardict_parsedata_plugin_init func!\n", filename);
354 g_module_close (module);
358 StarDictParseDataPlugInObject *parsedata_plugin_obj = new StarDictParseDataPlugInObject();
359 failed = func3.stardict_parsedata_plugin_init(parsedata_plugin_obj);
361 g_print("Load %s failed!\n", filename);
362 g_module_close (module);
364 delete parsedata_plugin_obj;
367 ParseDataPlugins.add(baseobj, parsedata_plugin_obj);
368 } else if (ptype == StarDictPlugInType_MISC) {
370 stardict_misc_plugin_init_func_t stardict_misc_plugin_init;
371 gpointer stardict_misc_plugin_init_avoid_warning;
373 func4.stardict_misc_plugin_init = 0;
374 if (!g_module_symbol (module, "stardict_misc_plugin_init", (gpointer *)&(func4.stardict_misc_plugin_init_avoid_warning))) {
375 printf("Load %s failed: No stardict_misc_plugin_init func!\n", filename);
376 g_module_close (module);
380 failed = func4.stardict_misc_plugin_init();
382 g_print("Load %s failed!\n", filename);
383 g_module_close (module);
387 MiscPlugins.add(baseobj);
389 g_print("Load %s failed: Unknow type plugin!\n", filename);
390 g_module_close (module);
396 void StarDictPlugins::unload_plugin(const char *filename, StarDictPlugInType plugin_type)
398 for (std::list<std::string>::iterator iter = loaded_plugin_list.begin(); iter != loaded_plugin_list.end(); ++iter) {
399 if (*iter == filename) {
400 loaded_plugin_list.erase(iter);
404 switch (plugin_type) {
405 case StarDictPlugInType_VIRTUALDICT:
406 VirtualDictPlugins.unload_plugin(filename);
408 case StarDictPlugInType_NETDICT:
409 NetDictPlugins.unload_plugin(filename);
411 case StarDictPlugInType_SPECIALDICT:
412 SpecialDictPlugins.unload_plugin(filename);
414 case StarDictPlugInType_TTS:
415 TtsPlugins.unload_plugin(filename);
417 case StarDictPlugInType_PARSEDATA:
418 ParseDataPlugins.unload_plugin(filename);
420 case StarDictPlugInType_MISC:
421 MiscPlugins.unload_plugin(filename);
428 void StarDictPlugins::configure_plugin(const char *filename, StarDictPlugInType plugin_type)
430 switch (plugin_type) {
431 case StarDictPlugInType_VIRTUALDICT:
432 VirtualDictPlugins.configure_plugin(filename);
434 case StarDictPlugInType_NETDICT:
435 NetDictPlugins.configure_plugin(filename);
437 case StarDictPlugInType_SPECIALDICT:
438 SpecialDictPlugins.configure_plugin(filename);
440 case StarDictPlugInType_TTS:
441 TtsPlugins.configure_plugin(filename);
443 case StarDictPlugInType_PARSEDATA:
444 ParseDataPlugins.configure_plugin(filename);
446 case StarDictPlugInType_MISC:
447 MiscPlugins.configure_plugin(filename);
455 // class StarDictVirtualDictPlugins begin.
458 StarDictVirtualDictPlugins::StarDictVirtualDictPlugins()
462 StarDictVirtualDictPlugins::~StarDictVirtualDictPlugins()
464 for (std::vector<StarDictVirtualDictPlugin *>::iterator i = oPlugins.begin(); i != oPlugins.end(); ++i) {
469 void StarDictVirtualDictPlugins::add(StarDictPluginBaseObject *baseobj, StarDictVirtualDictPlugInObject *virtualdict_plugin_obj)
471 StarDictVirtualDictPlugin *plugin = new StarDictVirtualDictPlugin(baseobj, virtualdict_plugin_obj);
472 oPlugins.push_back(plugin);
475 void StarDictVirtualDictPlugins::unload_plugin(const char *filename)
477 for (std::vector<StarDictVirtualDictPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
478 if (strcmp((*iter)->get_filename(), filename) == 0) {
480 oPlugins.erase(iter);
486 void StarDictVirtualDictPlugins::configure_plugin(const char *filename)
488 for (std::vector<StarDictVirtualDictPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
489 if (strcmp((*iter)->get_filename(), filename) == 0) {
490 (*iter)->configure();
496 void StarDictVirtualDictPlugins::lookup(size_t iPlugin, const gchar *word, char ***pppWord, char ****ppppWordData)
498 oPlugins[iPlugin]->lookup(word, pppWord, ppppWordData);
501 const char *StarDictVirtualDictPlugins::dict_name(size_t iPlugin)
503 return oPlugins[iPlugin]->dict_name();
506 const char *StarDictVirtualDictPlugins::dict_id(size_t iPlugin)
508 return oPlugins[iPlugin]->get_filename();
511 bool StarDictVirtualDictPlugins::find_dict_by_id(const char *id, size_t &iPlugin)
513 for (std::vector<StarDictVirtualDictPlugin *>::size_type i = 0; i < oPlugins.size(); i++) {
514 if (strcmp(oPlugins[i]->get_filename(), id)==0) {
523 // class StarDictVirtualDictPlugin begin.
526 StarDictVirtualDictPlugin::StarDictVirtualDictPlugin(StarDictPluginBaseObject *baseobj_, StarDictVirtualDictPlugInObject *virtualdict_plugin_obj):
527 StarDictPluginBase(baseobj_)
529 obj = virtualdict_plugin_obj;
532 StarDictVirtualDictPlugin::~StarDictVirtualDictPlugin()
537 void StarDictVirtualDictPlugin::lookup(const char *word, char ***pppWord, char ****ppppWordData)
539 obj->lookup_func(word, pppWord, ppppWordData);
542 const char *StarDictVirtualDictPlugin::dict_name()
544 return obj->dict_name;
548 // class StarDictNetDictPlugins begin.
551 StarDictNetDictPlugins::StarDictNetDictPlugins()
555 StarDictNetDictPlugins::~StarDictNetDictPlugins()
557 for (std::vector<StarDictNetDictPlugin *>::iterator i = oPlugins.begin(); i != oPlugins.end(); ++i) {
562 void StarDictNetDictPlugins::add(StarDictPluginBaseObject *baseobj, StarDictNetDictPlugInObject *netdict_plugin_obj)
564 StarDictNetDictPlugin *plugin = new StarDictNetDictPlugin(baseobj, netdict_plugin_obj);
565 oPlugins.push_back(plugin);
568 void StarDictNetDictPlugins::unload_plugin(const char *filename)
570 for (std::vector<StarDictNetDictPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
571 if (strcmp((*iter)->get_filename(), filename) == 0) {
573 oPlugins.erase(iter);
579 void StarDictNetDictPlugins::configure_plugin(const char *filename)
581 for (std::vector<StarDictNetDictPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
582 if (strcmp((*iter)->get_filename(), filename) == 0) {
583 (*iter)->configure();
589 void StarDictNetDictPlugins::lookup(size_t iPlugin, const gchar *word, bool ismainwin)
591 oPlugins[iPlugin]->lookup(word, ismainwin);
594 const char *StarDictNetDictPlugins::dict_name(size_t iPlugin)
596 return oPlugins[iPlugin]->dict_name();
599 const char *StarDictNetDictPlugins::dict_id(size_t iPlugin)
601 return oPlugins[iPlugin]->get_filename();
604 const char *StarDictNetDictPlugins::dict_cacheid(size_t iPlugin)
606 return oPlugins[iPlugin]->dict_cacheid();
609 bool StarDictNetDictPlugins::find_dict_by_id(const char *id, size_t &iPlugin)
611 for (std::vector<StarDictNetDictPlugin *>::size_type i = 0; i < oPlugins.size(); i++) {
612 if (strcmp(oPlugins[i]->get_filename(), id)==0) {
621 // class StarDictNetDictPlugin begin.
624 StarDictNetDictPlugin::StarDictNetDictPlugin(StarDictPluginBaseObject *baseobj_, StarDictNetDictPlugInObject *netdict_plugin_obj):
625 StarDictPluginBase(baseobj_)
627 obj = netdict_plugin_obj;
630 StarDictNetDictPlugin::~StarDictNetDictPlugin()
635 void StarDictNetDictPlugin::lookup(const char *word, bool ismainwin)
637 obj->lookup_func(word, ismainwin);
640 const char *StarDictNetDictPlugin::dict_name()
642 return obj->dict_name;
645 const char *StarDictNetDictPlugin::dict_cacheid()
647 return obj->dict_cacheid;
651 // class StarDictSpecialDictPlugins begin.
654 StarDictSpecialDictPlugins::StarDictSpecialDictPlugins()
658 StarDictSpecialDictPlugins::~StarDictSpecialDictPlugins()
660 for (std::vector<StarDictSpecialDictPlugin *>::iterator i = oPlugins.begin(); i != oPlugins.end(); ++i) {
665 void StarDictSpecialDictPlugins::add(StarDictPluginBaseObject *baseobj, StarDictSpecialDictPlugInObject *specialdict_plugin_obj)
667 StarDictSpecialDictPlugin *plugin = new StarDictSpecialDictPlugin(baseobj, specialdict_plugin_obj);
668 oPlugins.push_back(plugin);
671 void StarDictSpecialDictPlugins::unload_plugin(const char *filename)
673 for (std::vector<StarDictSpecialDictPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
674 if (strcmp((*iter)->get_filename(), filename) == 0) {
676 oPlugins.erase(iter);
682 void StarDictSpecialDictPlugins::configure_plugin(const char *filename)
684 for (std::vector<StarDictSpecialDictPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
685 if (strcmp((*iter)->get_filename(), filename) == 0) {
686 (*iter)->configure();
692 void StarDictSpecialDictPlugins::render_widget(size_t iPlugin, bool ismainwin, size_t dictid, const gchar *orig_word, gchar **Word, gchar ***WordData, GtkWidget **widget)
694 oPlugins[iPlugin]->render_widget(ismainwin, dictid, orig_word, Word, WordData, widget);
697 const char *StarDictSpecialDictPlugins::dict_type(size_t iPlugin)
699 return oPlugins[iPlugin]->dict_type();
703 // class StarDictSpecialDictPlugin begin.
706 StarDictSpecialDictPlugin::StarDictSpecialDictPlugin(StarDictPluginBaseObject *baseobj_, StarDictSpecialDictPlugInObject *specialdict_plugin_obj):
707 StarDictPluginBase(baseobj_)
709 obj = specialdict_plugin_obj;
712 StarDictSpecialDictPlugin::~StarDictSpecialDictPlugin()
717 void StarDictSpecialDictPlugin::render_widget(bool ismainwin, size_t dictid, const gchar *orig_word, gchar **Word, gchar ***WordData, GtkWidget **widget)
719 obj->render_widget_func(ismainwin, dictid, orig_word, Word, WordData, widget);
722 const char *StarDictSpecialDictPlugin::dict_type()
724 return obj->dict_type;
728 // class StarDictTtsPlugins begin.
731 StarDictTtsPlugins::StarDictTtsPlugins()
735 StarDictTtsPlugins::~StarDictTtsPlugins()
737 for (std::vector<StarDictTtsPlugin *>::iterator i = oPlugins.begin(); i != oPlugins.end(); ++i) {
742 void StarDictTtsPlugins::add(StarDictPluginBaseObject *baseobj, StarDictTtsPlugInObject *tts_plugin_obj)
744 StarDictTtsPlugin *plugin = new StarDictTtsPlugin(baseobj, tts_plugin_obj);
745 oPlugins.push_back(plugin);
748 void StarDictTtsPlugins::unload_plugin(const char *filename)
750 for (std::vector<StarDictTtsPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
751 if (strcmp((*iter)->get_filename(), filename) == 0) {
753 oPlugins.erase(iter);
759 void StarDictTtsPlugins::configure_plugin(const char *filename)
761 for (std::vector<StarDictTtsPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
762 if (strcmp((*iter)->get_filename(), filename) == 0) {
763 (*iter)->configure();
769 void StarDictTtsPlugins::saytext(size_t iPlugin, const gchar *text)
771 oPlugins[iPlugin]->saytext(text);
774 const char *StarDictTtsPlugins::tts_name(size_t iPlugin)
776 return oPlugins[iPlugin]->tts_name();
780 // class StarDictTtsPlugin begin.
783 StarDictTtsPlugin::StarDictTtsPlugin(StarDictPluginBaseObject *baseobj_, StarDictTtsPlugInObject *tts_plugin_obj):
784 StarDictPluginBase(baseobj_)
786 obj = tts_plugin_obj;
789 StarDictTtsPlugin::~StarDictTtsPlugin()
794 void StarDictTtsPlugin::saytext(const char *text)
796 obj->saytext_func(text);
799 const char *StarDictTtsPlugin::tts_name()
801 return obj->tts_name;
805 // class StarDictParseDataPlugins begin.
808 StarDictParseDataPlugins::StarDictParseDataPlugins()
812 StarDictParseDataPlugins::~StarDictParseDataPlugins()
814 for (std::vector<StarDictParseDataPlugin *>::iterator i = oPlugins.begin(); i != oPlugins.end(); ++i) {
819 void StarDictParseDataPlugins::add(StarDictPluginBaseObject *baseobj, StarDictParseDataPlugInObject *tts_plugin_obj)
821 StarDictParseDataPlugin *plugin = new StarDictParseDataPlugin(baseobj, tts_plugin_obj);
822 oPlugins.push_back(plugin);
825 void StarDictParseDataPlugins::unload_plugin(const char *filename)
827 for (std::vector<StarDictParseDataPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
828 if (strcmp((*iter)->get_filename(), filename) == 0) {
830 oPlugins.erase(iter);
836 void StarDictParseDataPlugins::configure_plugin(const char *filename)
838 for (std::vector<StarDictParseDataPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
839 if (strcmp((*iter)->get_filename(), filename) == 0) {
840 (*iter)->configure();
846 bool StarDictParseDataPlugins::parse(size_t iPlugin, const char *p, unsigned int *parsed_size, ParseResult &result, const char *oword)
848 return oPlugins[iPlugin]->parse(p, parsed_size, result, oword);
852 // class StarDictParseDataPlugin begin.
855 StarDictParseDataPlugin::StarDictParseDataPlugin(StarDictPluginBaseObject *baseobj_, StarDictParseDataPlugInObject *parsedata_plugin_obj):
856 StarDictPluginBase(baseobj_)
858 obj = parsedata_plugin_obj;
861 StarDictParseDataPlugin::~StarDictParseDataPlugin()
866 bool StarDictParseDataPlugin::parse(const char *p, unsigned int *parsed_size, ParseResult &result, const char *oword)
868 return obj->parse_func(p, parsed_size, result, oword);
872 // class StarDictMiscPlugins begin.
875 StarDictMiscPlugins::StarDictMiscPlugins()
879 StarDictMiscPlugins::~StarDictMiscPlugins()
881 for (std::vector<StarDictMiscPlugin *>::iterator i = oPlugins.begin(); i != oPlugins.end(); ++i) {
886 void StarDictMiscPlugins::add(StarDictPluginBaseObject *baseobj)
888 StarDictMiscPlugin *plugin = new StarDictMiscPlugin(baseobj);
889 oPlugins.push_back(plugin);
892 void StarDictMiscPlugins::unload_plugin(const char *filename)
894 for (std::vector<StarDictMiscPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
895 if (strcmp((*iter)->get_filename(), filename) == 0) {
897 oPlugins.erase(iter);
903 void StarDictMiscPlugins::configure_plugin(const char *filename)
905 for (std::vector<StarDictMiscPlugin *>::iterator iter = oPlugins.begin(); iter != oPlugins.end(); ++iter) {
906 if (strcmp((*iter)->get_filename(), filename) == 0) {
907 (*iter)->configure();
914 // class StarDictMiscPlugin begin.
917 StarDictMiscPlugin::StarDictMiscPlugin(StarDictPluginBaseObject *baseobj_):
918 StarDictPluginBase(baseobj_)
922 StarDictMiscPlugin::~StarDictMiscPlugin()
926 template<typename TV, typename TI>
927 void plugins_reorder(TV &oPlugins, const std::list<std::string>& order_list)
931 for (std::list<std::string>::const_iterator i = order_list.begin(); i != order_list.end(); ++i) {
932 for (TI j = prev.begin(); j != prev.end(); ++j) {
933 if (*i == (*j)->get_filename()) {
934 oPlugins.push_back(*j);
938 for (TI i=prev.begin(); i!=prev.end(); ++i) {
940 for (j=oPlugins.begin(); j!=oPlugins.end(); ++j) {
944 if (j == oPlugins.end())
949 void StarDictVirtualDictPlugins::reorder(const std::list<std::string>& order_list)
951 plugins_reorder<std::vector<StarDictVirtualDictPlugin *>, std::vector<StarDictVirtualDictPlugin *>::iterator>(oPlugins, order_list);
954 void StarDictNetDictPlugins::reorder(const std::list<std::string>& order_list)
956 plugins_reorder<std::vector<StarDictNetDictPlugin *>, std::vector<StarDictNetDictPlugin *>::iterator>(oPlugins, order_list);
959 void StarDictSpecialDictPlugins::reorder(const std::list<std::string>& order_list)
961 plugins_reorder<std::vector<StarDictSpecialDictPlugin *>, std::vector<StarDictSpecialDictPlugin *>::iterator>(oPlugins, order_list);
964 void StarDictTtsPlugins::reorder(const std::list<std::string>& order_list)
966 plugins_reorder<std::vector<StarDictTtsPlugin *>, std::vector<StarDictTtsPlugin *>::iterator>(oPlugins, order_list);
969 void StarDictParseDataPlugins::reorder(const std::list<std::string>& order_list)
971 plugins_reorder<std::vector<StarDictParseDataPlugin *>, std::vector<StarDictParseDataPlugin *>::iterator>(oPlugins, order_list);
974 void StarDictMiscPlugins::reorder(const std::list<std::string>& order_list)
976 plugins_reorder<std::vector<StarDictMiscPlugin *>, std::vector<StarDictMiscPlugin *>::iterator>(oPlugins, order_list);