1 #ifndef COLLECTIONREBUILDER_H
2 #define COLLECTIONREBUILDER_H
3 
4 #include <QThread>
5 #include <QMutex>
6 #include <QWaitCondition>
7 #include <QFile>
8 #include <QIcon>
9 #include <QHash>
10 #include <QTimer>
11 #include <QRegExp>
12 #include <QString>
13 #include <QStringList>
14 #include <QPixmap>
15 
16 #include "checksumdbmgr.h"
17 #include "xmldbmgr.h"
18 #include "swldbmgr.h"
19 #include "missingdumpsviewer.h"
20 #include "bigbytearray.h"
21 #include "ui_collectionrebuilder.h"
22 
23 class CollectionRebuilder;
24 class ROMAlyzer;
25 
26 #define QMC2_COLLECTIONREBUILDER_FILETYPE_ZIP	0
27 #define QMC2_COLLECTIONREBUILDER_FILETYPE_7Z	1
28 #define QMC2_COLLECTIONREBUILDER_FILETYPE_CHD	2
29 #define QMC2_COLLECTIONREBUILDER_FILETYPE_FILE	3
30 
31 #define QMC2_COLLECTIONREBUILDER_CHD_IGNORE	0
32 #define QMC2_COLLECTIONREBUILDER_CHD_HARDLINK	1
33 #define QMC2_COLLECTIONREBUILDER_CHD_SYMLINK	2
34 #define QMC2_COLLECTIONREBUILDER_CHD_COPY	3
35 #define QMC2_COLLECTIONREBUILDER_CHD_MOVE	4
36 
37 class CollectionRebuilderThread : public QThread
38 {
39 	Q_OBJECT
40 
41 	public:
42 		bool exitThread;
43 		bool isActive;
44 		bool isWaiting;
45 		bool isPaused;
46 		bool pauseRequested;
47 		bool stopRebuilding;
48 		bool doFilter;
49 		bool doFilterSoftware;
50 		bool isIncludeFilter;
51 		bool isIncludeFilterSoftware;
52 		bool doFilterState;
53 		bool includeStateC;
54 		bool includeStateM;
55 		bool includeStateI;
56 		bool includeStateN;
57 		bool includeStateU;
58 		bool exactMatch;
59 		bool exactMatchSoftware;
60 		bool useHashCache;
61 		bool dryRun;
62 		quint64 missingDisks;
63 		quint64 missingROMs;
64 		quint64 setsProcessed;
65 		QRegExp filterRx;
66 		QRegExp filterRxSoftware;
67 		QMutex mutex;
68 		QWaitCondition waitCondition;
69 
70 		CollectionRebuilderThread(QObject *parent = 0);
71 		~CollectionRebuilderThread();
72 
checkSumDb()73 		CheckSumDatabaseManager *checkSumDb() { return m_checkSumDb; }
rebuilderDialog()74 		CollectionRebuilder *rebuilderDialog() { return m_rebuilderDialog; }
xmlDb()75 		XmlDatabaseManager *xmlDb() { return m_xmlDb; }
swlDb()76 		SoftwareListXmlDatabaseManager *swlDb() { return m_swlDb; }
checkpoint()77 		qint64 checkpoint() { return m_checkpoint; }
currentListName()78 		QString currentListName() { return m_currentListName; }
79 		void setCheckpoint(qint64 cp, int xmlSourceIndex);
80 		void setListCheckpoint(QString list, int xmlSourceIndex);
81 		void reopenCheckSumDb();
82 		bool parseXml(QString, QString *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *);
83 		bool nextId(QString *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *);
84 		void checkpointRestart(qint64 checkpoint);
85 		bool rewriteSet(QString *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *);
86 		bool writeAllFileData(QString, QString, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *);
87 		bool writeAllZipData(QString, QString, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *);
88 #if defined(QMC2_LIBARCHIVE_ENABLED)
89 		bool writeAllArchiveData(QString, QString, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *, QStringList *);
90 #endif
91 		bool readFileData(QString, BigByteArray *);
92 		bool readSevenZipFileData(QString, QString, QString, BigByteArray *);
93 		bool readZipFileData(QString, QString, QString, BigByteArray *);
94 		bool hardlinkChds(QString, QString, QStringList *, QStringList *);
95 		bool symlinkChds(QString, QString, QStringList *, QStringList *);
96 		bool copyChds(QString, QString, QStringList *, QStringList *);
97 		bool moveChds(QString, QString, QStringList *, QStringList *);
98 		bool sameFileSystem(QString, QString);
99 		bool createBackup(QString filePath);
100 		void setFilterExpression(QString, int, int, bool);
101 		void setFilterExpressionSoftware(QString, int, int, bool);
clearFilterExpression()102 		void clearFilterExpression() { setFilterExpression(QString(), 0, 0, false); }
clearFilterExpressionSoftware()103 		void clearFilterExpressionSoftware() { setFilterExpressionSoftware(QString(), 0, 0, false); }
104 		void setStateFilter(bool enableFilter, bool stateC = true, bool stateM = true, bool stateI = true, bool stateN = true, bool stateU = true) {
105 			doFilterState = enableFilter;
106 			includeStateC = stateC;
107 			includeStateM = stateM;
108 			includeStateI = stateI;
109 			includeStateN = stateN;
110 			includeStateU = stateU;
111 		}
clearStateFilter()112 		void clearStateFilter() { setStateFilter(false); }
setSetEntityPattern(QString pattern)113 		void setSetEntityPattern(QString pattern) { m_setEntityPattern = pattern; }
setEntityPattern()114 		QString &setEntityPattern() { return m_setEntityPattern; }
setRomEntityPattern(QString pattern)115 		void setRomEntityPattern(QString pattern) { m_romEntityPattern = pattern; }
romEntityPattern()116 		QString &romEntityPattern() { return m_romEntityPattern; }
setDiskEntityPattern(QString pattern)117 		void setDiskEntityPattern(QString pattern) { m_diskEntityPattern = pattern; }
diskEntityPattern()118 		QString &diskEntityPattern() { return m_diskEntityPattern; }
setSetEntityStartPattern(QString pattern)119 		void setSetEntityStartPattern(QString pattern) { m_setEntityStartPattern = pattern; }
setEntityStartPattern()120 		QString &setEntityStartPattern() { return m_setEntityStartPattern; }
setListEntityStartPattern(QString pattern)121 		void setListEntityStartPattern(QString pattern) { m_listEntityStartPattern = pattern; }
listEntityStartPattern()122 		QString &listEntityStartPattern() { return m_listEntityStartPattern; }
setMerge(bool merge)123 		void setMerge(bool merge) { m_merge = merge; }
merge()124 		bool merge() { return m_merge; }
125 		bool evaluateFilters(QString &setKey);
126 
toHumanReadable(QString & text)127 		static QString &toHumanReadable(QString &text) {
128 			foreach (QString old, m_replacementHash.keys())
129 				text.replace(old, m_replacementHash.value(old));
130 			return text;
131 		}
132 
133 	public slots:
134 		void pause();
135 		void resume();
136 
137 	signals:
138 		void log(const QString &);
139 		void rebuildStarted();
140 		void rebuildFinished();
141 		void rebuildPaused();
142 		void rebuildResumed();
143 		void progressTextChanged(const QString &);
144 		void progressRangeChanged(int, int);
145 		void progressChanged(int);
146 		void statusUpdated(quint64, quint64, quint64);
147 		void newMissing(QString, QString, QString, QString, QString, QString, QString);
148 
149 	protected:
150 		void run();
151 
152 	private:
153 		CheckSumDatabaseManager *m_checkSumDb;
154 		XmlDatabaseManager *m_xmlDb;
155 		SoftwareListXmlDatabaseManager *m_swlDb;
156 		CollectionRebuilder *m_rebuilderDialog;
157 		qint64 m_xmlIndex, m_xmlIndexCount, m_checkpoint;
158 		QFile m_xmlFile;
159 		QString m_currentListName;
160 		QString m_setEntityPattern;
161 		QString m_romEntityPattern;
162 		QString m_diskEntityPattern;
163 		QString m_setEntityStartPattern;
164 		QString m_listEntityStartPattern;
165 		bool m_merge;
166 		static QHash<QString, QString> m_replacementHash;
167 		static QStringList m_fileTypes;
168 		QHash<QString, bool> m_hashCache;
169 		uint m_hashCacheUpdateTime;
170 		bool checkSumExists(QString sha1, QString crc, quint64 size = 0);
171 		void updateHashCache();
172 };
173 
174 class CollectionRebuilder : public QWidget, public Ui::CollectionRebuilder
175 {
176 	Q_OBJECT
177 
178        	public:
179 		CollectionRebuilder(ROMAlyzer *romAlyzer, QWidget *parent = 0);
180 		~CollectionRebuilder();
181 
rebuilderThread()182 		CollectionRebuilderThread *rebuilderThread() { return m_rebuilderThread; }
romAlyzer()183 		ROMAlyzer *romAlyzer() { return m_romAlyzer; }
settingsKey()184 		QString settingsKey() { return m_settingsKey; }
newMissingList()185 		QStringList &newMissingList() { return m_newMissingList; }
missingDumpsViewer()186 		MissingDumpsViewer *missingDumpsViewer() { return m_missingDumpsViewer; }
187 
defaultEmulator()188 		bool defaultEmulator() { return m_defaultEmulator; }
setDefaultEmulator(bool enable)189 		void setDefaultEmulator(bool enable) { m_defaultEmulator = enable; }
190 		void setStateFilterVisibility(bool visible);
showStateFilter()191 		void showStateFilter() { setStateFilterVisibility(true); }
hideStateFilter()192 		void hideStateFilter() { setStateFilterVisibility(false); }
active()193 		bool active() { return rebuilderThread() ? rebuilderThread()->isActive : false; }
setIgnoreCheckpoint(bool ignore)194 		void setIgnoreCheckpoint(bool ignore) { m_ignoreCheckpoint = ignore; }
ignoreCheckpoint()195 		bool ignoreCheckpoint() { return m_ignoreCheckpoint; }
196 
197 	public slots:
198 		void on_spinBoxMaxLogSize_valueChanged(int);
199 		void log(const QString &);
clear()200 		void clear() { plainTextEditLog->clear(); }
201 		void scrollToEnd();
202 		void adjustIconSizes();
203 		void on_pushButtonStartStop_clicked();
204 		void on_pushButtonPauseResume_clicked();
205 		void on_comboBoxXmlSource_currentIndexChanged(int);
206 		void on_toolButtonRemoveXmlSource_clicked();
207 		void on_toolButtonViewMissingList_clicked();
208 		void rebuilderThread_rebuildStarted();
209 		void rebuilderThread_rebuildFinished();
210 		void rebuilderThread_rebuildPaused();
211 		void rebuilderThread_rebuildResumed();
212 		void rebuilderThread_progressTextChanged(const QString &);
213 		void rebuilderThread_progressRangeChanged(int, int);
214 		void rebuilderThread_progressChanged(int);
215 		void rebuilderThread_statusUpdated(quint64, quint64, quint64);
216 		void rebuilderThread_newMissing(QString, QString, QString, QString, QString, QString, QString);
217 		void animationTimer_timeout();
218 		void updateMissingList();
219 		void updateModeSetup();
220 		void on_comboBoxModeSwitch_currentIndexChanged(int);
221 
222 	protected:
223 		void showEvent(QShowEvent *);
224 		void hideEvent(QHideEvent *);
225 
226 	private:
227 		CollectionRebuilderThread *m_rebuilderThread;
228 		QString m_defaultSetEntity, m_defaultRomEntity, m_defaultDiskEntity;
229 		QIcon m_iconCheckpoint, m_iconNoCheckpoint;
230 		QTimer m_animationTimer;
231 		int m_animationSequence;
232 		ROMAlyzer *m_romAlyzer;
233 		QString m_settingsKey;
234 		QPixmap m_correctIconPixmap;
235 		QPixmap m_mostlyCorrectIconPixmap;
236 		QPixmap m_incorrectIconPixmap;
237 		QPixmap m_notFoundIconPixmap;
238 		QPixmap m_unknownIconPixmap;
239 		QStringList m_newMissingList;
240 		MissingDumpsViewer *m_missingDumpsViewer;
241 		bool m_defaultEmulator;
242 		bool m_ignoreCheckpoint;
243 };
244 
245 #endif
246 
247 #include "romalyzer.h"
248