Add model class (DictManagerModel) to manage loaded dictionaries data and settings...
[mdictionary] / src / plugins / google / GooglePlugin.cpp
1 /*******************************************************************************
2
3     This file is part of mDictionary.
4
5     mDictionary is free software: you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation, either version 3 of the License, or
8     (at your option) any later version.
9
10     mDictionary is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with mDictionary.  If not, see <http://www.gnu.org/licenses/>.
17
18     Copyright 2010 Comarch S.A.
19
20 *******************************************************************************/
21 /*!
22     \file GooglePlugin.cpp
23     \brief Implementation of google plugin's main class.
24
25     \author Jakub Jaszczynski <j.j.jaszczynski@gmail.com>
26 */
27
28 #include "GooglePlugin.h"
29 #include <QDebug>
30 #include "GoogleDictDialog.h"
31
32 QMap<QString, QString> GooglePlugin::languages;
33 bool GooglePlugin::noNetworkErrorShowed = false;
34
35
36 GooglePlugin::GooglePlugin(QObject *parent): CommonDictInterface(parent),
37                     _name(""),_infoNote("") {
38     _settings = new Settings();
39     _settings->setValue("lang_to","");
40     _settings->setValue("lang_from","");
41     _settings->setValue("type","google");
42     _settings->setValue("connection_accepted","true");
43     _dictDialog = new GoogleDictDialog(this,this);
44     _iconPath = "/usr/share/mdictionary/google.png";
45     _icon = QIcon(_iconPath);
46
47     stopped = false;
48     initLanguages();
49
50     http = new QHttp();
51     connect(http, SIGNAL(done(bool)), this, SLOT(done()));
52     threa=new QThread();
53     http->moveToThread(threa);
54     threa->start();
55 }
56
57 void GooglePlugin::retranslate() {
58     QString locale = QLocale::system().name();
59     QTranslator *translator = new QTranslator(this);
60     if(!translator->load(":/google/translations/" + locale)) {
61         translator->load(":/google/translations/en_US");
62     }
63     QCoreApplication::installTranslator(translator);
64 }
65
66
67 GooglePlugin::~GooglePlugin() {
68     delete _settings;
69     delete _dictDialog;
70 }
71
72
73 QString GooglePlugin::langFrom() const {
74     return languages.key(_settings->value("lang_from"));
75 }
76
77
78 QString GooglePlugin::langTo() const {
79     return languages.key(_settings->value("lang_to"));
80 }
81
82
83 QString GooglePlugin::name() const {
84     return QString("dictionary");
85 }
86
87
88 QString GooglePlugin::type() const {
89     return QString("google");
90 }
91
92
93 QString GooglePlugin::infoNote() const {
94     return _infoNote;
95 }
96
97
98 void GooglePlugin::setLangTo(QString langTo){
99     _settings->setValue("lang_to",langTo);
100 }
101
102
103 void GooglePlugin::setLangFrom(QString langFrom){
104     _settings->setValue("lang_from",langFrom);;
105 }
106
107
108 DictDialog* GooglePlugin::dictDialog() {
109     return _dictDialog;
110 }
111
112
113 bool GooglePlugin::isAvailable() const {
114     return isConnectionAccept();
115 }
116
117
118 void GooglePlugin::setConnectionAccept(QString connectionAcepted) {
119     if(connectionAcepted=="true")
120         _settings->setValue("connection_accepted","true");
121     else
122         _settings->setValue("connection_accepted","false");
123 }
124
125
126 bool GooglePlugin::isConnectionAccept() const {
127     if(_settings->value("connection_accepted")=="true")
128         return true;
129     else
130         return false;
131 }
132
133
134 Settings* GooglePlugin::settings() {
135     return _settings;
136 }
137
138
139 void GooglePlugin::setSettings(const Settings* settings) {
140     if(settings) {
141         QStringList list = settings->keys();
142         foreach(QString key, list)
143             _settings->setValue(key, settings->value(key));
144         getDictionaryInfo();
145         Q_EMIT settingsChanged();
146     }
147 }
148
149
150 QIcon* GooglePlugin::icon() {
151     return &_icon;
152 }
153
154 QString GooglePlugin::iconPath(){
155     return _iconPath;
156 }
157
158
159 CommonDictInterface* GooglePlugin::getNew(const Settings* settings) const {
160     GooglePlugin *plugin = new GooglePlugin();
161     if(settings)
162         plugin->setSettings(settings);
163     return plugin;
164 }
165
166
167 QString GooglePlugin::search(QString) {
168     qDebug() << "function is not used in google plugin";
169     return QString("");
170 }
171
172
173 Translation* GooglePlugin::getTranslationFor(QString key) {
174     return (new TranslationGoogle(key,"",_infoNote,this));
175 }
176
177
178 QList<Translation*> GooglePlugin::searchWordList(QString word, int ) {
179     QList<Translation*> translations;
180     if(isAvailable()) {
181         QString error("");
182         char wrongChar[]={"*?&<>"};
183         for(unsigned int a=0;a<sizeof(wrongChar);a++)    /*remove wrong char*/
184             word.replace(wrongChar[a],"");
185
186         QString url=QString("/translate_a/t?client=t&sl=%1&tl=%2").arg(
187                                               _settings->value("lang_from"),
188                                               _settings->value("lang_to"));
189         QHttpRequestHeader head = QHttpRequestHeader("POST", url, 1,1);
190         head.setValue("Host","www.google.pl");
191         head.setValue("User-Agent", "Mozilla/5.0");
192         head.setValue("Accept-Encoding", "deflate");
193         head.setContentLength(word.length());
194         head.setValue("Connection", "Close");
195
196         QByteArray data("text=");
197         data.append(word.toUtf8());
198         http->setHost("www.google.pl");
199
200         wait=true;      /* bool - change in slot done (initiate by http) */
201         stopped=false;  /* bool - change in slot stop (initiate in gui)  */
202         int lastState=0;
203         http->request(head, data);
204         while(wait && (error=="" || error=="Unknown error") && !stopped){
205             error=http->errorString();
206             if(lastState!=http->state()) {
207                 lastState=http->state();
208                 if(lastState==0)
209                     done();
210             }
211         }
212         if(error!="" && error!="Unknown error") {
213             if(!noNetworkErrorShowed) {
214                 noNetworkErrorShowed = true;
215                 Q_EMIT notify(Notify::Warning,
216                         tr("GooglePlugin: %1").arg(error));
217             }
218         }
219
220         QString text = QString::fromUtf8(http->readAll());
221 //        qDebug()<<"google test"<<text;
222         text=jsonParse(text);
223         if(text!="") {
224             text="<key>" + word + "</key>" + "<t>" + text + "</t>";
225             translations<<(new TranslationGoogle(word,text,_infoNote,this));
226         }
227     }
228     return translations;
229 }
230
231
232 QString GooglePlugin::jsonParse(QString result) {
233     int pos=0,pos2=0,index=0,size=0;
234     QString returnLang;
235     QString translation;
236     QString original;
237     QList<QString> partOfSpeach;
238     QList<QList<QString>* > words;
239     QStringList list1 = result.split("\"");
240
241     size=(list1.size()-1)/2;
242     if(size<=2)
243         return QString(""); // wrong format of data
244
245     translation=list1.at(index*2+1);
246     index++;
247     original=list1.at(index*2+1);
248     pos=result.indexOf("]");
249     index++;
250     while(result.at(pos+1)==QChar(',')) {
251         index++;
252         translation+=list1.at(index*2+1);
253         index++;
254         original=list1.at(index*2+1);
255         pos=result.indexOf("]",pos+1);
256         index++;
257     }
258
259     pos=result.indexOf("]",pos+1);
260     pos++;
261     index++;
262     if(result.at(pos+1)==QChar(','))
263         returnLang=list1.at(index*2+1); /*return when translate sentence*/
264
265     while(result.indexOf("[",pos+1)!=-1){
266         partOfSpeach.append(list1.at(index*2+1));
267         pos2=result.indexOf("]",pos+1);
268         pos=result.indexOf("\"",pos+1);
269         pos=result.indexOf("\"",pos+1);
270         pos=result.indexOf("\"",pos+1);
271         pos=result.indexOf("\"",pos+1);
272         QList<QString> *list=new QList<QString>;
273         while(pos2>pos && pos2!=-1 && pos!= -1) {
274             index++;
275             if(size==index)
276                 return QString("");
277             list->append(list1.at(index*2+1));
278             pos=result.indexOf("\"",pos+1);
279             pos=result.indexOf("\"",pos+1);
280         }
281         words.append(list);
282         index++;
283         if(size==index)
284             return QString("");
285         pos=pos2+2;
286     }
287
288     if(words.size()!=partOfSpeach.size()) {
289         qDebug()<<"Error in Google Plugin (JsonParse)";
290         Q_EMIT notify(Notify::Warning,
291                 tr("GooglePlugin: can't parse Json"));
292         return QString("");
293     }
294     returnLang=list1.at(index*2+1);
295     if(partOfSpeach.size()==0){
296         if(translation.toLower()==original.toLower())
297             return QString(""); // word doesn't exist";
298         else
299             return "\""+translation+"\"";
300     }
301     result=translation;
302     for(int i=0; i<words.size();i++) {
303         result+="<br/><pos>"+partOfSpeach.at(i)+"</pos>: ";
304         for(int j=0; j<words.at(i)->size();j++)
305             result+=words.at(i)->at(j)+", ";
306         result.remove(result.size()-2,2);
307     }
308     return result;
309 }
310
311
312 void GooglePlugin::done() {
313     wait=false;
314 }
315
316
317 void GooglePlugin::stop() {
318     stopped=true;
319 }
320
321
322 void GooglePlugin::initLanguages() {
323     if(languages.count() != 0) return;
324
325     languages["Afrikaans"] = "af";
326     languages["Albanian"] = "sq";
327     languages["Arabic"] = "ar";
328     languages["Armenian"] = "hy";
329     languages["Azerbaijani"] = "az";
330     languages["Basque"] = "eu";
331     languages["Belarusian"] = "be";
332     languages["Bulgarian"] = "bg";
333     languages["Catalan"] = "ca";
334     languages["Chinese"] = "zh";
335     languages["Croatian"] = "hr";
336     languages["Czech"] = "cs";
337     languages["Danish"] = "da";
338     languages["Dutch"] = "nl";
339     languages["English"] = "en";
340     languages["Estonian"] = "et";
341     languages["Filipino"] = "tl";
342     languages["Finnish"] = "fi";
343     languages["French"] = "fr";
344     languages["Galician"] = "gl";
345     languages["Georgian"] = "ka";
346     languages["German"] = "de";
347     languages["Greek"] = "el";
348     languages["Haitian_creole"] = "ht";
349     languages["Hebrew"] = "iw";
350     languages["Hindi"] = "hi";
351     languages["Hungarian"] = "hu";
352     languages["Icelandic"] = "is";
353     languages["Indonesian"] = "id";
354     languages["Irish"] = "ga";
355     languages["Italian"] = "it";
356     languages["Japanese"] = "ja";
357     languages["Korean"] = "ko";
358     languages["Latvian"] = "lv";
359     languages["Lithuanian"] = "lt";
360     languages["Macedonian"] = "mk";
361     languages["Malay"] = "ms";
362     languages["Maltese"] = "mt";
363     languages["Norwegian"] = "no";
364     languages["Persian"] = "fa";
365     languages["Polish"] = "pl";
366     languages["Portuguese"] = "pt";
367     languages["Romanian"] = "ro";
368     languages["Russian"] = "ru";
369     languages["Serbian"] = "sr";
370     languages["Slovak"] = "sk";
371     languages["Slovenian"] = "sl";
372     languages["Spanish"] = "es";
373     languages["Swahili"] = "sw";
374     languages["Swedish"] = "sv";
375     languages["Thai"] = "th";
376     languages["Turkish"] = "tr";
377     languages["Ukrainian"] = "uk";
378     languages["Urdu"] = "ur";
379     languages["Vietnamese"] = "vi";
380     languages["Welsh"] = "cy";
381     languages["Yiddish"] = "yi";
382     languages["Detect langlage"] = "";
383 //    languages["AMHARIC"] = "am";
384 //    languages["BENGALI"] = "bn";
385 //    languages["BIHARI"] = "bh";
386 //    languages["BRETON"] = "br";
387 //    languages["BURMESE"] = "my";
388 //    languages["CHEROKEE"] = "chr";
389 //    languages["CHINESE_SIMPLIFIED"] = "zh-CN";
390 //    languages["CHINESE_TRADITIONAL"] = "zh-TW";
391 //    languages["CORSICAN"] = "co";
392 //    languages["DHIVEHI"] = "dv";
393 //    languages["ESPERANTO"] = "eo";
394 //    languages["FAROESE"] = "fo";
395 //    languages["FRISIAN"] = "fy";
396 //    languages["GUJARATI"] = "gu";
397 //    languages["INUKTITUT"] = "iu";
398 //    languages["JAVANESE"] = "jw";
399 //    languages["KANNADA"] = "kn";
400 //    languages["KAZAKH"] = "kk";
401 //    languages["KHMER"] = "km";
402 //    languages["KURDISH"] = "ku";
403 //    languages["KYRGYZ"] = "ky";
404 //    languages["LAO"] = "lo";
405 //    languages["LATIN"] = "la";
406 //    languages["LUXEMBOURGISH"] = "lb";
407 //    languages["MALAYALAM"] = "ml";
408 //    languages["MAORI"] = "mi";
409 //    languages["MARATHI"] = "mr";
410 //    languages["MONGOLIAN"] = "mn";
411 //    languages["NEPALI"] = "ne";
412 //    languages["OCCITAN"] = "oc";
413 //    languages["ORIYA"] = "or";
414 //    languages["PASHTO"] = "ps";
415 //    languages["PORTUGUESE_PORTUGAL"] = "pt-PT";
416 //    languages["PUNJABI"] = "pa";
417 //    languages["QUECHUA"] = "qu";
418 //    languages["SANSKRIT"] = "sa";
419 //    languages["SCOTS_GAELIC"] = "gd";
420 //    languages["SINDHI"] = "sd";
421 //    languages["SINHALESE"] = "si";
422 //    languages["SUNDANESE"] = "su";
423 //    languages["SYRIAC"] = "syr";
424 //    languages["TAJIK"] = "tg";
425 //    languages["TAMIL"] = "ta";
426 //    languages["TATAR"] = "tt";
427 //    languages["TELUGU"] = "te";
428 //    languages["TIBETAN"] = "bo";
429 //    languages["TONGA"] = "to";
430 //    languages["UZBEK"] = "uz";
431 //    languages["UIGHUR"] = "ug";
432 }
433
434
435 void GooglePlugin::getDictionaryInfo() {
436     QString fullLangFrom=languages.key(_settings->value("lang_from"));
437     QString fullLangTo=languages.key(_settings->value("lang_to"));
438     _infoNote=" [" + fullLangFrom + "-" + fullLangTo + "] ";
439 }
440
441
442 Q_EXPORT_PLUGIN2(google, GooglePlugin)