enchantclient.cpp

00001 // -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*-
00021 #include "enchantclient.h"
00022 #include "enchantdict.h"
00023 
00024 #include <kgenericfactory.h>
00025 #include <kdebug.h>
00026 
00027 typedef KGenericFactory<QSpellEnchantClient> EnchantClientFactory;
00028 K_EXPORT_COMPONENT_FACTORY(kspell_enchant, EnchantClientFactory("kspell_enchant"))
00029 
00030 using namespace KSpell2;
00031 
00032 static void enchantDictDescribeFn(const char * const lang_tag,
00033                                   const char * const provider_name,
00034                                   const char * const provider_desc,
00035                                   const char * const provider_file,
00036                                   void * user_data)
00037 {
00038     QSpellEnchantClient *client =
00039         reinterpret_cast<QSpellEnchantClient*>(user_data);
00040     //kdDebug()<<lang_tag<<provider_name<<provider_desc<<provider_file<<endl;
00041     Q_UNUSED(provider_name);
00042     Q_UNUSED(provider_desc);
00043     Q_UNUSED(provider_file);
00044     client->addLanguage(QString::fromLatin1(lang_tag));
00045 
00046 }
00047 
00048 QSpellEnchantClient::QSpellEnchantClient(QObject *parent, const char *name, const QStringList& /* args */)
00049     : Client(parent, name)
00050 {
00051     m_broker = enchant_broker_init();
00052     enchant_broker_list_dicts(m_broker,
00053                               enchantDictDescribeFn,
00054                               this);
00055 }
00056 
00057 QSpellEnchantClient::~QSpellEnchantClient()
00058 {
00059     enchant_broker_free(m_broker);
00060 }
00061 
00062 Dictionary *QSpellEnchantClient::dictionary(
00063     const QString &language)
00064 {
00065     EnchantDict *dict = enchant_broker_request_dict(m_broker,
00066                                                     language.utf8());
00067 
00068     if (!dict) {
00069         const char *err = enchant_broker_get_error(m_broker);
00070         kdDebug()<<"Couldn't create speller for"<<language<<": "<<err<<endl;
00071         return 0;
00072     } else {
00073         //Enchant caches dictionaries, so it will always return the same one.
00074         int refs = m_dictRefs[dict];
00075         ++refs;
00076         m_dictRefs[dict] = refs;
00077         return new QSpellEnchantDict(this, m_broker, dict, language);
00078     }
00079 }
00080 
00081 QStringList QSpellEnchantClient::languages() const
00082 {
00083     return m_languages;
00084 }
00085 
00086 void QSpellEnchantClient::addLanguage(const QString &lang)
00087 {
00088     if (m_languages.find(lang) == m_languages.end())
00089         m_languages.append(lang);
00090 }
00091 
00092 void QSpellEnchantClient::removeDictRef(EnchantDict *dict)
00093 {
00094     int refs = m_dictRefs[dict];
00095     --refs;
00096     m_dictRefs[dict] = refs;
00097     if (refs <= 0) {
00098         m_dictRefs.remove(dict);
00099         enchant_broker_free_dict(m_broker, dict);
00100     }
00101 }
00102 
00103 #include "enchantclient.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys