fix bug
[mdictionary] / src / plugins / stardict / CompressedReader.cpp
index c10c2fc..59bfaa1 100644 (file)
     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)
@@ -45,6 +54,7 @@ bool CompressedReader::open(QString file) {
     return true;
 }
 
+
 void CompressedReader::close() {
     gzclose(_file);
     _file = NULL;
@@ -52,59 +62,65 @@ void CompressedReader::close() {
 
 
 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;
 }