diff options
Diffstat (limited to 'comm/mailnews/db/mork/morkBlob.cpp')
-rw-r--r-- | comm/mailnews/db/mork/morkBlob.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/comm/mailnews/db/mork/morkBlob.cpp b/comm/mailnews/db/mork/morkBlob.cpp new file mode 100644 index 0000000000..d0fdf104ff --- /dev/null +++ b/comm/mailnews/db/mork/morkBlob.cpp @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef _MDB_ +# include "mdb.h" +#endif + +#ifndef _MORK_ +# include "mork.h" +#endif + +#ifndef _MORKBLOB_ +# include "morkBlob.h" +#endif + +#ifndef _MORKENV_ +# include "morkEnv.h" +#endif + +// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789 + +/*static*/ void morkBuf::NilBufBodyError(morkEnv* ev) { + ev->NewError("nil mBuf_Body"); +} + +// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789 + +/*static*/ void morkBlob::BlobFillOverSizeError(morkEnv* ev) { + ev->NewError("mBuf_Fill > mBlob_Size"); +} + +// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789 + +mork_bool morkBlob::GrowBlob(morkEnv* ev, nsIMdbHeap* ioHeap, + mork_size inNewSize) { + if (ioHeap) { + if (!mBuf_Body) // no body? implies zero sized? + mBlob_Size = 0; + + if (mBuf_Fill > mBlob_Size) // fill more than size? + { + ev->NewWarning("mBuf_Fill > mBlob_Size"); + mBuf_Fill = mBlob_Size; + } + + if (inNewSize > mBlob_Size) // need to allocate larger blob? + { + mork_u1* body = 0; + ioHeap->Alloc(ev->AsMdbEnv(), inNewSize, (void**)&body); + if (body && ev->Good()) { + void* oldBody = mBuf_Body; + if (mBlob_Size) // any old content to transfer? + MORK_MEMCPY(body, oldBody, mBlob_Size); + + mBlob_Size = inNewSize; // install new size + mBuf_Body = body; // install new body + + if (oldBody) // need to free old buffer body? + ioHeap->Free(ev->AsMdbEnv(), oldBody); + } + } + } else + ev->NilPointerError(); + + if (ev->Good() && mBlob_Size < inNewSize) + ev->NewError("mBlob_Size < inNewSize"); + + return ev->Good(); +} + +// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789 + +morkCoil::morkCoil(morkEnv* ev, nsIMdbHeap* ioHeap) { + mBuf_Body = 0; + mBuf_Fill = 0; + mBlob_Size = 0; + mText_Form = 0; + mCoil_Heap = ioHeap; + if (!ioHeap) ev->NilPointerError(); +} + +void morkCoil::CloseCoil(morkEnv* ev) { + void* body = mBuf_Body; + nsIMdbHeap* heap = mCoil_Heap; + + mBuf_Body = 0; + mCoil_Heap = 0; + + if (body && heap) { + heap->Free(ev->AsMdbEnv(), body); + } +} + +// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789 |