a8db47034f2301216283b79d6e691c24417b8715
[mdictionary] / src / plugins / stardict / CompressedReader.cpp
1 /*******************************************************************************
2
3     This file is part of mDictionary.
4
5     mDictionary is free software: you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation, either version 3 of the License, or
8     (at your option) any later version.
9
10     mDictionary is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with mDictionary.  If not, see <http://www.gnu.org/licenses/>.
17
18     Copyright 2010 Comarch S.A.
19
20 *******************************************************************************/
21 /*!
22     \file CompressedReader.cpp
23     \author Mateusz Półrola
24 */
25
26 #include "CompressedReader.h"
27 #include <QtEndian>
28 #include <QDebug>
29
30 CompressedReader::CompressedReader(QObject *parent) :
31     StarDictReader(parent) {
32 }
33
34
35 CompressedReader::CompressedReader(QString filename, QObject *parent) :
36     StarDictReader(parent) {
37     open(filename);
38 }
39
40
41 CompressedReader::~CompressedReader() {
42     if(_file != NULL)
43         gzclose(_file);
44 }
45
46
47 bool CompressedReader::open(QString file) {
48     _file = gzopen(file.toStdString().c_str(), "rb");
49     if(_file == NULL)
50         return false;
51     return true;
52 }
53
54
55 void CompressedReader::close() {
56     gzclose(_file);
57     _file = NULL;
58 }
59
60
61 QChar CompressedReader::readChar() {
62     char c[4]={0};
63     QString cha;
64
65     gzread(_file, c, 1);
66     if(((unsigned char)c[0])>239)
67         gzread(_file, c+1, 3);
68     else if(((unsigned char)c[0])>223)
69         gzread(_file, c+1, 2);
70     else if(((unsigned char)c[0])>191)
71         gzread(_file, c+1, 1);
72     else if(((unsigned char)c[0])>127){
73         qDebug()<<"error - starDict - read wordList from UTF-8";
74         c[0]=0;
75     }
76
77     cha=QString::fromUtf8(c);
78     return cha.at(0);
79 }
80
81
82 qint32 CompressedReader::readInt32BigEndian() {
83     qint32 value;
84     gzread(_file, (void*)(&value), 4);
85     return qFromBigEndian(value);
86 }
87
88
89 qint64 CompressedReader::readInt64BigEndian() {
90     qint64 value;
91     gzread(_file, (void*)(&value), 8);
92     return value;
93 }
94
95
96 QString CompressedReader::readKeyword() {
97     QString result;
98     QChar c;
99
100     c = readChar();
101     while(c != '\0') {
102         result += c;
103         c = readChar();
104     }
105     return result;
106 }
107
108
109 QByteArray CompressedReader::readString(qint64 offset, qint32 len) {
110     char* buf;
111     buf = new char[len];
112
113     gzseek(_file, offset, SEEK_SET);
114     gzread(_file, buf, len);
115
116     QByteArray res(buf, len);
117     delete [] buf;
118     return res;
119 }
120