#include "CompressedReader.h"
#include <QtEndian>
+#include <QDebug>
CompressedReader::CompressedReader(QObject *parent) :
StarDictReader(parent) {
return result;
}
-QString CompressedReader::readString(qint32 offset, qint32 len) {
+QByteArray CompressedReader::readString(qint64 offset, qint32 len) {
char* buf;
buf = new char[len];
gzseek(_file, offset, SEEK_SET);
gzread(_file, buf, len);
- QString result(buf);
+ QByteArray res(buf, len);
delete [] buf;
- return result;
-}
-
-QString CompressedReader::readString(qint64 offset, qint32 len) {
- char* buf;
- buf = new char[len];
-
- gzseek(_file, offset, SEEK_SET);
- gzread(_file, buf, len);
-
- QString result(buf);
- delete [] buf;
- return result;
+ return res;
}
/*!
Reads translations text from compressed dict file.
- \param offset 32-bit offset of translation in uncompressed file, readed
- from idx file
- \param len length of uncompressed translation, readed from idx file too
- */
- QString readString(qint32 offset, qint32 len);
-
- /*!
- Reads translations text from compressed dict file.
\param offset 64-bit offset of translation in uncompressed file, readed
from idx file
\param len length of uncompressed translation, readed from idx file too
*/
- QString readString(qint64 offset, qint32 len);
+ QByteArray readString(qint64 offset, qint32 len);
/*!
Reads 32-bits integer value from compressed file and convert it from
}
+QByteArray StarDictPlugin::read(QByteArray::iterator it,
+ QByteArray::iterator end, int bytes) {
+ QByteArray ret;
+ if(bytes == 0 && it != end)
+ while(*it != '\0')
+ ret.append(*it++);
+ else
+ for(int i = 0; i < bytes && it != end; i++)
+ ret.append(*it++);
+ return ret;
+}
+
+
+QString StarDictPlugin::interpret(QByteArray::iterator it,
+ QByteArray::iterator end, QChar mode, bool last) {
+ QString result;
+ if(mode == 'm')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'l')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'g')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 't')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'x')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'y')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'k')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'w')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'h')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'r')
+ result += QString::fromUtf8(read(it++, end));
+
+ else if(mode == 'W') {
+ if(!last) {
+ QByteArray tmp ;
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it));
+ result += read(it++, end, (qint32)qFromBigEndian(tmp.data()));
+ } else
+ result += read(it++, end);
+ } else if(mode == 'P') {
+ if(!last) {
+ QByteArray tmp ;
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it));
+ result += read(it++, end, (qint32)qFromBigEndian(tmp.data()));
+ } else
+ result += read(it++, end);
+ }
+ return result;
+}
+
+
+QString StarDictPlugin::format(QByteArray raw, QString mode) {
+ QString result;
+ if(mode == "") {
+ for(QByteArray::iterator it = raw.begin(); it != raw.end(); it++) {
+ char tmp = *(++it);
+ result += interpret(--it, raw.end(), tmp);
+ }
+ } else {
+ QByteArray::iterator it = raw.begin();
+ foreach(QChar tmp, mode) {
+ result += interpret(it, raw.end(), tmp);
+ }
+ }
+
+ return result;
+
+}
+
+
QString StarDictPlugin::search(QString key, qint64 offset, qint32 len) {
if(!dictReader)
return "";
- qDebug() << dictReader->readString(offset, len);
- return dictReader->readString(offset, len);
+ QByteArray raw = dictReader->readString(offset, len);
+
+ return format(raw, settings()->value("sametypesequence"));
}
#include <QtPlugin>
#include <QHash>
#include <QIcon>
+#include <QtEndian>
#include "../../include/CommonDictInterface.h"
#include "../../include/settings.h"
StarDictDialog* _dictDialog;
Settings* _ifoFileSettings;
StarDictReader * dictReader;
+ QString format(QByteArray, QString mode);
+ QByteArray read(QByteArray::iterator, QByteArray::iterator end,
+ int bytes = 0);
+ QString interpret(QByteArray::iterator, QByteArray::iterator,
+ QChar, bool last = false);
};
#endif // XDXFPLUGIN_H
/*!
Reads translations text from dict file.
- \param offset 32-bit offset of translation in file, readed from idx file
- \param len length of translation, readed from idx file too
- */
- virtual QString readString(qint32 offset, qint32 len)=0;
-
- /*!
- Reads translations text from dict file.
\param offset 64-bit offset of translation in file, readed from idx file
\param len length of translation, readed from idx file too
*/
- virtual QString readString(qint64 offset, qint32 len)=0;
+ virtual QByteArray readString(qint64 offset, qint32 len)=0;
/*!
Reads 32-bits integer value from file and convert it from BigEndian
return result;
}
-QString UncompressedReader::readString(qint32 offset, qint32 len) {
- char* buf;
- buf = new char[len];
-
- _file.seek(offset);
- _stream.readRawData(buf, len);
-
- QString result(buf);
- delete [] buf;
- return result;
-}
-QString UncompressedReader::readString(qint64 offset, qint32 len) {
+QByteArray UncompressedReader::readString(qint64 offset, qint32 len) {
char* buf;
buf = new char[len];
_file.seek(offset);
_stream.readRawData(buf, len);
- QString result(buf);
+ QByteArray result(buf, len);
delete [] buf;
return result;
}
/*!
Reads translations text from file
- \param offset 32-bit offset of translation in file, readed
- from idx file
- \param len length of translation, readed from idx file too
- */
- QString readString(qint32 offset, qint32 len);
-
- /*!
- Reads translations text from file
\param offset 64-bit offset of translation in file, readed
from idx file
\param len length of translation, readed from idx file too
*/
- QString readString(qint64 offset, qint32 len);
+ QByteArray readString(qint64 offset, qint32 len);
/*!
Reads 32-bits integer value from file and convert it from