void KMimeTypeTest::testHasServiceType2() // with services coming from ksycoca { KService::Ptr katepart = KService::serviceByDesktopPath( "katepart.desktop" ); QVERIFY( !katepart.isNull() ); QVERIFY( katepart->hasMimeType( "text/plain" ) ); QVERIFY( katepart->hasMimeType( "text/x-patch" ) ); // due to inheritance QVERIFY( !katepart->hasMimeType( "image/png" ) ); QVERIFY( katepart->hasServiceType( "KParts/ReadOnlyPart" ) ); QVERIFY( katepart->hasServiceType( "KParts/ReadWritePart" ) ); QVERIFY( !katepart->hasServiceType( "KTextEditor/Plugin" ) ); KService::Ptr ktexteditor_insertfile = KService::serviceByDesktopPath( "ktexteditor_insertfile.desktop" ); QVERIFY( !ktexteditor_insertfile.isNull() ); QVERIFY( ktexteditor_insertfile->hasServiceType( "KTextEditor/Plugin" ) ); QVERIFY( !ktexteditor_insertfile->hasServiceType( "KParts/ReadOnlyPart" ) ); }
void KMimeTypeTest::testHasServiceType2() // with services coming from ksycoca { KService::Ptr faketextpart = KService::serviceByDesktopPath("faketextpart.desktop"); QVERIFY(faketextpart); QVERIFY(faketextpart->hasMimeType("text/plain")); QVERIFY(faketextpart->hasMimeType("text/x-patch")); // due to inheritance QVERIFY(!faketextpart->hasMimeType("image/png")); QVERIFY(faketextpart->hasServiceType("KParts/ReadOnlyPart")); QVERIFY(!faketextpart->hasServiceType("KParts/ReadWritePart")); QVERIFY(!faketextpart->hasServiceType("KPluginInfo")); KService::Ptr textPlugin = KService::serviceByDesktopPath("faketextplugin.desktop"); QVERIFY(textPlugin); QVERIFY(textPlugin->hasServiceType("KPluginInfo")); QVERIFY(!textPlugin->hasServiceType("KParts/ReadOnlyPart")); }
bool DocumentationViewer::urlSelected(const QString &url, int button, int state, const QString &_target, const KParts::OpenUrlArguments &args, const KParts::BrowserArguments & /* browserArgs */) { QUrl cURL = completeURL(url); QMimeDatabase db; QString mime = db.mimeTypeForUrl(cURL).name(); //load this URL in the embedded viewer if KHTML can handle it, or when mimetype detection failed KService::Ptr service = KService::serviceByDesktopName("khtml"); if (db.mimeTypeForUrl(cURL).isDefault() || (service && service->hasServiceType(mime))) { KHTMLPart::urlSelected(url, button, state, _target, args); openUrl(cURL); addToHistory(cURL.url()); } //KHTML can't handle it, look for an appropriate application else { KService::List offers = KMimeTypeTrader::self()->query(mime, "Type == 'Application'"); if(offers.isEmpty()) { KMessageBox::error(view(), i18n("No KDE service found for the MIME type \"%1\".", mime)); return false; } QList<QUrl> lst; lst.append(cURL); KRun::runService(*(offers.first()), lst, view()); } return true; }
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); }