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"