X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Ffilethread.cpp;h=5d0d5834398a6abf1c04d888c3f0bb5b6772903b;hb=f005034d4a3990efc8e445ce46222ce32600411b;hp=90bee21229cad767e9dd6403bed875d528e43ed5;hpb=742efd9b7deca399ca92f1c548e97836d626c86a;p=virtualjaguar diff --git a/src/gui/filethread.cpp b/src/gui/filethread.cpp index 90bee21..5d0d583 100644 --- a/src/gui/filethread.cpp +++ b/src/gui/filethread.cpp @@ -1,10 +1,10 @@ // // filethread.cpp - File discovery thread // -// by James L. Hammons +// by James Hammons // (C) 2010 Underground Software // -// JLH = James L. Hammons +// JLH = James Hammons // // Who When What // --- ---------- ------------------------------------------------------------- @@ -21,6 +21,7 @@ #include "crc32.h" #include "file.h" #include "filedb.h" +//#include "memory.h" #include "settings.h" #define VERBOSE_LOGGING @@ -39,8 +40,9 @@ FileThread::~FileThread() wait(); } -void FileThread::Go(void) +void FileThread::Go(bool allowUnknown/*= false*/) { + allowUnknownSoftware = allowUnknown; QMutexLocker locker(&mutex); start(); } @@ -90,10 +92,13 @@ printf("FileThread: Aborting!!!\n"); // void FileThread::HandleFile(QFileInfo fileInfo) { + // Really, need to come up with some kind of cacheing scheme here, so we don't + // fish through these files every time we run VJ :-P +#warning "!!! Need to come up with some kind of cacheing scheme here !!!" bool haveZIPFile = (fileInfo.suffix().compare("zip", Qt::CaseInsensitive) == 0 ? true : false); uint32_t fileSize = 0; - uint8 * buffer = NULL; + uint8_t * buffer = NULL; if (haveZIPFile) { @@ -117,17 +122,17 @@ void FileThread::HandleFile(QFileInfo fileInfo) if (fileSize == 0) return; - buffer = new uint8[fileSize]; + buffer = new uint8_t[fileSize]; file.read((char *)buffer, fileSize); file.close(); } // Try to divine the file type by size & header - int fileType = ParseFileType(buffer[0], buffer[1], fileSize); + int fileType = ParseFileType(buffer, fileSize); // Check for Alpine ROM w/Universal Header bool foundUniversalHeader = HasUniversalHeader(buffer, fileSize); - uint32 crc; + uint32_t crc; //printf("FileThread: About to calc checksum on file with size %u... (buffer=%08X)\n", size, buffer); if (foundUniversalHeader) @@ -135,11 +140,19 @@ void FileThread::HandleFile(QFileInfo fileInfo) else crc = crc32_calcCheckSum(buffer, fileSize); - uint32 index = FindCRCIndexInFileList(crc); + uint32_t index = FindCRCIndexInFileList(crc); delete[] buffer; - if ((index == 0xFFFFFFFF) || (romList[index].flags & FF_BIOS)) - return; // CRC wasn't found, so bail... + // Here we filter out files that are *not* in the DB and of unknown type, + // and BIOS files. If desired, this can be overriden with a config option. + if ((index == 0xFFFFFFFF) && (fileType == JST_NONE)) + { + // If we allow unknown software, we pass the (-1) index on, otherwise... + if (!allowUnknownSoftware) + return; // CRC wasn't found, so bail... + } + else if ((index != 0xFFFFFFFF) && romList[index].flags & FF_BIOS) + return; //Here's a little problem. When we create the image here and pass it off to FilePicker, //we can clobber this image before we have a chance to copy it out in the FilePicker function @@ -150,7 +163,7 @@ void FileThread::HandleFile(QFileInfo fileInfo) // See if we can fish out a label. :-) if (haveZIPFile) { - uint32 size = GetFileFromZIP(fileInfo.filePath().toAscii(), FT_LABEL, buffer); + uint32_t size = GetFileFromZIP(fileInfo.filePath().toAscii(), FT_LABEL, buffer); //printf("FT: Label size = %u bytes.\n", size); if (size > 0) @@ -165,14 +178,15 @@ void FileThread::HandleFile(QFileInfo fileInfo) //printf("FileThread: Attempted to load image. Size: %u x %u...\n", img.width(), img.height()); } - emit FoundAFile2(index, fileInfo.canonicalFilePath(), img, fileSize); +// emit FoundAFile2(index, fileInfo.canonicalFilePath(), img, fileSize); + emit FoundAFile3(index, fileInfo.canonicalFilePath(), img, fileSize, foundUniversalHeader, fileType, crc); } // // Find a CRC in the ROM list (simple brute force algorithm). // If it's there, return the index, otherwise return $FFFFFFFF // -uint32 FileThread::FindCRCIndexInFileList(uint32 crc) +uint32_t FileThread::FindCRCIndexInFileList(uint32_t crc) { // Instead of a simple brute-force search, we should probably do a binary // partition search instead, since the CRCs are sorted numerically.