diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-07-27 20:00:51 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-07-27 20:01:53 -0400 |
commit | b46688a663b8709e0e0795f25ef8961db1f46cba (patch) | |
tree | 069e9a024da08b84e5efd1daf90c55b3b9ccbf3d | |
parent | c2a94c283d6d0a82b8960e73c253ecb96c2b8140 (diff) |
fdo#64423: Detect BIFF 2 (and 3) file format like we should.
Change-Id: I1421cca4b0ef8e9410aab5725cc5a8d9cffef7a9
-rw-r--r-- | sc/source/ui/unoobj/exceldetect.cxx | 18 | ||||
-rw-r--r-- | sc/source/ui/unoobj/scdetect.cxx | 45 |
2 files changed, 59 insertions, 4 deletions
diff --git a/sc/source/ui/unoobj/exceldetect.cxx b/sc/source/ui/unoobj/exceldetect.cxx index db040e3e46f7..fb15a3cbbbc3 100644 --- a/sc/source/ui/unoobj/exceldetect.cxx +++ b/sc/source/ui/unoobj/exceldetect.cxx @@ -74,6 +74,10 @@ bool hasStream(const uno::Reference<io::XInputStream>& xInStream, const OUString return xStorage->IsStream(rName); } +/** + * We detect BIFF 2, 3 and 4 file types together since the only thing that + * set them apart is the BOF ID. + */ bool isExcel40(const uno::Reference<io::XInputStream>& xInStream) { SfxMedium aMedium; @@ -93,12 +97,18 @@ bool isExcel40(const uno::Reference<io::XInputStream>& xInStream) sal_uInt16 nBofId, nBofSize; *pStream >> nBofId >> nBofSize; - if (nBofId != 0x0409) - // This ID signifies Excel 4.0 format. It must be 0x0409. - return false; + switch (nBofId) + { + case 0x0009: // Excel 2.1 worksheet (BIFF 2) + case 0x0209: // Excel 3.0 worksheet (BIFF 3) + case 0x0409: // Excel 4.0 worksheet (BIFF 4) + break; + default: + return false; + } if (nBofSize < 4 || 16 < nBofSize) - // BOF record must be sized between 4 and 16 for Excel 4.0 stream. + // BOF record must be sized between 4 and 16 for BIFF 2, 3 and 4. return false; sal_Size nPos = pStream->Tell(); diff --git a/sc/source/ui/unoobj/scdetect.cxx b/sc/source/ui/unoobj/scdetect.cxx index ce430868d694..be11ace1dc4c 100644 --- a/sc/source/ui/unoobj/scdetect.cxx +++ b/sc/source/ui/unoobj/scdetect.cxx @@ -71,6 +71,48 @@ using namespace ::com::sun::star::beans; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::ucb; +#include <stdio.h> +#include <string> +#include <sys/time.h> + +namespace { + +class stack_printer +{ +public: + explicit stack_printer(const char* msg) : + msMsg(msg) + { + fprintf(stdout, "%s: --begin\n", msMsg.c_str()); + mfStartTime = getTime(); + } + + ~stack_printer() + { + double fEndTime = getTime(); + fprintf(stdout, "%s: --end (duration: %g sec)\n", msMsg.c_str(), (fEndTime - mfStartTime)); + } + + void printTime(int line) const + { + double fEndTime = getTime(); + fprintf(stdout, "%s: --(%d) (duration: %g sec)\n", msMsg.c_str(), line, (fEndTime - mfStartTime)); + } + +private: + double getTime() const + { + timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; + } + + ::std::string msMsg; + double mfStartTime; +}; + +} + ScFilterDetect::ScFilterDetect( const uno::Reference<uno::XComponentContext>& /*xContext*/ ) { } @@ -217,6 +259,7 @@ static sal_Bool lcl_MayBeDBase( SvStream& rStream ) OUString SAL_CALL ScFilterDetect::detect( uno::Sequence<beans::PropertyValue>& lDescriptor ) throw( uno::RuntimeException ) { + stack_printer __stack_printer__("ScFilterDetect::detect"); uno::Reference< XInputStream > xStream; uno::Reference< XContent > xContent; uno::Reference< XInteractionHandler > xInteraction; @@ -296,6 +339,8 @@ OUString SAL_CALL ScFilterDetect::detect( uno::Sequence<beans::PropertyValue>& l bDeepDetection = lDescriptor[nProperty].Value.get<sal_Bool>(); } + fprintf(stdout, "ScFilterDetect::detect: type = '%s'\n", rtl::OUStringToOString(aTypeName, RTL_TEXTENCODING_UTF8).getStr()); + // can't check the type for external filters, so set the "dont" flag accordingly SolarMutexGuard aGuard; //SfxFilterFlags nMust = SFX_FILTER_IMPORT, nDont = SFX_FILTER_NOTINSTALLED; |