MediaImageContainer presents contained media images in a map instead of
authorMikko Keinänen <mikko.keinanen@gmail.com>
Mon, 18 Oct 2010 17:09:32 +0000 (20:09 +0300)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Mon, 18 Oct 2010 17:09:32 +0000 (20:09 +0300)
list.

src/dataobjects/mediaimagecontainer.cpp
src/dataobjects/mediaimagecontainer.h
src/db/dbmediaimage.cpp
src/db/dbmediaimage.h
src/db/dbmediaimagecontainer.cpp
src/emulauncher.cpp
src/utils/emuhelper.cpp
src/utils/emuhelper.h
src/utils/fileutil.cpp
src/utils/unziphelper.cpp
src/utils/unziphelper.h

index 30bc36c..675a927 100644 (file)
 MediaImageContainer::MediaImageContainer()
     : EmuFrontFile(EmuFrontFile::FileType_MediaImageContainer)
 {
-    lstMediaImage = QList<MediaImage*>();
+    lstMediaImage = QMap<QString, EmuFrontObject*>();
     filePath = 0;
 }
 
 MediaImageContainer::MediaImageContainer(int id, QString name, 
-    QString checksum, int size, QList<MediaImage *>images, FilePathObject *fpo)
+    QString checksum, int size, QMap<QString, EmuFrontObject*>images, FilePathObject *fpo)
     : EmuFrontFile(id, name, checksum, size, EmuFrontFile::FileType_MediaImageContainer),
         lstMediaImage(images), filePath(fpo)
 { }
 
 MediaImageContainer::MediaImageContainer(QString name, QString checksum,
-    int size, QList<MediaImage *>images, FilePathObject *fpo)
+    int size, QMap<QString, EmuFrontObject*>images, FilePathObject *fpo)
     : EmuFrontFile(-1, name, checksum, size, EmuFrontFile::FileType_MediaImageContainer),
         lstMediaImage(images), filePath(fpo)
 { }
@@ -48,9 +48,16 @@ MediaImageContainer::~MediaImageContainer()
 MediaImageContainer::MediaImageContainer(MediaImageContainer &mic)
     : EmuFrontFile(mic)
 {
-    lstMediaImage = QList<MediaImage*>();
-    foreach(MediaImage *mi, mic.lstMediaImage)
-        lstMediaImage.append(new MediaImage(*mi));
+    lstMediaImage = QMap<QString, EmuFrontObject*>();
+
+    QMapIterator<QString, EmuFrontObject*> it(mic.lstMediaImage);
+    MediaImage *mi = 0;
+    while(it.hasNext()) {
+        it.next();
+        mi = dynamic_cast<MediaImage*>(it.value());
+        lstMediaImage[mi->getCheckSum()] = new MediaImage(*mi);
+    }
+
     filePath = new FilePathObject(*(mic.filePath));
 }
 
@@ -63,23 +70,29 @@ MediaImageContainer& MediaImageContainer::operator =(MediaImageContainer &mic)
     checkSum = mic.checkSum;
     size = mic.size;
     qDeleteAll(lstMediaImage);
-    foreach(MediaImage *mi, mic.lstMediaImage)
-        lstMediaImage.append(new MediaImage(*mi));
+
+    QMapIterator<QString, EmuFrontObject*> it(mic.lstMediaImage);
+    MediaImage *mi = 0;
+    while(it.hasNext()) {
+        it.next();
+        mi = dynamic_cast<MediaImage*>(it.value());
+        lstMediaImage[mi->getCheckSum()] = new MediaImage(*mi);
+    }
     filePath = new FilePathObject(*(mic.filePath));
     return (*this);
 }
 
-void MediaImageContainer::setMediaImages(QList<MediaImage *> list)
+void MediaImageContainer::setMediaImages(QMap<QString, EmuFrontObject*> list)
 {
     qDeleteAll(lstMediaImage);
     lstMediaImage = list;
 }
 
-QList<MediaImage *> MediaImageContainer::getMediaImages() const
+QMap<QString, EmuFrontObject*> MediaImageContainer::getMediaImages() const
 {   return lstMediaImage; }
 
 void MediaImageContainer::addMediaImage(MediaImage *mi)
-{   lstMediaImage.append(mi); }
+{   lstMediaImage[mi->getCheckSum()] = mi; }
 
 void MediaImageContainer::clearMediaImages()
 {
index 5aaa64e..ff038f8 100644 (file)
@@ -30,20 +30,20 @@ class MediaImageContainer : public EmuFrontFile
 public:
     MediaImageContainer();
     MediaImageContainer(int id, QString name, QString checksum,
-        int size, QList<MediaImage*> images, FilePathObject *fpo);
+        int size, QMap<QString, EmuFrontObject*> images, FilePathObject *fpo);
     MediaImageContainer(QString name, QString checksum,
-        int size, QList<MediaImage*> images, FilePathObject *fpo);
+        int size, QMap<QString, EmuFrontObject*> images, FilePathObject *fpo);
     ~MediaImageContainer();
     MediaImageContainer(MediaImageContainer&);
     MediaImageContainer& operator=(MediaImageContainer&);
-    QList<MediaImage*> getMediaImages() const;
-    void setMediaImages(QList<MediaImage*>);
+    QMap<QString, EmuFrontObject*> getMediaImages() const;
+    void setMediaImages(QMap<QString, EmuFrontObject*>);
     void addMediaImage(MediaImage*);
     void clearMediaImages();
     void setFilePath(FilePathObject*);
     FilePathObject* getFilePath() const;
 private:
-    QList<MediaImage*> lstMediaImage;
+    QMap<QString, EmuFrontObject*> lstMediaImage;
     FilePathObject *filePath;
 };
 
index c4a4f5b..376d578 100644 (file)
@@ -89,12 +89,16 @@ EmuFrontObject* DbMediaImage::recordToDataObject(const QSqlRecord *)
    Returns a list of media image id corresponding to the given list of media
    images inserted to the database or already in the database.
 */
-QList<int> DbMediaImage::storeMediaImages(QList<MediaImage *> images)
+QList<int> DbMediaImage::storeMediaImages(QMap<QString, EmuFrontObject*> images)
 {
     qDebug() << "Storing media images to database.";
     QList<int> ids  = QList<int>();
-    foreach(MediaImage* mi, images)
+    QMapIterator<QString, EmuFrontObject*> it(images);
+    MediaImage *mi = 0;
+    while(it.hasNext())
     {
+        it.next();
+        mi = dynamic_cast<MediaImage*>(it.value());
         QString cksum = mi->getCheckSum();
         qDebug() << "Storing media image " << mi->getName()
             << " with checksum " << cksum;
@@ -134,9 +138,9 @@ void DbMediaImage::removeOrphanedMediaImages(QList<int> ids)
 
 /* Fetches a list of media images inside a media image container
     with a given id */
-QList<MediaImage*> DbMediaImage::getMediaImages(int micId) const
+QMap<QString, EmuFrontObject*> DbMediaImage::getMediaImages(int micId) const
 {
-    QList<MediaImage*> list;
+    QMap<QString, EmuFrontObject*> list;
     QSqlQuery  q;
     q.prepare("SELECT file.id, file.name, file.checksum, file.size "
         "FROM file INNER JOIN mediaimagecontainer_mediaimage "
@@ -155,7 +159,7 @@ QList<MediaImage*> DbMediaImage::getMediaImages(int micId) const
         name = rec.value(DbMediaImage::File_Name).toString();
         checksum = rec.value(DbMediaImage::File_CheckSum).toString();
         size = rec.value(DbMediaImage::File_FileSize).toInt();
-        list.append(new MediaImage(id, name, checksum, size));
+        list[checksum] = new MediaImage(id, name, checksum, size);
     }
     return list;
 }
index cedc3a6..5486616 100644 (file)
 
 #include "dbfile.h"
 #include "../dataobjects/mediaimage.h"
+#include <QMap>
 
 class DbMediaImage : public DbFile
 {
 public:
     DbMediaImage(QObject *parent);
-    QList<int> storeMediaImages(QList<MediaImage*>);
+    QList<int> storeMediaImages(QMap<QString, EmuFrontObject*>);
     void removeOrphanedMediaImages(QList<int> ids);
-    QList<MediaImage*> getMediaImages(int id) const;
+    QMap<QString, EmuFrontObject*> getMediaImages(int id) const;
     /*virtual bool updateDataObjectToModel(const EmuFrontObject *);
     virtual bool insertDataObjectToModel(const EmuFrontObject *);
     virtual bool deleteDataObjectFromModel(QModelIndex *);
index da6f7ec..e1f11c3 100644 (file)
@@ -61,7 +61,7 @@ int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
         throw new EmuFrontException("Cannot install media image "
             "container to database without a file path object!");
 
-    QList<MediaImage*> images = mic->getMediaImages();
+    QMap<QString, EmuFrontObject*> images = mic->getMediaImages();
     QList<int> ids = dbMediaImage->storeMediaImages(images);
 
     qDebug() << "Stored " << ids.count() << " media images.";
@@ -169,7 +169,7 @@ EmuFrontObject* DbMediaImageContainer::recordToDataObject(const QSqlRecord *rec)
         = dynamic_cast<FilePathObject*>(dbFilePath->getDataObject(fpId));
     //int supId = rec->value(MIC_SetupId).toInt();
     //Setup *sup = dbSetup->getDataObject(supId)
-    QList<MediaImage*> images = dbMediaImage->getMediaImages(id);
+    QMap<QString, EmuFrontObject*> images = dbMediaImage->getMediaImages(id);
 
     mic = new MediaImageContainer(
        id, name, checksum, size, images, fpo
index 171b897..d5eb206 100644 (file)
@@ -112,7 +112,7 @@ void EmuLauncher::updateMediaImageContainers()
 
 void EmuLauncher::launchEmu()
 {
-    QList<EmuFrontObject*> mediaImages;
+    QMap<QString, EmuFrontObject*> mediaImages;
     QList<MediaImageContainer*> mediaImageContainers;
     Executable *exe;
     try {
@@ -158,9 +158,12 @@ void EmuLauncher::launchEmu()
                 continue;
             }
             mediaImageContainers << mic;
-            QList<MediaImage*> contained = mic->getMediaImages();
-            foreach(MediaImage *mi, contained)
-                mediaImages << mi;
+            QMap<QString, EmuFrontObject*> contained = mic->getMediaImages();
+            mediaImages.unite(contained);
+            /*QMapIterator<QString, MediaImage*> it(contained);
+            while (it.hasNext()){
+                mediaImages << it.value();
+            }*/
         }
 
         if (mediaImages.count() < 1) {
@@ -177,7 +180,7 @@ void EmuLauncher::launchEmu()
             pos += rx.matchedLength();
         }
 
-        QList<MediaImage*> selectedImages;
+        QList<EmuFrontObject*> selectedImages;
         if (list.count() > 1) {
             for(int i = 0; i < list.count(); i++) {
                 //QInputDialog::getItem();
@@ -190,17 +193,20 @@ void EmuLauncher::launchEmu()
             // show select boot image dialog
             bool ok;
             EmuFrontObject *efo = EmuFrontInputDialog::getItem(
-                this, tr("Select boot image"), tr("Select"), mediaImages, 0, false, &ok);
+                this, tr("Select boot image"), tr("Select"), mediaImages.values(), 0, false, &ok);
             if (!ok)  {
                 throw new EmuFrontException(tr("Boot image selection was canceled, aborting."));
             }
+            selectedImages << efo;
         }
+        else if (mediaImages.count() == 1)
+            selectedImages << mediaImages.values().first();
         // in the both cases the (ordered) list of media images will be passed to emuHelper
 
-        foreach(EmuFrontObject *mi, mediaImages) {
-            qDebug() << "Media image " << mi->getName();
-        }
-        emuHelper->launch(exe, mediaImageContainers, mediaImages);
+        if (selectedImages.count() < 1)
+            throw new EmuFrontException(tr("No media images selected"));
+
+        emuHelper->launch(exe, mediaImageContainers, selectedImages);
     } catch (EmuFrontException efe) {
         delete exe;
         qDeleteAll(mediaImageContainers);
index d2fbd90..33fae17 100644 (file)
@@ -31,23 +31,28 @@ EmuHelper::EmuHelper(QObject *parent) :
     unzipHelper = new UnzipHelper(this);
 }
 
-void EmuHelper::launch(const Executable * ex, QList<MediaImageContainer *> &micList, QList<EmuFrontObject *> &miList)
+void EmuHelper::launch(const Executable * ex, QList<MediaImageContainer *> micList,
+    QList<EmuFrontObject *> miList)
 {
+    if (miList.count() < 1) {
+        throw EmuFrontException(tr("No media images available!"));
+    }
+    if (micList.count() < 1) {
+        throw EmuFrontException(tr("No media image containers available!"));
+    }
     // extract the media image container to tmp folder
     // (TODO: tmp folder configuration)
 
-    // TODO: support multiple media images
-    MediaImageContainer *mic = micList.first();
-
-    QString fp;
-    fp.append(mic->getFilePath()->getName());
-    if (!fp.endsWith('/')) fp.append("/");
-    fp.append(mic->getName());
-
-    int ret = unzipHelper->extractAll(fp, "/tmp/");
-
-    if (ret) {
-        throw EmuFrontException(tr("Unzip failed with %1.").arg(ret));
+    foreach(MediaImageContainer *mic, micList) {
+        QString fp;
+        fp.append(mic->getFilePath()->getName());
+        if (!fp.endsWith('/')) fp.append("/");
+        fp.append(mic->getName());
+        int ret = unzipHelper->extractAll(fp, "/tmp/");
+        if (ret) {
+            qDebug() << "Failed unzipping " << fp << ".";
+            //throw EmuFrontException(tr("Unzip failed with %1.").arg(ret));
+        }
     }
 
     // TODO: launch the 1st media image in the media image list of ex
@@ -57,8 +62,8 @@ void EmuHelper::launch(const Executable * ex, QList<MediaImageContainer *> &micL
 
     QString opts = ex->getOptions();
     QString tmpfp = " \"/tmp/";
-    qDebug() << "Launching file '" << mic->getMediaImages().first()->getName() << " '";
-    tmpfp.append(mic->getMediaImages().first()->getName()).append("\"");
+    // if only one media image placeholder -> TODO: if more placeholders e.g. $1 $2 ...
+    tmpfp.append(miList.first()->getName()).append("\"");
     opts.replace("$1", tmpfp);
     QString cmdWithParams;
     cmdWithParams.append(ex->getExecutable());
@@ -66,9 +71,10 @@ void EmuHelper::launch(const Executable * ex, QList<MediaImageContainer *> &micL
     // TODO: tmp will be set dynamically
     // TODO: assigning multiple media images
     qDebug() << "Command with params " << cmdWithParams;
-    // Executable and MediaImageContainer objects are no more needed:
+    // Executable and MediaImageContainer / MediaImage objects are no more needed:
     delete ex;
-    delete mic;
+    qDeleteAll(micList);
+    //qDeleteAll(miList); these objects are already deleted along with micList
     start(cmdWithParams, QIODevice::ReadOnly);
 }
 
index 5dab145..d7ab9b4 100644 (file)
@@ -33,7 +33,7 @@ class EmuHelper : public ProcessHelper
     Q_OBJECT
 public:
     explicit EmuHelper(QObject *parent = 0);
-    void launch(const Executable * ex, QList<MediaImageContainer *> &micList, QList<EmuFrontObject*> &miList);
+    void launch(const Executable * ex, QList<MediaImageContainer *> micList, QList<EmuFrontObject*> miList);
 private slots:
     void processError(QProcess::ProcessError);
     void processFinished(int);
index b1decaa..f2e8359 100644 (file)
@@ -83,7 +83,7 @@ int FileUtil::scanFilePath(FilePathObject *fp, QStringList filters, DbMediaImage
         qDebug() << QString("%1 %2").arg(fileInfo.size(), 10).arg(fileInfo.absoluteFilePath());
 
         //... and collect the contents of each archive
-        QList<MediaImage*> files = unzipHelper->listContents(fileInfo.absoluteFilePath(), fp);
+        QMap<QString, EmuFrontObject*> files = unzipHelper->listContents(fileInfo.absoluteFilePath(), fp);
 
         if (files.count() > 0)
         {
index 48434d5..7472247 100644 (file)
@@ -33,7 +33,7 @@ UnzipHelper::UnzipHelper(QObject *parent) :
 {
 }
 
-QList<MediaImage*> UnzipHelper::listContents(const QString filePath, const FilePathObject *fp)
+QMap<QString, EmuFrontObject*> UnzipHelper::listContents(const QString filePath, const FilePathObject *fp)
 {
     if (!fp->getSetup()){
         throw EmuFrontException(tr("Setup not available with %1.").arg(fp->getName()));
@@ -45,7 +45,7 @@ QList<MediaImage*> UnzipHelper::listContents(const QString filePath, const FileP
     }
 
     Setup *sup = fp->getSetup();
-    QList<MediaImage*>  fileList;
+    QMap<QString, EmuFrontObject*>  fileList;
 
     QString command;
     command.append(UNZIP_COMMAND);
@@ -113,7 +113,7 @@ QList<MediaImage*> UnzipHelper::listContents(const QString filePath, const FileP
         int length = lenStr.toInt(&ok);
         if (!ok) continue;
         MediaImage *effo = new MediaImage(filename, checksum, length);
-        fileList << effo;
+        fileList[checksum] = effo;
     }
 
     qDebug() << "File list has " << fileList.size() << " entries.";
index f4dbe4c..17703eb 100644 (file)
 
 #include "processhelper.h"
 
-class MediaImage;
+class EmuFrontObject;
 class FilePathObject;
 
 class UnzipHelper : public ProcessHelper
 {
 public:
     UnzipHelper(QObject *parent = 0);
-    QList<MediaImage*> listContents(const QString filePath, const FilePathObject *fp);
+    QMap<QString, EmuFrontObject*> listContents(const QString filePath, const FilePathObject *fp);
     int extractAll(QString filePath, QString targetPath);
 private:
     static const QString UNZIP_COMMAND;