diff options
author | Alan Conway <aconway@apache.org> | 2006-09-27 19:50:23 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2006-09-27 19:50:23 +0000 |
commit | caca23c5dc055d985fecfe188573104bc707ad9d (patch) | |
tree | 154c0bbd4c7bca70080de28116b5654491657906 /cpp/common/framing/src | |
parent | 9d718c2348708b0b27ce9fb9fcbf05c4b0a997cc (diff) | |
download | qpid-python-caca23c5dc055d985fecfe188573104bc707ad9d.tar.gz |
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@450556 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/common/framing/src')
-rw-r--r-- | cpp/common/framing/src/AMQContentBody.cpp | 5 | ||||
-rw-r--r-- | cpp/common/framing/src/AMQFrame.cpp | 18 | ||||
-rw-r--r-- | cpp/common/framing/src/AMQHeaderBody.cpp | 13 | ||||
-rw-r--r-- | cpp/common/framing/src/Buffer.cpp | 1 | ||||
-rw-r--r-- | cpp/common/framing/src/FieldTable.cpp | 145 | ||||
-rw-r--r-- | cpp/common/framing/src/NamedValue.cpp | 67 | ||||
-rw-r--r-- | cpp/common/framing/src/Value.cpp | 82 |
7 files changed, 173 insertions, 158 deletions
diff --git a/cpp/common/framing/src/AMQContentBody.cpp b/cpp/common/framing/src/AMQContentBody.cpp index c8aadc8108..a9ee190ba8 100644 --- a/cpp/common/framing/src/AMQContentBody.cpp +++ b/cpp/common/framing/src/AMQContentBody.cpp @@ -16,6 +16,7 @@ * */ #include "AMQContentBody.h" +#include <iostream> qpid::framing::AMQContentBody::AMQContentBody(){ } @@ -33,3 +34,7 @@ void qpid::framing::AMQContentBody::decode(Buffer& buffer, u_int32_t size){ buffer.getRawData(data, size); } +void qpid::framing::AMQContentBody::print(std::ostream& out) const +{ + out << "content (" << size() << " bytes)"; +} diff --git a/cpp/common/framing/src/AMQFrame.cpp b/cpp/common/framing/src/AMQFrame.cpp index 70f71010ff..5686c9ac81 100644 --- a/cpp/common/framing/src/AMQFrame.cpp +++ b/cpp/common/framing/src/AMQFrame.cpp @@ -1,3 +1,4 @@ + /* * * Copyright (c) 2006 The Apache Software Foundation @@ -126,21 +127,8 @@ void AMQFrame::decodeBody(Buffer& buffer, uint32_t size) std::ostream& qpid::framing::operator<<(std::ostream& out, const AMQFrame& t){ out << "Frame[channel=" << t.channel << "; "; - if(t.body.get() == 0){ - out << "empty"; - }else if(t.body->type() == METHOD_BODY){ - (dynamic_cast<AMQMethodBody*>(t.body.get()))->print(out); - }else if(t.body->type() == HEADER_BODY){ - out << "header, content_size=" << - (dynamic_cast<AMQHeaderBody*>(t.body.get()))->getContentSize() - << " (" << t.body->size() << " bytes)"; - }else if(t.body->type() == CONTENT_BODY){ - out << "content (" << t.body->size() << " bytes)"; - }else if(t.body->type() == HEARTBEAT_BODY){ - out << "heartbeat"; - }else{ - out << "unknown type, " << t.body->type(); - } + if (t.body.get() == 0) out << "empty"; + else out << *t.body; out << "]"; return out; } diff --git a/cpp/common/framing/src/AMQHeaderBody.cpp b/cpp/common/framing/src/AMQHeaderBody.cpp index 4bf1626a8a..1fd387c5d5 100644 --- a/cpp/common/framing/src/AMQHeaderBody.cpp +++ b/cpp/common/framing/src/AMQHeaderBody.cpp @@ -58,3 +58,16 @@ void qpid::framing::AMQHeaderBody::createProperties(int classId){ THROW_QPID_ERROR(FRAMING_ERROR, "Unknown header class"); } } + +void qpid::framing::AMQHeaderBody::print(std::ostream& out) const +{ + out << "header, content_size=" << getContentSize() + << " (" << size() << " bytes)" << ", headers=" ; + // TODO aconway 2006-09-26: Hack to see headers. + // Should write proper op << for BasicHeaderProperties. + // + const BasicHeaderProperties* props = + dynamic_cast<const BasicHeaderProperties*>(getProperties()); + // TODO aconway 2006-09-26: Lose the static cast, fix BasicHeaderProperties + if (props) out << const_cast<BasicHeaderProperties*>(props)->getHeaders(); +} diff --git a/cpp/common/framing/src/Buffer.cpp b/cpp/common/framing/src/Buffer.cpp index 5264491980..15a4485abd 100644 --- a/cpp/common/framing/src/Buffer.cpp +++ b/cpp/common/framing/src/Buffer.cpp @@ -16,6 +16,7 @@ * */ #include "Buffer.h" +#include "FieldTable.h" qpid::framing::Buffer::Buffer(int _size) : size(_size), position(0), limit(_size){ data = new char[size]; diff --git a/cpp/common/framing/src/FieldTable.cpp b/cpp/common/framing/src/FieldTable.cpp index 048cefa83c..b12b2783df 100644 --- a/cpp/common/framing/src/FieldTable.cpp +++ b/cpp/common/framing/src/FieldTable.cpp @@ -16,112 +16,133 @@ * */ #include "FieldTable.h" -#include "NamedValue.h" #include "QpidError.h" #include "Buffer.h" #include "Value.h" +#include <assert.h> -qpid::framing::FieldTable::~FieldTable(){ - int count(values.size()); - for(int i = 0; i < count; i++){ - delete values[i]; - } -} +namespace qpid { +namespace framing { -u_int32_t qpid::framing::FieldTable::size() const { +FieldTable::~FieldTable() {} + +u_int32_t FieldTable::size() const { u_int32_t size(4); - int count(values.size()); - for(int i = 0; i < count; i++){ - size += values[i]->size(); + for(ValueMap::const_iterator i = values.begin(); i != values.end(); ++i) { + // 2 = shortstr_len_byyte + type_char_byte + size += 2 + (i->first).size() + (i->second)->size(); } return size; } -int qpid::framing::FieldTable::count() const { +int FieldTable::count() const { return values.size(); } -std::ostream& qpid::framing::operator<<(std::ostream& out, const FieldTable& t){ - out << "field_table{}"; - return out; +namespace +{ +std::ostream& operator<<(std::ostream& out, const FieldTable::ValueMap::value_type& i) { + return out << i.first << ":" << *i.second; +} } -void qpid::framing::FieldTable::setString(const std::string& name, const std::string& value){ - setValue(name, new StringValue(value)); +std::ostream& operator<<(std::ostream& out, const FieldTable& t) { + out << "field_table{"; + FieldTable::ValueMap::const_iterator i = t.getMap().begin(); + if (i != t.getMap().end()) out << *i++; + while (i != t.getMap().end()) + { + out << "," << *i++; + } + return out << "}"; } -void qpid::framing::FieldTable::setInt(const std::string& name, int value){ - setValue(name, new IntegerValue(value)); +void FieldTable::setString(const std::string& name, const std::string& value){ + values[name] = ValuePtr(new StringValue(value)); } -void qpid::framing::FieldTable::setTimestamp(const std::string& name, u_int64_t value){ - setValue(name, new TimeValue(value)); +void FieldTable::setInt(const std::string& name, int value){ + values[name] = ValuePtr(new IntegerValue(value)); } -void qpid::framing::FieldTable::setTable(const std::string& name, const FieldTable& value){ - setValue(name, new FieldTableValue(value)); +void FieldTable::setTimestamp(const std::string& name, u_int64_t value){ + values[name] = ValuePtr(new TimeValue(value)); } -std::string qpid::framing::FieldTable::getString(const std::string& name){ - StringValue* val = dynamic_cast<StringValue*>(getValue(name)); - return (val == 0 ? "" : val->getValue()); +void FieldTable::setTable(const std::string& name, const FieldTable& value){ + values[name] = ValuePtr(new FieldTableValue(value)); } -int qpid::framing::FieldTable::getInt(const std::string& name){ - IntegerValue* val = dynamic_cast<IntegerValue*>(getValue(name)); - return (val == 0 ? 0 : val->getValue()); +namespace { +// TODO aconway 2006-09-26: This is messy. Revisit the field table +// and Value classes with a traits-based approach. +// +template <class T> T default_value() { return T(); } +template <> int default_value<int>() { return 0; } +template <> u_int64_t default_value<u_int64_t>() { return 0; } } -u_int64_t qpid::framing::FieldTable::getTimestamp(const std::string& name){ - TimeValue* val = dynamic_cast<TimeValue*>(getValue(name)); - return (val == 0 ? 0 : val->getValue()); +template <class T> +T FieldTable::getValue(const std::string& name) const +{ + ValueMap::const_iterator i = values.find(name); + if (i == values.end()) return default_value<T>(); + const ValueOps<T> *vt = dynamic_cast<const ValueOps<T>*>(i->second.get()); + return vt->getValue(); } -void qpid::framing::FieldTable::getTable(const std::string& name, FieldTable& value){ - FieldTableValue* val = dynamic_cast<FieldTableValue*>(getValue(name)); - if(val != 0) value = val->getValue(); +std::string FieldTable::getString(const std::string& name) const { + return getValue<std::string>(name); } -qpid::framing::NamedValue* qpid::framing::FieldTable::find(const std::string& name) const{ - int count(values.size()); - for(int i = 0; i < count; i++){ - if(values[i]->getName() == name) return values[i]; - } - return 0; +int FieldTable::getInt(const std::string& name) const { + return getValue<int>(name); } -qpid::framing::Value* qpid::framing::FieldTable::getValue(const std::string& name) const{ - NamedValue* val = find(name); - return val == 0 ? 0 : val->getValue(); +u_int64_t FieldTable::getTimestamp(const std::string& name) const { + return getValue<u_int64_t>(name); } -void qpid::framing::FieldTable::setValue(const std::string& name, Value* value){ - NamedValue* val = find(name); - if(val == 0){ - val = new NamedValue(name, value); - values.push_back(val); - }else{ - Value* old = val->getValue(); - if(old != 0) delete old; - val->setValue(value); - } +void FieldTable::getTable(const std::string& name, FieldTable& value) const { + value = getValue<FieldTable>(name); } -void qpid::framing::FieldTable::encode(Buffer& buffer) const{ +void FieldTable::encode(Buffer& buffer) const{ buffer.putLong(size() - 4); - int count(values.size()); - for(int i = 0; i < count; i++){ - values[i]->encode(buffer); + for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) { + buffer.putShortString(i->first); + buffer.putOctet(i->second->getType()); + i->second->encode(buffer); } } -void qpid::framing::FieldTable::decode(Buffer& buffer){ +void FieldTable::decode(Buffer& buffer){ u_int32_t size = buffer.getLong(); int leftover = buffer.available() - size; while(buffer.available() > leftover){ - NamedValue* value = new NamedValue(); - value->decode(buffer); - values.push_back(value); + std::string name; + buffer.getShortString(name); + std::auto_ptr<Value> value(Value::decode_value(buffer)); + values[name] = ValuePtr(value.release()); } } + + +bool FieldTable::operator==(const FieldTable& x) const { + if (values.size() != x.values.size()) return false; + for (ValueMap::const_iterator i = values.begin(); i != values.end(); ++i) { + ValueMap::const_iterator j = x.values.find(i->first); + if (j == x.values.end()) return false; + if (*(i->second) != *(j->second)) return false; + } + return true; +} + +void FieldTable::erase(const std::string& name) +{ + values.erase(values.find(name)); +} + +} +} diff --git a/cpp/common/framing/src/NamedValue.cpp b/cpp/common/framing/src/NamedValue.cpp deleted file mode 100644 index e80aea433c..0000000000 --- a/cpp/common/framing/src/NamedValue.cpp +++ /dev/null @@ -1,67 +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 "NamedValue.h" -#include "QpidError.h" -#include "Buffer.h" -#include "FieldTable.h" - -qpid::framing::NamedValue::NamedValue() : value(0){} - -qpid::framing::NamedValue::NamedValue(const string& n, Value* v) : name(n), value(v){} - -qpid::framing::NamedValue::~NamedValue(){ - if(value != 0){ - delete value; - } -} - -u_int32_t qpid::framing::NamedValue::size() const{ - return value ? 1/*size of name*/ + name.length() + 1/*type char*/ + value->size() : 0; -} - -void qpid::framing::NamedValue::encode(Buffer& buffer){ - buffer.putShortString(name); - u_int8_t type = value->getType(); - buffer.putOctet(type); - value->encode(buffer); -} - -void qpid::framing::NamedValue::decode(Buffer& buffer){ - buffer.getShortString(name); - u_int8_t type = buffer.getOctet(); - switch(type){ - case 'S': - value = new StringValue(); - break; - case 'I': - value = new IntegerValue(); - break; - case 'D': - value = new DecimalValue(); - break; - case 'T': - value = new TimeValue(); - break; - case 'F': - value = new FieldTableValue(); - break; - default: - THROW_QPID_ERROR(FRAMING_ERROR, "Unknown field table value type"); - } - value->decode(buffer); -} diff --git a/cpp/common/framing/src/Value.cpp b/cpp/common/framing/src/Value.cpp index 240b086696..1c210fdb12 100644 --- a/cpp/common/framing/src/Value.cpp +++ b/cpp/common/framing/src/Value.cpp @@ -18,40 +18,94 @@ #include "Value.h" #include "Buffer.h" #include "FieldTable.h" +#include "QpidError.h" -void qpid::framing::StringValue::encode(Buffer& buffer){ +namespace qpid { +namespace framing { + +Value::~Value() {} + +void StringValue::encode(Buffer& buffer){ buffer.putLongString(value); } -void qpid::framing::StringValue::decode(Buffer& buffer){ +void StringValue::decode(Buffer& buffer){ buffer.getLongString(value); } -void qpid::framing::IntegerValue::encode(Buffer& buffer){ +void IntegerValue::encode(Buffer& buffer){ buffer.putLong((u_int32_t) value); } -void qpid::framing::IntegerValue::decode(Buffer& buffer){ +void IntegerValue::decode(Buffer& buffer){ value = buffer.getLong(); } -void qpid::framing::TimeValue::encode(Buffer& buffer){ +void TimeValue::encode(Buffer& buffer){ buffer.putLongLong(value); } -void qpid::framing::TimeValue::decode(Buffer& buffer){ +void TimeValue::decode(Buffer& buffer){ value = buffer.getLongLong(); } -void qpid::framing::DecimalValue::encode(Buffer& buffer){ - buffer.putOctet(decimals); - buffer.putLong(value); +void DecimalValue::encode(Buffer& buffer){ + buffer.putOctet(value.decimals); + buffer.putLong(value.value); } -void qpid::framing::DecimalValue::decode(Buffer& buffer){ - decimals = buffer.getOctet(); - value = buffer.getLong(); +void DecimalValue::decode(Buffer& buffer){ + value = Decimal(buffer.getLong(), buffer.getOctet()); } -void qpid::framing::FieldTableValue::encode(Buffer& buffer){ +void FieldTableValue::encode(Buffer& buffer){ buffer.putFieldTable(value); } -void qpid::framing::FieldTableValue::decode(Buffer& buffer){ +void FieldTableValue::decode(Buffer& buffer){ buffer.getFieldTable(value); } + +std::auto_ptr<Value> Value::decode_value(Buffer& buffer) +{ + std::auto_ptr<Value> value; + u_int8_t type = buffer.getOctet(); + switch(type){ + case 'S': + value.reset(new StringValue()); + break; + case 'I': + value.reset(new IntegerValue()); + break; + case 'D': + value.reset(new DecimalValue()); + break; + case 'T': + value.reset(new TimeValue()); + break; + case 'F': + value.reset(new FieldTableValue()); + break; + default: + THROW_QPID_ERROR(FRAMING_ERROR, "Unknown field table value type"); + } + value->decode(buffer); + return value; +} + +EmptyValue::~EmptyValue() {} + +void EmptyValue::print(std::ostream& out) const +{ + out << "<empty field value>"; +} + +std::ostream& operator<<(std::ostream& out, const Value& v) { + v.print(out); + return out; +} + +std::ostream& operator<<(std::ostream& out, const Decimal& d) +{ + return out << "Decimal(" << d.value << "," << d.decimals << ")"; +} + +}} + + + |