diff options
Diffstat (limited to 'cpp/common/framing/inc')
-rw-r--r-- | cpp/common/framing/inc/AMQBody.h | 8 | ||||
-rw-r--r-- | cpp/common/framing/inc/AMQContentBody.h | 1 | ||||
-rw-r--r-- | cpp/common/framing/inc/AMQHeaderBody.h | 2 | ||||
-rw-r--r-- | cpp/common/framing/inc/AMQHeartbeatBody.h | 3 | ||||
-rw-r--r-- | cpp/common/framing/inc/Buffer.h | 3 | ||||
-rw-r--r-- | cpp/common/framing/inc/FieldTable.h | 72 | ||||
-rw-r--r-- | cpp/common/framing/inc/NamedValue.h | 49 | ||||
-rw-r--r-- | cpp/common/framing/inc/Value.h | 207 |
8 files changed, 182 insertions, 163 deletions
diff --git a/cpp/common/framing/inc/AMQBody.h b/cpp/common/framing/inc/AMQBody.h index d4b436c949..a1770820a9 100644 --- a/cpp/common/framing/inc/AMQBody.h +++ b/cpp/common/framing/inc/AMQBody.h @@ -27,18 +27,20 @@ namespace qpid { class AMQBody { - public: + public: typedef std::tr1::shared_ptr<AMQBody> shared_ptr; + virtual ~AMQBody(); virtual u_int32_t size() const = 0; virtual u_int8_t type() const = 0; virtual void encode(Buffer& buffer) const = 0; virtual void decode(Buffer& buffer, u_int32_t size) = 0; - inline virtual ~AMQBody(){} + virtual void print(std::ostream& out) const; }; - enum body_types {METHOD_BODY = 1, HEADER_BODY = 2, CONTENT_BODY = 3, HEARTBEAT_BODY = 8}; + std::ostream& operator<<(std::ostream& out, const AMQBody& body) ; + enum body_types {METHOD_BODY = 1, HEADER_BODY = 2, CONTENT_BODY = 3, HEARTBEAT_BODY = 8}; } } diff --git a/cpp/common/framing/inc/AMQContentBody.h b/cpp/common/framing/inc/AMQContentBody.h index 8e97c31edb..1a6f2cf117 100644 --- a/cpp/common/framing/inc/AMQContentBody.h +++ b/cpp/common/framing/inc/AMQContentBody.h @@ -40,6 +40,7 @@ public: u_int32_t size() const; void encode(Buffer& buffer) const; void decode(Buffer& buffer, u_int32_t size); + void print(std::ostream& out) const; }; } diff --git a/cpp/common/framing/inc/AMQHeaderBody.h b/cpp/common/framing/inc/AMQHeaderBody.h index 369db8a9c8..e39fffa8ce 100644 --- a/cpp/common/framing/inc/AMQHeaderBody.h +++ b/cpp/common/framing/inc/AMQHeaderBody.h @@ -40,12 +40,14 @@ public: AMQHeaderBody(); inline u_int8_t type() const { return HEADER_BODY; } HeaderProperties* getProperties(){ return properties; } + const HeaderProperties* getProperties() const { return properties; } inline u_int64_t getContentSize() const { return contentSize; } inline void setContentSize(u_int64_t size) { contentSize = size; } virtual ~AMQHeaderBody(); virtual u_int32_t size() const; virtual void encode(Buffer& buffer) const; virtual void decode(Buffer& buffer, u_int32_t size); + virtual void print(std::ostream& out) const; }; } diff --git a/cpp/common/framing/inc/AMQHeartbeatBody.h b/cpp/common/framing/inc/AMQHeartbeatBody.h index ca2def977a..cfe057bdcd 100644 --- a/cpp/common/framing/inc/AMQHeartbeatBody.h +++ b/cpp/common/framing/inc/AMQHeartbeatBody.h @@ -30,11 +30,12 @@ class AMQHeartbeatBody : virtual public AMQBody public: typedef std::tr1::shared_ptr<AMQHeartbeatBody> shared_ptr; - virtual ~AMQHeartbeatBody() {} + virtual ~AMQHeartbeatBody(); inline u_int32_t size() const { return 0; } inline u_int8_t type() const { return HEARTBEAT_BODY; } inline void encode(Buffer& buffer) const {} inline void decode(Buffer& buffer, u_int32_t size) {} + virtual void print(std::ostream& out) const; }; } diff --git a/cpp/common/framing/inc/Buffer.h b/cpp/common/framing/inc/Buffer.h index 1ff4611f1f..e0532cc9d6 100644 --- a/cpp/common/framing/inc/Buffer.h +++ b/cpp/common/framing/inc/Buffer.h @@ -16,7 +16,6 @@ * */ #include "amqp_types.h" -#include "FieldTable.h" #ifndef _Buffer_ #define _Buffer_ @@ -24,6 +23,8 @@ namespace qpid { namespace framing { +class FieldTable; + class Buffer { const int size; diff --git a/cpp/common/framing/inc/FieldTable.h b/cpp/common/framing/inc/FieldTable.h index cf935d3284..7da914968e 100644 --- a/cpp/common/framing/inc/FieldTable.h +++ b/cpp/common/framing/inc/FieldTable.h @@ -17,6 +17,8 @@ */ #include <iostream> #include <vector> +#include <tr1/memory> +#include <tr1/unordered_map> #include "amqp_types.h" #ifndef _FieldTable_ @@ -25,42 +27,50 @@ namespace qpid { namespace framing { - class NamedValue; - class Value; - class Buffer; +class Value; +class Buffer; - class FieldTable - { - std::vector<NamedValue*> values; - NamedValue* find(const std::string& name) const; +class FieldTable +{ + public: + typedef std::tr1::shared_ptr<Value> ValuePtr; + typedef std::tr1::unordered_map<std::string, ValuePtr> ValueMap; - Value* getValue(const std::string& name) const; - void setValue(const std::string& name, Value* value); + ~FieldTable(); + u_int32_t size() const; + int count() const; + void setString(const std::string& name, const std::string& value); + void setInt(const std::string& name, int value); + void setTimestamp(const std::string& name, u_int64_t value); + void setTable(const std::string& name, const FieldTable& value); + //void setDecimal(string& name, xxx& value); + std::string getString(const std::string& name) const; + int getInt(const std::string& name) const; + u_int64_t getTimestamp(const std::string& name) const; + void getTable(const std::string& name, FieldTable& value) const; + //void getDecimal(string& name, xxx& value); + void erase(const std::string& name); + + void encode(Buffer& buffer) const; + void decode(Buffer& buffer); - public: - ~FieldTable(); - u_int32_t size() const; - int count() const; - void setString(const std::string& name, const std::string& value); - void setInt(const std::string& name, int value); - void setTimestamp(const std::string& name, u_int64_t value); - void setTable(const std::string& name, const FieldTable& value); - //void setDecimal(string& name, xxx& value); - std::string getString(const std::string& name); - int getInt(const std::string& name); - u_int64_t getTimestamp(const std::string& name); - void getTable(const std::string& name, FieldTable& value); - //void getDecimal(string& name, xxx& value); + bool operator==(const FieldTable& other) const; - void encode(Buffer& buffer) const; - void decode(Buffer& buffer); + // TODO aconway 2006-09-26: Yeuch! Rework FieldTable to have + // a map-like interface. + const ValueMap& getMap() const { return values; } + ValueMap& getMap() { return values; } + + + private: + friend std::ostream& operator<<(std::ostream& out, const FieldTable& body); + ValueMap values; + template<class T> T getValue(const std::string& name) const; +}; - friend std::ostream& operator<<(std::ostream& out, const FieldTable& body); - }; - - class FieldNotFoundException{}; - class UnknownFieldName : public FieldNotFoundException{}; - class IncorrectFieldType : public FieldNotFoundException{}; +class FieldNotFoundException{}; +class UnknownFieldName : public FieldNotFoundException{}; +class IncorrectFieldType : public FieldNotFoundException{}; } } diff --git a/cpp/common/framing/inc/NamedValue.h b/cpp/common/framing/inc/NamedValue.h deleted file mode 100644 index 729b5d08a7..0000000000 --- a/cpp/common/framing/inc/NamedValue.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#include <iostream> -#include <vector> -#include "amqp_types.h" -#include "Value.h" - -#ifndef _NamedValue_ -#define _NamedValue_ - -namespace qpid { -namespace framing { - - class Buffer; - - class NamedValue{ - string name; - Value* value; - public: - NamedValue(); - NamedValue(const string& name, Value* value); - ~NamedValue(); - void encode(Buffer& buffer); - void decode(Buffer& buffer); - u_int32_t size() const; - inline const string& getName() const { return name; } - inline Value* getValue() const { return value; } - inline void setValue(Value* val) { value = val; } - }; -} -} - - -#endif diff --git a/cpp/common/framing/inc/Value.h b/cpp/common/framing/inc/Value.h index e3d2a2c1d6..3d525a0bef 100644 --- a/cpp/common/framing/inc/Value.h +++ b/cpp/common/framing/inc/Value.h @@ -26,84 +26,135 @@ namespace qpid { namespace framing { - class Buffer; - - class Value{ - public: - inline virtual ~Value(){} - virtual u_int32_t size() const = 0; - virtual char getType() const = 0; - virtual void encode(Buffer& buffer) = 0; - virtual void decode(Buffer& buffer) = 0; - }; - - class StringValue : public virtual Value{ - string value; - - public: - inline StringValue(const string& v) : value(v){} - inline StringValue(){} - inline string getValue(){ return value; } - ~StringValue(){} - inline virtual u_int32_t size() const { return 4 + value.length(); } - inline virtual char getType() const { return 'S'; } - virtual void encode(Buffer& buffer); - virtual void decode(Buffer& buffer); - }; - - class IntegerValue : public virtual Value{ - int value; - public: - inline IntegerValue(int v) : value(v){} - inline IntegerValue(){} - inline int getValue(){ return value; } - ~IntegerValue(){} - inline virtual u_int32_t size() const { return 4; } - inline virtual char getType() const { return 'I'; } - virtual void encode(Buffer& buffer); - virtual void decode(Buffer& buffer); - }; - - class TimeValue : public virtual Value{ - u_int64_t value; - public: - inline TimeValue(int v) : value(v){} - inline TimeValue(){} - inline u_int64_t getValue(){ return value; } - ~TimeValue(){} - inline virtual u_int32_t size() const { return 8; } - inline virtual char getType() const { return 'T'; } - virtual void encode(Buffer& buffer); - virtual void decode(Buffer& buffer); - }; - - class DecimalValue : public virtual Value{ - u_int8_t decimals; - u_int32_t value; - public: - inline DecimalValue(int v) : value(v){} - inline DecimalValue(){} - ~DecimalValue(){} - inline virtual u_int32_t size() const { return 5; } - inline virtual char getType() const { return 'D'; } - virtual void encode(Buffer& buffer); - virtual void decode(Buffer& buffer); - }; - - class FieldTableValue : public virtual Value{ - FieldTable value; - public: - inline FieldTableValue(const FieldTable& v) : value(v){} - inline FieldTableValue(){} - inline FieldTable getValue(){ return value; } - ~FieldTableValue(){} - inline virtual u_int32_t size() const { return 4 + value.size(); } - inline virtual char getType() const { return 'F'; } - virtual void encode(Buffer& buffer); - virtual void decode(Buffer& buffer); - }; -} -} +class Buffer; +/** + * Represents a decimal value. + * No arithmetic functionality for now, we only care about encoding/decoding. + */ +struct Decimal { + u_int32_t value; + u_int8_t decimals; + + Decimal(u_int32_t value_=0, u_int8_t decimals_=0) : value(value_), decimals(decimals_) {} + bool operator==(const Decimal& d) const { + return decimals == d.decimals && value == d.value; + } + bool operator!=(const Decimal& d) const { return !(*this == d); } +}; + +std::ostream& operator<<(std::ostream& out, const Decimal& d); + +/** + * Polymorpic base class for values. + */ +class Value { + public: + virtual ~Value(); + virtual u_int32_t size() const = 0; + virtual char getType() const = 0; + virtual void encode(Buffer& buffer) = 0; + virtual void decode(Buffer& buffer) = 0; + virtual bool operator==(const Value&) const = 0; + bool operator!=(const Value& v) const { return !(*this == v); } + virtual void print(std::ostream& out) const = 0; + + /** Create a new value by decoding from the buffer */ + static std::auto_ptr<Value> decode_value(Buffer& buffer); +}; + +std::ostream& operator<<(std::ostream& out, const Value& d); + + +/** + * Template for common operations on Value sub-classes. + */ +template <class T> +class ValueOps : public Value +{ + protected: + T value; + public: + ValueOps() {} + ValueOps(const T& v) : value(v) {} + const T& getValue() const { return value; } + T& getValue() { return value; } + + virtual bool operator==(const Value& v) const { + const ValueOps<T>* vo = dynamic_cast<const ValueOps<T>*>(&v); + if (vo == 0) return false; + else return value == vo->value; + } + + void print(std::ostream& out) const { out << value; } +}; + + +class StringValue : public ValueOps<std::string> { + public: + StringValue(const std::string& v) : ValueOps<std::string>(v) {} + StringValue() {} + virtual u_int32_t size() const { return 4 + value.length(); } + virtual char getType() const { return 'S'; } + virtual void encode(Buffer& buffer); + virtual void decode(Buffer& buffer); +}; + +class IntegerValue : public ValueOps<int> { + public: + IntegerValue(int v) : ValueOps<int>(v) {} + IntegerValue(){} + virtual u_int32_t size() const { return 4; } + virtual char getType() const { return 'I'; } + virtual void encode(Buffer& buffer); + virtual void decode(Buffer& buffer); +}; + +class TimeValue : public ValueOps<u_int64_t> { + public: + TimeValue(u_int64_t v) : ValueOps<u_int64_t>(v){} + TimeValue(){} + virtual u_int32_t size() const { return 8; } + virtual char getType() const { return 'T'; } + virtual void encode(Buffer& buffer); + virtual void decode(Buffer& buffer); +}; + +class DecimalValue : public ValueOps<Decimal> { + public: + DecimalValue(const Decimal& d) : ValueOps<Decimal>(d) {} + DecimalValue(u_int32_t value_=0, u_int8_t decimals_=0) : + ValueOps<Decimal>(Decimal(value_, decimals_)){} + virtual u_int32_t size() const { return 5; } + virtual char getType() const { return 'D'; } + virtual void encode(Buffer& buffer); + virtual void decode(Buffer& buffer); +}; + + +class FieldTableValue : public ValueOps<FieldTable> { + public: + FieldTableValue(const FieldTable& v) : ValueOps<FieldTable>(v){} + FieldTableValue(){} + virtual u_int32_t size() const { return 4 + value.size(); } + virtual char getType() const { return 'F'; } + virtual void encode(Buffer& buffer); + virtual void decode(Buffer& buffer); +}; + +class EmptyValue : public Value { + public: + ~EmptyValue(); + virtual u_int32_t size() const { return 0; } + virtual char getType() const { return 0; } + virtual void encode(Buffer& buffer) {} + virtual void decode(Buffer& buffer) {} + virtual bool operator==(const Value& v) const { + return dynamic_cast<const EmptyValue*>(&v); + } + virtual void print(std::ostream& out) const; +}; + +}} // qpid::framing #endif |