tdf#110987: Don't mis-detect .doc files as .dot

Also add a unit test for that.

Change-Id: I86c195cebbe12b2bdf498954956db882f6f0d12b
Reviewed-on: https://gerrit.libreoffice.org/68005
Tested-by: Jenkins
Reviewed-by: Tor Lillqvist <tml@collabora.com>
diff --git a/sw/qa/extras/ww8import/data/tdf110987 b/sw/qa/extras/ww8import/data/tdf110987
new file mode 100644
index 0000000..16195c0
--- /dev/null
+++ b/sw/qa/extras/ww8import/data/tdf110987
Binary files differ
diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx
index 9398645..41b4d34 100644
--- a/sw/qa/extras/ww8import/ww8import.cxx
+++ b/sw/qa/extras/ww8import/ww8import.cxx
@@ -17,6 +17,8 @@
#include <editeng/boxitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/ulspitem.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/docfilt.hxx>

class Test : public SwModelTestBase
{
@@ -268,6 +270,17 @@ DECLARE_WW8IMPORT_TEST(testTdf122425_2, "tdf122425_2.doc")
    }
}

DECLARE_WW8IMPORT_TEST(testTdf110987, "tdf110987")
{
    // The input document is an empty .doc, but without file name
    // extension. Check that it was loaded as a normal .doc document,
    // and not a template.
    SwXTextDocument* pTextDoc     = dynamic_cast<SwXTextDocument*>(mxComponent.get());
    CPPUNIT_ASSERT(pTextDoc);
    OUString sFilterName = pTextDoc->GetDocShell()->GetMedium()->GetFilter()->GetFilterName();
    CPPUNIT_ASSERT(sFilterName != "MS Word 97 Vorlage");
}

// tests should only be added to ww8IMPORT *if* they fail round-tripping in ww8EXPORT

CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/ui/uno/swdetect.cxx b/sw/source/ui/uno/swdetect.cxx
index a878246..fffceef 100644
--- a/sw/source/ui/uno/swdetect.cxx
+++ b/sw/source/ui/uno/swdetect.cxx
@@ -95,7 +95,29 @@ OUString SAL_CALL SwFilterDetect::detect( Sequence< PropertyValue >& lDescriptor
            {
                bIsDetected = aStorage->IsContained( "WordDocument" );
                if ( bIsDetected && aTypeName.startsWith( "writer_MS_Word_97" ) )
                {
                    bIsDetected = ( aStorage->IsContained("0Table") || aStorage->IsContained("1Table") );

                    // If we are checking the template type, and the document is not a .dot, don't
                    // mis-detect it.
                    if ( bIsDetected && aTypeName == "writer_MS_Word_97_Vorlage" )
                    {
                        // 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 )
                        {
                            sal_uInt8 aBits1;
                            xWordDocument->ReadUChar( aBits1 );
                            // Check fDot bit
                            bIsDetected = ((aBits1 & 0x01) == 0x01);
                        }
                    }
                }
            }
        }
        catch (...)