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