1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// --------------------------------------------------------------------------
//
// File
// Name: PartialReadStream.h
// Purpose: Read part of another stream
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
#include "Box.h"
#include "PartialReadStream.h"
#include "CommonException.h"
#include "MemLeakFindOn.h"
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::PartialReadStream(IOStream &,
// pos_type)
// Purpose: Constructor, taking another stream and the number of
// bytes to be read from it.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
PartialReadStream::PartialReadStream(IOStream &rSource,
pos_type BytesToRead)
: mrSource(rSource),
mBytesLeft(BytesToRead)
{
ASSERT(BytesToRead > 0);
}
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::~PartialReadStream()
// Purpose: Destructor. Won't absorb any unread bytes.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
PartialReadStream::~PartialReadStream()
{
// Warn in debug mode
if(mBytesLeft != 0)
{
BOX_TRACE("PartialReadStream destroyed with " << mBytesLeft <<
" bytes remaining");
}
}
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::Read(void *, int, int)
// Purpose: As interface.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
int PartialReadStream::Read(void *pBuffer, int NBytes, int Timeout)
{
// Finished?
if(mBytesLeft <= 0)
{
return 0;
}
// Asking for more than is allowed?
if(NBytes > mBytesLeft)
{
// Adjust downwards
NBytes = mBytesLeft;
}
// Route the request to the source
int read = mrSource.Read(pBuffer, NBytes, Timeout);
ASSERT(read <= mBytesLeft);
// Adjust the count
mBytesLeft -= read;
// Return the number read
return read;
}
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::BytesLeftToRead()
// Purpose: As interface.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
IOStream::pos_type PartialReadStream::BytesLeftToRead()
{
return mBytesLeft;
}
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::Write(const void *, int)
// Purpose: As interface. But will exception.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
void PartialReadStream::Write(const void *pBuffer, int NBytes, int Timeout)
{
THROW_EXCEPTION(CommonException, CantWriteToPartialReadStream)
}
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::StreamDataLeft()
// Purpose: As interface.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
bool PartialReadStream::StreamDataLeft()
{
return mBytesLeft != 0;
}
// --------------------------------------------------------------------------
//
// Function
// Name: PartialReadStream::StreamClosed()
// Purpose: As interface.
// Created: 2003/08/26
//
// --------------------------------------------------------------------------
bool PartialReadStream::StreamClosed()
{
// always closed
return true;
}
|