blob: 5ed89571c878a449db2624ded028eaf2d987f7fc [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef OOX_CORE_FILTERDETECT_HXX
#define OOX_CORE_FILTERDETECT_HXX
#include <vector>
#include <com/sun/star/document/XExtendedFilterDetection.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
#include <cppuhelper/implbase1.hxx>
#include <cppuhelper/implbase2.hxx>
#include "oox/dllapi.h"
namespace com { namespace sun { namespace star {
namespace io { class XInputStream; }
namespace uno { class XComponentContext; }
} } }
namespace comphelper { class MediaDescriptor; }
namespace oox { class AttributeList; }
namespace oox {
namespace core {
// ============================================================================
/** Document handler specifically designed for detecting OOXML file formats.
It takes a reference to the filter string object via its constructor, and
puts the name of the detected filter to it, if it successfully finds one.
*/
class FilterDetectDocHandler : public ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XFastDocumentHandler >
{
public:
explicit FilterDetectDocHandler( ::rtl::OUString& rFilter );
virtual ~FilterDetectDocHandler();
// XFastDocumentHandler
virtual void SAL_CALL startDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL setDocumentLocator( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >& xLocator ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
// XFastContextHandler
virtual void SAL_CALL startFastElement( sal_Int32 nElement, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL startUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL endFastElement( sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL endUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Reference< XFastContextHandler > SAL_CALL createUnknownChildContext( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
private:
void parseRelationship( const AttributeList& rAttribs );
::rtl::OUString getFilterNameFromContentType( const ::rtl::OUString& rContentType ) const;
void parseContentTypesDefault( const AttributeList& rAttribs );
void parseContentTypesOverride( const AttributeList& rAttribs );
private:
typedef ::std::vector< sal_Int32 > ContextVector;
::rtl::OUString& mrFilterName;
ContextVector maContextStack;
::rtl::OUString maTargetPath;
};
// ============================================================================
class OOX_DLLPUBLIC FilterDetect : public ::cppu::WeakImplHelper2< ::com::sun::star::document::XExtendedFilterDetection, ::com::sun::star::lang::XServiceInfo >
{
public:
explicit FilterDetect( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext )
throw( ::com::sun::star::uno::RuntimeException );
virtual ~FilterDetect();
/** Tries to extract an unencrypted ZIP package from the passed media
descriptor.
First, this function checks if the input stream provided by the media
descriptor property 'InputStream' contains a ZIP package. If yes, this
stream is returned.
Second, this function checks if the 'ComponentData' property exists and
contains a sequence of com.sun.star.beans.NamedValue. If yes, a named
value is searched with the name 'DecryptedPackage' and a value of type
com.sun.star.io.XStream. If the input stream provided by this XStream
contains a ZIP package, this input stream is returned.
Third, this function checks if the input stream of the media descriptor
contains an OLE package. If yes, it checks the existence of the streams
'EncryptionInfo' and 'EncyptedPackage' and tries to decrypt the package
into a temporary file. This may include requesting a password from the
media descriptor property 'Password' or from the user, using the
interaction handler provided by the descriptor. On success, and if the
decrypted package is a ZIP package, the XStream of the temporary file
is stored in the property 'ComponentData' of the media descriptor and
its input stream is returned.
*/
::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
extractUnencryptedPackage( ::comphelper::MediaDescriptor& rMediaDesc ) const;
// com.sun.star.lang.XServiceInfo interface -------------------------------
virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& rServiceName ) throw( ::com::sun::star::uno::RuntimeException );
virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
// com.sun.star.document.XExtendedFilterDetection interface ---------------
/** Detects MS Office 2007 file types and supports package decryption.
The following file types are detected:
- MS Word 2007 XML Document (*.docx, *.docm)
- MS Word 2007 XML Template (*.dotx, *.dotm)
- MS Excel 2007 XML Document (*.xlsx, *.xlsm)
- MS Excel 2007 BIFF12 Document (*.xlsb)
- MS Excel 2007 XML Template (*.xltx, *.xltm)
- MS Powerpoint 2007 XML Document (*.pptx, *.pptm)
- MS Powerpoint 2007 XML Template (*.potx, *.potm)
If the package is encrypted, the detection tries to decrypt it into a
temporary file. The user may be asked for a password. The XStream
interface of the temporary file will be stored in the 'ComponentData'
property of the passed media descriptor.
*/
virtual ::rtl::OUString SAL_CALL
detect( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq )
throw( ::com::sun::star::uno::RuntimeException );
private:
::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mxContext;
};
// ============================================================================
} // namespace core
} // namespace oox
#endif