blob: 350a49c73877a56d3ecc9395e881dc555007b385 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2014 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/
#include "backend/drivers/cswordlexiconmoduleinfo.h"
#include <QFile>
#include <QDataStream>
#include <QTextCodec>
#include <QDebug>
#include "util/directory.h"
// Sword includes:
#include <swmodule.h>
//Change it once the format changed to make all systems rebuild their caches
#define CACHE_FORMAT "3"
const QStringList &CSwordLexiconModuleInfo::entries() const {
namespace DU = util::directory;
// If cache is ok, just return it:
if (!m_entries.empty()) {
return m_entries;
}
QString dir(DU::getUserCacheDir().absolutePath());
QFile f1( QString(dir).append("/").append(name()));
/*
* Try the module's cache
*/
if ( f1.open( QIODevice::ReadOnly ) ) {
QDataStream s( &f1 );
QString ModuleVersion, CacheVersion, QDataStreamVersion;
s >> ModuleVersion;
s >> CacheVersion;
s >> QDataStreamVersion;
qDebug() << "Lexicon cache metadata"
<< "Name" << name()
<< "ModuleVersion" << ModuleVersion
<< "CacheVersion" << CacheVersion
<< "QDataStreamVersion" << QDataStreamVersion;
// Check if cache is valid
if (ModuleVersion == config(CSwordModuleInfo::ModuleVersion)
&& CacheVersion == CACHE_FORMAT
&& QDataStreamVersion == QString::number(s.version())) {
s >> m_entries;
f1.close();
qDebug() << "Read" << m_entries.count() << "entries from lexicon cache for module" << name();
return m_entries;
}
f1.close();
}
/*
* Ok, no cache or invalid.
*/
qDebug() << "Read all entries of lexicon" << name();
module()->setSkipConsecutiveLinks(true);
module()->setPosition(sword::TOP);
snap(); //snap to top entry
do {
if ( isUnicode() ) {
m_entries.append(QString::fromUtf8(module()->getKeyText()));
}
else {
//for latin1 modules use fromLatin1 because of speed
QTextCodec* codec = QTextCodec::codecForName("Windows-1252");
m_entries.append(codec->toUnicode(module()->getKeyText()));
}
module()->increment();
} while (!module()->popError());
module()->setPosition(sword::TOP); // back to the first entry
module()->setSkipConsecutiveLinks(false);
/// \todo Document why the following code is here:
if (!m_entries.empty() && m_entries.front().simplified().isEmpty())
m_entries.pop_front();
qDebug() << "Writing cache file for lexicon module" << name();
if (m_entries.count()) {
//create cache
QString dir(DU::getUserCacheDir().absolutePath());
QFile f2( QString(dir).append("/").append(name()) );
if (f2.open( QIODevice::WriteOnly )) {
QDataStream s( &f2 );
s << config(CSwordModuleInfo::ModuleVersion) //store module version
<< QString(CACHE_FORMAT) //store BT version -- format may change
<< QString::number(s.version()) //store QDataStream version -- format may change
<< m_entries;
f2.close();
}
}
return m_entries;
}
|