summaryrefslogtreecommitdiff
path: root/cpp/lib/common
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/lib/common')
-rw-r--r--cpp/lib/common/framing/AMQMethodBody.h1
-rw-r--r--cpp/lib/common/framing/FramingContent.cpp45
-rw-r--r--cpp/lib/common/framing/FramingContent.h21
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