diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2020-10-28 14:54:52 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2020-10-28 19:34:45 +0100 |
commit | ada07f303e7cd1e39c73abe0741aefe7d9d73a57 (patch) | |
tree | fd8c81e5404da2909394a250fce7b8ecdc77b28e /tools | |
parent | db6c7a486395304f38e9ea52951f576f34749cbc (diff) |
tdf#123476 filter: try to detect 0-byte files based on extension
A 0-byte ("empty") pptx file is obviously junk input, so it's not
surprising if the catch-all generic_Text filter is chosen to open it in
Writer at the end.
But we can do better: if we really get an empty file URL with an
extension we can recognize, that we can fake the filter type / filter
name, so the empty "presentation" opens in Impress, and also a re-save
works as expected.
This builds on top of commit 8a201be240b6d408d15166be7ffc576b9e123634
(fdo#68903 Import .tsv and .xls plain text files in Calc by default,
2013-10-27), just the new way works for all supported file extensions
and also with filters which would not handle empty input (e.g. pptx
refuses the import if the ZIP storage is broken).
Change-Id: Ie01650a5eb6ca42c35e090133965467b621bb526
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104939
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'tools')
-rw-r--r-- | tools/source/stream/stream.cxx | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/tools/source/stream/stream.cxx b/tools/source/stream/stream.cxx index fe2470766be3..84dcef93bcd5 100644 --- a/tools/source/stream/stream.cxx +++ b/tools/source/stream/stream.cxx @@ -37,6 +37,7 @@ #include <tools/long.hxx> #include <comphelper/fileformat.h> +#include <comphelper/fileurl.hxx> static void swapNibbles(unsigned char &c) { @@ -1414,6 +1415,25 @@ bool checkSeek(SvStream &rSt, sal_uInt64 nOffset) return (nOffset <= nMaxSeek && rSt.Seek(nOffset) == nOffset); } +namespace tools +{ +bool isEmptyFileUrl(const OUString& rUrl) +{ + if (!comphelper::isFileUrl(rUrl)) + { + return false; + } + + SvFileStream aStream(rUrl, StreamMode::READ); + if (!aStream.IsOpen()) + { + return false; + } + + return aStream.remainingSize() == 0; +} +} + //STREAM_SEEK_TO_END in some of the Seek backends is special cased to be //efficient, in others e.g. SotStorageStream it's really horribly slow, and in //those this should be overridden |