[Libreoffice-commits] core.git: sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Sat Jul 27 17:01:36 PDT 2013


 sc/source/ui/unoobj/exceldetect.cxx |   18 +++++++++++---
 sc/source/ui/unoobj/scdetect.cxx    |   45 ++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 4 deletions(-)

New commits:
commit b46688a663b8709e0e0795f25ef8961db1f46cba
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Sat Jul 27 20:00:51 2013 -0400

    fdo#64423: Detect BIFF 2 (and 3) file format like we should.
    
    Change-Id: I1421cca4b0ef8e9410aab5725cc5a8d9cffef7a9

diff --git a/sc/source/ui/unoobj/exceldetect.cxx b/sc/source/ui/unoobj/exceldetect.cxx
index db040e3..fb15a3c 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 ce43086..be11ace 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;


More information about the Libreoffice-commits mailing list