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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user