Created initial support for M.A.M.E and similar (the container zip is
authorMikko Keinänen <mikko.keinanen@gmail.com>
Mon, 8 Nov 2010 22:38:54 +0000 (00:38 +0200)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Mon, 8 Nov 2010 22:38:54 +0000 (00:38 +0200)
used as is).

src/db/dbsetup.cpp
src/db/dbsetup.h
src/emulauncher.cpp
src/utils/emuhelper.cpp
src/utils/emuhelper.h
src/widgets/stringlistwidget.cpp

index 0b12340..0b648bf 100644 (file)
@@ -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<Platform*>(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();
index 8c262b1..c500867 100644 (file)
@@ -51,5 +51,6 @@ private:
     virtual QString getCountRefsSelect(int) const;
     DbPlatform *dbPlatform;
     DbMediaType *dbMediaType;
+    QString supportedExtensionsToDb(QStringList list);
 };
 #endif // DBSETUP_H
index 90d929e..23e8b0e 100644 (file)
@@ -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<QString, EmuFrontObject*> mediaImages;
     QList<MediaImageContainer*> 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<EmuFrontObject*> 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<EmuFrontObject*> 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) {
index 03f84a4..5eb5d92 100644 (file)
@@ -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<MediaImageContainer *> 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<MediaImageContainer *> micList,
     QList<EmuFrontObject *> miList, int mediaCount, QString tmp)
 {
@@ -79,7 +112,7 @@ void EmuHelper::launch(const Executable * ex, QList<MediaImageContainer *> 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))
index dfdc81c..0d99e85 100644 (file)
@@ -34,6 +34,7 @@ class EmuHelper : public ProcessHelper
 public:
     explicit EmuHelper(QObject *parent = 0);
     void launch(const Executable * ex, QList<MediaImageContainer *> micList, QList<EmuFrontObject*> miList, int mediaCount = 1, QString tmp = ".");
+    void launch(const Executable * ex, QList<MediaImageContainer *> micList);
 private slots:
     void processError(QProcess::ProcessError);
     void processFinished(int);
index e9b6384..476d12c 100644 (file)
@@ -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);
 }