]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/gui/filethread.cpp
Removed some cruft and nonstandard int/uint types, added M series BIOS.
[virtualjaguar] / src / gui / filethread.cpp
index 90bee21229cad767e9dd6403bed875d528e43ed5..5d0d5834398a6abf1c04d888c3f0bb5b6772903b 100644 (file)
@@ -1,10 +1,10 @@
 //
 // filethread.cpp - File discovery thread
 //
-// by James L. Hammons
+// by James Hammons
 // (C) 2010 Underground Software
 //
-// JLH = James L. Hammons <jlhamm@acm.org>
+// JLH = James Hammons <jlhamm@acm.org>
 //
 // 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.