Added windows build howto into README
[imgsort.git] / filebank.cpp
1 #include "filebank.h"
2
3
4 QString createTmpDir(const char * keyword = "sortimg") {
5   QDir temp_parent = QDir::temp();
6   QString temp_dirname;
7   int i = 0;
8   do {
9     temp_dirname.sprintf("%s%04d", keyword, i++);
10   } while (!temp_parent.mkdir(temp_dirname));
11   return temp_parent.absoluteFilePath(temp_dirname);
12 }
13
14 // QString fixPath(const QString & a_path) {
15 //   QString s(a_path);
16 //   
17 //   s.replace("/./", "/");
18 //   if (s.endsWith("/.")) s.chop(2);
19 //   
20 //   return s;
21 // }
22 // not used, use QDir::cleanPath instead !
23
24 FileBank::FileBank(const QString & source_path, const QStringList & file_mask) 
25     : srcDir(QDir::cleanPath(source_path)), tmpDir(createTmpDir()),
26       dstDir(QDir::cleanPath(srcDir.absoluteFilePath(si_settings_dest_dir))) {
27       
28   QDirIterator srcIt(srcDir.absolutePath(), file_mask, QDir::Files, QDirIterator::NoIteratorFlags);
29   
30   while (srcIt.hasNext()) {
31     filelist.insert(srcIt.next(), ScaleCropRule());
32   }
33   
34   //qSort(filelist);
35   
36   qDebug() << "Source dir: " << srcDir.path();
37   qDebug() << "Temp dir: " << tmpDir.path();
38   qDebug() << "Target dir: " << dstDir.path();
39 }
40
41
42 QString FileBank::getTmpNameFor(const QString & file) {
43   QString pure_file = srcDir.relativeFilePath(file);
44   return tmpDir.absoluteFilePath(pure_file);
45 }
46   
47   
48   
49 void FileBank::markAsDeleted(const QString & file) {
50   qDebug() << getTmpNameFor(file) + ".deleted";
51   
52   QFile delFile(getTmpNameFor(file) + ".deleted");
53   delFile.open(QIODevice::WriteOnly | QIODevice::Text);
54   QTextStream delStream(&delFile);
55   delStream << "Following file is gonna be deleted:\n" << file << "\n";
56   delFile.close();
57 }
58
59 void FileBank::unmarkDeleted(const QString & file) {
60   QFile delFile(getTmpNameFor(file) + ".deleted");
61   delFile.remove();
62 }
63
64 bool FileBank::isMarkedAsDeleted(const QString & file) {
65   QFile delFile(getTmpNameFor(file) + ".deleted");
66   return delFile.exists();
67 }
68
69
70
71 void FileBank::finalizeTmpDir() {
72   QMapIterator<QString, ScaleCropRule> allFiles(filelist);
73   
74   bool sameStrDst = (srcDir.canonicalPath() == dstDir.canonicalPath()); // actually not used
75   while (allFiles.hasNext()) {
76     QString processed = allFiles.next().key();
77     QString pFileName = srcDir.relativeFilePath(processed);
78     QString pTName = tmpDir.absoluteFilePath(pFileName);
79     QString pTDeleted = pTName + ".deleted";
80     QString pDName = dstDir.absoluteFilePath(pFileName);
81     bool pTExists = QFile(pTName).exists();
82     bool pTDExists = QFile(pTDeleted).exists();
83     bool pDNExists = QFile(pDName).exists();
84     
85     if ((pTExists || pTDExists) && pDNExists) dstDir.remove(pFileName);
86     if (pTExists && !pTDExists) tmpDir.rename(pFileName, pDName);
87     if (pTExists && pTDExists) tmpDir.remove(pFileName);
88     if (pTDExists) tmpDir.remove(pTDeleted);
89     if (!sameStrDst && !pTDExists && !pTExists && pDNExists) dstDir.remove(pFileName);
90     if (!sameStrDst && !pTDExists && !pTExists) QFile::copy(processed, pDName);
91   }
92   
93   tmpDir.rmdir(".");
94 }
95     
96     
97     
98
99
100
101