29#include <com/sun/star/beans/XPropertySet.hpp>
30#include <com/sun/star/embed/XStorage.hpp>
31#include <com/sun/star/io/XInputStream.hpp>
32#include <com/sun/star/packages/zip/ZipIOException.hpp>
33#include <com/sun/star/task/XInteractionHandler.hpp>
43OUString getInternalFromMediaType(std::u16string_view aMediaType)
46 if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_TEXT_ASCII )
return "writer8";
47 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_TEXT_TEMPLATE_ASCII )
return "writer8_template";
48 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_TEXT_WEB_ASCII )
return "writerweb8_writer_template";
49 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL_ASCII )
return "writerglobal8";
50 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL_TEMPLATE_ASCII )
return "writerglobal8_template";
51 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_DRAWING_ASCII )
return "draw8";
52 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_DRAWING_TEMPLATE_ASCII )
return "draw8_template";
53 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_ASCII )
return "impress8";
54 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE_ASCII )
return "impress8_template";
55 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET_ASCII )
return "calc8";
56 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET_TEMPLATE_ASCII )
return "calc8_template";
57 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII )
return "chart8";
58 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_ASCII )
return "math8";
59 else if ( aMediaType == MIMETYPE_OASIS_OPENDOCUMENT_REPORT_CHART_ASCII )
return "StarBaseReportChart";
62 else if ( aMediaType == MIMETYPE_VND_SUN_XML_WRITER_ASCII )
return "writer_StarOffice_XML_Writer";
63 else if ( aMediaType == MIMETYPE_VND_SUN_XML_WRITER_TEMPLATE_ASCII )
return "writer_StarOffice_XML_Writer_Template";
64 else if ( aMediaType == MIMETYPE_VND_SUN_XML_WRITER_WEB_ASCII )
return "writer_web_StarOffice_XML_Writer_Web_Template";
65 else if ( aMediaType == MIMETYPE_VND_SUN_XML_WRITER_GLOBAL_ASCII )
return "writer_globaldocument_StarOffice_XML_Writer_GlobalDocument";
66 else if ( aMediaType == MIMETYPE_VND_SUN_XML_DRAW_ASCII )
return "draw_StarOffice_XML_Draw";
67 else if ( aMediaType == MIMETYPE_VND_SUN_XML_DRAW_TEMPLATE_ASCII )
return "draw_StarOffice_XML_Draw_Template";
68 else if ( aMediaType == MIMETYPE_VND_SUN_XML_IMPRESS_ASCII )
return "impress_StarOffice_XML_Impress";
69 else if ( aMediaType == MIMETYPE_VND_SUN_XML_IMPRESS_TEMPLATE_ASCII )
return "impress_StarOffice_XML_Impress_Template";
70 else if ( aMediaType == MIMETYPE_VND_SUN_XML_CALC_ASCII )
return "calc_StarOffice_XML_Calc";
71 else if ( aMediaType == MIMETYPE_VND_SUN_XML_CALC_TEMPLATE_ASCII )
return "calc_StarOffice_XML_Calc_Template";
72 else if ( aMediaType == MIMETYPE_VND_SUN_XML_CHART_ASCII )
return "chart_StarOffice_XML_Chart";
73 else if ( aMediaType == MIMETYPE_VND_SUN_XML_MATH_ASCII )
return "math_StarOffice_XML_Math";
82 mxCxt(
std::move(xCxt)) {}
93 uno::Reference< io::XInputStream > xInStream( aMediaDesc[MediaDescriptor::PROP_INPUTSTREAM], uno::UNO_QUERY );
94 if ( !xInStream.is() )
101 uno::Reference< beans::XPropertySet > xStorageProperties( xStorage, uno::UNO_QUERY );
102 if ( !xStorageProperties.is() )
106 xStorageProperties->getPropertyValue(
"MediaType" ) >>= aMediaType;
107 aTypeName = getInternalFromMediaType( aMediaType );
115 catch(
const lang::WrappedTargetException& aWrap )
117 packages::zip::ZipIOException aZipException;
120 OUString aRequestedTypeName = aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_TYPENAME, OUString() );
121 if ( ( aWrap.TargetException >>= aZipException ) && !aRequestedTypeName.isEmpty() )
124 uno::Reference< task::XInteractionHandler > xInteraction =
125 aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_INTERACTIONHANDLER, uno::Reference< task::XInteractionHandler >() );
127 if ( xInteraction.is() )
129 INetURLObject aParser( aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_URL, OUString() ) );
131 bool bRepairPackage = aMediaDesc.getUnpackedValueOrDefault(
"RepairPackage",
false );
133 bool bRepairAllowed = aMediaDesc.getUnpackedValueOrDefault(
"RepairAllowed",
true );
135 if ( !bRepairPackage && bRepairAllowed )
139 xInteraction->handle( aRequest.
GetRequest() );
143 aTypeName = aRequestedTypeName;
144 aMediaDesc[MediaDescriptor::PROP_DOCUMENTTITLE] <<= aDocumentTitle;
145 aMediaDesc[MediaDescriptor::PROP_ASTEMPLATE] <<=
true;
146 aMediaDesc[
"RepairPackage"] <<=
true;
152 xInteraction->handle( aNotifyRequest.
GetRequest() );
153 aMediaDesc[
"RepairAllowed"] <<=
false;
157 aMediaDesc >> rDescriptor;
162 catch( uno::RuntimeException& )
166 catch( uno::Exception& )
178 return "com.sun.star.comp.filters.StorageFilterDetect";
188 return {
"com.sun.star.document.ExtendedTypeDetection",
"com.sun.star.comp.filters.StorageFilterDetect" };
192extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
194 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
OUString getName(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
css::uno::Reference< css::task::XInteractionRequest > GetRequest() const
css::uno::Reference< css::task::XInteractionRequest > GetRequest() const
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual OUString SAL_CALL getImplementationName() override
virtual OUString SAL_CALL detect(css::uno::Sequence< css::beans::PropertyValue > &rDescriptor) override
virtual ~StorageFilterDetect() override
StorageFilterDetect(css::uno::Reference< css::uno::XComponentContext > xCxt)
css::uno::Reference< css::uno::XComponentContext > mxCxt
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
static css::uno::Reference< css::embed::XStorage > GetStorageFromInputStream(const css::uno::Reference< css::io::XInputStream > &xStream, const css::uno::Reference< css::uno::XComponentContext > &rxContext=css::uno::Reference< css::uno::XComponentContext >())
Shape IDs per cluster in DGG atom.
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * filter_StorageFilterDetect_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)