Reject type detection for zip formats when the stream is not a zip archive.

Else it would incorrectly declare a non-zip archive format as a zip-based
format.

Change-Id: I017b63768dc89f7fe6e2202a661faf5f692b1a92
This commit is contained in:
Kohei Yoshida
2013-03-06 16:27:23 -05:00
parent 1a3c7b84b7
commit c9fbcaa0b9

View File

@@ -74,6 +74,27 @@ using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::ucb; using namespace ::com::sun::star::ucb;
using namespace ::rtl; using namespace ::rtl;
namespace {
bool isZipStorageType(const OUString& rTypeName)
{
if (rTypeName == "impress8" || rTypeName == "impress8_template")
return true;
if (rTypeName == "draw8" || rTypeName == "draw8_template")
return true;
if (rTypeName == "impress_StarOffice_XML_Impress" || rTypeName == "impress_StarOffice_XML_Impress_Template")
return true;
if (rTypeName == "draw_StarOffice_XML_Draw" || rTypeName == "draw_StarOffice_XML_Draw_Template")
return true;
return false;
}
}
SdFilterDetect::SdFilterDetect( const REFERENCE < ::com::sun::star::lang::XMultiServiceFactory >& ) SdFilterDetect::SdFilterDetect( const REFERENCE < ::com::sun::star::lang::XMultiServiceFactory >& )
{ {
} }
@@ -89,7 +110,7 @@ SdFilterDetect::~SdFilterDetect()
REFERENCE< XInteractionHandler > xInteraction; REFERENCE< XInteractionHandler > xInteraction;
String aURL; String aURL;
::rtl::OUString sTemp; ::rtl::OUString sTemp;
String aTypeName; // a name describing the type (from MediaDescriptor, usually from flat detection) OUString aTypeName; // a name describing the type (from MediaDescriptor, usually from flat detection)
String aPreselectedFilterName; // a name describing the filter to use (from MediaDescriptor, usually from UI action) String aPreselectedFilterName; // a name describing the filter to use (from MediaDescriptor, usually from UI action)
::rtl::OUString aDocumentTitle; // interesting only if set in this method ::rtl::OUString aDocumentTitle; // interesting only if set in this method
@@ -195,7 +216,7 @@ SdFilterDetect::~SdFilterDetect()
aMedium.UseInteractionHandler( sal_True ); aMedium.UseInteractionHandler( sal_True );
if ( aPreselectedFilterName.Len() ) if ( aPreselectedFilterName.Len() )
pFilter = SfxFilter::GetFilterByName( aPreselectedFilterName ); pFilter = SfxFilter::GetFilterByName( aPreselectedFilterName );
else if( aTypeName.Len() ) else if (!aTypeName.isEmpty())
{ {
SfxFilterMatcher aMatch; SfxFilterMatcher aMatch;
pFilter = aMatch.GetFilter4EA( aTypeName ); pFilter = aMatch.GetFilter4EA( aTypeName );
@@ -208,11 +229,11 @@ SdFilterDetect::~SdFilterDetect()
xStream = aMedium.GetInputStream(); xStream = aMedium.GetInputStream();
xContent = aMedium.GetContent(); xContent = aMedium.GetContent();
bReadOnly = aMedium.IsReadOnly(); bReadOnly = aMedium.IsReadOnly();
sal_Bool bIsStorage = aMedium.IsStorage(); bool bIsZipStorage = aMedium.IsStorage();
if (aMedium.GetError() == SVSTREAM_OK) if (aMedium.GetError() == SVSTREAM_OK)
{ {
if ( bIsStorage ) if (bIsZipStorage)
{ {
// PowerPoint needs to be detected via StreamName, all other storage based formats are our own and can // PowerPoint needs to be detected via StreamName, all other storage based formats are our own and can
// be detected by the ClipboardId, so except for the PPT filter all filters must have a ClipboardId set // be detected by the ClipboardId, so except for the PPT filter all filters must have a ClipboardId set
@@ -265,7 +286,7 @@ SdFilterDetect::~SdFilterDetect()
return OUString(); return OUString();
packages::zip::ZipIOException aZipException; packages::zip::ZipIOException aZipException;
if ( ( aWrap.TargetException >>= aZipException ) && aTypeName.Len() ) if ((aWrap.TargetException >>= aZipException) && !aTypeName.isEmpty())
{ {
if ( xInteraction.is() ) if ( xInteraction.is() )
{ {
@@ -293,7 +314,7 @@ SdFilterDetect::~SdFilterDetect()
if ( !bRepairAllowed ) if ( !bRepairAllowed )
{ {
aTypeName.Erase(); aTypeName = OUString();
pFilter = 0; pFilter = 0;
} }
} }
@@ -304,11 +325,11 @@ SdFilterDetect::~SdFilterDetect()
} }
catch( uno::Exception& ) catch( uno::Exception& )
{ {
aTypeName.Erase(); aTypeName = OUString();
pFilter = 0; pFilter = 0;
} }
if ( !pFilter && aTypeName.Len() ) if (!pFilter && !aTypeName.isEmpty())
{ {
//TODO/LATER: using this method impress is always preferred if no flat detecion has been made //TODO/LATER: using this method impress is always preferred if no flat detecion has been made
// this should been discussed! // this should been discussed!
@@ -321,12 +342,19 @@ SdFilterDetect::~SdFilterDetect()
} }
else else
{ {
SvStream* pStm = aMedium.GetInStream(); if (isZipStorageType(aTypeName))
if ( !pStm ) // This stream is a not zip archive, but a zip archive type is specified.
pFilter = NULL;
SvStream* pStm = NULL;
if (pFilter)
{ {
pFilter = 0; pStm = aMedium.GetInStream();
if (!pStm)
pFilter = NULL;
} }
else
if (pFilter && pStm)
{ {
SotStorageRef aStorage = new SotStorage ( pStm, sal_False ); SotStorageRef aStorage = new SotStorage ( pStm, sal_False );
if ( !aStorage->GetError() ) if ( !aStorage->GetError() )
@@ -472,7 +500,7 @@ SdFilterDetect::~SdFilterDetect()
if ( pFilter ) if ( pFilter )
aTypeName = pFilter->GetTypeName(); aTypeName = pFilter->GetTypeName();
else else
aTypeName.Erase(); aTypeName = OUString();
return aTypeName; return aTypeName;
} }