| /************************************************************** |
| * |
| * 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 _ZIP_PACKAGE_STREAM_HXX |
| #define _ZIP_PACKAGE_STREAM_HXX |
| |
| #include <com/sun/star/io/XActiveDataSink.hpp> |
| #include <com/sun/star/io/XSeekable.hpp> |
| #include <com/sun/star/beans/NamedValue.hpp> |
| #include <com/sun/star/packages/XDataSinkEncrSupport.hpp> |
| |
| #include <rtl/ref.hxx> |
| #include <cppuhelper/implbase2.hxx> |
| |
| #include <ZipPackageEntry.hxx> |
| #include <EncryptionData.hxx> |
| #include <mutexholder.hxx> |
| |
| #define PACKAGE_STREAM_NOTSET 0 |
| #define PACKAGE_STREAM_PACKAGEMEMBER 1 |
| #define PACKAGE_STREAM_DETECT 2 |
| #define PACKAGE_STREAM_DATA 3 |
| #define PACKAGE_STREAM_RAW 4 |
| |
| class ZipPackage; |
| struct ZipEntry; |
| class ZipPackageStream : public cppu::ImplInheritanceHelper2 |
| < |
| ZipPackageEntry, |
| ::com::sun::star::io::XActiveDataSink, |
| ::com::sun::star::packages::XDataSinkEncrSupport |
| > |
| { |
| protected: |
| com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xStream; |
| const ::com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory > m_xFactory; |
| ZipPackage &rZipPackage; |
| sal_Bool bToBeCompressed, bToBeEncrypted, bHaveOwnKey, bIsEncrypted; |
| |
| ::rtl::Reference< BaseEncryptionData > m_xBaseEncryptionData; |
| ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue > m_aStorageEncryptionKeys; |
| ::com::sun::star::uno::Sequence< sal_Int8 > m_aEncryptionKey; |
| |
| sal_Int32 m_nImportedStartKeyAlgorithm; |
| sal_Int32 m_nImportedEncryptionAlgorithm; |
| sal_Int32 m_nImportedChecksumAlgorithm; |
| sal_Int32 m_nImportedDerivedKeySize; |
| |
| sal_uInt8 m_nStreamMode; |
| sal_uInt32 m_nMagicalHackPos; |
| sal_uInt32 m_nMagicalHackSize; |
| |
| sal_Bool m_bHasSeekable; |
| |
| sal_Bool m_bCompressedIsSetFromOutside; |
| |
| sal_Bool m_bFromManifest; |
| |
| bool m_bUseWinEncoding; |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > GetOwnSeekStream(); |
| |
| public: |
| sal_Bool HasOwnKey () const { return bHaveOwnKey;} |
| sal_Bool IsToBeCompressed () const { return bToBeCompressed;} |
| sal_Bool IsToBeEncrypted () const { return bToBeEncrypted;} |
| sal_Bool IsEncrypted () const { return bIsEncrypted;} |
| sal_Bool IsPackageMember () const { return m_nStreamMode == PACKAGE_STREAM_PACKAGEMEMBER;} |
| |
| sal_Bool IsFromManifest() const { return m_bFromManifest; } |
| void SetFromManifest( sal_Bool bValue ) { m_bFromManifest = bValue; } |
| |
| ::rtl::Reference< EncryptionData > GetEncryptionData( bool bWinEncoding = false ); |
| void SetBaseEncryptionData( const ::rtl::Reference< BaseEncryptionData >& xData ); |
| |
| ::com::sun::star::uno::Sequence< sal_Int8 > GetEncryptionKey( bool bWinEncoding = false ); |
| |
| sal_Int32 GetStartKeyGenID(); |
| |
| const com::sun::star::uno::Sequence < sal_Int8 > getInitialisationVector () const |
| { return m_xBaseEncryptionData->m_aInitVector;} |
| const com::sun::star::uno::Sequence < sal_Int8 > getDigest () const |
| { return m_xBaseEncryptionData->m_aDigest;} |
| const com::sun::star::uno::Sequence < sal_Int8 > getSalt () const |
| { return m_xBaseEncryptionData->m_aSalt;} |
| sal_Int32 getIterationCount () const |
| { return m_xBaseEncryptionData->m_nIterationCount;} |
| sal_Int32 getSize () const |
| { return aEntry.nSize;} |
| |
| sal_uInt8 GetStreamMode() const { return m_nStreamMode; } |
| sal_uInt32 GetMagicalHackPos() const { return m_nMagicalHackPos; } |
| sal_uInt32 GetMagicalHackSize() const { return m_nMagicalHackSize; } |
| sal_Int32 GetEncryptionAlgorithm() const; |
| sal_Int32 GetBlockSize() const; |
| |
| void SetToBeCompressed (sal_Bool bNewValue) { bToBeCompressed = bNewValue;} |
| void SetIsEncrypted (sal_Bool bNewValue) { bIsEncrypted = bNewValue;} |
| void SetImportedStartKeyAlgorithm( sal_Int32 nAlgorithm ) { m_nImportedStartKeyAlgorithm = nAlgorithm; } |
| void SetImportedEncryptionAlgorithm( sal_Int32 nAlgorithm ) { m_nImportedEncryptionAlgorithm = nAlgorithm; } |
| void SetImportedChecksumAlgorithm( sal_Int32 nAlgorithm ) { m_nImportedChecksumAlgorithm = nAlgorithm; } |
| void SetImportedDerivedKeySize( sal_Int32 nSize ) { m_nImportedDerivedKeySize = nSize; } |
| void SetToBeEncrypted (sal_Bool bNewValue) |
| { |
| bToBeEncrypted = bNewValue; |
| if ( bToBeEncrypted && !m_xBaseEncryptionData.is()) |
| m_xBaseEncryptionData = new BaseEncryptionData; |
| else if ( !bToBeEncrypted && m_xBaseEncryptionData.is() ) |
| m_xBaseEncryptionData.clear(); |
| } |
| void SetPackageMember (sal_Bool bNewValue); |
| |
| void setKey (const com::sun::star::uno::Sequence < sal_Int8 >& rNewKey ) |
| { m_aEncryptionKey = rNewKey; m_aStorageEncryptionKeys.realloc( 0 ); } |
| void setInitialisationVector (const com::sun::star::uno::Sequence < sal_Int8 >& rNewVector ) |
| { m_xBaseEncryptionData->m_aInitVector = rNewVector;} |
| void setSalt (const com::sun::star::uno::Sequence < sal_Int8 >& rNewSalt ) |
| { m_xBaseEncryptionData->m_aSalt = rNewSalt;} |
| void setDigest (const com::sun::star::uno::Sequence < sal_Int8 >& rNewDigest ) |
| { m_xBaseEncryptionData->m_aDigest = rNewDigest;} |
| void setIterationCount (const sal_Int32 nNewCount) |
| { m_xBaseEncryptionData->m_nIterationCount = nNewCount;} |
| void setSize (const sal_Int32 nNewSize); |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > GetOwnStreamNoWrap() { return xStream; } |
| |
| void CloseOwnStreamIfAny(); |
| |
| ZipPackageStream ( ZipPackage & rNewPackage, |
| const ::com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory >& xFactory, |
| sal_Bool bAllowRemoveOnInsert ); |
| virtual ~ZipPackageStream( void ); |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > GetRawEncrStreamNoHeaderCopy(); |
| ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > TryToGetRawFromDataStream( |
| sal_Bool bAddHeaderForEncr ); |
| |
| sal_Bool ParsePackageRawStream(); |
| |
| void setZipEntryOnLoading( const ZipEntry &rInEntry); |
| ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getRawData() |
| throw(::com::sun::star::uno::RuntimeException); |
| |
| static const ::com::sun::star::uno::Sequence < sal_Int8 >& static_getImplementationId(); |
| |
| // XActiveDataSink |
| virtual void SAL_CALL setInputStream( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& aStream ) |
| throw(::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getInputStream( ) |
| throw(::com::sun::star::uno::RuntimeException); |
| |
| // XDataSinkEncrSupport |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getDataStream() |
| throw ( ::com::sun::star::packages::WrongPasswordException, |
| ::com::sun::star::io::IOException, |
| ::com::sun::star::uno::RuntimeException ); |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getRawStream() |
| throw ( ::com::sun::star::packages::NoEncryptionException, |
| ::com::sun::star::io::IOException, |
| ::com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL setDataStream( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& aStream ) |
| throw ( ::com::sun::star::io::IOException, |
| ::com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL setRawStream( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& aStream ) |
| throw ( ::com::sun::star::packages::EncryptionNotAllowedException, |
| ::com::sun::star::packages::NoRawFormatException, |
| ::com::sun::star::io::IOException, |
| ::com::sun::star::uno::RuntimeException ); |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getPlainRawStream() |
| throw ( ::com::sun::star::io::IOException, |
| ::com::sun::star::uno::RuntimeException ); |
| |
| // XUnoTunnel |
| virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) |
| throw(::com::sun::star::uno::RuntimeException); |
| |
| // XPropertySet |
| virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) |
| throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) |
| throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); |
| |
| // XServiceInfo |
| virtual ::rtl::OUString SAL_CALL getImplementationName( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| }; |
| #endif |