+ void SetBufSize(size_t size) { ResizeIfNeeded(size); }
+ void SetDataLen(size_t len)
+ {
+ wxASSERT(len <= m_size);
+ m_len = len;
+ }
+
+ // Ensure the buffer is big enough and return a pointer to it
+ void* GetWriteBuf(size_t sizeNeeded)
+ {
+ ResizeIfNeeded(sizeNeeded);
+ return m_data;
+ }
+ // Update the length after the write
+ void UngetWriteBuf(size_t sizeUsed) { SetDataLen(sizeUsed); }
+
+ // Like the above, but appends to the buffer
+ void* GetAppendBuf(size_t sizeNeeded)
+ {
+ ResizeIfNeeded(m_len + sizeNeeded);
+ return (char*)m_data + m_len;
+ }
+ void UngetAppendBuf(size_t sizeUsed) { SetDataLen(m_len + sizeUsed); }
+
+ // Other ways to append to the buffer
+ void AppendByte(char data) {
+ ResizeIfNeeded(m_len + 1);
+ *(((char*)m_data)+m_len) = data;
+ m_len += 1;
+ }
+ void AppendData(void* data, size_t len)
+ {
+ memcpy(GetAppendBuf(len), data, len);
+ UngetAppendBuf(len);
+ }
+
+ operator const char *() const { return (const char*)m_data; }
+
+
+ // Copy and assignment
+ wxMemoryBuffer(const wxMemoryBuffer& src)
+ : m_data(src.m_data), m_size(src.m_size), m_len(src.m_len)
+ {
+ // no reference count yet...
+ ((wxMemoryBuffer*)&src)->m_data = NULL;
+ ((wxMemoryBuffer*)&src)->m_size = 0;
+ ((wxMemoryBuffer*)&src)->m_len = 0;
+ }
+
+ wxMemoryBuffer& operator=(const wxMemoryBuffer& src)
+ {
+ m_data = src.m_data;
+ m_size = src.m_size;
+ m_len = src.m_len;
+
+ // no reference count yet...
+ ((wxMemoryBuffer*)&src)->m_data = NULL;
+ ((wxMemoryBuffer*)&src)->m_size = 0;
+ ((wxMemoryBuffer*)&src)->m_len = 0;
+
+ return *this;
+ }
+
+
+protected:
+ void ResizeIfNeeded(size_t newSize)
+ {
+ if (newSize > m_size)
+ {
+ m_data = realloc(m_data, newSize + wxMemoryBuffer::BLOCK_SIZE);
+ wxASSERT(m_data != NULL);
+ m_size = newSize + wxMemoryBuffer::BLOCK_SIZE;
+ }
+ }