Extended implementing StarDict *.dict file
[mdictionary] / src / plugins / stardict / StarDictPlugin.h
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
23 /*! \file xdxfplugin.h
24 */
25 #ifndef STARDICTPLUGIN_H
26 #define STARDICTPLUGIN_H
27
28
29 #include <QObject>
30 #include <QDialog>
31 #include <QRegExp>
32 #include <QTime>
33 #include <QSqlQuery>
34 #include <QSqlDatabase>
35 #include <QSqlError>
36 #include <QFile>
37 #include <QXmlStreamReader>
38 #include <QtPlugin>
39 #include <QHash>
40 #include <QIcon>
41 #include <QtEndian>
42
43 #include "../../include/CommonDictInterface.h"
44 #include "../../include/settings.h"
45 #include "StarDictDialog.h"
46 #include "TranslationStarDict.h"
47
48 class TranslationXdxf;
49
50 class StarDictPlugin : public CommonDictInterface
51 {
52     Q_OBJECT
53     Q_INTERFACES(CommonDictInterface)
54 public:
55     StarDictPlugin(QObject *parent=0);
56
57     ~StarDictPlugin();
58
59     //! \returns source language code iso 639-2
60     QString langFrom() const;
61
62     //! \returns destination language code iso 639-2
63     QString langTo() const;
64
65     //! \returns dictionary name (like "old English" or so)
66     QString name() const;
67
68     //! \returns dictionary type (xdxf, google translate, etc)
69     QString type() const;
70
71     //! returns information about dictionary in xml (name, authors, etc)
72     QString infoNote() const;
73
74     /*! \returns DictDialog object that creates dialogs
75         for adding a new dictionary and changing plugin settings
76       */
77     DictDialog* dictDialog();
78
79     //! \returns new, clean copy of plugin with settings set as in Settings*
80     CommonDictInterface* getNew(const Settings*) const;
81
82     //! \returns whether plugin can start searching
83     bool isAvailable() const;
84
85     //! \returns a description of a word given by a QString
86     QString search(QString key) {
87         return search(key, 0, 0);
88     }
89
90     /*! \return a description of a word given by a QString
91         \param offset offset of translation to be cut out
92         \param len lenght of translation to be cut out
93         */
94     QString search(QString key, qint64 offset, qint32 len);
95
96     //! \returns current plugin settings
97     Settings* settings();
98
99     //! \returns words count in a dictionary
100     long wordsCount();
101
102     //! Sets new settings
103     bool setSettings(const Settings*);
104
105     //! \returns plugin icon
106     QIcon* icon();
107
108     /*! plugin should delete any files (eg. cache) that have been created and are ready
109         to be deleted
110         */
111     void clean();
112
113
114
115 public Q_SLOTS:
116     /*! performs search in a dictionary
117       \param  word word to search for in a dictionary
118       \param limit limit on number of results
119
120       After finishing search it has to emit
121       \see CommonDictInterface:finalTranslation  finalTranslation
122     */
123     QList<Translation*> searchWordList(QString word, int limit=0);
124
125     //! stops current operation
126     void stop();
127
128     //! loads translations for each plugin only once
129     void retranslate();
130
131
132 private:
133
134     /*! \returns true or false depending on whether the dictionary is cached
135         or not
136      */
137     bool isCached();
138     /*! searches for a list of words similar to a word in a database file
139     \param word key compared with keys in a database
140     \param limit limits the number of translations in returned list,
141            0 means unlimited
142     \returns list of translations
143     */
144     QList<Translation*> searchWordListCache(QString word, int limit=0);
145
146     /*! searches for a list of words similar to a word in a xdxf file
147     \param word key compared with keys in a xdxf file
148     \param limit limits the number of translations in returned list,
149            0 means unlimited
150     \returns list of translations
151     */
152     QList<Translation*> searchWordListFile(QString word, int limit=0);
153
154     /*! searches for a translation of a word which is exactly like a key
155         in a xdxf file */
156     QString searchFile(QString key);
157
158     //! scans dictionary file to get information about it
159     bool getDictionaryInfo();
160
161     //! counts the keys in a xdxf file
162     int countWords();
163
164
165     //! language from which we translate
166     QString _langFrom;
167     //! language to which we translate
168     QString _langTo;
169     //! name of a dictionary
170     QString _name;
171     //! information about dictionary
172     QString _infoNote;
173
174     QString _dictionaryInfo;
175
176     //! icon displayed during translations and when a dictionary is chosen
177     QIcon _icon;
178
179     //! number of words in a dictionary
180     long _wordsCount;
181     //! indicates if search is stopped
182     volatile bool stopped;
183     Settings *_settings;
184     StarDictDialog* _dictDialog;
185     Settings* _ifoFileSettings;
186     StarDictReader * dictReader;
187     QString format(QByteArray, QString mode);
188     QByteArray read(QByteArray::iterator, QByteArray::iterator end,
189            int bytes = 0);
190     QString interpret(QByteArray::iterator, QByteArray::iterator,
191             QChar, bool last = false);
192 };
193
194 #endif // XDXFPLUGIN_H
195
196