]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/filethread.cpp
Incremental improvements to the file picker, introduction of ImageDelegate
[virtualjaguar] / src / gui / filethread.cpp
1 //
2 // filethread.cpp - File discovery thread
3 //
4 // by James L. Hammons
5 // (C) 2010 Underground Software
6 //
7 // JLH = James L. Hammons <jlhamm@acm.org>
8 //
9 // Who  When        What
10 // ---  ----------  -------------------------------------------------------------
11 // JLH  01/28/2010  Created this file
12 //
13
14 #include "filethread.h"
15
16 #include <QtGui>
17 #include "crc32.h"
18 #include "settings.h"
19 //#include "types.h"
20
21 struct RomIdentifier
22 {
23         const uint32 crc32;
24         const char name[128];
25         const char file[128];
26 };
27
28 RomIdentifier romList[] = {
29         { 0x0509C85E, "Raiden (World)", "" },
30         { 0x08F15576, "Iron Soldier (World) (v1.04)", "" },
31         { 0x0957A072, "Kasumi Ninja (World)", "" },
32         { 0x0AC83D77, "NBA Jam T.E. (World)", "" },
33         { 0x0EC5369D, "Evolution - Dino Dudes (World)", "" },
34         { 0x0F6A1C2C, "Ultra Vortek (World)", "" },
35         { 0x14915F20, "White Men Can't Jump (World)", "" },
36         { 0x1660F070, "Power Drive Rally (World)", "" },
37         { 0x1E451446, "Trevor McFur in the Crescent Galaxy (World)", "" },
38         { 0x27594C6A, "Defender 2000 (World)", "" },
39         { 0x2E17D5DA, "Bubsy in Fractured Furry Tales (World)", "" },
40         { 0x348E6449, "Double Dragon V - The Shadow Falls (World)", "" },
41         { 0x3615AF6A, "Fever Pitch Soccer (World) (En,Fr,De,Es,It)", "" },
42         { 0x38A130ED, "Troy Aikman NFL Football (World)", "" },
43         { 0x3C044941, "Skyhammer (World)", "" },
44         { 0x42A13EC5, "Soccer Kid (World)", "" },
45         { 0x47EBC158, "Theme Park (World)", "" },
46         { 0x4899628F, "Hover Strike (World)", "" },
47         { 0x53DF6440, "Space War 2000 (World)", "" },
48         { 0x55A0669C, "[BIOS] Atari Jaguar Developer CD (World)", "" },
49         { 0x58272540, "Syndicate (World)", "" },
50         { 0x5A101212, "Sensible Soccer - International Edition (World)", "" },
51         { 0x5B6BB205, "Ruiner Pinball (World)", "" },
52         { 0x5CFF14AB, "Pinball Fantasies (World)", "" },
53         { 0x5E2CDBC0, "Doom (World)", "" },
54         { 0x61C7EEC0, "Zero 5 (World)", "" },
55         { 0x67F9AB3A, "Battle Sphere Gold (World)", "" },
56         { 0x687068D5, "[BIOS] Atari Jaguar CD (World)", "" },
57         { 0x6B2B95AD, "Tempest 2000 (World)", "" },
58         { 0x6EB774EB, "Worms (World)", "" },
59         { 0x6F8B2547, "Super Burnout (World)", "" },
60         { 0x817A2273, "Pitfall - The Mayan Adventure (World)", "" },
61         { 0x8975F48B, "Zool 2 (World)", "" },
62         { 0x8D15DBC6, "[BIOS] Atari Jaguar Stubulator '94 (World)", "" },
63         { 0x8FEA5AB0, "Dragon - The Bruce Lee Story (World)", "" },
64         { 0x97EB4651, "I-War (World)", "" },
65         { 0xA27823D8, "Ultra Vortek (World) (v0.94) (Beta)", "" },
66         { 0xA56D0798, "Protector - Special Edition (World)", "" },
67         { 0xA9F8A00E, "Rayman (World)", "" },
68         { 0xB14C4753, "Fight for Life (World)", "" },
69         { 0xBCB1A4BF, "Brutal Sports Football (World)", "" },
70         { 0xBDA405C6, "Cannon Fodder (World)", "" },
71         { 0xBDE67498, "Cybermorph (World) (Rev 1)", "" },
72         { 0xC5562581, "Zoop! (World)", "" },
73         { 0xC654681B, "Total Carnage (World)", "" },
74         { 0xC6C7BA62, "Fight for Life (World) (Alt)", "" },
75         { 0xC9608717, "Val d'Isere Skiing and Snowboarding (World)", "" },
76         { 0xCBFD822A, "Air Cars (World)", "" },
77         { 0xCD5BF827, "Attack of the Mutant Penguins (World)", "" },
78         { 0xD6C19E34, "Iron Soldier 2 (World)", "" },
79         { 0xDA9C4162, "Missile Command 3D (World)", "" },
80         { 0xDC187F82, "Alien vs Predator (World)", "" },
81         { 0xDE55DCC7, "Flashback - The Quest for Identity (World) (En,Fr)", "" },
82         { 0xE28756DE, "Atari Karts (World)", "" },
83         { 0xE60277BB, "[BIOS] Atari Jaguar Stubulator '93 (World)", "" },
84         { 0xE91BD644, "Wolfenstein 3D (World)", "" },
85         { 0xEC22F572, "SuperCross 3D (World)", "" },
86         { 0xECF854E7, "Cybermorph (World) (Rev 2)", "" },
87         { 0xEEE8D61D, "Club Drive (World)", "" },
88         { 0xF0360DB3, "Hyper Force (World)", "" },
89         { 0xFA7775AE, "Checkered Flag (World)", "" },
90         { 0xFAE31DD0, "Flip Out! (World)", "" },
91         { 0xFB731AAA, "[BIOS] Atari Jaguar (World)", "" },
92         { 0xFFFFFFFF, "***END***", "" }
93 };
94
95 /*
96 Our strategy here is like so:
97 Look at the files in the directory pointed to by ROMPath.
98 For each file in the directory, take the CRC32 of it and compare it to the CRC
99 in the romList[]. If there's a match, put it in a list and note it's index value
100 in romList for future reference.
101
102 When constructing the list, use the index to pull up an image of the cart and
103 put that in the list. User picks from a graphical image of the cart.
104
105 Ideally, the label will go into the archive along with the ROM image, but that's
106 for the future...
107 Maybe box art, screenshots will go as well...
108 */
109
110 FileThread::FileThread(QObject * parent/*= 0*/): QThread(parent), listWidget(NULL), abort(false)
111 {
112 }
113
114 FileThread::~FileThread()
115 {
116         mutex.lock();
117         abort = true;
118         condition.wakeOne();
119         mutex.unlock();
120
121         wait();
122 }
123
124 void FileThread::Go(QListWidget * lw)
125 {
126         QMutexLocker locker(&mutex);
127         this->listWidget = lw;
128         start();
129 }
130
131 void FileThread::run(void)
132 {
133         QDir romDir(vjs.ROMPath);
134         QFileInfoList list = romDir.entryInfoList();
135
136 /*
137 Another thing we'll probably have to do here is check for compressed files and
138 decompress/fish around in them to find what we need. :-P
139 */
140
141         for(int i=0; i<list.size(); i++)
142         {
143                 if (abort)
144 #if 1
145 {
146 printf("FileThread: Aborting!!!\n");
147 #endif
148                         return;
149 #if 1
150 }
151 #endif
152
153                 QFileInfo fileInfo = list.at(i);
154                 QFile file(romDir.filePath(fileInfo.fileName()));
155                 uint8 * buffer = new uint8[fileInfo.size()];
156
157                 if (file.open(QIODevice::ReadOnly))
158                 {
159                         file.read((char *)buffer, fileInfo.size());
160                         uint32 crc = crc32_calcCheckSum(buffer, fileInfo.size());
161                         file.close();
162 //printf("FilePickerWindow: File crc == %08X...\n", crc);
163
164                         uint32 index = FindCRCIndexInFileList(crc);
165
166                         if (index != 0xFFFFFFFF)
167                         {
168 printf("FileThread: Found match [%s]...\n", romList[index].name);
169                                 new QListWidgetItem(QIcon(":/res/generic.png"), romList[index].name, listWidget);
170 //                              emit FoundAFile(romList[index].crc32);
171                                 emit FoundAFile(index);
172                         }
173                 }
174
175                 delete[] buffer;
176         }
177 }
178
179 //
180 // Find a CRC in the ROM list (simple brute force algorithm).
181 // If it's there, return the index, otherwise return $FFFFFFFF
182 //
183 uint32 FileThread::FindCRCIndexInFileList(uint32 crc)
184 {
185         for(int i=0; romList[i].crc32!=0xFFFFFFFF; i++)
186         {
187                 if (romList[i].crc32 == crc)
188                         return i;
189         }
190
191         return 0xFFFFFFFF;
192 }
193