blob: 99edbdc9007872d84e665de95db73eb7a22f59d6 [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 _VOS_STREAM_HXX_
#define _VOS_STREAM_HXX_
# include <vos/types.hxx>
# include <vos/object.hxx>
# include <vos/istream.hxx>
namespace vos
{
/** Adds seeking capabilities to IStream
*/
class IPositionableStream : public vos::IStream
{
public:
typedef sal_Int32 Offset;
public:
///
virtual sal_Bool SAL_CALL seekTo(Offset position) const = 0;
///
virtual sal_Bool SAL_CALL seekRelative(Offset change) const = 0;
///
virtual sal_Bool SAL_CALL seekToEnd() const = 0;
///
virtual sal_Bool SAL_CALL changeSize(sal_uInt32 new_size) = 0;
///
virtual sal_uInt32 SAL_CALL getSize() const = 0;
///
virtual Offset SAL_CALL getOffset() const = 0;
protected:
IPositionableStream() { }
virtual ~IPositionableStream() { }
};
/** Implements IPositionableStream
*/
class OStream : public vos::OObject,
public vos::IPositionableStream
{
VOS_DECLARE_CLASSINFO(VOS_NAMESPACE(OStream, vos));
public:
///
OStream(IPositionableStream& rStream);
///
virtual ~OStream ();
// ----------------- Read operations -------------------------
///
virtual sal_Int32 SAL_CALL read(void* pbuffer, sal_uInt32 n) const;
///
sal_Int32 SAL_CALL read(IPositionableStream::Offset offset,
void* pbuffer,
sal_uInt32 n) const;
///
inline sal_Bool SAL_CALL read(sal_Int32& value) const;
///
inline sal_Bool SAL_CALL read(sal_Int16& value) const;
///
inline sal_Bool SAL_CALL read(sal_Char& value) const;
///
inline sal_Bool SAL_CALL read(sal_uInt8& value) const;
// ----------------- Write operations ------------------------
///
virtual sal_Int32 SAL_CALL write(const void* pbuffer, sal_uInt32 n);
///
sal_Int32 SAL_CALL write(IPositionableStream::Offset offset,
const void* pbuffer,
sal_uInt32 n);
///
inline sal_Bool SAL_CALL write(sal_Int32 value);
///
inline sal_Bool SAL_CALL write(sal_Int16 value);
///
inline sal_Bool SAL_CALL write(sal_Char value);
///
inline sal_Bool SAL_CALL write(sal_uInt8 value);
///
sal_Bool SAL_CALL append(void* pbuffer, sal_uInt32 n); // Write at the end of the Stream.
// ------------- Positioning and sizing operations ----------
///
inline sal_Bool SAL_CALL seekToBegin() const;
// ----------------- Stream interface ------------------------
///
virtual sal_Bool SAL_CALL seekTo(IPositionableStream::Offset pos) const;
///
virtual sal_Bool SAL_CALL seekToEnd() const;
///
virtual sal_Bool SAL_CALL seekRelative(IPositionableStream::Offset change) const;
///
virtual sal_Bool SAL_CALL changeSize(sal_uInt32 new_size);
///
virtual sal_uInt32 SAL_CALL getSize() const;
///
virtual sal_Bool SAL_CALL isEof() const;
///
virtual IPositionableStream::Offset SAL_CALL getOffset() const;
protected:
IPositionableStream& m_rStream;
// ----------------- Stream operators ------------------------
friend const OStream& operator>> (OStream& rStream, sal_Int32& value);
friend const OStream& operator>> (OStream& rStream, sal_Int16& value);
friend const OStream& operator>> (OStream& rStream, sal_uInt8& value);
friend const OStream& operator>> (OStream& rStream, sal_Char& value);
friend OStream& operator<< (OStream& rStream, sal_Int32 value);
friend OStream& operator<< (OStream& rStream, sal_Int16 value);
friend OStream& operator<< (OStream& rStream, sal_uInt8 value);
friend OStream& operator<< (OStream& rStream, sal_Char value);
};
inline sal_Bool OStream::read(sal_Int32& value) const
{
return (read(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::read(sal_Int16& value) const
{
return (read(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::read(sal_Char& value) const
{
return (read(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::read(sal_uInt8& value) const
{
return (read(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::write(sal_Int32 value)
{
return (write(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::write(sal_Int16 value)
{
return (write(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::write(sal_Char value)
{
return (write(&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::write(sal_uInt8 value)
{
return (write((sal_uInt8*)&value, sizeof(value)) == sizeof(value));
}
inline sal_Bool OStream::seekToBegin() const
{
return (seekTo(0L));
}
inline const OStream& operator>> (OStream& rStream, sal_Int32& value)
{
rStream.read(value);
return (rStream);
}
inline const OStream& operator>> (OStream& rStream, sal_Int16& value)
{
rStream.read(value);
return (rStream);
}
inline const OStream& operator>> (OStream& rStream, sal_uInt8& value)
{
rStream.read(value);
return (rStream);
}
inline const OStream& operator>> (OStream& rStream, sal_Char& value)
{
rStream.read(value);
return (rStream);
}
inline OStream& operator<< (OStream& rStream, sal_Int32 value)
{
rStream.write(value);
return (rStream);
}
inline OStream& operator<< (OStream& rStream, sal_Int16 value)
{
rStream.write(value);
return (rStream);
}
inline OStream& operator<< (OStream& rStream, sal_uInt8 value)
{
rStream.write(value);
return (rStream);
}
inline OStream& operator<< (OStream& rStream, sal_Char value)
{
rStream.write(value);
return (rStream);
}
}
#endif // _VOS_STREAM_HXX_