fix i18nc typo in last commit
[kdeaccessibility.git] / ksayit / src / fxpluginhandler.cpp
blob4c9f1d99d163eb4212ec889aec9d461332976495
1 //
2 // C++ Implementation: fxpluginhandler
3 //
4 // Description:
5 //
6 //
7 // Author: Robert Vogl <voglrobe@lapislazuli>, (C) 2004
8 //
9 // Copyright: See COPYING file that comes with this distribution
13 // QT includes
14 #include <QtCore/QDir>
16 // KDE includes
17 #include <kdebug.h>
18 #include <kstandarddirs.h>
19 #include <kglobal.h>
20 #include <kmessagebox.h>
22 // App specific includes
23 #include "fxpluginhandler.h"
24 #include "ksayit_fxplugin.h"
25 #include "ksayit_ttsplugin.h"
27 FXPluginHandler::FXPluginHandler(QObject *parent, const char *name, KConfig *config)
28 : QObject(parent, name), m_config(config)
33 FXPluginHandler::~FXPluginHandler()
35 QMap<QString, fx_struct>::Iterator mit;
37 for (mit=pmap.begin(); mit!=pmap.end(); ++mit){
38 if ( (*mit).p != 0 ){
39 (*mit).pdestroy( (*mit).p );
40 (*mit).handle->unload();
42 delete (*mit).handle;
47 void FXPluginHandler::searchPlugins()
49 kDebug(100200) << "FXPluginHandler::searchPlugins()";
51 QDir pdir;
52 QStringList plist, tmplist;
53 QStringList::Iterator fit, it;
54 QString ppath;
56 plist.clear();
57 pmap.clear();
59 // get .so-files of all KSayIt plugin directories
60 QStringList global_dirs = KGlobal::dirs()->resourceDirs("data");
61 for (fit=global_dirs.begin(); fit!=global_dirs.end(); ++fit){ // for each dir
62 ppath = *fit + "ksayit/fxplugins";
63 // kDebug(100200) << "Plugin-Directory: " << ppath;
64 pdir.setPath( ppath );
65 tmplist = pdir.entryList("*.so", QDir::Files); // list of all .so-files of dir
66 for (it=tmplist.begin(); it!=tmplist.end(); ++it){ // for each .so-file of dir
67 if( !plist.contains(*it) ){ // .so-file already in list?
68 if ( initPluginMap( ppath + '/' + *it ) ){
69 plist.append(*it); // append if plugin scuccessfully opened.
73 tmplist.clear();
78 bool FXPluginHandler::initPluginMap(const QString &libpath)
80 // kDebug(100200) << "FXPluginHandler::initPluginMap() " << libpath;
82 fx_struct plugin;
84 plugin.handle = new QLibrary( libpath );
85 if ( !plugin.handle->load() ){
86 kDebug(100200) << "OOPS: Cannot load library!";
87 return false;
90 create_fxpi createPlugin = (create_fxpi) plugin.handle->resolve("createPlugin");
91 destroy_fxpi destroyPlugin = (destroy_fxpi) plugin.handle->resolve("destroyPlugin");
92 if ( createPlugin && destroyPlugin ){ // its a KSayIt plugin
93 FXPlugin *p = createPlugin( KApplication::kApplication() );
94 plugin.name = p->getName_KS();
95 plugin.description = p->getDescription_KS();
96 plugin.EffectID = 0;
97 kDebug(100200) << "FX-Plugin " << plugin.name << " Handle: " << plugin.handle << " registered.";
98 destroyPlugin(p);
99 plugin.p = NULL;
100 // add to list of available plugins
101 pmap[plugin.name] = plugin;
102 if ( !plugin.handle->unload() ){
103 kDebug(100200) << "Unload plugin failed.";
105 } else { // not a KSayIt plugin
106 kDebug(100200) << "Malformed plugin found!";
107 plugin.handle->unload(); // no KSayIt plugin: unload & destroy
108 delete plugin.handle;
109 return false;
111 return true;
115 void FXPluginHandler::readConfiguration()
117 kDebug(100200) << "+++ entering FXPluginHandler::readConfiguration()";
119 QMap<QString, fx_struct>::Iterator mit;
120 fx_struct plugin;
121 create_fxpi createPlugin;
122 destroy_fxpi destroyPlugin;
124 // unload all plugins and destroy the effect objects
125 for (mit=activePlugins.begin(); mit!=activePlugins.end(); ++mit){ // for all active plugins
126 plugin = *mit;
127 if ((plugin.p != NULL) && (plugin.EffectID == 0)){ // check if really exits and not in use
128 plugin.pdestroy(plugin.p); // delete plugin object
129 plugin.p = NULL; // mark as deleted
130 plugin.handle->unload(); // unload SO
131 plugin.handle = NULL;
132 plugin.pcreate = NULL; // no longer valid
133 plugin.pdestroy = NULL; // no longer valid
134 plugin.name.clear();
135 plugin.description.clear();
136 plugin.EffectID = 0;
140 // load active plugins and create effect objects
141 activePlugins.clear();
142 m_config->setGroup("Effect Stack Configuration");
143 QStringList conf_active = m_config->readEntry("Activated",QStringList());
144 QStringList::Iterator it;
145 for (it=conf_active.begin(); it!=conf_active.end(); ++it){ // for all names in config
146 mit = pmap.find(*it);
147 if( mit!=pmap.end() ){
148 // plugin found in list of registered plugins
149 plugin = *mit;
150 // resolve factory functions
151 createPlugin = (create_fxpi) plugin.handle->resolve("createPlugin");
152 destroyPlugin = (destroy_fxpi) plugin.handle->resolve("destroyPlugin");
153 if ( createPlugin && destroyPlugin ){
154 plugin.pcreate = createPlugin;
155 plugin.pdestroy = destroyPlugin;
156 plugin.p = createPlugin( KApplication::kApplication() );
157 // append to list of active plugins
158 activePlugins[plugin.name] = plugin;
159 kDebug(100200) << "FXPluginHandler: FX-Plugin " << plugin.name << " active.";
161 } else {
162 kDebug(100200) << "Fatal error. Conflict with configuration file.";
165 kDebug(100200) << "--- leaving FXPluginHandler::readConfiguration()";
170 void FXPluginHandler::showEffectGUI(const QString &pname)
172 kDebug(100200) << "FXPluginHandler::showEffectGUI(): " << pname;
174 QMap<QString, fx_struct>::Iterator mit;
176 // find plugin with name==pname in active list and show its GUI
177 mit = activePlugins.find(pname);
178 if ( mit != activePlugins.end() ){
179 if ( (*mit).p!=NULL ){
180 // named and active plugin found
181 (*mit).p->showGUI_KS();
183 return;
186 // Not found in active list. Check if an effect with the given name is installed
187 mit = pmap.find(pname);
188 if ( mit == pmap.end() ){
189 kDebug(100200) << "Sorry. Effect with name " << pname << " is not installed.";
190 return;
193 // plugin exists, but effect is not active yet
194 fx_struct plugin;
195 create_fxpi createPlugin;
196 destroy_fxpi destroyPlugin;
198 kDebug(100200) << "Effect not active yet. Loading...";
199 plugin = *mit;
200 // resolve factory functions
201 createPlugin = (create_fxpi) plugin.handle->resolve("createPlugin");
202 destroyPlugin = (destroy_fxpi) plugin.handle->resolve("destroyPlugin");
203 if ( createPlugin && destroyPlugin ){
204 plugin.pcreate = createPlugin;
205 plugin.pdestroy = destroyPlugin;
206 plugin.p = createPlugin( KApplication::kApplication() );
207 // append to list of active plugins
208 activePlugins[plugin.name] = plugin;
209 kDebug(100200) << "FX-Plugin " << plugin.name << " now active.";
210 plugin.p->showGUI_KS();
215 void FXPluginHandler::getPlugins(QStringList &pluginlist)
217 // kDebug(100200) << "FXPluginHandler::getPlugins";
219 pluginlist.clear();
221 QMap<QString, fx_struct>::Iterator mit;
222 for (mit=pmap.begin(); mit!=pmap.end(); ++mit){
223 pluginlist.append( (*mit).name );
228 void FXPluginHandler::activateEffect(const QString &pname,
229 KArtsServer *server,
230 StereoEffectStack *fx_stack)
232 kDebug(100200) << "FXPluginHandler::activateEffect: " << pname;
234 QMap<QString, fx_struct>::Iterator mit;
236 // find plugin with name==pname
237 mit = activePlugins.find(pname);
238 if ( mit==activePlugins.end() || (*mit).p==NULL){
239 kDebug(100200) << "Effect " << pname << " not found or inactive.";
240 return;
242 (*mit).EffectID = (*mit).p->activate_KS(server, fx_stack);
246 void FXPluginHandler::deactivateEffects(StereoEffectStack *fx_stack)
248 kDebug(100200) << "FXPluginHandler::deactivateEffects.";
250 QMap<QString, fx_struct>::Iterator mit;
251 for (mit=activePlugins.begin(); mit!=activePlugins.end(); ++mit){
252 if ( ((*mit).EffectID!=0) && ((*mit).p!=NULL) ) {
253 // effect active and on stack
254 (*mit).p->deactivate_KS(fx_stack, (*mit).EffectID);
255 kDebug(100200) << (*mit).name << " with Effect ID " << (*mit).EffectID << " removed.";
256 (*mit).EffectID = 0;
265 #include "fxpluginhandler.moc"