From 9ad6a2c7760f28efd8e1dce0b0fa0b9a3605e262 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mikko=20Kein=C3=A4nen?= Date: Tue, 9 Nov 2010 00:38:54 +0200 Subject: [PATCH] Created initial support for M.A.M.E and similar (the container zip is used as is). --- src/db/dbsetup.cpp | 17 +++++++++++------ src/db/dbsetup.h | 1 + src/emulauncher.cpp | 36 +++++++++++++++++++++++++++++++++--- src/utils/emuhelper.cpp | 35 ++++++++++++++++++++++++++++++++++- src/utils/emuhelper.h | 1 + src/widgets/stringlistwidget.cpp | 5 +++-- 6 files changed, 83 insertions(+), 12 deletions(-) diff --git a/src/db/dbsetup.cpp b/src/db/dbsetup.cpp index 0b12340..0b648bf 100644 --- a/src/db/dbsetup.cpp +++ b/src/db/dbsetup.cpp @@ -39,8 +39,10 @@ EmuFrontObject* DbSetup::recordToDataObject(const QSqlRecord *rec) Setup *s = 0; if (!rec) return s; int id = rec->value(Setup_Id).toInt(); - QString extensions = rec->value(Setup_FileTypeExtensions).toString(); - QStringList list = extensions.split(FILE_TYPE_EXTENSION_SEPARATOR); + QString extensions = rec->value(Setup_FileTypeExtensions).toString().trimmed(); + QStringList list; + if (!extensions.isEmpty()) + list = extensions.split(FILE_TYPE_EXTENSION_SEPARATOR); int plfId = rec->value(Setup_PlatformId).toInt(); int mtId = rec->value(Setup_MediaTypeId).toInt(); Platform *plf = dynamic_cast(dbPlatform->getDataObject(plfId)); @@ -63,13 +65,18 @@ bool DbSetup::updateDataObjectToModel(const EmuFrontObject *ob) query.bindValue(":platformid", fpo->getPlatform()->getId()); if (fpo->getMediaType()) query.bindValue(":mediatypeid", fpo->getMediaType()->getId()); - query.bindValue(":filetypeextensions", fpo->getSupportedFileTypeExtensions().join(FILE_TYPE_EXTENSION_SEPARATOR)); + query.bindValue(":filetypeextensions", supportedExtensionsToDb(fpo->getSupportedFileTypeExtensions())); query.bindValue(":id", fpo->getId()); ret = query.exec(); if (!ret) qDebug() << query.lastError().text() << query.executedQuery(); return ret; } +QString DbSetup::supportedExtensionsToDb(QStringList list) +{ + return list.isEmpty() ? "" : list.join(FILE_TYPE_EXTENSION_SEPARATOR); +} + int DbSetup::insertDataObjectToModel(const EmuFrontObject *ob) { qDebug() << "Inserting setup to database..."; @@ -79,11 +86,9 @@ int DbSetup::insertDataObjectToModel(const EmuFrontObject *ob) "VALUES (NULL, :platformid, :mediatypeid, :fileextensions)"); int plfId = fpo->getPlatform() ? fpo->getPlatform()->getId() : -1; int mtId = fpo->getMediaType() ? fpo->getMediaType()->getId() : -1; - QString exts = fpo->getSupportedFileTypeExtensions().join(FILE_TYPE_EXTENSION_SEPARATOR); - qDebug() << "Going to insert setup with platform " << plfId << ", media type " << mtId << " and extensions " << exts; query.bindValue(":platformid", plfId); query.bindValue(":mediatypeid", mtId); - query.bindValue(":filetypeextensions", exts); + query.bindValue(":filetypeextensions", supportedExtensionsToDb(fpo->getSupportedFileTypeExtensions())); int id = -1; if (query.exec()) id = query.lastInsertId().toInt(); diff --git a/src/db/dbsetup.h b/src/db/dbsetup.h index 8c262b1..c500867 100644 --- a/src/db/dbsetup.h +++ b/src/db/dbsetup.h @@ -51,5 +51,6 @@ private: virtual QString getCountRefsSelect(int) const; DbPlatform *dbPlatform; DbMediaType *dbMediaType; + QString supportedExtensionsToDb(QStringList list); }; #endif // DBSETUP_H diff --git a/src/emulauncher.cpp b/src/emulauncher.cpp index 90d929e..23e8b0e 100644 --- a/src/emulauncher.cpp +++ b/src/emulauncher.cpp @@ -131,6 +131,8 @@ void EmuLauncher::updateMediaImageContainers() void EmuLauncher::launchEmu() { + // if selected emulator has no extensions configured, it's assumed to be a M.A.M.E. or similar and + // map of media images will be no be used QMap mediaImages; QList mediaImageContainers; Executable *exe = 0; @@ -157,6 +159,24 @@ void EmuLauncher::launchEmu() throw EmuFrontException(tr("Failed creating Emulator object!")); } + + qDebug() << "File types; " << exe->getSetup()->getSupportedFileTypeExtensions().count(); + + bool mame = exe->getSetup()->getSupportedFileTypeExtensions().isEmpty(); + + + + if (mame && listMIndex.count() > 1) { + throw new EmuFrontException(tr("No supported file types configured for this emulator configuration. " + "Assuming emulator support container files as is. " + "Only one container can be selected without configuring supported file types." + )); + } + + + // Now we have one or more media image containers and an emulator selected, + // let's fetch the media image container data. + foreach(QModelIndex mind, listMIndex) { if (!mind.isValid()) continue; EmuFrontObject *obImg = dbMic->getDataObjectFromModel(&mind); @@ -175,6 +195,16 @@ void EmuLauncher::launchEmu() mediaImages.unite(contained); } + if (mame) { + emuHelper->launch(exe, mediaImageContainers); + return; + } + + // mediaImageContainers list contains all the selected media image containers and + // mediaImages list contains all the media images inside all the selected containers + + + QList selectedImages; if (mediaImages.count() < 1) { throw EmuFrontException("No media images available!"); } @@ -188,9 +218,8 @@ void EmuLauncher::launchEmu() list << rx.cap(1); pos += rx.matchedLength(); } - bool ok; - QList selectedImages; + if (list.count() > mediaImages.count()) { throw EmuFrontException(tr("Select %1 media images for this emulator configuration").arg(list.count())); } @@ -215,7 +244,7 @@ void EmuLauncher::launchEmu() else if (mediaImages.count() > 1) { // show select boot image dialog EmuFrontObject *efo = EmuFrontInputDialog::getItem( - this, tr("Select boot image"), tr("Select"), mediaImages.values(), 0, false, &ok); + this, tr("Select boot image"), tr("Select"), mediaImages.values(), 0, false, &ok); if (!ok) { throw EmuFrontException(tr("Boot image selection was canceled, aborting.")); } @@ -228,6 +257,7 @@ void EmuLauncher::launchEmu() if (selectedImages.count() < 1) throw EmuFrontException(tr("No media images selected")); + emuHelper->launch(exe, mediaImageContainers, selectedImages, list.count(), tmpDirPath); micTable->clearSelection(); } catch (EmuFrontException efe) { diff --git a/src/utils/emuhelper.cpp b/src/utils/emuhelper.cpp index 03f84a4..5eb5d92 100644 --- a/src/utils/emuhelper.cpp +++ b/src/utils/emuhelper.cpp @@ -32,6 +32,39 @@ EmuHelper::EmuHelper(QObject *parent) : unzipHelper = new UnzipHelper(this); } + +// TODO: These two launch functions may be merged to one and/or split into some common helper functions. +void EmuHelper::launch(const Executable * ex, QList micList) +{ + if (micList.count() < 1) { + throw EmuFrontException(tr("No media image containers available!")); + } + + MediaImageContainer *mic = micList.first(); + QString fp = " \""; + fp.append(mic->getFilePath()->getName()); + if (!fp.endsWith('/')) + fp.append("/"); + fp.append(mic->getName()); + fp.append("\""); + + QString opts = ex->getOptions(); + opts.replace(QString("$1"), fp); + + QString cmdWithParams; + cmdWithParams.append(ex->getExecutable()); + cmdWithParams.append(" ").append(opts); + + qDebug() << "Command with params " << cmdWithParams; + start(cmdWithParams, QIODevice::ReadOnly); + + // for the moment, we'll wait for the process to be finished until we continue + waitForFinished(-1); + + delete ex; + qDeleteAll(micList); +} + void EmuHelper::launch(const Executable * ex, QList micList, QList miList, int mediaCount, QString tmp) { @@ -79,7 +112,7 @@ void EmuHelper::launch(const Executable * ex, QList micLi // clean the temp dir foreach(EmuFrontObject *ob, miList) { QString fp = " \""; - fp.append(tmp); + fp.append(tmp); fp.append(ob->getName()); fp.append("\""); if (!QFile::remove(fp)) diff --git a/src/utils/emuhelper.h b/src/utils/emuhelper.h index dfdc81c..0d99e85 100644 --- a/src/utils/emuhelper.h +++ b/src/utils/emuhelper.h @@ -34,6 +34,7 @@ class EmuHelper : public ProcessHelper public: explicit EmuHelper(QObject *parent = 0); void launch(const Executable * ex, QList micList, QList miList, int mediaCount = 1, QString tmp = "."); + void launch(const Executable * ex, QList micList); private slots: void processError(QProcess::ProcessError); void processFinished(int); diff --git a/src/widgets/stringlistwidget.cpp b/src/widgets/stringlistwidget.cpp index e9b6384..476d12c 100644 --- a/src/widgets/stringlistwidget.cpp +++ b/src/widgets/stringlistwidget.cpp @@ -75,7 +75,8 @@ QStringList StringListWidget::getItems() { QStringList l; for(int i = 0; i < stringList->count(); ++i) - l << stringList->item(i)->text(); + if (!stringList->item(i)->text().trimmed().isEmpty()) + l << stringList->item(i)->text(); return l; } @@ -83,5 +84,5 @@ void StringListWidget::setItems(QStringList list) { stringList->clear(); foreach(QString s, list) - stringList->addItem(s); + if (!s.trimmed().isEmpty()) stringList->addItem(s); } -- 1.7.9.5