summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/broker/ConnectionHandler.cpp10
-rw-r--r--cpp/src/qpid/broker/ConnectionHandler.h2
-rw-r--r--cpp/src/qpid/framing/Array.cpp11
-rw-r--r--cpp/src/qpid/framing/Array.h5
-rw-r--r--cpp/src/qpid/framing/FieldValue.cpp13
-rw-r--r--cpp/src/qpid/framing/FieldValue.h6
6 files changed, 42 insertions, 5 deletions
diff --git a/cpp/src/qpid/broker/ConnectionHandler.cpp b/cpp/src/qpid/broker/ConnectionHandler.cpp
index 53a403c955..f28c2bb7f7 100644
--- a/cpp/src/qpid/broker/ConnectionHandler.cpp
+++ b/cpp/src/qpid/broker/ConnectionHandler.cpp
@@ -66,8 +66,12 @@ void ConnectionHandler::handle(framing::AMQFrame& frame)
ConnectionHandler::ConnectionHandler(Connection& connection) : handler(new Handler(connection)) {
FieldTable properties;
- string mechanisms(PLAIN);
- string locales(en_US);
+ Array mechanisms(0x95);
+ boost::shared_ptr<FieldValue> m(new Str16Value(PLAIN));
+ mechanisms.add(m);
+ Array locales(0x95);
+ boost::shared_ptr<FieldValue> l(new Str16Value(en_US));
+ locales.add(l);
handler->serverMode = true;
handler->client.start(properties, mechanisms, locales);
}
@@ -105,7 +109,7 @@ void ConnectionHandler::Handler::tuneOk(uint16_t /*channelmax*/,
}
void ConnectionHandler::Handler::open(const string& /*virtualHost*/,
- const string& /*capabilities*/, bool /*insist*/)
+ const framing::Array& /*capabilities*/, bool /*insist*/)
{
string knownhosts;
client.openOk(knownhosts);
diff --git a/cpp/src/qpid/broker/ConnectionHandler.h b/cpp/src/qpid/broker/ConnectionHandler.h
index 8e659f0913..56de1c7517 100644
--- a/cpp/src/qpid/broker/ConnectionHandler.h
+++ b/cpp/src/qpid/broker/ConnectionHandler.h
@@ -56,7 +56,7 @@ class ConnectionHandler : public framing::FrameHandler
void tuneOk(uint16_t channelMax, uint32_t frameMax, uint16_t heartbeat);
void heartbeat() {}
void open(const std::string& virtualHost,
- const std::string& capabilities, bool insist);
+ const framing::Array& capabilities, bool insist);
void close(uint16_t replyCode, const std::string& replyText,
uint16_t classId, uint16_t methodId);
void closeOk();
diff --git a/cpp/src/qpid/framing/Array.cpp b/cpp/src/qpid/framing/Array.cpp
index 1215c8a28b..d2ab354dab 100644
--- a/cpp/src/qpid/framing/Array.cpp
+++ b/cpp/src/qpid/framing/Array.cpp
@@ -30,6 +30,8 @@ namespace framing {
Array::Array() : typeOctet(0xF0/*void*/) {}
+Array::Array(uint8_t type) : typeOctet(type) {}
+
Array::Array(const std::vector<std::string>& in)
{
typeOctet = 0xA4;
@@ -39,6 +41,7 @@ Array::Array(const std::vector<std::string>& in)
}
}
+
uint32_t Array::size() const {
//note: size is only included when used as a 'top level' type
uint32_t len(4/*size*/ + 1/*type*/ + 4/*count*/);
@@ -109,6 +112,14 @@ bool Array::operator==(const Array& x) const {
return true;
}
+void Array::add(ValuePtr value)
+{
+ if (typeOctet != value->getType()) {
+ throw SyntaxErrorException(QPID_MSG("Wrong type of value, expected " << typeOctet));
+ }
+ values.push_back(value);
+}
+
}
}
diff --git a/cpp/src/qpid/framing/Array.h b/cpp/src/qpid/framing/Array.h
index 6a13c63672..1367a023f2 100644
--- a/cpp/src/qpid/framing/Array.h
+++ b/cpp/src/qpid/framing/Array.h
@@ -47,9 +47,12 @@ class Array
bool operator==(const Array& other) const;
Array();
- //only long string arrays can currently be created (any type can be decoded)
+ Array(uint8_t type);
+ //creates a longstr array
Array(const std::vector<std::string>& in);
+ void add(ValuePtr value);
+
template <class T>
void collect(std::vector<T>& out)
{
diff --git a/cpp/src/qpid/framing/FieldValue.cpp b/cpp/src/qpid/framing/FieldValue.cpp
index 961b6017cd..cbda061209 100644
--- a/cpp/src/qpid/framing/FieldValue.cpp
+++ b/cpp/src/qpid/framing/FieldValue.cpp
@@ -25,6 +25,11 @@
namespace qpid {
namespace framing {
+uint8_t FieldValue::getType()
+{
+ return typeOctet;
+}
+
void FieldValue::setType(uint8_t type)
{
typeOctet = type;
@@ -106,6 +111,14 @@ StringValue::StringValue(const std::string& v) :
{
}
+Str16Value::Str16Value(const std::string& v) :
+ FieldValue(
+ 0x95,
+ new VariableWidthValue<2>(
+ reinterpret_cast<const uint8_t*>(v.data()),
+ reinterpret_cast<const uint8_t*>(v.data()+v.size())))
+{}
+
IntegerValue::IntegerValue(int v) :
FieldValue(0x21, new FixedWidthValue<4>(v))
{
diff --git a/cpp/src/qpid/framing/FieldValue.h b/cpp/src/qpid/framing/FieldValue.h
index 3ec95a99e1..272670d102 100644
--- a/cpp/src/qpid/framing/FieldValue.h
+++ b/cpp/src/qpid/framing/FieldValue.h
@@ -79,6 +79,7 @@ class FieldValue {
FieldValue(): data(0) {};
// Default assignment operator is fine
void setType(uint8_t type);
+ uint8_t getType();
Data& getData() { return *data; }
uint32_t size() const { return 1 + data->size(); };
bool empty() const { return data.get() == 0; }
@@ -206,6 +207,11 @@ class StringValue : public FieldValue {
StringValue(const std::string& v);
};
+class Str16Value : public FieldValue {
+ public:
+ Str16Value(const std::string& v);
+};
+
/*
* Basic integer value encodes as signed 32 bit
*/