/** A wrapper for a binary input stream that supports aligned read operations.
Theimplementationdoesnotsupportseekingbackthewrappedstream.All seekingoperations(tell,seekTo,align)areperformedrelativetothe positionofthewrappedstreamatconstructiontimeofthiswrapper.Itis possibletoconstructthiswrapperwithanunseekableinputstreamwithout losinganyfunctionality.
*/ class AxAlignedInputStream final : public BinaryInputStream
{ public: explicit AxAlignedInputStream( BinaryInputStream& rInStrm );
/** Returns the size of the data this stream represents, if the wrapped
stream supports the size() operation. */ virtual sal_Int64 size() const override; /** Return the current relative stream position (relative to position of
the wrapped stream at construction time). */ virtual sal_Int64 tell() const override; /** Seeks the stream to the passed relative position, if it is behind the
current position. */ virtualvoid seek( sal_Int64 nPos ) override; /** Closes the input stream but not the wrapped stream. */ virtualvoid close() override;
/** Reads nBytes bytes to the passed sequence.
@return Number of bytes really read. */ virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes, size_t nAtomSize = 1 ) override; /** Reads nBytes bytes to the (existing) buffer opMem.
@return Number of bytes really read. */ virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes, size_t nAtomSize = 1 ) override; /** Seeks the stream forward by the passed number of bytes. */ virtualvoid skip( sal_Int32 nBytes, size_t nAtomSize = 1 ) override;
/** Aligns the stream to a multiple of the passed size (relative to the
position of the wrapped stream at construction time). */ void align( size_t nSize );
/** Aligns the stream according to the passed type and reads a value. */ template< typename Type >
[[nodiscard]]
Type readAligned() { align( sizeof( Type ) ); return readValue< Type >(); } /** Aligns the stream according to the passed type and skips the size of the type. */ template< typename Type > void skipAligned() { align( sizeof( Type ) ); skip( sizeof( Type ) ); }
private:
BinaryInputStream* mpInStrm; ///< The wrapped input stream.
sal_Int64 mnStrmPos; ///< Tracks relative position in the stream.
sal_Int64 mnStrmSize; ///< Size of the wrapped stream data.
};
/** A pair of integer values as a property. */ typedef ::std::pair< sal_Int32, sal_Int32 > AxPairData;
/** An array of string values as a property. */ typedef ::std::vector< OUString > AxArrayString;
/** Import helper to read simple and complex ActiveX form control properties
from a binary input stream. */ class AxBinaryPropertyReader
{ public: explicit AxBinaryPropertyReader( BinaryInputStream& rInStrm, bool b64BitPropFlags = false );
/** Reads the next integer property value from the stream, if the
respective flag in the property mask is set. */ template< typename StreamType, typename DataType > void readIntProperty( DataType& ornValue )
{ if( startNextProperty() ) ornValue = maInStrm.readAligned< StreamType >(); } /** Reads the next boolean property value from the stream, if the
respective flag in the property mask is set. */ void readBoolProperty( bool& orbValue, bool bReverse = false ); /** Reads the next pair property from the stream, if the respective flag in
the property mask is set. */ void readPairProperty( AxPairData& orPairData ); /** Reads the next string property from the stream, if the respective flag
in the property mask is set. */ void readStringProperty( OUString& orValue ); /** Reads ArrayString, an array of fmString ( compressed or uncompressed )
is read from the stream and inserted into rStrings */ void readArrayStringProperty( std::vector< OUString >& rStrings ); /** Reads the next GUID property from the stream, if the respective flag
in the property mask is set. The GUID will be enclosed in braces. */ void readGuidProperty( OUString& orGuid ); /** Reads the next font property from the stream, if the respective flag in
the property mask is set. */ void readFontProperty( AxFontData& orFontData ); /** Reads the next picture property from the stream, if the respective flag
in the property mask is set. */ void readPictureProperty( StreamDataSequence& orPicData );
/** Skips the next integer property value in the stream, if the respective
flag in the property mask is set. */ template< typename StreamType > void skipIntProperty() { if( startNextProperty() ) maInStrm.skipAligned< StreamType >(); } /** Skips the next boolean property value in the stream, if the respective
flag in the property mask is set. */ void skipBoolProperty() { (void)startNextProperty(); } /** Skips the next string property in the stream, if the respective flag in
the property mask is set. */ void skipStringProperty() { readStringProperty( maDummyString ); } /** Skips the next ArrayString property in the stream, if the respective flag in
the property mask is set. */ void skipArrayStringProperty() { readArrayStringProperty( maDummyArrayString ); } /** Skips the next GUID property in the stream, if the respective flag in
the property mask is set. */ void skipGuidProperty() { readGuidProperty( maDummyString ); } /** Skips the next picture property in the stream, if the respective flag
in the property mask is set. */ void skipPictureProperty() { readPictureProperty( maDummyPicData ); } /** Has to be called for undefined properties. If the respective flag in
the mask is set, the property import cannot be finished successfully. */ void skipUndefinedProperty() { ensureValid( !startNextProperty() ); }
/** Final processing, reads contents of all complex properties. */ bool finalizeImport();
private: /** Base class for complex properties such as string, point, size, GUID, picture. */ struct ComplexProperty
{ virtual ~ComplexProperty(); virtualbool readProperty( AxAlignedInputStream& rInStrm ) = 0;
};
/** Complex property for a 32-bit value pair, e.g. point or size. */ struct PairProperty final : public ComplexProperty
{ private:
AxPairData& mrPairData; public: explicit PairProperty( AxPairData& rPairData ) :
mrPairData( rPairData ) {} virtualbool readProperty( AxAlignedInputStream& rInStrm ) override;
};
private:
AxAlignedInputStream maInStrm; ///< The input stream to read from.
ComplexPropVector maLargeProps; ///< Stores info for all used large properties.
ComplexPropVector maStreamProps; ///< Stores info for all used stream data properties.
StreamDataSequence maDummyPicData; ///< Dummy picture for unsupported properties.
OUString maDummyString; ///< Dummy string for unsupported properties.
AxArrayString maDummyArrayString; ///< Dummy strings for unsupported ArrayString properties.
sal_Int64 mnPropFlags; ///< Flags specifying existing properties.
sal_Int64 mnNextProp; ///< Next property to read.
sal_Int64 mnPropsEnd; ///< End position of simple/large properties. bool mbValid; ///< True = stream still valid.
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.