dng_memory_block * dng_stream::AsMemoryBlock (dng_memory_allocator &allocator) { Flush (); uint64 len64 = Length (); if (len64 > 0xFFFFFFFF) { ThrowProgramError (); } uint32 len = (uint32) len64; AutoPtr<dng_memory_block> block (allocator.Allocate (len)); if (len) { SetReadPosition (0); Get (block->Buffer (), len); } return block.Release (); }
void dng_stream::DuplicateStream (dng_stream &dstStream) { // Turn off sniffers for this operation. TempStreamSniffer noSniffer1 (*this , NULL); TempStreamSniffer noSniffer2 (dstStream, NULL); // First grow the destination stream if required, in an attempt to // reserve any needed space before overwriting the existing data. if (dstStream.Length () < Length ()) { dstStream.SetLength (Length ()); } SetReadPosition (0); dstStream.SetWritePosition (0); CopyToStream (dstStream, Length ()); dstStream.Flush (); dstStream.SetLength (Length ()); }
//------------------------------------------------------------------------------ ByteBufferUPtr BinaryInputStream::ReadAll() noexcept { CS_ASSERT(IsValid(), "Trying to use an invalid FileStream."); //Reset the read position to the beginning SetReadPosition(0); return Read(m_length); }
void dng_memory_stream::CopyToStream (dng_stream &dstStream, uint64 count) { if (count < kBigBufferSize) { dng_stream::CopyToStream (dstStream, count); } else { Flush (); uint64 offset = Position (); if (offset + count > Length ()) { ThrowEndOfFile (); } while (count) { uint32 pageIndex = (uint32) (offset / fPageSize); uint32 pageOffset = (uint32) (offset % fPageSize); uint32 blockCount = (uint32) Min_uint64 (fPageSize - pageOffset, count); const uint8 *sPtr = fPageList [pageIndex]->Buffer_uint8 () + pageOffset; dstStream.Put (sPtr, blockCount); offset += blockCount; count -= blockCount; } SetReadPosition (offset); } }