fix bug
[mdictionary] / src / plugins / stardict / CompressedReader.cpp
index 33a9744..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>
@@ -29,16 +34,19 @@ 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)
@@ -46,6 +54,7 @@ bool CompressedReader::open(QString file) {
     return true;
 }
 
+
 void CompressedReader::close() {
     gzclose(_file);
     _file = NULL;
@@ -57,31 +66,39 @@ QChar CompressedReader::readChar() {
     QString cha;
 
     gzread(_file, c, 1);
-    if(((unsigned char)c[0])>127){
+    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);
-        if(((unsigned char)c[1])>127 && ((unsigned char)c[1])<192){
-            gzread(_file, c+2, 1);
-            if(((unsigned char)c[2])>127 && ((unsigned char)c[2])<192)
-                gzread(_file, c+3, 1);
-        }
+    else if(((unsigned char)c[0])>127){
+        qDebug()<<"error - starDict - read wordList from UTF-8";
+        c[0]=0;
     }
 
     cha=QString::fromUtf8(c);
-    return cha.at(0);
+    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;
@@ -94,6 +111,7 @@ QString CompressedReader::readKeyword() {
     return result;
 }
 
+
 QByteArray CompressedReader::readString(qint64 offset, qint32 len) {
     char* buf;
     buf = new char[len];