summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/db/mork/morkBlob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/db/mork/morkBlob.cpp')
-rw-r--r--comm/mailnews/db/mork/morkBlob.cpp96
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