2 * Copyright (C) 2008 Nick Shaforostoff <shaforostoff@kde.ru>
5 * Copyright (C) 2007 Thomas Georgiou <TAGeorgiou@gmail.com> and Jeff Cooper <weirdsox11@gmail.com>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "dictengine.h"
22 #include "dictplugin.h"
25 #include <QPluginLoader>
34 #include <Plasma/DataContainer>
36 #define MEMORYFREE_DELAY 60000
40 * This class represents a dictionary provided by a plugin
45 Dictionary(const QString &plugin, const QString &name)
52 const QString &plugin() const {return m_plugin;}
53 const QString &name() const {return m_name;}
54 void setPlugin(const QString &plugin) {m_plugin=plugin;}
55 void setName(const QString &name) {m_name=name;}
56 bool operator == (const Dictionary &dict) {return m_name==dict.m_name && m_plugin==dict.m_plugin;}
64 struct QStarDictEngine::Private
69 QHash<QString, QPointer<QPluginLoader> > plugins; //name to pointer
70 // QList<Dictionary> dicts;
71 // QHash<QString, QString> dictToPlugin; //name to metastructure
72 QHash<QString, Dictionary> dicts; //name to metastructure
81 QStarDictEngine::QStarDictEngine(QObject* parent, const QVariantList& args)
82 : Plasma::DataEngine(parent, args)
88 QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("*0.dll"),QDir::Files|QDir::NoDotAndDotDot);
89 for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i)
90 d->plugins[i->fileName().left(i->fileName().length()-5))]=0;
92 qWarning()<<QSTARDICT_PLUGINS_DIR;
93 QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("lib*.so"),QDir::Files|QDir::NoDotAndDotDot);
94 for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i)
95 d->plugins[i->fileName().mid(3, i->fileName().length()-6)]=0;
100 // use cache to not load redudant plugins? 16->10 ms
101 // QSettings settings("qstardict","qstardict");
102 // m_dictDirs = settings.value("Multitran/dictDirs", m_dictDirs).toStringList();
104 d->timer.setInterval(MEMORYFREE_DELAY);
105 d->timer.setSingleShot(true);
106 connect(&d->timer, SIGNAL(timeout()), this, SLOT(unloadPlugins()));
109 QList<QString> plugins=d->plugins.keys();
110 for (QList<QString>::const_iterator i = plugins.constBegin(); i != plugins.constEnd(); ++i)
112 // QStringList dicts = settings.value(*i+"/dicts", QStringList()).toStringList();
113 // if (!dicts.isEmpty())
115 QStarDict::DictPlugin* plugin = dictPlugin(*i);
118 QStringList dicts=plugin->availableDicts();
119 // settings.setValue(*i+"/dicts", QVariant(dicts));
120 // plugin->setdicts(dicts);
122 for (QStringList::const_iterator j = dicts.constBegin(); j != dicts.constEnd(); ++j)
123 d->dicts[*j]=Dictionary(*i, *j);
124 // d->dicts<<Dictionary(*i, *j);
126 // qWarning()<<a.elapsed();
130 QStarDictEngine::~QStarDictEngine()
138 QStarDict::DictPlugin* QStarDictEngine::dictPlugin(const QString &name)
140 if (! d->plugins.contains(name) )
142 if (! d->plugins.value(name) )
145 QString pluginFilename = QSTARDICT_PLUGINS_DIR "/" + name + "0.dll";
147 QString pluginFilename = QSTARDICT_PLUGINS_DIR "/" "lib" + name + ".so";
149 QPluginLoader* plugin = new QPluginLoader(pluginFilename);
150 if (! plugin->load())
152 kWarning() << plugin->errorString();
156 d->plugins[name]=plugin;
159 return qobject_cast<QStarDict::DictPlugin*>(d->plugins.value(name)->instance());
162 void QStarDictEngine::unloadPlugins()
164 for (QHash<QString, QPointer<QPluginLoader> >::iterator i = d->plugins.begin(); i != d->plugins.end(); ++i)
168 (*i)->instance()->deleteLater();
175 bool QStarDictEngine::sourceRequestEvent(const QString &word)
177 qWarning()<<"sourceRequestEvent"<<word;
178 d->timer.start();//delay freeing resources / activate delayed resources freeing
180 if (word=="list-dictionaries")
183 int i=d->plugins.keys().size();
186 QStarDict::DictPlugin* plugin = dictPlugin(d->plugins.keys().at(i));
189 result << plugin->availableDicts();
191 setData("list-dictionaries", "dictionaries", result);
196 QString simplifiedWord;
197 QStringList queriedDicts;
198 int pos=word.indexOf(':');
201 queriedDicts=word.left(pos).split(',');
202 simplifiedWord=word.mid(pos+1).simplified();
205 simplifiedWord=word.simplified();
206 qWarning()<<"simplifiedWord"<<simplifiedWord;
207 qWarning()<<"queriedDicts"<<queriedDicts;
209 if (queriedDicts.isEmpty())
210 for (QHash<QString,Dictionary>::const_iterator i = d->dicts.constBegin(); i != d->dicts.constEnd(); ++i)
211 queriedDicts<<i->name();
213 d->currentWord = word;
216 if (simplifiedWord.length() == 0)
218 setData(d->currentWord, "text", QString());
222 for (QStringList::const_iterator i = queriedDicts.constBegin(); i != queriedDicts.constEnd(); ++i)
224 if (!d->dicts.contains(*i))
226 QStarDict::DictPlugin* plugin = dictPlugin(d->dicts.value(*i).plugin());
229 QStringList ld=plugin->loadedDicts();
230 if (!ld.contains(*i))
231 plugin->setLoadedDicts(ld<<*i);
232 if ( !plugin->isTranslatable(*i, simplifiedWord))
234 QStarDict::DictPlugin::Translation translation = plugin->translate(*i, simplifiedWord);
235 if (translation.translation().isEmpty())
238 "<font class=\"dict_name\">" + translation.dictName() + "</font><br>\n"
239 "<font class=\"title\">" + translation.title() + "</font><br>\n"
240 + translation.translation() + "</p>\n";
243 setData(d->currentWord, "text", result);
251 #include "dictengine.moc"