void ArkViewer::view(const QString& fileName) { QMimeDatabase db; QMimeType mimeType = db.mimeTypeForFile(fileName); qCDebug(ARK) << "viewing" << fileName << "with mime type:" << mimeType.name(); KService::Ptr viewer = ArkViewer::getViewer(mimeType.name()); const bool needsExternalViewer = (viewer && !viewer->hasServiceType(QStringLiteral("KParts/ReadOnlyPart"))); if (needsExternalViewer) { // We have already resolved the MIME type and the service above. // So there is no point in using KRun::runUrl() which would need // to do the same again. qCDebug(ARK) << "Using external viewer"; const QList<QUrl> fileUrlList = {QUrl::fromLocalFile(fileName)}; // The last argument (tempFiles) set to true means that the temporary // file will be removed when the viewer application exits. KRun::runService(*viewer, fileUrlList, nullptr, true); return; } qCDebug(ARK) << "Attempting to use internal viewer"; bool viewInInternalViewer = true; if (!viewer) { // No internal viewer available for the file. Ask the user if it // should be previewed as text/plain. qCDebug(ARK) << "Internal viewer not available"; int response; if (!mimeType.isDefault()) { // File has a defined MIME type, and not the default // application/octet-stream. So it could be viewable as // plain text, ask the user. response = KMessageBox::warningContinueCancel(nullptr, xi18n("The internal viewer cannot preview this type of file<nl/>(%1).<nl/><nl/>Do you want to try to view it as plain text?", mimeType.name()), i18nc("@title:window", "Cannot Preview File"), KGuiItem(i18nc("@action:button", "Preview as Text"), QIcon::fromTheme(QStringLiteral("text-plain"))), KStandardGuiItem::cancel(), QStringLiteral("PreviewAsText_%1").arg(mimeType.name())); } else { // No defined MIME type, or the default application/octet-stream. // There is still a possibility that it could be viewable as plain // text, so ask the user. Not the same as the message/question // above, because the wording and default are different. response = KMessageBox::warningContinueCancel(nullptr, xi18n("The internal viewer cannot preview this unknown type of file.<nl/><nl/>Do you want to try to view it as plain text?"), i18nc("@title:window", "Cannot Preview File"), KGuiItem(i18nc("@action:button", "Preview as Text"), QIcon::fromTheme(QStringLiteral("text-plain"))), KStandardGuiItem::cancel(), QString(), KMessageBox::Dangerous); } if (response == KMessageBox::Cancel) { viewInInternalViewer = false; } else { // set for viewer later mimeType = db.mimeTypeForName(QStringLiteral("text/plain")); } } if (viewInInternalViewer) { qCDebug(ARK) << "Opening internal viewer"; ArkViewer *internalViewer = new ArkViewer(); internalViewer->show(); if (internalViewer->viewInInternalViewer(fileName, mimeType)) { // The internal viewer is showing the file, and will // remove the temporary file in its destructor. So there // is no more to do here. return; } else { KMessageBox::sorry(nullptr, i18n("The internal viewer cannot preview this file.")); delete internalViewer; } } // Only get here if there is no internal viewer available or could be // used for the file, and no external viewer was opened. Nothing can be // done with the temporary file, so remove it now. qCDebug(ARK) << "Removing temporary file:" << fileName; QFile::remove(fileName); }
void ArkViewer::view(const QString& fileName, QWidget *parent) { KMimeType::Ptr mimeType = KMimeType::findByPath(fileName); kDebug() << "MIME type" << mimeType->name(); KService::Ptr viewer = ArkViewer::getViewer(mimeType); const bool needsExternalViewer = (!viewer.isNull() && !viewer->hasServiceType(QLatin1String("KParts/ReadOnlyPart"))); if (needsExternalViewer) { // We have already resolved the MIME type and the service above. // So there is no point in using KRun::runUrl() which would need // to do the same again. const KUrl::List fileUrlList = KUrl(fileName); // The last argument (tempFiles) set to true means that the temporary // file will be removed when the viewer application exits. KRun::run(*viewer, fileUrlList, parent, true); return; } bool viewInInternalViewer = true; if (viewer.isNull()) { // No internal viewer available for the file. Ask the user if it // should be previewed as text/plain. int response; if (!mimeType->isDefault()) { // File has a defined MIME type, and not the default // application/octet-stream. So it could be viewable as // plain text, ask the user. response = KMessageBox::warningContinueCancel(parent, i18n("The internal viewer cannot preview this type of file<nl/>(%1).<nl/><nl/>Do you want to try to view it as plain text?", mimeType->name()), i18nc("@title:window", "Cannot Preview File"), KGuiItem(i18nc("@action:button", "Preview as Text"), KIcon(QLatin1String("text-plain"))), KStandardGuiItem::cancel(), QString(QLatin1String("PreviewAsText_%1")).arg(mimeType->name())); } else { // No defined MIME type, or the default application/octet-stream. // There is still a possibility that it could be viewable as plain // text, so ask the user. Not the same as the message/question // above, because the wording and default are different. response = KMessageBox::warningContinueCancel(parent, i18n("The internal viewer cannot preview this unknown type of file.<nl/><nl/>Do you want to try to view it as plain text?"), i18nc("@title:window", "Cannot Preview File"), KGuiItem(i18nc("@action:button", "Preview as Text"), KIcon(QLatin1String("text-plain"))), KStandardGuiItem::cancel(), QString(), KMessageBox::Dangerous); } if (response == KMessageBox::Cancel) { viewInInternalViewer = false; } else { // set for viewer later mimeType = KMimeType::mimeType(QLatin1String("text/plain")); } } if (viewInInternalViewer) { ArkViewer *internalViewer = new ArkViewer(parent, Qt::Window); if (internalViewer->viewInInternalViewer(fileName, mimeType)) { internalViewer->show(); // The internal viewer is showing the file, and will // remove the temporary file in dialogClosed(). So there // is no more to do here. return; } else { KMessageBox::sorry(parent, i18n("The internal viewer cannot preview this file.")); delete internalViewer; } } // Only get here if there is no internal viewer available or could be // used for the file, and no external viewer was opened. Nothing can be // done with the temporary file, so remove it now. QFile::remove(fileName); }