Kaydet (Commit) 65559252 authored tarafından Tor Lillqvist's avatar Tor Lillqvist

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: 's avatarTor Lillqvist <tml@collabora.com>
üst db32d80b
......@@ -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();
......
......@@ -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 (...)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment