summaryrefslogtreecommitdiff
path: root/cpp/common/framing/inc
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/common/framing/inc')
-rw-r--r--cpp/common/framing/inc/AMQBody.h8
-rw-r--r--cpp/common/framing/inc/AMQContentBody.h1
-rw-r--r--cpp/common/framing/inc/AMQHeaderBody.h2
-rw-r--r--cpp/common/framing/inc/AMQHeartbeatBody.h3
-rw-r--r--cpp/common/framing/inc/Buffer.h3
-rw-r--r--cpp/common/framing/inc/FieldTable.h72
-rw-r--r--cpp/common/framing/inc/NamedValue.h49
-rw-r--r--cpp/common/framing/inc/Value.h207
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