ReadWriteSection.cpp [plain text]
#include "ReadWriteSection.h"
uint32 WriteSection::put(uint32 inOffset, uint32 inValue)
{
uint32 aLength = CheckUInt32Add(inOffset, sizeof(inValue));
if (aLength > mCapacity)
grow(aLength);
if (mAddress == NULL)
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
*reinterpret_cast<uint32 *>(mAddress + inOffset) = htonl(inValue);
return aLength;
}
uint32 WriteSection::put(uint32 inOffset, uint32 inLength, const uint8 *inData)
{
if (inLength == 0 || inData == NULL)
{
return inOffset;
}
uint32 aLength = CheckUInt32Add(inOffset, inLength);
uint32 aNewOffset = align(aLength);
if (aNewOffset > mCapacity)
grow(aNewOffset);
if (mAddress == NULL)
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
memcpy(mAddress + inOffset, inData, inLength);
for (uint32 anOffset = aLength; anOffset < aNewOffset; anOffset++)
mAddress[anOffset] = 0;
return aNewOffset;
}
void WriteSection::grow(size_t inNewCapacity)
{
size_t n = CheckUInt32Multiply(mCapacity, 2);
size_t aNewCapacity = max(n, inNewCapacity);
mAddress = reinterpret_cast<uint8 *>(mAllocator.realloc(mAddress, aNewCapacity));
memset(mAddress + mCapacity, 0, aNewCapacity - mCapacity);
mCapacity = aNewCapacity;
}