From f4c09955551730009ed91ab0b58ab43326c9306b Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Thu, 13 Jan 2011 19:10:07 +0000 Subject: In qmfengine, if a method call or method response requires a buffer larger than the static buffer used for communication, allocate a large-enough buffer temporarily from the heap. A test is included to verify large-buffer behavior. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1058709 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qmf/engine/ValueImpl.cpp | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'cpp/src/qmf/engine/ValueImpl.cpp') diff --git a/cpp/src/qmf/engine/ValueImpl.cpp b/cpp/src/qmf/engine/ValueImpl.cpp index 409bf64c35..f9ebbf5028 100644 --- a/cpp/src/qmf/engine/ValueImpl.cpp +++ b/cpp/src/qmf/engine/ValueImpl.cpp @@ -394,6 +394,51 @@ void ValueImpl::encode(Buffer& buf) const } } +uint32_t ValueImpl::encodedSize() const +{ + FieldTable ft; + List fl; + + switch (typecode) { + case TYPE_UINT8 : + case TYPE_BOOL : + case TYPE_INT8 : return 1; + + case TYPE_UINT16 : + case TYPE_INT16 : return 2; + + case TYPE_UINT32 : + case TYPE_INT32 : + case TYPE_FLOAT : return 4; + + case TYPE_UINT64 : + case TYPE_INT64 : + case TYPE_DOUBLE : + case TYPE_ABSTIME : + case TYPE_DELTATIME : return 8; + + case TYPE_UUID : + case TYPE_REF : return 16; + + case TYPE_SSTR : return 1 + stringVal.size(); + case TYPE_LSTR : return 2 + stringVal.size(); + case TYPE_MAP: + mapToFieldTable(ft); + return ft.encodedSize(); + + case TYPE_LIST: + listToFramingList(fl); + return fl.encodedSize(); + + case TYPE_ARRAY: + case TYPE_OBJECT: + default: + break; + } + + return 0; +} + bool ValueImpl::keyInMap(const char* key) const { return typecode == TYPE_MAP && mapVal.count(key) > 0; -- cgit v1.2.1