From ba2a0600dc3d96b81bd75b876dbf7ce90fd25e60 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 1 Jun 2020 23:14:57 -0400 Subject: [PATCH] Adds a basic Qt ROM fetcher and attempt to create a machine. --- OSBindings/Qt/mainwindow.cpp | 51 +++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/OSBindings/Qt/mainwindow.cpp b/OSBindings/Qt/mainwindow.cpp index 2910a166b..9fc18df53 100644 --- a/OSBindings/Qt/mainwindow.cpp +++ b/OSBindings/Qt/mainwindow.cpp @@ -1,10 +1,14 @@ #include #include +#include #include "mainwindow.h" #include "ui_mainwindow.h" #include "timer.h" +#include "../../Analyser/Static/StaticAnalyser.hpp" +#include "../../Machines/Utility/MachineForTarget.hpp" + /* General Qt implementation notes: @@ -61,7 +65,52 @@ void MainWindow::createActions() { void MainWindow::open() { QString fileName = QFileDialog::getOpenFileName(this); if(!fileName.isEmpty()) { - qDebug() << "Should open" << fileName; + const auto targets = Analyser::Static::GetTargets(fileName.toStdString()); + if(targets.empty()) { + qDebug() << "Not media:" << fileName; + } else { + qDebug() << "Got media:" << fileName; + + const QStringList appDataLocations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); + ROMMachine::ROMFetcher rom_fetcher = [&appDataLocations] + (const std::vector &roms) -> std::vector>> { + std::vector>> results; + + for(const auto &rom: roms) { + FILE *file = nullptr; + for(const auto &path: appDataLocations) { + const std::string source = path.toStdString() + "/ROMImages/" + rom.machine_name + "/" + rom.file_name; + const std::string nativeSource = QDir::toNativeSeparators(QString::fromStdString(source)).toStdString(); + + qDebug() << "Taking a run at " << nativeSource.c_str(); + + file = fopen(nativeSource.c_str(), "rb"); + if(file) break; + } + + if(file) { + auto data = std::make_unique>(); + + fseek(file, 0, SEEK_END); + data->resize(std::ftell(file)); + fseek(file, 0, SEEK_SET); + size_t read = fread(data->data(), 1, data->size(), file); + fclose(file); + + if(read == data->size()) { + results.push_back(std::move(data)); + } else { + results.push_back(nullptr); + } + } else { + results.push_back(nullptr); + } + } + return results; + }; + Machine::Error error; + std::unique_ptr machine(Machine::MachineForTargets(targets, rom_fetcher, error)); + } } }