summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2013-02-19 17:10:50 +0200
committerFridrich Strba <fridrich@documentfoundation.org>2013-02-25 12:23:15 +0000
commit5cb823aa71981c1fb13872e67e74bf5027f46cd0 (patch)
tree10dd69c82f0a899a44e20a3a65eb063765873f25
parentb1bc16f5b342ac9c54201cfd30de3ea87bc20538 (diff)
Fix scan for central directory end signature in ODF in Spotlight importer
Once this was fixed it seems to work nicely. Add keywords in File:Properties and they show up in Finder's Properties, and Spotlight finds text from the document contents. (cherry picked from commit b8da61acb2bb887a7335a5db82b8b5ae1e0fab69) (cherry picked from commit 95e6a0885e65cc57b11719cc0658be9d8b78fba9) Change-Id: I9adc65d1821d0920ce3a39d05697557c4303ff68 Reviewed-on: https://gerrit.libreoffice.org/2265 Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r--extensions/source/macosx/spotlight/OOoSpotlightImporter.m27
1 files changed, 22 insertions, 5 deletions
diff --git a/extensions/source/macosx/spotlight/OOoSpotlightImporter.m b/extensions/source/macosx/spotlight/OOoSpotlightImporter.m
index 964b627d5ca2..3a72d5337051 100644
--- a/extensions/source/macosx/spotlight/OOoSpotlightImporter.m
+++ b/extensions/source/macosx/spotlight/OOoSpotlightImporter.m
@@ -208,21 +208,38 @@ static bool areHeadersConsistent(const LocalFileHeader *header, const CentralDir
static bool findCentralDirectoryEnd(NSFileHandle *file)
{
+ // Assume the cdir end is in the last 1024 bytes
+ // Scan backward from end of file for the end signature
+
[file seekToEndOfFile];
unsigned long long fileLength = [file offsetInFile];
- [file seekToFileOffset: 0];
- while ([file offsetInFile] < fileLength)
+ if (fileLength < 10)
+ return false;
+
+ [file seekToFileOffset: (fileLength - 4)];
+
+ unsigned long long limit;
+ if (fileLength > 1024)
+ limit = fileLength - 1024;
+ else
+ limit = 0;
+
+ unsigned long long offset;
+ while ((offset = [file offsetInFile]) > limit)
{
- unsigned long long offset = [file offsetInFile];
unsigned signature = readInt(file);
if (signature == CDIR_END_SIG)
{
- [file seekToFileOffset: (offset - 4)];
+ // Seek back over the CDIR_END_SIG
+ [file seekToFileOffset: offset];
return true;
}
else
- [file seekToFileOffset: (offset - 3)];
+ {
+ // Seek one byte back
+ [file seekToFileOffset: (offset - 1)];
+ }
}
return false;
}