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