blob: 8c18a20be32214377cf444b76b874ca880acd7ec [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_HELPER_BINARYSTREAMBASE_HXX
#define OOX_HELPER_BINARYSTREAMBASE_HXX
#include <com/sun/star/uno/Sequence.hxx>
#include <boost/shared_ptr.hpp>
#include "oox/helper/helper.hxx"
namespace com { namespace sun { namespace star {
namespace io { class XSeekable; }
} } }
namespace oox {
typedef ::com::sun::star::uno::Sequence< sal_Int8 > StreamDataSequence;
// ============================================================================
/** Base class for binary stream classes.
*/
class BinaryStreamBase
{
public:
virtual ~BinaryStreamBase();
/** Implementations return the size of the stream, if possible.
This function may be implemented for some types of unseekable streams,
and MUST be implemented for all seekable streams.
@return
The size of the stream in bytes, or -1, if not implemented.
*/
virtual sal_Int64 size() const = 0;
/** Implementations return the current stream position, if possible.
This function may be implemented for some types of unseekable streams,
and MUST be implemented for all seekable streams.
@return
The current position in the stream, or -1, if not implemented.
*/
virtual sal_Int64 tell() const = 0;
/** Implementations seek the stream to the passed position, if
the stream is seekable.
*/
virtual void seek( sal_Int64 nPos ) = 0;
/** Implementations close the stream.
*/
virtual void close() = 0;
/** Returns true, if the implementation supports the seek() operation.
Implementations may still implement size() and tell() even if the
stream is not seekable.
*/
inline bool isSeekable() const { return mbSeekable; }
/** Returns true, if the stream position is invalid (EOF). This flag turns
true *after* the first attempt to seek/read beyond the stream end.
*/
inline bool isEof() const { return mbEof; }
/** Returns the size of the remaining data available in the stream, if
stream supports size() and tell(), otherwise -1.
*/
sal_Int64 getRemaining() const;
/** Seeks the stream to the beginning, if stream is seekable.
*/
inline void seekToStart() { seek( 0 ); }
/** Seeks the stream to the end, if stream is seekable.
*/
inline void seekToEnd() { seek( size() ); }
/** Seeks the stream forward to a position that is a multiple of the passed
block size, if stream is seekable.
@param nBlockSize
The size of the data blocks the streams needs to be aligned to.
@param nAnchorPos
Position in the stream the data blocks are aligned to.
*/
void alignToBlock( sal_Int32 nBlockSize, sal_Int64 nAnchorPos = 0 );
protected:
inline explicit BinaryStreamBase( bool bSeekable ) : mbEof( false ), mbSeekable( bSeekable ) {}
private:
BinaryStreamBase( const BinaryStreamBase& );
BinaryStreamBase& operator=( const BinaryStreamBase& );
protected:
bool mbEof; /// End of stream flag.
private:
const bool mbSeekable; /// True = implementation supports seeking.
};
// ============================================================================
/** Base class for binary input and output streams wrapping a UNO stream,
seekable via the com.sun.star.io.XSeekable interface.
*/
class BinaryXSeekableStream : public virtual BinaryStreamBase
{
public:
virtual ~BinaryXSeekableStream();
/** Returns the size of the stream, if wrapped stream is seekable, otherwise -1. */
virtual sal_Int64 size() const;
/** Returns the current stream position, if wrapped stream is seekable, otherwise -1. */
virtual sal_Int64 tell() const;
/** Seeks the stream to the passed position, if wrapped stream is seekable. */
virtual void seek( sal_Int64 nPos );
/** Releases the reference to the UNO XSeekable interface. */
virtual void close();
protected:
explicit BinaryXSeekableStream(
const ::com::sun::star::uno::Reference< ::com::sun::star::io::XSeekable >& rxSeekable );
private:
::com::sun::star::uno::Reference< ::com::sun::star::io::XSeekable >
mxSeekable; /// Stream seeking interface.
};
// ============================================================================
/** Base class for binary input and output streams wrapping a
StreamDataSequence, which is always seekable.
The wrapped data sequence MUST live at least as long as this stream
wrapper. The data sequence MUST NOT be changed from outside as long as this
stream wrapper is used to modify it.
*/
class SequenceSeekableStream : public virtual BinaryStreamBase
{
public:
/** Returns the size of the wrapped data sequence. */
virtual sal_Int64 size() const;
/** Returns the current stream position. */
virtual sal_Int64 tell() const;
/** Seeks the stream to the passed position. */
virtual void seek( sal_Int64 nPos );
/** Releases the reference to the data sequence. */
virtual void close();
protected:
explicit SequenceSeekableStream( const StreamDataSequence& rData );
protected:
const StreamDataSequence* mpData; /// Wrapped data sequence.
sal_Int32 mnPos; /// Current position in the sequence.
};
// ============================================================================
} // namespace oox
#endif