diff --git a/kerfuffle/archive_kerfuffle.h b/kerfuffle/archive_kerfuffle.h --- a/kerfuffle/archive_kerfuffle.h +++ b/kerfuffle/archive_kerfuffle.h @@ -80,6 +80,12 @@ Custom = 1048576 }; +enum ArchiveError { + NoError = 0, + NoPlugin, + FailedPlugin +}; + typedef QHash ArchiveEntry; /** @@ -141,6 +147,8 @@ static Archive *create(const QString &fileName, const QString &fixedMimeType, QObject *parent = 0); ~Archive(); + ArchiveError error() const; + bool isValid() const; QString fileName() const; bool isReadOnly() const; @@ -179,6 +187,7 @@ private: Archive(ReadOnlyArchiveInterface *archiveInterface, bool isReadOnly, QObject *parent = 0); + Archive(ArchiveError errorCode, QObject *parent = 0); void listIfNotListed(); ReadOnlyArchiveInterface *m_iface; @@ -188,6 +197,7 @@ bool m_isSingleFolderArchive; QString m_subfolderName; qlonglong m_extractedFilesSize; + ArchiveError m_error; }; KERFUFFLE_EXPORT QStringList supportedMimeTypes(); diff --git a/kerfuffle/archive_kerfuffle.cpp b/kerfuffle/archive_kerfuffle.cpp --- a/kerfuffle/archive_kerfuffle.cpp +++ b/kerfuffle/archive_kerfuffle.cpp @@ -137,7 +137,7 @@ const KService::List offers = findPluginOffers(fileName, fixedMimeType); if (offers.isEmpty()) { qCCritical(ARK) << "Could not find a plugin to handle" << fileName; - return Q_NULLPTR; + return new Archive(NoPlugin, parent); } KPluginFactory *factory; @@ -176,16 +176,24 @@ } qCCritical(ARK) << "Failed to find a usable plugin for" << fileName; - return Q_NULLPTR; + return new Archive(FailedPlugin, parent); +} + +Archive::Archive(ArchiveError errorCode, QObject *parent) + : QObject(parent) + , m_error(errorCode) +{ + qCDebug(ARK) << "Created archive instance with error"; } Archive::Archive(ReadOnlyArchiveInterface *archiveInterface, bool isReadOnly, QObject *parent) - : QObject(parent), - m_iface(archiveInterface), - m_hasBeenListed(false), - m_isReadOnly(isReadOnly), - m_isPasswordProtected(false), - m_isSingleFolderArchive(false) + : QObject(parent) + , m_iface(archiveInterface) + , m_hasBeenListed(false) + , m_isReadOnly(isReadOnly) + , m_isPasswordProtected(false) + , m_isSingleFolderArchive(false) + , m_error(NoError) { qCDebug(ARK) << "Created archive instance"; @@ -200,6 +208,16 @@ { } +bool Archive::isValid() const +{ + return (m_error == NoError); +} + +ArchiveError Archive::error() const +{ + return m_error; +} + bool Archive::isReadOnly() const { return (m_iface->isReadOnly() || m_isReadOnly); diff --git a/part/part.cpp b/part/part.cpp --- a/part/part.cpp +++ b/part/part.cpp @@ -448,54 +448,27 @@ QScopedPointer archive(Kerfuffle::Archive::create(localFile, m_model)); - if ((!archive) || ((creatingNewArchive) && (archive->isReadOnly()))) { - QStringList mimeTypeList; - QHash mimeTypes; - - if (creatingNewArchive) { - mimeTypeList = Kerfuffle::supportedWriteMimeTypes(); - } else { - mimeTypeList = Kerfuffle::supportedMimeTypes(); - } - - QMimeDatabase db; - foreach(const QString& mime, mimeTypeList) { - const QMimeType mimeType = db.mimeTypeForName(mime); - if (mimeType.isValid()) { - // Key = "application/zip", Value = "Zip Archive" - mimeTypes[mime] = mimeType.comment(); - } - } - - QStringList mimeComments(mimeTypes.values()); - mimeComments.sort(); - - bool ok; - QString item; - - if (creatingNewArchive) { - item = QInputDialog::getItem(widget(), i18nc("@title:window", "Invalid Archive Type"), - i18nc("@info", "Ark cannot create archives of the type you have chosen.
Please choose another archive type below."), - mimeComments, 0, false, &ok); - } else { - item = QInputDialog::getItem(widget(), i18nc("@title:window", "Unable to Determine Archive Type"), - i18nc("@info", "Ark was unable to determine the archive type of the filename.
Please choose the correct archive type below."), - mimeComments, 0, false, &ok); - } - - if ((!ok) || (item.isEmpty())) { - return false; - } - - // Delete archive and point to a new one - archive.reset(Kerfuffle::Archive::create(localFile, mimeTypes.key(item), m_model)); - } - - if (!archive) { - KMessageBox::sorry(widget(), xi18nc("@info", "Ark was not able to open the archive %1. No plugin capable of handling the file was found.", localFile), i18nc("@title:window", "Error Opening Archive")); + Q_ASSERT(archive); + + if (archive->error() == NoPlugin) { + KMessageBox::sorry(widget(), + xi18nc("@info", "Ark was not able to open %1. No suitable plugin found." + "Ark does not seem to support this file type.", + localFile.section(QLatin1Char('/'), -1)), + i18nc("@title:window", "Error Opening Archive")); + return false; + } else if (archive->error() == FailedPlugin) { + KMessageBox::sorry(widget(), + xi18nc("@info", "Ark was not able to open %1. Failed to load a suitable plugin." + "Make sure any executables needed to handle the archive type are installed.", + localFile.section(QLatin1Char('/'), -1)), + i18nc("@title:window", "Error Opening Archive")); return false; } + Q_ASSERT(archive->isValid()); + + // Plugin loaded successfully. KJob *job = m_model->setArchive(archive.take()); registerJob(job); job->start();