3
* This file is part of BibleTime's source code, http://www.bibletime.info/.
5
* Copyright 1999-2008 by the BibleTime developers.
6
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
10
#include "directoryutil.h"
16
#include <QFileInfoList>
18
#include <QCoreApplication>
23
namespace filesystem {
25
void DirectoryUtil::removeRecursive(const QString dir) {
26
//Check for validity of argument
27
if (dir.isEmpty()) return;
29
if (!d.exists()) return;
31
//remove all files in this dir
32
d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
33
const QFileInfoList fileList = d.entryInfoList();
34
for (QFileInfoList::const_iterator it_file = fileList.begin(); it_file != fileList.end(); it_file++)
36
d.remove( it_file->fileName() );
39
//remove all subdirs recursively
40
d.setFilter( QDir::Dirs | QDir::NoSymLinks );
41
const QFileInfoList dirList = d.entryInfoList();
42
for (QFileInfoList::const_iterator it_dir = dirList.begin(); it_dir != dirList.end(); it_dir++)
44
if ( !it_dir->isDir() || it_dir->fileName() == "." || it_dir->fileName() == ".." ) {
47
removeRecursive( it_dir->absoluteFilePath() );
52
/** Returns the size of the directory including the size of all it's files and it's subdirs.
54
unsigned long DirectoryUtil::getDirSizeRecursive(const QString dir) {
55
//Check for validity of argument
57
if (!d.exists()) return 0;
59
unsigned long size = 0;
61
//First get the size of all files int this folder
62
d.setFilter(QDir::Files);
63
const QFileInfoList infoList = d.entryInfoList();
64
for (QFileInfoList::const_iterator it = infoList.begin(); it != infoList.end(); it++)
69
//Then add the sizes of all subdirectories
70
d.setFilter(QDir::Dirs);
71
const QFileInfoList dirInfoList = d.entryInfoList();
72
for (QFileInfoList::const_iterator it_dir = dirInfoList.begin(); it_dir != dirInfoList.end(); it_dir++)
74
if ( !it_dir->isDir() || it_dir->fileName() == "." || it_dir->fileName() == ".." ) {
77
size += getDirSizeRecursive( it_dir->absoluteFilePath() );
82
/**Recursively copies a directory, overwriting existing files*/
83
void DirectoryUtil::copyRecursive(QString src, QString dest){
87
QStringList files = srcDir.entryList(QDir::Files);
88
for (QStringList::iterator it = files.begin(); it != files.end(); ++it){
89
QFile currFile(src + "/" + *it);
90
QString newFileLoc = dest + "/" + *it;
91
QFile newFile(newFileLoc);
93
currFile.copy(newFileLoc);
95
QStringList dirs = srcDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
96
for (QStringList::iterator it = dirs.begin(); it != dirs.end(); ++it){
98
if (!destDir.cd(*it)){
101
copyRecursive(src + "/" + *it, dest + "/" + *it);
105
static QDir cachedIconDir;
106
static QDir cachedJavascriptDir;
107
static QDir cachedLicenseDir;
108
static QDir cachedPicsDir;
109
static QDir cachedLocaleDir;
110
static QDir cachedHandbookDir;
111
static QDir cachedHowtoDir;
112
static QDir cachedDisplayTemplatesDir;
113
static QDir cachedUserDisplayTemplatesDir;
114
static QDir cachedUserBaseDir;
115
static QDir cachedUserHomeDir;
116
static QDir cachedUserSessionsDir;
117
static QDir cachedUserCacheDir;
118
static QDir cachedUserIndexDir;
120
static bool dirCacheInitialized = false;
122
void DirectoryUtil::initDirectoryCache(void)
124
QDir wDir( QCoreApplication::applicationDirPath() );
127
if (!wDir.cdUp()) //installation prefix
129
qWarning() << "Cannot cd up from directory " << QCoreApplication::applicationDirPath();
133
cachedIconDir = wDir; //icon dir
134
if (!cachedIconDir.cd("share/bibletime/icons") || !cachedIconDir.isReadable())
136
qWarning() << "Cannot find icon directory relative to" << QCoreApplication::applicationDirPath();
140
cachedJavascriptDir = wDir;
141
if (!cachedJavascriptDir.cd("share/bibletime/javascript") || !cachedJavascriptDir.isReadable())
143
qWarning() << "Cannot find javascript directory relative to" << QCoreApplication::applicationDirPath();
147
cachedLicenseDir = wDir;
148
if (!cachedLicenseDir.cd("share/bibletime/license") || !cachedLicenseDir.isReadable())
150
qWarning() << "Cannot find license directory relative to" << QCoreApplication::applicationDirPath();
154
cachedPicsDir = wDir; //icon dir
155
if (!cachedPicsDir.cd("share/bibletime/pics") || !cachedPicsDir.isReadable())
157
qWarning() << "Cannot find icon directory relative to" << QCoreApplication::applicationDirPath();
161
cachedLocaleDir = wDir;
162
if (!cachedLocaleDir.cd("share/bibletime/locale")) {
163
qWarning() << "Cannot find locale directory relative to" << QCoreApplication::applicationDirPath();
167
QString localeName = QLocale::system().name();
168
QString langCode = localeName.section('_', 0, 0);
170
cachedHandbookDir = wDir;
171
if (!cachedHandbookDir.cd(QString("share/bibletime/docs/handbook/") + localeName)) {
172
if (!cachedHandbookDir.cd(QString("share/bibletime/docs/handbook/") + langCode)) {
173
if (!cachedHandbookDir.cd("share/bibletime/docs/handbook/en/")) {
174
qWarning() << "Cannot find handbook directory relative to" << QCoreApplication::applicationDirPath();
180
cachedHowtoDir = wDir;
181
if (!cachedHowtoDir.cd(QString("share/bibletime/docs/howto/") + localeName)) {
182
if (!cachedHowtoDir.cd(QString("share/bibletime/docs/howto/") + langCode)) {
183
if (!cachedHowtoDir.cd("share/bibletime/docs/howto/en/")) {
184
qWarning() << "Cannot find handbook directory relative to" << QCoreApplication::applicationDirPath();
190
cachedDisplayTemplatesDir = wDir; //display templates dir
191
if (!cachedDisplayTemplatesDir.cd("share/bibletime/display-templates/")) {
192
qWarning() << "Cannot find display template directory relative to" << QCoreApplication::applicationDirPath();
196
cachedUserHomeDir = QDir::home();
198
cachedUserBaseDir = QDir::home();
199
if (!cachedUserBaseDir.cd(".bibletime")){
200
bool success = cachedUserBaseDir.mkdir(".bibletime") && cachedUserBaseDir.cd(".bibletime");
202
qWarning() << "Could not create user setting directory.";
207
cachedUserSessionsDir = cachedUserBaseDir;
208
if (!cachedUserSessionsDir.cd("sessions")){
209
bool success = cachedUserSessionsDir.mkdir("sessions") && cachedUserSessionsDir.cd("sessions");
211
qWarning() << "Could not create user sessions directory.";
216
cachedUserCacheDir = cachedUserBaseDir;
217
if (!cachedUserCacheDir.cd("cache")){
218
bool success = cachedUserCacheDir.mkdir("cache") && cachedUserCacheDir.cd("cache");
220
qWarning() << "Could not create user cache directory.";
225
cachedUserIndexDir = cachedUserBaseDir;
226
if (!cachedUserIndexDir.cd("indices")){
227
bool success = cachedUserIndexDir.mkdir("indices") && cachedUserIndexDir.cd("indices");
229
qWarning() << "Could not create user indices directory.";
233
cachedUserDisplayTemplatesDir = cachedUserBaseDir;
234
if (!cachedUserDisplayTemplatesDir.cd("display-templates")){
235
bool success = cachedUserDisplayTemplatesDir.mkdir("display-templates") && cachedUserDisplayTemplatesDir.cd("display-templates");
237
qWarning() << "Could not create user display templates directory.";
241
dirCacheInitialized = true;
244
QDir DirectoryUtil::getIconDir(void)
246
if (!dirCacheInitialized) initDirectoryCache();
247
return cachedIconDir;
250
QDir DirectoryUtil::getJavascriptDir(void)
252
if (!dirCacheInitialized) initDirectoryCache();
253
return cachedJavascriptDir;
256
QDir DirectoryUtil::getLicenseDir(void)
258
if (!dirCacheInitialized) initDirectoryCache();
259
return cachedLicenseDir;
262
QIcon DirectoryUtil::getIcon(const QString& name)
264
static QMap<QString, QIcon> iconCache;
265
//error if trying to use name directly...
267
QString plainName = name2.remove(".svg", Qt::CaseInsensitive);
268
if (iconCache.contains(plainName)) {
269
return iconCache.value(plainName);
272
QString iconDir = getIconDir().canonicalPath();
273
QString iconFileName = iconDir + "/" + plainName + ".svg";
274
if (QFile(iconFileName).exists())
276
QIcon ic = QIcon(iconFileName);
277
iconCache.insert(plainName, ic);
281
iconFileName = iconDir + "/" + plainName + ".png";
282
if (QFile(iconFileName).exists()) {
283
QIcon ic = QIcon(iconFileName);
284
iconCache.insert(plainName, ic);
287
qWarning() << "Cannot find icon file" << iconFileName << ", using default icon.";
288
iconFileName = iconDir + "/" + "/default.svg";
289
if (QFile(iconFileName).exists()) {
290
return QIcon(iconDir + "/default.svg");
292
return QIcon(iconDir + "default.png");
298
QDir DirectoryUtil::getPicsDir(void)
300
if (!dirCacheInitialized) initDirectoryCache();
301
return cachedPicsDir;
304
QDir DirectoryUtil::getLocaleDir(void)
306
if (!dirCacheInitialized) initDirectoryCache();
307
return cachedLocaleDir;
310
QDir DirectoryUtil::getHandbookDir(void)
312
if (!dirCacheInitialized) initDirectoryCache();
313
return cachedHandbookDir;
316
QDir DirectoryUtil::getHowtoDir(void)
318
if (!dirCacheInitialized) initDirectoryCache();
319
return cachedHowtoDir;
322
QDir DirectoryUtil::getDisplayTemplatesDir(void)
324
if (!dirCacheInitialized) initDirectoryCache();
325
return cachedDisplayTemplatesDir;
328
QDir DirectoryUtil::getUserBaseDir(void)
330
if (!dirCacheInitialized) initDirectoryCache();
331
return cachedUserBaseDir;
334
QDir DirectoryUtil::getUserHomeDir(void)
336
if (!dirCacheInitialized) initDirectoryCache();
337
return cachedUserHomeDir;
340
QDir DirectoryUtil::getUserSessionsDir(void)
342
if (!dirCacheInitialized) initDirectoryCache();
343
return cachedUserSessionsDir;
346
QDir DirectoryUtil::getUserCacheDir(void)
348
if (!dirCacheInitialized) initDirectoryCache();
349
return cachedUserCacheDir;
352
QDir DirectoryUtil::getUserIndexDir(void)
354
if (!dirCacheInitialized) initDirectoryCache();
355
return cachedUserIndexDir;
358
QDir DirectoryUtil::getUserDisplayTemplatesDir(void)
360
if (!dirCacheInitialized) initDirectoryCache();
361
return cachedUserDisplayTemplatesDir;
365
} //end of namespace util::filesystem
367
} //end of namespace util