Copyright 2010 Comarch S.A.
*******************************************************************************/
+/*!
+ \file CompressedReader.cpp
+ \brief Class implementing StarDictReader interface and handling reading from compressed
+ files like .gz or .dz
-//Created by Mateusz Półrola
+ \author Mateusz Półrola
+*/
#include "CompressedReader.h"
#include <QtEndian>
+#include <QDebug>
CompressedReader::CompressedReader(QObject *parent) :
StarDictReader(parent) {
}
+
CompressedReader::CompressedReader(QString filename, QObject *parent) :
StarDictReader(parent) {
open(filename);
}
+
CompressedReader::~CompressedReader() {
if(_file != NULL)
gzclose(_file);
}
+
bool CompressedReader::open(QString file) {
_file = gzopen(file.toStdString().c_str(), "rb");
if(_file == NULL)
return true;
}
+
void CompressedReader::close() {
gzclose(_file);
_file = NULL;
QChar CompressedReader::readChar() {
- char c[1];
+ char c[4]={0};
+ QString cha;
+
gzread(_file, c, 1);
- return QChar(c[0]);
+ if(((unsigned char)c[0])>239)
+ gzread(_file, c+1, 3);
+ else if(((unsigned char)c[0])>223)
+ gzread(_file, c+1, 2);
+ else if(((unsigned char)c[0])>191)
+ gzread(_file, c+1, 1);
+ else if(((unsigned char)c[0])>127){
+ qDebug()<<"error - starDict - read wordList from UTF-8";
+ c[0]=0;
+ }
+
+ cha=QString::fromUtf8(c);
+ if(cha.size()!=0)
+ return cha.at(0);
+ else
+ return '\0';
}
+
qint32 CompressedReader::readInt32BigEndian() {
qint32 value;
gzread(_file, (void*)(&value), 4);
-
return qFromBigEndian(value);
}
+
qint64 CompressedReader::readInt64BigEndian() {
qint64 value;
gzread(_file, (void*)(&value), 8);
-
return value;
}
+
QString CompressedReader::readKeyword() {
QString result;
QChar c;
- c = readChar();
+ c = readChar();
while(c != '\0') {
result += c;
c = readChar();
}
-
return result;
}
-QString CompressedReader::readString(qint32 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;
-}
-QString CompressedReader::readString(qint64 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;
+ return res;
}