tdf#125216 import filter: allow .doc renamed as .dot

A LO 6.2.2 regression prevented .doc-as-.dot files to load,
giving a "Read Error. This is not a valid WinWord6 file."

Well, it is not a valid .dot file (because of some bit differences),
but it is a valid .doc file.
Since it was renamed to be treated as a template
(requiring a save-as), we should treat it as that.

Change-Id: I308375797e9dae3ca6d203fab520e91ee788325e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140687
Tested-by: Jenkins
Reviewed-by: Justin Luth <jluth@mail.com>
diff --git a/sw/qa/extras/ww8import/data/tdf120761_zOrder.doc b/sw/qa/extras/ww8import/data/tdf120761_zOrder.dot
similarity index 100%
rename from sw/qa/extras/ww8import/data/tdf120761_zOrder.doc
rename to sw/qa/extras/ww8import/data/tdf120761_zOrder.dot
Binary files differ
diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx
index c41b86d..0687138 100644
--- a/sw/qa/extras/ww8import/ww8import.cxx
+++ b/sw/qa/extras/ww8import/ww8import.cxx
@@ -275,7 +275,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf110987)

CPPUNIT_TEST_FIXTURE(Test, testTdf120761_zOrder)
{
    load(mpTestDocumentPath, "tdf120761_zOrder.doc");
    load(mpTestDocumentPath, "tdf120761_zOrder.dot");
    //The blue shape was covering everything (highest zorder = 2) instead of the lowest(0)
    uno::Reference<drawing::XShape> xShape(getShapeByName(u"Picture 2"), uno::UNO_QUERY);
    CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), getProperty<sal_uInt32>(xShape, "ZOrder"));
diff --git a/sw/source/ui/uno/swdetect.cxx b/sw/source/ui/uno/swdetect.cxx
index 9e354ded..83b7162 100644
--- a/sw/source/ui/uno/swdetect.cxx
+++ b/sw/source/ui/uno/swdetect.cxx
@@ -24,6 +24,7 @@
#include <com/sun/star/uno/XComponentContext.hpp>
#include <sfx2/docfile.hxx>
#include <sot/storage.hxx>
#include <tools/urlobj.hxx>
#include <unotools/mediadescriptor.hxx>

using namespace ::com::sun::star;
@@ -102,19 +103,29 @@ OUString SAL_CALL SwFilterDetect::detect( Sequence< PropertyValue >& lDescriptor
                    // mis-detect it.
                    if ( bIsDetected && aTypeName == "writer_MS_Word_97_Vorlage" )
                    {
                        // It is common practice to rename a .doc to .dot to make it a template.
                        // Since we have detected a.doc-ish format, always accept .dot-named-files
                        // as valid templates to avoid flagging this as an invalid .dot format..
                        INetURLObject aParser(aMediaDesc.getUnpackedValueOrDefault(
                            utl::MediaDescriptor::PROP_URL, OUString()));

                        // Super ugly hack, but we don't want to use the whole WW8Fib thing here in
                        // the swd library, apparently. We know (do we?) that the "aBits1" byte, as
                        // the variable is called in WW8Fib::WW8Fib(SvStream&,sal_uInt8,sal_uInt32),
                        // is at offset 10 in the WordDocument stream. The fDot bit is bit 0x01 of
                        // that byte.
                        tools::SvRef<SotStorageStream> xWordDocument = aStorage->OpenSotStream("WordDocument", StreamMode::STD_READ);
                        xWordDocument->Seek( 10 );
                        if ( xWordDocument->Tell() == 10 )
                        if (aParser.getExtension().toAsciiLowerCase() != "dot")
                        {
                            sal_uInt8 aBits1;
                            xWordDocument->ReadUChar( aBits1 );
                            // Check fDot bit
                            bIsDetected = ((aBits1 & 0x01) == 0x01);
                            tools::SvRef<SotStorageStream> xWordDocument
                                = aStorage->OpenSotStream("WordDocument", StreamMode::STD_READ);
                            xWordDocument->Seek(10);
                            if (xWordDocument->Tell() == 10)
                            {
                                sal_uInt8 aBits1;
                                xWordDocument->ReadUChar(aBits1);
                                // Check fDot bit
                                bIsDetected = ((aBits1 & 0x01) == 0x01);
                            }
                        }
                    }
                }