18e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
28e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Copyright 2006-2007 Adobe Systems Incorporated
38e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// All Rights Reserved.
48e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener//
58e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
68e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
78e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
88e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
98e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_stream.h#2 $ */
108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $DateTime: 2012/06/01 07:28:57 $ */
118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Change: 832715 $ */
128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Author: tknoll $ */
138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/** Data stream abstraction for serializing and deserializing sequences of
158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *  basic types and RAW image data.
168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener */
178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#ifndef __dng_stream__
218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#define __dng_stream__
228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_classes.h"
268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_types.h"
278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_memory.h"
288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_rational.h"
298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_utils.h"
308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Constants for invalid offset in streams.
348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
358e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerconst uint64 kDNGStreamInvalidOffset = (uint64) (int64) -1;
368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/// Base stream abstraction. Has support for going between stream and pointer
408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/// abstraction.
418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
428e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass dng_stream
438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		enum
488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			kSmallBufferSize =  4 * 1024,
518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			kBigBufferSize   = 64 * 1024,
528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			kDefaultBufferSize = kSmallBufferSize
548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			};
568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fSwapBytes;
608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fHaveLength;
628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 fLength;
648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const uint64 fOffsetInOriginalFile;
668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 fPosition;
688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_memory_data fMemBlock;
708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint8 *fBuffer;
728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fBufferSize;
748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 fBufferStart;
768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 fBufferEnd;
778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 fBufferLimit;
788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fBufferDirty;
808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_abort_sniffer *fSniffer;
828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	protected:
848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream (dng_abort_sniffer *sniffer = NULL,
868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					uint32 bufferSize = kDefaultBufferSize,
878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					uint64 offsetInOriginalFile = kDNGStreamInvalidOffset);
888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual uint64 DoGetLength ();
908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void DoRead (void *data,
928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 uint32 count,
938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 uint64 offset);
948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void DoSetLength (uint64 length);
968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void DoWrite (const void *data,
988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							  uint32 count,
998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							  uint64 offset);
1008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
1028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Construct a stream with initial data.
1048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param data Pointer to initial contents of stream.
1058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param count Number of bytes data is valid for.
1068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param offsetInOriginalFile If data came from a file originally,
1078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// offset can be saved here for later use.
1088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream (const void *data,
1108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					uint32 count,
1118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					uint64 offsetInOriginalFile = kDNGStreamInvalidOffset);
1128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual ~dng_stream ();
1148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for whether stream is swapping byte order on input/output.
1168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval If true, data will be swapped on input/output.
1178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool SwapBytes () const
1198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fSwapBytes;
1218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for whether stream is swapping byte order on input/output.
1248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param swapBytes If true, stream will swap byte order on input or
1258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// output for future reads/writes.
1268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetSwapBytes (bool swapBytes)
1288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fSwapBytes = swapBytes;
1308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for whether data in stream is big endian.
1338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval If true, data in stream is big endian.
1348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool BigEndian () const;
1368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for whether data in stream is big endian.
1388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param bigEndian If true, data in stream is big endian.
1398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetBigEndian (bool bigEndian = true);
1418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for whether data in stream is big endian.
1438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval If true, data in stream is big endian.
1448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool LittleEndian () const
1468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return !BigEndian ();
1488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Setter for whether data in stream is big endian.
1518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param littleEndian If true, data in stream is big endian.
1528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetLittleEndian (bool littleEndian = true)
1548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			SetBigEndian (!littleEndian);
1568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Returns the size of the buffer used by the stream.
1598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 BufferSize () const
1618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fBufferSize;
1638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for length of data in stream.
1668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval Length of readable data in stream.
1678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 Length ()
1698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			if (!fHaveLength)
1728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				{
1738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fLength = DoGetLength ();
1758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fHaveLength = true;
1778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				}
1798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fLength;
1818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for current offset in stream.
1858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval current offset from start of stream.
1868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 Position () const
1888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fPosition;
1908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for current position in original file, taking into account
1938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// OffsetInOriginalFile stream data was taken from.
1948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval kInvalidOffset if no offset in original file is set, sum
1958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// of offset in original file and current position otherwise.
1968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 PositionInOriginalFile () const;
1988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for offset in original file.
2008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval kInvalidOffset if no offset in original file is set,
2018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// offset in original file otherwise.
2028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 OffsetInOriginalFile () const;
2048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Return pointer to stream contents if the stream is entirely
2068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// available as a single memory block, NULL otherwise.
2078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		const void * Data () const;
2098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Return the entire stream as a single memory block.
2118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// This works for all streams, but requires copying the data to a new buffer.
2128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param allocator Allocator used to allocate memory.
2138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_memory_block * AsMemoryBlock (dng_memory_allocator &allocator);
2158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Seek to a new position in stream for reading.
2178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetReadPosition (uint64 offset);
2198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Skip forward in stream.
2218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param delta Number of bytes to skip forward.
2228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Skip (uint64 delta)
2248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			SetReadPosition (Position () + delta);
2268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
2278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get data from stream. Exception is thrown and no data is read if
2298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// insufficient data available in stream.
2308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param data Buffer to put data into. Must be valid for count bytes.
2318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param count Bytes of data to read.
2328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
2338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
2348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Get (void *data, uint32 count);
2368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Seek to a new position in stream for writing.
2388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetWritePosition (uint64 offset);
2408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Force any stored data in stream to be written to underlying storage.
2428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Flush ();
2448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Set length of available data.
2468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param length Number of bytes of avialble data in stream.
2478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetLength (uint64 length);
2498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Write data to stream.
2518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param data Buffer of data to write to stream.
2528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param count Bytes of in data.
2538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put (const void *data, uint32 count);
2558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get an unsigned 8-bit integer from stream and advance read position.
2578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One unsigned 8-bit integer.
2588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
2598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
2608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint8 Get_uint8 ()
2628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Fast check to see if in buffer
2658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			if (fPosition >= fBufferStart && fPosition < fBufferEnd)
2678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				{
2688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				return fBuffer [fPosition++ - fBufferStart];
2708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				}
2728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Not in buffer, let main routine do the work.
2748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			uint8 x;
2768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			Get (&x, 1);
2788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return x;
2808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
2828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put an unsigned 8-bit integer to stream and advance write position.
2848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One unsigned 8-bit integer.
2858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_uint8 (uint8 x)
2878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			if (fBufferDirty               &&
2908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			    fPosition  >= fBufferStart &&
2918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fPosition  <= fBufferEnd   &&
2928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fPosition  <  fBufferLimit)
2938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				{
2948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fBuffer [fPosition - fBufferStart] = x;
2968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fPosition++;
2988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				if (fBufferEnd < fPosition)
3008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					fBufferEnd = fPosition;
3018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fLength = Max_uint64 (Length (), fPosition);
3038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				}
3058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			else
3078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				{
3088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				Put (&x, 1);
3108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				}
3128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get an unsigned 16-bit integer from stream and advance read position.
3168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One unsigned 16-bit integer.
3188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
3198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
3208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint16 Get_uint16 ();
3228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put an unsigned 16-bit integer to stream and advance write position.
3248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One unsigned 16-bit integer.
3268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_uint16 (uint16 x);
3288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get an unsigned 32-bit integer from stream and advance read position.
3308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One unsigned 32-bit integer.
3328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
3338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
3348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 Get_uint32 ();
3368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put an unsigned 32-bit integer to stream and advance write position.
3388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One unsigned 32-bit integer.
3408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_uint32 (uint32 x);
3428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get an unsigned 64-bit integer from stream and advance read position.
3448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One unsigned 64-bit integer.
3468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
3478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
3488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 Get_uint64 ();
3508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put an unsigned 64-bit integer to stream and advance write position.
3528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One unsigned 64-bit integer.
3548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_uint64 (uint64 x);
3568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get one 8-bit integer from stream and advance read position.
3588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 8-bit integer.
3598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
3608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
3618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		int8 Get_int8 ()
3638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return (int8) Get_uint8 ();
3658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put one 8-bit integer to stream and advance write position.
3688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One  8-bit integer.
3698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_int8 (int8 x)
3718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			Put_uint8 ((uint8) x);
3738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get one 16-bit integer from stream and advance read position.
3768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 16-bit integer.
3788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
3798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
3808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		int16 Get_int16 ()
3828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return (int16) Get_uint16 ();
3848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put one 16-bit integer to stream and advance write position.
3878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One 16-bit integer.
3898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_int16 (int16 x)
3918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			Put_uint16 ((uint16) x);
3938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get one 32-bit integer from stream and advance read position.
3968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
3978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 32-bit integer.
3988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
3998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
4008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		int32 Get_int32 ()
4028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return (int32) Get_uint32 ();
4048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put one 32-bit integer to stream and advance write position.
4078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
4088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One 32-bit integer.
4098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_int32 (int32 x)
4118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			Put_uint32 ((uint32) x);
4138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get one 64-bit integer from stream and advance read position.
4168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
4178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 64-bit integer.
4188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
4198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
4208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		int64 Get_int64 ()
4228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return (int64) Get_uint64 ();
4248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put one 64-bit integer to stream and advance write position.
4278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Byte swap if byte swapping is turned on.
4288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One 64-bit integer.
4298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_int64 (int64 x)
4318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			Put_uint64 ((uint64) x);
4338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get one 32-bit IEEE floating-point number from stream and advance
4368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// read position. Byte swap if byte swapping is turned on.
4378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 32-bit IEEE floating-point number.
4388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
4398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
4408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		real32 Get_real32 ();
4428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put one 32-bit IEEE floating-point number to stream and advance write
4448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// position. Byte swap if byte swapping is turned on.
4458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One 32-bit IEEE floating-point number.
4468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_real32 (real32 x);
4488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get one 64-bit IEEE floating-point number from stream and advance
4508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// read position. Byte swap if byte swapping is turned on.
4518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 64-bit IEEE floating-point number .
4528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
4538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
4548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		real64 Get_real64 ();
4568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Put one 64-bit IEEE floating-point number to stream and advance write
4588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// position. Byte swap if byte swapping is turned on.
4598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param x One64-bit IEEE floating-point number.
4608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Put_real64 (real64 x);
4628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get an 8-bit character string from stream and advance read position.
4648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Routine always reads until a NUL character (8-bits of zero) is read.
4658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// (That is, only maxLength bytes will be returned in buffer, but the
4668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// stream is always advanced until a NUL is read or EOF is reached.)
4678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param data Buffer in which string is returned.
4688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param maxLength Maximum number of bytes to place in buffer.
4698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
4708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if stream runs out before NUL is seen.
4718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Get_CString (char *data,
4738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						  uint32 maxLength);
4748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get a 16-bit character string from stream and advance read position.
4768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// 16-bit characters are truncated to 8-bits.
4778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Routine always reads until a NUL character (16-bits of zero) is read.
4788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// (That is, only maxLength bytes will be returned in buffer, but the
4798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// stream is always advanced until a NUL is read or EOF is reached.)
4808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param data Buffer to place string in.
4818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param maxLength Maximum number of bytes to place in buffer.
4828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
4838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if stream runs out before NUL is seen.
4848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void Get_UString (char *data,
4868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						  uint32 maxLength);
4878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Writes the specified number of zero bytes to stream.
4898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param count Number of zero bytes to write.
4908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void PutZeros (uint64 count);
4928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Writes zeros to align the stream position to a multiple of 2.
4948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void PadAlign2 ();
4968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Writes zeros to align the stream position to a multiple of 4.
4988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void PadAlign4 ();
5008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get a value of size indicated by tag type from stream and advance
5028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// read position. Byte swap if byte swapping is turned on and tag type
5038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// is larger than a byte. Value is returned as an unsigned 32-bit integer.
5048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param tagType Tag type of data stored in stream.
5058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One unsigned 32-bit integer.
5068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
5078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
5088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 TagValue_uint32 (uint32 tagType);
5108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get a value of size indicated by tag type from stream and advance read
5128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// position. Byte swap if byte swapping is turned on and tag type is larger
5138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// than a byte. Value is returned as a 32-bit integer.
5148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param tagType Tag type of data stored in stream.
5158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 32-bit integer.
5168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
5178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
5188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		int32 TagValue_int32 (uint32 tagType);
5208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get a value of size indicated by tag type from stream and advance read
5228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// position. Byte swap if byte swapping is turned on and tag type is larger
5238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// than a byte. Value is returned as a dng_urational.
5248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param tagType Tag type of data stored in stream.
5258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One dng_urational.
5268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
5278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
5288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_urational TagValue_urational (uint32 tagType);
5308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get a value of size indicated by tag type from stream and advance read
5328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// position. Byte swap if byte swapping is turned on and tag type is larger
5338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// than a byte. Value is returned as a dng_srational.
5348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param tagType Tag type of data stored in stream.
5358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One dng_srational.
5368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
5378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
5388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_srational TagValue_srational (uint32 tagType);
5408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Get a value of size indicated by tag type from stream and advance read
5428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// position. Byte swap if byte swapping is turned on and tag type is larger
5438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// than a byte. Value is returned as a 64-bit IEEE floating-point number.
5448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param tagType Tag type of data stored in stream.
5458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval One 64-bit IEEE floating-point number.
5468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \exception dng_exception with fErrorCode equal to dng_error_end_of_file
5478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// if not enough data in stream.
5488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		real64 TagValue_real64 (uint32 tagType);
5508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Getter for sniffer associated with stream.
5528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \retval The sniffer for this stream.
5538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_abort_sniffer * Sniffer () const
5558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fSniffer;
5578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Putter for sniffer associated with stream.
5608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param sniffer The new sniffer to use (or NULL for none).
5618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void SetSniffer (dng_abort_sniffer *sniffer)
5638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
5648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fSniffer = sniffer;
5658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Copy a specified number of bytes to a target stream.
5688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param dstStream The target stream.
5698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param count The number of bytes to copy.
5708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void CopyToStream (dng_stream &dstStream,
5728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								   uint64 count);
5738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// Makes the target stream a copy of this stream.
5758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		/// \param dstStream The target stream.
5768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		void DuplicateStream (dng_stream &dstStream);
5788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
5808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Hidden copy constructor and assignment operator.
5828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream (const dng_stream &stream);
5848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream & operator= (const dng_stream &stream);
5868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
5888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
5908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5918e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass TempBigEndian
5928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
5938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
5958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream & fStream;
5978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		bool fOldSwap;
5998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
6018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		TempBigEndian (dng_stream &stream,
6038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					   bool bigEndian = true);
6048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual ~TempBigEndian ();
6068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
6088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
6108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6118e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass TempLittleEndian: public TempBigEndian
6128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
6138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
6158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		TempLittleEndian (dng_stream &stream,
6178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						  bool littleEndian = true)
6188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	TempBigEndian (stream, !littleEndian)
6208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual ~TempLittleEndian ()
6258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
6298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
6318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6328e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass TempStreamSniffer
6338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
6348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
6368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream & fStream;
6388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_abort_sniffer *fOldSniffer;
6408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
6428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		TempStreamSniffer (dng_stream &stream,
6448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					       dng_abort_sniffer *sniffer);
6458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual ~TempStreamSniffer ();
6478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
6498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Hidden copy constructor and assignment operator.
6518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		TempStreamSniffer (const TempStreamSniffer &temp);
6538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		TempStreamSniffer & operator= (const TempStreamSniffer &temp);
6558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
6578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
6598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6608e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass PreserveStreamReadPosition
6618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
6628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
6648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_stream & fStream;
6668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint64 fPosition;
6688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
6708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		PreserveStreamReadPosition (dng_stream &stream)
6728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	fStream	  (stream)
6748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fPosition (stream.Position ())
6758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		~PreserveStreamReadPosition ()
6808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
6818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fStream.SetReadPosition (fPosition);
6828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
6838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
6858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Hidden copy constructor and assignment operator.
6878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		PreserveStreamReadPosition (const PreserveStreamReadPosition &rhs);
6898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		PreserveStreamReadPosition & operator= (const PreserveStreamReadPosition &rhs);
6918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
6938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
6958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#endif
6978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
6988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
699