diff options
Diffstat (limited to 'cpp/lib/common')
-rw-r--r-- | cpp/lib/common/framing/AMQMethodBody.h | 1 | ||||
-rw-r--r-- | cpp/lib/common/framing/FramingContent.cpp | 45 | ||||
-rw-r--r-- | cpp/lib/common/framing/FramingContent.h | 21 |
3 files changed, 56 insertions, 11 deletions
diff --git a/cpp/lib/common/framing/AMQMethodBody.h b/cpp/lib/common/framing/AMQMethodBody.h index a38f580aa5..9f859046f8 100644 --- a/cpp/lib/common/framing/AMQMethodBody.h +++ b/cpp/lib/common/framing/AMQMethodBody.h @@ -26,6 +26,7 @@ #include <AMQBody.h> #include <Buffer.h> #include <AMQP_ServerOperations.h> +#include <MethodContext.h> namespace qpid { namespace framing { diff --git a/cpp/lib/common/framing/FramingContent.cpp b/cpp/lib/common/framing/FramingContent.cpp index 70c56e1fdd..bf3399525e 100644 --- a/cpp/lib/common/framing/FramingContent.cpp +++ b/cpp/lib/common/framing/FramingContent.cpp @@ -22,26 +22,57 @@ #include "Buffer.h" #include "FramingContent.h" +#include <QpidError.h> +#include <sstream> namespace qpid { namespace framing { +Content::Content() : discriminator(0) {} + +Content::Content(u_int8_t _discriminator, const string& _value): discriminator(_discriminator), value(_value) { + validate(); +} + +void Content::validate() { + //validation: + if (discriminator == REFERENCE) { + if(value.empty()) { + //cannot have empty reference + THROW_QPID_ERROR(FRAMING_ERROR, "Reference cannot be empty"); + } + }else if (discriminator != INLINE) { + //invalid discriminator + std::stringstream out; + out << "Invalid discriminator: " << discriminator; + THROW_QPID_ERROR(FRAMING_ERROR, out.str()); + } +} + Content::~Content() {} -void Content::encode(Buffer&) const { - assert(0); // FIXME aconway 2007-01-04: 0-9 feature +void Content::encode(Buffer& buffer) const { + buffer.putOctet(discriminator); + buffer.putLongString(value); } -void Content::decode(Buffer&) { - assert(0); // FIXME aconway 2007-01-04: 0-9 feature +void Content::decode(Buffer& buffer) { + discriminator = buffer.getOctet(); + buffer.getLongString(value); + validate(); } size_t Content::size() const { - assert(0); // FIXME aconway 2007-01-04: 0-9 feature + return 1 + 4 + value.size(); } -std::ostream& operator<<(std::ostream&, const Content&) { - assert(0); // FIXME aconway 2007-01-04: 0-9 feature +std::ostream& operator<<(std::ostream& out, const Content& content) { + if (content.discriminator == REFERENCE) { + out << "{REF:" << content.value << "}"; + } else if (content.discriminator == INLINE) { + out << "{INLINE:" << content.value.size() << " bytes}"; + } + return out; } }} // namespace framing::qpid diff --git a/cpp/lib/common/framing/FramingContent.h b/cpp/lib/common/framing/FramingContent.h index 833e766f9a..0f4a4b8f64 100644 --- a/cpp/lib/common/framing/FramingContent.h +++ b/cpp/lib/common/framing/FramingContent.h @@ -6,19 +6,32 @@ namespace qpid { namespace framing { -/* - * TODO: New Content class required for AMQP 0-9. This is a stub only. +enum discriminator_types { INLINE = 0, REFERENCE = 1 }; + +/** + * A representation of the AMQP 'content' data type (used for message + * bodies) which can hold inline data or a reference. */ class Content { - public: + u_int8_t discriminator; + string value; + + void validate(); + + public: + Content(); + Content(u_int8_t _discriminator, const string& _value); ~Content(); void encode(Buffer& buffer) const; void decode(Buffer& buffer); size_t size() const; + bool isInline() { return discriminator == INLINE; } + bool isReference() { return discriminator == REFERENCE; } + const string& getValue() { return value; } - friend std::ostream& operator<<(std::ostream&, const Content&); + friend std::ostream& operator<<(std::ostream&, const Content&); }; }} // namespace qpid::framing |