8bf95b7e0de5759764f4b4c870996b7ab5fc9bfd
[mdictionary] / src / plugins / stardict / UncompressedReader.cpp
1 #include "UncompressedReader.h"
2 #include "QDebug"
3
4 UncompressedReader::UncompressedReader(QObject *parent) :
5         StarDictReader(parent) {
6
7 }
8
9 UncompressedReader::UncompressedReader(QString filename, QObject *parent) :
10 StarDictReader(parent) {
11     open(filename);
12 }
13
14 UncompressedReader::~UncompressedReader() {
15     if(_file.isOpen())
16         _file.close();
17 }
18
19 bool UncompressedReader::open(QString file) {
20     _file.setFileName(file);
21     _stream.setDevice(&_file);
22     return _file.open(QFile::ReadOnly);
23 }
24
25 void UncompressedReader::close() {
26     _file.close();
27 }
28
29 QChar UncompressedReader::readChar() {
30     char c[4]={0};
31     QString cha;
32
33     _stream.readRawData(c,1);
34     if(((unsigned char)c[0])>127){
35         _stream.readRawData(c+1,1);
36         if(((unsigned char)c[1])>127 && ((unsigned char)c[1])<192){
37             _stream.readRawData(c+2,1);
38             if(((unsigned char)c[2])>127 && ((unsigned char)c[2])<192)
39                 _stream.readRawData(c+3,1);
40         }
41     }
42
43     cha=QString::fromUtf8(c);
44     return cha.at(0);
45 }
46
47 QString UncompressedReader::readKeyword() {
48     QString result;
49     QChar c;
50     c = readChar();
51
52     while(c != '\0') {
53         result += c;
54         c = readChar();
55     }
56
57     return result;
58 }
59
60
61 QByteArray UncompressedReader::readString(qint64 offset, qint32 len) {
62     char* buf;
63     buf = new char[len];
64
65     _file.seek(offset);
66     _stream.readRawData(buf, len);
67
68     QByteArray result(buf, len);
69     delete [] buf;
70     return result;
71 }
72
73 qint32 UncompressedReader::readInt32BigEndian() {
74     _stream.setByteOrder(QDataStream::BigEndian);
75     qint32 value;
76     _stream>>value;
77     _stream.setByteOrder(QDataStream::LittleEndian);
78     return value;
79 }
80
81 qint64 UncompressedReader::readInt64BigEndian() {
82     _stream.setByteOrder(QDataStream::BigEndian);
83     qint64 value;
84     _stream>>value;
85     _stream.setByteOrder(QDataStream::LittleEndian);
86
87     return value;
88 }