core: Fix libdwarf and Qt build failure
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / CartFilesListWin.cpp
CommitLineData
24470541 1//
f99a6ebc 2// CartFilesListWin.cpp - List files in the cartridge
24470541
JPM
3//
4// by Jean-Paul Mari
5//
6// JPM = Jean-Paul Mari <djipi.mari@gmail.com>
7//
8// Who When What
9// --- ---------- -----------------------------------------------------------
6642f781 10// JPM Oct./2018 Created this file, and changed position of the status bar
f99a6ebc 11// JPM Aug./2019 Update texts descriptions
24470541
JPM
12//
13
14// TO DO:
15// To allow file opening / viewing
16// Remove/modify the 1st information, named '1', at the top
17// To add a filter
18//
19
20#include "debugger/CartFilesListWin.h"
21#include "memory.h"
22#include "settings.h"
23#include "debugger/DBGManager.h"
24
25
26//
27CartFilesListWindow::CartFilesListWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),
28TableView(new QTableView),
29model(new QStandardItemModel),
6642f781
JPM
30TVlayout(new QVBoxLayout),
31Mlayout(new QVBoxLayout),
24470541
JPM
32layout(new QVBoxLayout),
33treeView(new QTreeView),
34standardModel(new QStandardItemModel),
35rootNode(new QStandardItem),
36CartDirectory(NULL),
6642f781 37TVstatusbar(new QStatusBar),
24470541
JPM
38fileItems(NULL),
39nbItem(0),
40CartUsedBytes(0),
41CartDirType(CFL_NOTYPE)
42{
f99a6ebc 43 setWindowTitle(tr("cartridge directory & files"));
24470541
JPM
44
45 // Set the font
46 QFont fixedFont("Lucida Console", 8, QFont::Normal);
47 fixedFont.setStyleHint(QFont::TypeWriter);
48
49 // Set the new layout with proper identation and readibility
50#ifdef CFL_BUFFERTREAM
51 model->setColumnCount(5);
52#else
53 model->setColumnCount(4);
54#endif
55 model->setHeaderData(0, Qt::Horizontal, QObject::tr("File"));
56 model->setHeaderData(1, Qt::Horizontal, QObject::tr("Address"));
57 model->setHeaderData(2, Qt::Horizontal, QObject::tr("Size"));
58 model->setHeaderData(3, Qt::Horizontal, QObject::tr("Seek"));
59#ifdef CFL_BUFFERTREAM
60 model->setHeaderData(4, Qt::Horizontal, QObject::tr("Stream"));
61#endif
62 // Information table
63 TableView->setModel(model);
64 TableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
65 TableView->setShowGrid(0);
66 TableView->setFont(fixedFont);
67 TableView->verticalHeader()->setDefaultSectionSize(TableView->verticalHeader()->minimumSectionSize());
68 TableView->verticalHeader()->setDefaultAlignment(Qt::AlignRight);
6642f781
JPM
69 TVlayout->addWidget(TableView);
70 TVlayout->addWidget(TVstatusbar);
24470541
JPM
71
72 // Setup root
73 rootNode = standardModel->invisibleRootItem();
74 //register the model
75 treeView->setModel(standardModel);
76 treeView->expandAll();
6642f781 77 Mlayout->addWidget(treeView);
24470541 78
6642f781
JPM
79 // Set layouts
80 layout->addLayout(TVlayout);
81 layout->addLayout(Mlayout);
24470541
JPM
82 setLayout(layout);
83}
84
85
86//
87CartFilesListWindow::~CartFilesListWindow(void)
88{
89}
90
91
92//
93void CartFilesListWindow::Reset(void)
94{
95 standardModel->setRowCount(0);
96 model->setRowCount(0);
97 free(CartDirectory);
98 free(fileItems);
99 fileItems = NULL;
100 CartDirectory = NULL;
101 CartUsedBytes = CartNbrFiles = CartDirType = nbItem = 0;
102}
103
104
105//
106void CartFilesListWindow::RefreshContents(void)
107{
108 size_t Error;
109 char msg[1024];
110
111 if (isVisible())
112 {
113 if (!CartDirectory)
114 {
115 if (CartDirType = GetDirType())
116 {
117 if ((CartNbrFiles = GetNbrFiles()))
118 {
119 if ((CartDirectory = (CARTDIRINFO *)CreateInfos()))
120 {
121 UpdateInfos();
f99a6ebc 122 sprintf(msg, "%u files | %u bytes in cartridge", (unsigned int)CartNbrFiles, (unsigned int)CartUsedBytes);
24470541
JPM
123 Error = CFL_NOERROR;
124 }
125 else
126 {
127 sprintf(msg, "Cannot use directory");
128 Error = CFL_NODIRUSE;
129 }
130 }
131 else
132 {
133 sprintf(msg, "No files");
134 Error = CFL_NOFILESLIST;
135 }
136 }
137 else
138 {
139 sprintf(msg, "No directory found");
140 Error = CFL_NODIRECTORYLIST;
141 }
142
143 // Display status bar
144 if (Error)
145 {
146 if ((Error & CFL_WARNING))
147 {
6642f781 148 TVstatusbar->setStyleSheet("background-color: lightyellow; font: bold");
24470541
JPM
149 }
150 else
151 {
6642f781 152 TVstatusbar->setStyleSheet("background-color: tomato; font: bold");
24470541
JPM
153 }
154 }
155 else
156 {
6642f781 157 TVstatusbar->setStyleSheet("background-color: lightgreen; font: bold");
24470541 158 }
6642f781 159 TVstatusbar->showMessage(QString(msg));
24470541
JPM
160 }
161 else
162 {
163 UpdateInfos();
164 }
165 }
166}
167
168
f99a6ebc 169// Get files number in the cartridge directory
24470541
JPM
170size_t CartFilesListWindow::GetNbrFiles(void)
171{
172 switch (CartDirType)
173 {
174 case CFL_OSJAGTYPE:
175 return ((DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_End") - DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb"))) / sizeof(long);
176 break;
177
178 default:
179 return 0;
180 break;
181 }
182}
183
184
f99a6ebc 185// Get cartridge directory type
24470541
JPM
186size_t CartFilesListWindow::GetDirType(void)
187{
188 if (DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory"))
189 {
190 return CFL_OSJAGTYPE;
191 }
192 else
193 {
194 return CFL_NOTYPE;
195 }
196}
197
198
199// Get filename from index (starting from 0)
200void CartFilesListWindow::GetFileInfos(CARTDIRINFO *Ptr, size_t index)
201{
202 OSJAGDir *Adr;
203 size_t Offset;
204
205 switch (CartDirType)
206 {
207 case CFL_OSJAGTYPE:
208 Offset = DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb") + (index * sizeof(long));
209 Adr = (OSJAGDir *)&jagMemSpace[Offset = GET32(jagMemSpace, Offset)];
210 if (strlen(Adr->Filename))
211 {
212 Ptr->PtrFilename = Adr->Filename;
213 Ptr->valid = true;
214 }
215 else
216 {
217 Ptr->PtrFilename = (char *)"(null)";
218 }
219 Ptr->PtrDataFile = GET32(jagMemSpace, Offset);
220 Ptr->SizeFile = GET32(jagMemSpace, (Offset + sizeof(long)));
221 break;
222
223 default:
224 break;
225 }
226}
227
228
f99a6ebc 229// Create information from the cartridge directory information
24470541
JPM
230void *CartFilesListWindow::CreateInfos(void)
231{
232 CARTDIRINFO *Ptr = (CARTDIRINFO *)calloc(CartNbrFiles, sizeof(CARTDIRINFO));
233 model->setRowCount(0);
234
235 for (int i = 0; i < CartNbrFiles; i++)
236 {
237 GetFileInfos(&Ptr[i], i);
238 AddFilename(Ptr[i].PtrFilename, rootNode, 0);
239 // Display row content
240 model->insertRow(i);
241 model->setItem(i, 0, new QStandardItem(QString("%1").arg(Ptr[i].PtrFilename)));
6642f781 242 if (Ptr[i].SizeFile)
24470541
JPM
243 {
244 model->setItem(i, 1, new QStandardItem(QString("0x%1").arg(Ptr[i].PtrDataFile, 6, 16, QChar('0'))));
245 model->setItem(i, 2, new QStandardItem(QString("0x%1").arg(Ptr[i].SizeFile, 6, 16, QChar('0'))));
246 }
247 CartUsedBytes += Ptr[i].SizeFile;
248 }
249
250 return Ptr;
251}
252
253
254// Update the variables information (seek and stream buffer)
255void CartFilesListWindow::UpdateInfos(void)
256{
257 size_t Offset;
258
259 for (int i = 0; i < CartNbrFiles; i++)
260 {
261 // Check if file validity (exitence)
262 if (CartDirectory[i].valid)
263 {
264 // Get the current seek and tentatively check validity (must be included in the ram zone)
265 Offset = DBGManager_GetAdrFromSymbolName((char *)"OSJAG_SeekPosition") + (i * sizeof(long));
266 if ((CartDirectory[i].CurrentSeek = GET32(jagMemSpace, Offset)) < vjs.DRAM_size)
267 {
268 model->setItem(i, 3, new QStandardItem(QString("0x%1").arg(CartDirectory[i].CurrentSeek, 6, 16, QChar('0'))));
269 }
24470541
JPM
270
271 // Get stream buffer address and check validity (must be included in the ram zone)
272 Offset = DBGManager_GetAdrFromSymbolName((char *)"OSJAG_PtrBuffer") + (i * sizeof(long));
273 if (((CartDirectory[i].PtrBufferStream = GET32(jagMemSpace, Offset)) < vjs.DRAM_size) && CartDirectory[i].PtrBufferStream)
274 {
275#ifdef CFL_BUFFERTREAM
276 model->setItem(i, 4, new QStandardItem(QString("0x%1").arg(CartDirectory[i].PtrBufferStream, 6, 16, QChar('0'))));
277#else
278 if (!CartDirectory[i].SizeFile)
279 {
280 model->setItem(i, 1, new QStandardItem(QString("0x%1").arg(CartDirectory[i].PtrBufferStream, 6, 16, QChar('0'))));
281 }
282#endif
283 }
284 else
285 {
286#ifdef CFL_BUFFERTREAM
287 model->setItem(i, 4, new QStandardItem(QString("%1").arg("")));
288#else
289 if (!CartDirectory[i].SizeFile)
290 {
291 model->setItem(i, 1, new QStandardItem(QString("%1").arg("")));
292 }
293#endif
294 }
295 }
296 }
297}
298
299
300// Add source code filename in the list
301void CartFilesListWindow::AddFilename(char *FileName, QStandardItem *root, size_t ItemPos)
302{
303 char *Ptr = FileName;
304 Sfileitem *PtrNewFile;
305 char Buffer[255];
306 char a;
307
308 while ((a = *Ptr++) && ((a != '\\') && (a != '/')));
309
310 if (a)
311 {
312 strncpy(Buffer, FileName, (Ptr - FileName - 1));
313 Buffer[(Ptr - FileName - 1)] = 0;
314 }
315 else
316 {
317 strcpy(Buffer, FileName);
318 }
319 PtrNewFile = (Sfileitem *)AddItem(Buffer, ItemPos);
320 if (!PtrNewFile->PreviousItem)
321 {
322 PtrNewFile->PreviousItem = root;
323 root->appendRow(PtrNewFile->Item);
324 PtrNewFile->Item->setEditable(false);
325 }
326
327 if (a)
328 {
329 return (AddFilename(Ptr, PtrNewFile->Item, (ItemPos + 1)));
330 }
331}
332
333
334// Add item to the list
335// Return void * on new item or already existing one
336void *CartFilesListWindow::AddItem(char *ItemName, size_t ItemPos)
337{
338 Sfileitem *Ptr = fileItems;
339
340 // Look for already existing item
341 for (size_t i = 0; i < nbItem; i++)
342 {
343 if ((Ptr->column == ItemPos) && !strcmp(Ptr->Item->text().toLocal8Bit().constData(), ItemName))
344 {
345 return Ptr;
346 }
347 else
348 {
349 Ptr++;
350 }
351 }
352
353 // Add item in the list
354 fileItems = (Sfileitem *)realloc(fileItems, (sizeof(Sfileitem) * ++nbItem));
355 (fileItems + (nbItem - 1))->column = ItemPos;
356 (fileItems + (nbItem - 1))->PreviousItem = NULL;
357 (fileItems + (nbItem - 1))->Item = new QStandardItem(ItemName);
358 return (fileItems + (nbItem - 1));
359}
360
361
362//
363void CartFilesListWindow::keyPressEvent(QKeyEvent * e)
364{
365 if (e->key() == Qt::Key_Escape)
366 {
367 hide();
368 }
369}