diff --git a/headers/private/shared/DataBuffer.h b/headers/private/shared/DataBuffer.h index 4d8abf3844..cd9631ce06 100644 --- a/headers/private/shared/DataBuffer.h +++ b/headers/private/shared/DataBuffer.h @@ -25,14 +25,14 @@ class BDataBuffer { public: BDataBuffer(size_t len); - BDataBuffer(void* data, size_t len); + BDataBuffer(void* data, size_t len, bool copy = false); BDataBuffer(const BDataBuffer& rhs); ~BDataBuffer(); BDataBuffer& operator=(const BDataBuffer& rhs); size_t BufferSize() const; - const void* Buffer(); + const void* Buffer() const; private: class BDataReference @@ -41,21 +41,22 @@ class BDataBuffer void Acquire(BDataReference*& ref); void Release(BDataReference*& ref); - char* Data() { return data; } - size_t Size() const { return size; } - int32 Count() { return count; } + char* Data() { return fData; } + size_t Size() const { return fSize; } + int32 Count() { return fCount; } - static void Create(void* data, size_t len, BDataReference*& ref); + static void Create(void* data, size_t len, BDataReference*& ref, + bool copy = false); static void Create(size_t len, BDataReference*& ref); private: - BDataReference(void* data, size_t len); + BDataReference(void* data, size_t len, bool copy = false); BDataReference(size_t len); ~BDataReference(); - char* data; - size_t size; - int32 count; + char* fData; + size_t fSize; + int32 fCount; }; BDataBuffer(); // No default construction allowed! diff --git a/src/kits/support/DataBuffer.cpp b/src/kits/support/DataBuffer.cpp index c2dc7c84b1..905adefe16 100644 --- a/src/kits/support/DataBuffer.cpp +++ b/src/kits/support/DataBuffer.cpp @@ -25,9 +25,9 @@ BDataBuffer::BDataBuffer(size_t len) BDataReference::Create(len, fDataRef); } //------------------------------------------------------------------------------ -BDataBuffer::BDataBuffer(void* data, size_t len) +BDataBuffer::BDataBuffer(void* data, size_t len, bool copy) { - BDataReference::Create(data, len, fDataRef); + BDataReference::Create(data, len, fDataRef, copy); } //------------------------------------------------------------------------------ BDataBuffer::BDataBuffer(const BDataBuffer& rhs) @@ -58,7 +58,7 @@ size_t BDataBuffer::BufferSize() const return fDataRef->Size(); } //------------------------------------------------------------------------------ -const void* BDataBuffer::Buffer() +const void* BDataBuffer::Buffer() const { return (const void*)fDataRef->Data(); } @@ -67,9 +67,9 @@ const void* BDataBuffer::Buffer() //------------------------------------------------------------------------------ void BDataBuffer::BDataReference::Create(void* data, size_t len, - BDataReference*& ref) + BDataReference*& ref, bool copy) { - BDataReference* temp = new BDataReference(data, len); + BDataReference* temp = new BDataReference(data, len, copy); temp->Acquire(ref); } //------------------------------------------------------------------------------ @@ -82,38 +82,45 @@ void BDataBuffer::BDataReference::Create(size_t len, BDataReference*& ref) void BDataBuffer::BDataReference::Acquire(BDataReference*& ref) { ref = this; - ++count; + ++fCount; } //------------------------------------------------------------------------------ void BDataBuffer::BDataReference::Release(BDataReference*& ref) { ref = NULL; - --count; - if (count <= 0) + --fCount; + if (fCount <= 0) { delete this; } } //------------------------------------------------------------------------------ -BDataBuffer::BDataReference::BDataReference(void* data, size_t len) - : data(NULL), size(len), count(0) +BDataBuffer::BDataReference::BDataReference(void* data, size_t len, bool copy) + : fData(NULL), fSize(len), fCount(0) { - data = new char[len]; - memcpy((void*)data, data, len); + if (copy) + { + fData = new char[fSize]; + memcpy((void*)fData, data, fSize); + } + else + { + fData = (char*)data; + } } //------------------------------------------------------------------------------ BDataBuffer::BDataReference::BDataReference(size_t len) - : data(NULL), size(len), count(0) + : fData(NULL), fSize(len), fCount(0) { - data = new char[len]; + fData = new char[fSize]; } //------------------------------------------------------------------------------ BDataBuffer::BDataReference::~BDataReference() { - if (data) + if (fData) { - delete[] data; - data = NULL; + delete[] fData; + fData = NULL; } } //------------------------------------------------------------------------------