diff --git a/thumbnail/opendocumentcreator.cpp b/thumbnail/opendocumentcreator.cpp --- a/thumbnail/opendocumentcreator.cpp +++ b/thumbnail/opendocumentcreator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Kai Uwe Broulik + * Copyright (c) 2018-2019 Kai Uwe Broulik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,6 +21,8 @@ #include "opendocumentcreator.h" #include +#include +#include #include @@ -46,12 +48,45 @@ return false; } + // Open Document const KArchiveEntry *entry = zip.directory()->entry(QStringLiteral("Thumbnails/thumbnail.png")); - if (!entry || !entry->isFile()) { - return false; + if (entry && entry->isFile()) { + const KZipFileEntry *zipFileEntry = static_cast(entry); + + if (image.loadFromData(zipFileEntry->data(), "PNG")) { + return true; + } + } + + // Open Packaging Conventions (e.g. Office "Open" XML) + const KArchiveEntry *relsEntry = zip.directory()->entry(QStringLiteral("_rels/.rels")); + if (relsEntry && relsEntry->isFile()) { + const auto *relsFileEntry = static_cast(relsEntry); + + QScopedPointer relsDevice(relsFileEntry->createDevice()); + + QString thumbnailPath; + + QXmlStreamReader xml(relsDevice.data()); + while (!xml.atEnd() && !xml.hasError()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == QLatin1String("Relationship")) { + const auto attributes = xml.attributes(); + if (attributes.value(QStringLiteral("Type")) == QLatin1String("http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")) { + thumbnailPath = attributes.value(QStringLiteral("Target")).toString(); + break; + } + } + } + + if (!thumbnailPath.isEmpty()) { + const auto *thumbnailEntry = zip.directory()->entry(thumbnailPath); + if (thumbnailEntry && thumbnailEntry->isFile()) { + return image.loadFromData(static_cast(thumbnailEntry)->data()); + } + } } - const KZipFileEntry *zipFileEntry = static_cast(entry); - return image.loadFromData(zipFileEntry->data(), "PNG"); + return false; } diff --git a/thumbnail/opendocumentthumbnail.desktop b/thumbnail/opendocumentthumbnail.desktop --- a/thumbnail/opendocumentthumbnail.desktop +++ b/thumbnail/opendocumentthumbnail.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Type=Service -Name=Office Documents (Open Document Files) +Name=Office Documents Name[ca]=Documents Office (Fitxers Open Document) Name[ca@valencia]=Documents Office (Fitxers Open Document) Name[cs]=Kancelářské dokumenty (soubory Open Document) @@ -24,7 +24,7 @@ Name[zh_TW]=Office 文件 (開啟文件檔案) X-KDE-ServiceTypes=ThumbCreator -MimeType=application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-template;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.oasis.opendocument.formula;application/vnd.oasis.opendocument.formula-template;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template; +MimeType=application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-template;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.oasis.opendocument.formula;application/vnd.oasis.opendocument.formula-template;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/oxps;application/vnd.ms-xpsdocument; X-KDE-Library=opendocumentthumbnail CacheThumbnail=true