]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/filepicker.cpp
Initial file reading thread implementation
[virtualjaguar] / src / gui / filepicker.cpp
1 //
2 // filepicker.cpp - A ROM chooser
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/22/2010  Created this file
12 //
13
14 #include "filepicker.h"
15
16 #include "crc32.h"
17 #include "settings.h"
18 #include "types.h"
19
20 struct RomIdentifier
21 {
22         const uint32 crc32;
23         const char name[128];
24         const char file[128];
25 };
26
27 RomIdentifier romList[] = {
28         { 0x0509C85E, "Raiden (World)", "" },
29         { 0x08F15576, "Iron Soldier (World) (v1.04)", "" },
30         { 0x0957A072, "Kasumi Ninja (World)", "" },
31         { 0x0AC83D77, "NBA Jam T.E. (World)", "" },
32         { 0x0EC5369D, "Evolution - Dino Dudes (World)", "" },
33         { 0x0F6A1C2C, "Ultra Vortek (World)", "" },
34         { 0x14915F20, "White Men Can't Jump (World)", "" },
35         { 0x1660F070, "Power Drive Rally (World)", "" },
36         { 0x1E451446, "Trevor McFur in the Crescent Galaxy (World)", "" },
37         { 0x27594C6A, "Defender 2000 (World)", "" },
38         { 0x2E17D5DA, "Bubsy in Fractured Furry Tales (World)", "" },
39         { 0x348E6449, "Double Dragon V - The Shadow Falls (World)", "" },
40         { 0x3615AF6A, "Fever Pitch Soccer (World) (En,Fr,De,Es,It)", "" },
41         { 0x38A130ED, "Troy Aikman NFL Football (World)", "" },
42         { 0x3C044941, "Skyhammer (World)", "" },
43         { 0x42A13EC5, "Soccer Kid (World)", "" },
44         { 0x47EBC158, "Theme Park (World)", "" },
45         { 0x4899628F, "Hover Strike (World)", "" },
46         { 0x53DF6440, "Space War 2000 (World)", "" },
47         { 0x55A0669C, "[BIOS] Atari Jaguar Developer CD (World)", "" },
48         { 0x58272540, "Syndicate (World)", "" },
49         { 0x5A101212, "Sensible Soccer - International Edition (World)", "" },
50         { 0x5B6BB205, "Ruiner Pinball (World)", "" },
51         { 0x5CFF14AB, "Pinball Fantasies (World)", "" },
52         { 0x5E2CDBC0, "Doom (World)", "" },
53         { 0x61C7EEC0, "Zero 5 (World)", "" },
54         { 0x67F9AB3A, "Battle Sphere Gold (World)", "" },
55         { 0x687068D5, "[BIOS] Atari Jaguar CD (World)", "" },
56         { 0x6B2B95AD, "Tempest 2000 (World)", "" },
57         { 0x6EB774EB, "Worms (World)", "" },
58         { 0x6F8B2547, "Super Burnout (World)", "" },
59         { 0x817A2273, "Pitfall - The Mayan Adventure (World)", "" },
60         { 0x8975F48B, "Zool 2 (World)", "" },
61         { 0x8D15DBC6, "[BIOS] Atari Jaguar Stubulator '94 (World)", "" },
62         { 0x8FEA5AB0, "Dragon - The Bruce Lee Story (World)", "" },
63         { 0x97EB4651, "I-War (World)", "" },
64         { 0xA27823D8, "Ultra Vortek (World) (v0.94) (Beta)", "" },
65         { 0xA56D0798, "Protector - Special Edition (World)", "" },
66         { 0xA9F8A00E, "Rayman (World)", "" },
67         { 0xB14C4753, "Fight for Life (World)", "" },
68         { 0xBCB1A4BF, "Brutal Sports Football (World)", "" },
69         { 0xBDA405C6, "Cannon Fodder (World)", "" },
70         { 0xBDE67498, "Cybermorph (World) (Rev 1)", "" },
71         { 0xC5562581, "Zoop! (World)", "" },
72         { 0xC654681B, "Total Carnage (World)", "" },
73         { 0xC6C7BA62, "Fight for Life (World) (Alt)", "" },
74         { 0xC9608717, "Val d'Isere Skiing and Snowboarding (World)", "" },
75         { 0xCBFD822A, "Air Cars (World)", "" },
76         { 0xCD5BF827, "Attack of the Mutant Penguins (World)", "" },
77         { 0xD6C19E34, "Iron Soldier 2 (World)", "" },
78         { 0xDA9C4162, "Missile Command 3D (World)", "" },
79         { 0xDC187F82, "Alien vs Predator (World)", "" },
80         { 0xDE55DCC7, "Flashback - The Quest for Identity (World) (En,Fr)", "" },
81         { 0xE28756DE, "Atari Karts (World)", "" },
82         { 0xE60277BB, "[BIOS] Atari Jaguar Stubulator '93 (World)", "" },
83         { 0xE91BD644, "Wolfenstein 3D (World)", "" },
84         { 0xEC22F572, "SuperCross 3D (World)", "" },
85         { 0xECF854E7, "Cybermorph (World) (Rev 2)", "" },
86         { 0xEEE8D61D, "Club Drive (World)", "" },
87         { 0xF0360DB3, "Hyper Force (World)", "" },
88         { 0xFA7775AE, "Checkered Flag (World)", "" },
89         { 0xFAE31DD0, "Flip Out! (World)", "" },
90         { 0xFB731AAA, "[BIOS] Atari Jaguar (World)", "" },
91         { 0xFFFFFFFF, "***END***", "" }
92 };
93
94 /*
95 Our strategy here is like so:
96 Look at the files in the directory pointed to by ROMPath.
97 For each file in the directory, take the CRC32 of it and compare it to the CRC
98 in the romList[]. If there's a match, put it in a list and note it's index value
99 in romList for future reference.
100
101 When constructing the list, use the index to pull up an image of the cart and
102 put that in the list. User picks from a graphical image of the cart.
103
104 Ideally, the label will go into the archive along with the ROM image, but that's
105 for the future...
106 Maybe box art, screenshots will go as well...
107 */
108
109 //FilePickerWindow::FilePickerWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog)//could use Window as well...
110 FilePickerWindow::FilePickerWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Window)
111 {
112         setWindowTitle("Insert Cartridge...");
113
114         fileList = new QListWidget(this);
115 //      addWidget(fileList);
116
117         QVBoxLayout * layout = new QVBoxLayout();
118 //      layout->setSizeConstraint(QLayout::SetFixedSize);
119         setLayout(layout);
120
121         layout->addWidget(fileList);
122
123         PopulateList();
124 }
125
126 void FilePickerWindow::PopulateList(void)
127 {
128         QDir romDir(vjs.ROMPath);
129         QFileInfoList list = romDir.entryInfoList();
130
131         for(int i=0; i<list.size(); i++)
132         {
133                 QFileInfo fileInfo = list.at(i);
134 //         std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
135 //                                                 .arg(fileInfo.fileName()));
136 //         std::cout << std::endl;
137                 QFile file(romDir.filePath(fileInfo.fileName()));
138                 uint8 * buffer = new uint8[fileInfo.size()];
139
140                 if (file.open(QIODevice::ReadOnly))
141                 {
142                         file.read((char *)buffer, fileInfo.size());
143                         uint32 crc = crc32_calcCheckSum(buffer, fileInfo.size());
144                         file.close();
145 //printf("FilePickerWindow: File crc == %08X...\n", crc);
146
147                         for(int j=0; romList[j].crc32 != 0xFFFFFFFF; j++)
148                         {
149                                 if (romList[j].crc32 == crc)
150                                 {
151 printf("FilePickerWindow: Found match [%s]...\n", romList[j].name);
152                                         new QListWidgetItem(QIcon(":/res/generic.png"), romList[j].name, fileList);
153                                         break;
154                                 }
155                         }
156                 }
157
158                 delete[] buffer;
159         }
160 }
161