Fixed StarDictPlugin integration with other stardict classes
authorBartosz Szatkowski <bulislaw@linux.com>
Wed, 6 Oct 2010 07:51:11 +0000 (09:51 +0200)
committerBartosz Szatkowski <bulislaw@linux.com>
Wed, 6 Oct 2010 07:51:11 +0000 (09:51 +0200)
src/plugins/stardict/StarDictPlugin.cpp
src/plugins/stardict/StarDictPlugin.h
src/plugins/stardict/TranslationStarDict.cpp
src/plugins/stardict/TranslationStarDict.h
src/plugins/stardict/stardict.pro

index cc7ee06..87928cb 100644 (file)
 */
 
 #include "StarDictPlugin.h"
-#include <QDebug>
-#include "../../include/Notify.h"
-#include <QTranslator>
-#include <QCoreApplication>
-#include <QThread>
+
+uint qHash(const TranslationStarDict &key) {
+   return qHash(key.key());
+}
 
 StarDictPlugin::StarDictPlugin(QObject *parent) : CommonDictInterface(parent),
                     _langFrom(""), _langTo(""),_name(""), _infoNote("") {
@@ -90,8 +89,53 @@ QString StarDictPlugin::infoNote() const {
 
 
 QList<Translation*> StarDictPlugin::searchWordList(QString word, int limit) {
-    QSet<Translation*> translations;
-    return translations.toList();
+    QList<TranslationStarDict> translations;
+    bool is32b = false;
+    if(settings()->value("idxoffsetbits") == "32" ||
+            settings()->value("idxoffsetbits") == "")
+       is32b = true;
+
+    bool err = 0;
+    int wordcount = settings()->value("wordcount").toInt(&err);
+    if(err)
+        return QList<Translation*>();
+
+    QString idxPath = settings()->value("idxFileName");
+    StarDictReader * reader = StarDictReaderFactory::createReader(idxPath);
+
+    QString fkey;
+    qint64 offset = 0, len = 0;
+    QRegExp keyword(word, Qt::CaseInsensitive, QRegExp::Wildcard);
+
+    int counter = 0;
+    while(counter < wordcount) {
+        counter++;
+        fkey = reader->readKeyword();
+        if(is32b)
+            offset = reader->readInt32BigEndian();
+        else
+            offset = reader->readInt64BigEndian();
+        len = reader->readInt32BigEndian();
+
+        if(keyword.exactMatch(fkey)) {
+            TranslationStarDict tran(fkey, infoNote(), this);
+            int id = translations.indexOf(tran);
+            if(id == -1) {
+                tran.add(offset, len);
+                translations.push_front(tran);
+            } else
+                translations[id].add(offset, len);
+        }
+
+
+    }
+    QList<Translation*> ret;
+    QListIterator<TranslationStarDict> it(translations);
+    while(it.hasNext())
+        ret.push_back(new TranslationStarDict(it.next()));
+
+
+    return ret;
 }
 
 
@@ -103,9 +147,9 @@ QString StarDictPlugin::search(QString key) {
 void StarDictPlugin::parseIfoFile()
 {
     QFile file(settings()->value("path"));
-    if (!file.open(QIODevice::ReadOnly))
-    {
-        return 0;
+    if (!file.open(QIODevice::ReadOnly)) {
+        // TODO notification
+        return ;
     }
     QTextStream in(&file);
     while (!in.atEnd()) {
index ac5611a..c712fa0 100644 (file)
@@ -43,7 +43,6 @@
 #include "../../include/settings.h"
 #include "StarDictDialog.h"
 #include "TranslationStarDict.h"
-#include "StarDictSettings.h"
 
 class TranslationXdxf;
 
@@ -95,7 +94,7 @@ public:
     bool setSettings(const Settings*);
 
     //! \return object containing data parsed from .ifo file
-    StarDictSettings* parseIfoFile();
+    void parseIfoFile();
 
     //! \returns plugin icon
     QIcon* icon();
index 942b21e..74cc0cb 100644 (file)
@@ -39,6 +39,21 @@ TranslationStarDict::TranslationStarDict(QString _key, QString _dictionaryInfo,
 }
 
 
+TranslationStarDict::TranslationStarDict(const TranslationStarDict &base) {
+    _key = base.key();
+    _dictHash = base._dictHash;
+    _dictionaryInfo = base._dictionaryInfo;
+    lengths = base.lengths;
+    offsets = base.offsets;
+}
+
+
+void TranslationStarDict::add(qint64 offset, qint32 len) {
+    offsets.append(offset);
+    lengths.append(len);
+}
+
+
 QString TranslationStarDict::key() const {
     return _key;
 }
index 6a18cf8..6582324 100644 (file)
 #define TRANSLATIONSTARDICT_H
 
 #include <QString>
+#include <QHash>
+#include <QDebug>
+#include <QTranslator>
+#include <QCoreApplication>
+#include <QThread>
+#include <QSet>
+
+#include "StarDictReaderFactory.h"
 #include "../../include/translation.h"
 #include "StarDictPlugin.h"
+#include "../../include/Notify.h"
+#include "TranslationStarDict.h"
 
 class TranslationStarDict : public Translation
 {
@@ -34,6 +44,7 @@ public:
     TranslationStarDict(QString _key,
                     QString _dictionaryInfo,
                     StarDictPlugin *starDictPlugin);
+    TranslationStarDict(const TranslationStarDict &base);
 
     //! \return word to be translated
     QString key() const;
@@ -56,12 +67,29 @@ public:
     //! returns corresponding dict object
     uint dict() const {return _dictHash;}
 
+    /*! Add another hit in *.id(x) file
+        \param offset offset from begining of file to searched keyword
+        \param len lenght of searched keyword
+    */
+    void add(qint64 offset, qint32 len);
+
+
+
+    bool operator==(const TranslationStarDict &key) {
+        if (this->key() == key.key())
+            return true;
+        return false;
+    }
+
 private:
     QString _key;
     QString _dictionaryInfo;
     StarDictPlugin *starDictPlugin;
     int _dictHash;
+    QVector<qint64> offsets;
+    QVector<qint32> lengths;
 };
 
+
 #endif // TRANSLATIONSTARDICT_H
 
index 1d683f1..7401341 100644 (file)
@@ -16,7 +16,6 @@ SOURCES +=  \
     TranslationStarDict.cpp \
     StarDictDialog.cpp \
     StarDialog.cpp \
-    StarDictSettings.cpp \
     CompressedReader.cpp \
     UncompressedReader.cpp \
     StarDictReaderFactory.cpp
@@ -31,7 +30,6 @@ HEADERS += \
     ../../include/settings.h \
     ../../include/CommonDictInterface.h \
     StarDialog.h \
-    StarDictSettings.h \
     CompressedReader.h \
     UncompressedReader.h \
     StarDictReaderFactory.h \