diff options
Diffstat (limited to 'cpp/src/qpid')
-rw-r--r-- | cpp/src/qpid/amqp_0_10/Codecs.cpp (renamed from cpp/src/qpid/client/amqp0_10/Codecs.cpp) | 27 | ||||
-rw-r--r-- | cpp/src/qpid/client/amqp0_10/AddressResolution.cpp | 55 | ||||
-rw-r--r-- | cpp/src/qpid/client/amqp0_10/CodecsInternal.h | 41 | ||||
-rw-r--r-- | cpp/src/qpid/client/amqp0_10/FailoverUpdates.cpp | 2 | ||||
-rw-r--r-- | cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp | 6 | ||||
-rw-r--r-- | cpp/src/qpid/client/amqp0_10/OutgoingMessage.cpp | 4 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/Address.cpp | 12 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/Connection.cpp | 7 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/ListContent.cpp | 106 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/ListView.cpp | 65 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/MapContent.cpp | 96 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/MapView.cpp | 65 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/Message.cpp | 71 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/MessageImpl.cpp | 4 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/Receiver.cpp | 4 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/Sender.cpp | 2 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/Session.cpp | 4 | ||||
-rw-r--r-- | cpp/src/qpid/types/Variant.cpp | 2 |
18 files changed, 116 insertions, 457 deletions
diff --git a/cpp/src/qpid/client/amqp0_10/Codecs.cpp b/cpp/src/qpid/amqp_0_10/Codecs.cpp index ce806572e5..6325f9f664 100644 --- a/cpp/src/qpid/client/amqp0_10/Codecs.cpp +++ b/cpp/src/qpid/amqp_0_10/Codecs.cpp @@ -18,8 +18,7 @@ * under the License. * */ -#include "qpid/client/amqp0_10/Codecs.h" -#include "qpid/types/Variant.h" +#include "qpid/amqp_0_10/Codecs.h" #include "qpid/framing/Array.h" #include "qpid/framing/Buffer.h" #include "qpid/framing/FieldTable.h" @@ -31,12 +30,10 @@ #include <limits> using namespace qpid::framing; -using namespace qpid::messaging; using namespace qpid::types; namespace qpid { -namespace client { -namespace amqp0_10 { +namespace amqp_0_10 { namespace { const std::string iso885915("iso-8859-15"); @@ -294,26 +291,24 @@ template <class T, class U, class F> void _decode(const std::string& data, U& va convert(t, value, f); } -void MapCodec::encode(const Variant& value, std::string& data) +void MapCodec::encode(const Variant::Map& value, std::string& data) { - _encode<FieldTable>(value.asMap(), data, &toFieldTableEntry); + _encode<FieldTable>(value, data, &toFieldTableEntry); } -void MapCodec::decode(const std::string& data, Variant& value) +void MapCodec::decode(const std::string& data, Variant::Map& value) { - value = Variant::Map(); - _decode<FieldTable>(data, value.asMap(), &toVariantMapEntry); + _decode<FieldTable>(data, value, &toVariantMapEntry); } -void ListCodec::encode(const Variant& value, std::string& data) +void ListCodec::encode(const Variant::List& value, std::string& data) { - _encode<List>(value.asList(), data, &toFieldValue); + _encode<List>(value, data, &toFieldValue); } -void ListCodec::decode(const std::string& data, Variant& value) +void ListCodec::decode(const std::string& data, Variant::List& value) { - value = Variant::List(); - _decode<List>(data, value.asList(), &toVariant); + _decode<List>(data, value, &toVariant); } void translate(const Variant::Map& from, FieldTable& to) @@ -329,4 +324,4 @@ void translate(const FieldTable& from, Variant::Map& to) const std::string ListCodec::contentType("amqp/list"); const std::string MapCodec::contentType("amqp/map"); -}}} // namespace qpid::client::amqp0_10 +}} // namespace qpid::amqp_0_10 diff --git a/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp b/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp index 990b2a19d8..f64a46ba01 100644 --- a/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp +++ b/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp @@ -19,8 +19,7 @@ * */ #include "qpid/client/amqp0_10/AddressResolution.h" -#include "qpid/client/amqp0_10/Codecs.h" -#include "qpid/client/amqp0_10/CodecsInternal.h" +#include "qpid/amqp_0_10/Codecs.h" #include "qpid/client/amqp0_10/MessageSource.h" #include "qpid/client/amqp0_10/MessageSink.h" #include "qpid/client/amqp0_10/OutgoingMessage.h" @@ -55,6 +54,7 @@ using qpid::framing::ReplyTo; using qpid::framing::Uuid; using namespace qpid::types; using namespace qpid::framing::message; +using namespace qpid::amqp_0_10; using namespace boost::assign; @@ -262,43 +262,29 @@ bool in(const Variant& value, const std::vector<std::string>& choices) return false; } -bool getReceiverPolicy(const Address& address, const std::string& key) -{ - return in(address.getOption(key), list_of<std::string>(ALWAYS)(RECEIVER)); -} - -bool getSenderPolicy(const Address& address, const std::string& key) -{ - return in(address.getOption(key), list_of<std::string>(ALWAYS)(SENDER)); -} - -const Variant& getOption(const Variant::Map& options, const std::vector<std::string>& path, size_t index=0) +const Variant& getOption(const Variant::Map& options, const std::string& name) { - Variant::Map::const_iterator j = options.find(path[index]); + Variant::Map::const_iterator j = options.find(name); if (j == options.end()) { return EMPTY_VARIANT; - } else if (++index < path.size()) { - if (j->second.getType() != VAR_MAP) - throw InvalidAddress((boost::format("Expected %1% to be a map") % j->first).str()); - return getOption(j->second.asMap(), path, index); } else { return j->second; } } -const Variant& getOption(const Address& address, const std::vector<std::string>& path) +const Variant& getOption(const Address& address, const std::string& name) { - return getOption(address.getOptions(), path); + return getOption(address.getOptions(), name); } -const Variant& getOption(const Variant::Map& options, const std::string& name) +bool getReceiverPolicy(const Address& address, const std::string& key) { - Variant::Map::const_iterator j = options.find(name); - if (j == options.end()) { - return EMPTY_VARIANT; - } else { - return j->second; - } + return in(getOption(address, key), list_of<std::string>(ALWAYS)(RECEIVER)); +} + +bool getSenderPolicy(const Address& address, const std::string& key) +{ + return in(getOption(address, key), list_of<std::string>(ALWAYS)(SENDER)); } struct Opt @@ -360,13 +346,14 @@ void Opt::collect(qpid::framing::FieldTable& args) const bool AddressResolution::is_unreliable(const Address& address) { - return in(getOption(address, list_of<std::string>(LINK)(RELIABILITY)), + + return in((Opt(address)/LINK/RELIABILITY).str(), list_of<std::string>(UNRELIABLE)(AT_MOST_ONCE)); } bool AddressResolution::is_reliable(const Address& address) { - return in(getOption(address, list_of<std::string>(LINK)(RELIABILITY)), + return in((Opt(address)/LINK/RELIABILITY).str(), list_of<std::string>(AT_LEAST_ONCE)(EXACTLY_ONCE)); } @@ -433,7 +420,7 @@ std::auto_ptr<MessageSink> AddressResolution::resolveSink(qpid::client::Session bool isBrowse(const Address& address) { - const Variant& mode = address.getOption(MODE); + const Variant& mode = getOption(address, MODE); if (!mode.isVoid()) { std::string value = mode.asString(); if (value == BROWSE) return true; @@ -651,9 +638,9 @@ bool isTopic(qpid::client::Session session, const qpid::messaging::Address& addr } Node::Node(const Address& address) : name(address.getName()), - createPolicy(address.getOption(CREATE)), - assertPolicy(address.getOption(ASSERT)), - deletePolicy(address.getOption(DELETE)) + createPolicy(getOption(address, CREATE)), + assertPolicy(getOption(address, ASSERT)), + deletePolicy(getOption(address, DELETE)) { nodeBindings.add((Opt(address)/NODE/X_BINDINGS).asList()); linkBindings.add((Opt(address)/LINK/X_BINDINGS).asList()); @@ -908,7 +895,7 @@ bool Node::enabled(const Variant& policy, CheckMode mode) bool Node::createEnabled(const Address& address, CheckMode mode) { - const Variant& policy = address.getOption(CREATE); + const Variant& policy = getOption(address, CREATE); return enabled(policy, mode); } diff --git a/cpp/src/qpid/client/amqp0_10/CodecsInternal.h b/cpp/src/qpid/client/amqp0_10/CodecsInternal.h deleted file mode 100644 index a110d80b8a..0000000000 --- a/cpp/src/qpid/client/amqp0_10/CodecsInternal.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef QPID_CLIENT_AMQP0_10_CODECSINTERNAL_H -#define QPID_CLIENT_AMQP0_10_CODECSINTERNAL_H - -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 "qpid/types/Variant.h" -#include "qpid/framing/FieldTable.h" - -namespace qpid { -namespace client { -namespace amqp0_10 { - -/** - * Declarations of a couple of conversion functions implemented in - * Codecs.cpp but not exposed through API - */ - -void translate(const qpid::types::Variant::Map& from, qpid::framing::FieldTable& to); -void translate(const qpid::framing::FieldTable& from, qpid::types::Variant::Map& to); - -}}} // namespace qpid::client::amqp0_10 - -#endif /*!QPID_CLIENT_AMQP0_10_CODECSINTERNAL_H*/ diff --git a/cpp/src/qpid/client/amqp0_10/FailoverUpdates.cpp b/cpp/src/qpid/client/amqp0_10/FailoverUpdates.cpp index 5e526a2ffc..354d6f6aba 100644 --- a/cpp/src/qpid/client/amqp0_10/FailoverUpdates.cpp +++ b/cpp/src/qpid/client/amqp0_10/FailoverUpdates.cpp @@ -46,7 +46,7 @@ struct FailoverUpdatesImpl : qpid::sys::Runnable FailoverUpdatesImpl(Connection& c) : connection(c), quit(false) { - session = connection.newSession("failover-updates"); + session = connection.createSession("failover-updates"); receiver = session.createReceiver("amq.failover"); thread = qpid::sys::Thread(*this); } diff --git a/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp b/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp index 345ebfb66d..c26b2eb09f 100644 --- a/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp +++ b/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp @@ -20,8 +20,7 @@ */ #include "qpid/client/amqp0_10/IncomingMessages.h" #include "qpid/client/amqp0_10/AddressResolution.h" -#include "qpid/client/amqp0_10/Codecs.h" -#include "qpid/client/amqp0_10/CodecsInternal.h" +#include "qpid/amqp_0_10/Codecs.h" #include "qpid/client/SessionImpl.h" #include "qpid/client/SessionBase_0_10Access.h" #include "qpid/log/Statement.h" @@ -42,6 +41,7 @@ namespace amqp0_10 { using namespace qpid::framing; using namespace qpid::framing::message; +using namespace qpid::amqp_0_10; using qpid::sys::AbsTime; using qpid::sys::Duration; using qpid::messaging::MessageImplAccess; @@ -306,7 +306,7 @@ void populate(qpid::messaging::Message& message, FrameSet& command) //e.g. for rejecting. MessageImplAccess::get(message).setInternalId(command.getId()); - command.getContent(message.getContent()); + message.setContent(command.getContent()); populateHeaders(message, command.getHeaders()); } diff --git a/cpp/src/qpid/client/amqp0_10/OutgoingMessage.cpp b/cpp/src/qpid/client/amqp0_10/OutgoingMessage.cpp index b19b26f903..c22eb5403f 100644 --- a/cpp/src/qpid/client/amqp0_10/OutgoingMessage.cpp +++ b/cpp/src/qpid/client/amqp0_10/OutgoingMessage.cpp @@ -20,8 +20,7 @@ */ #include "qpid/client/amqp0_10/OutgoingMessage.h" #include "qpid/client/amqp0_10/AddressResolution.h" -#include "qpid/client/amqp0_10/Codecs.h" -#include "qpid/client/amqp0_10/CodecsInternal.h" +#include "qpid/amqp_0_10/Codecs.h" #include "qpid/messaging/Address.h" #include "qpid/messaging/Message.h" #include "qpid/messaging/MessageImpl.h" @@ -34,6 +33,7 @@ namespace amqp0_10 { using qpid::messaging::Address; using qpid::messaging::MessageImplAccess; using namespace qpid::framing::message; +using namespace qpid::amqp_0_10; void OutgoingMessage::convert(const qpid::messaging::Message& from) { diff --git a/cpp/src/qpid/messaging/Address.cpp b/cpp/src/qpid/messaging/Address.cpp index 2902b8fc4b..0c522888e7 100644 --- a/cpp/src/qpid/messaging/Address.cpp +++ b/cpp/src/qpid/messaging/Address.cpp @@ -92,7 +92,7 @@ Address::~Address() { delete impl; } Address& Address::operator=(const Address& a) { *impl = *a.impl; return *this; } -std::string Address::toStr() const +std::string Address::str() const { std::stringstream out; out << impl->name; @@ -106,7 +106,6 @@ bool Address::operator !() const { return impl->name.empty(); } const std::string& Address::getName() const { return impl->name; } void Address::setName(const std::string& name) { impl->name = name; } const std::string& Address::getSubject() const { return impl->subject; } -bool Address::hasSubject() const { return !(impl->subject.empty()); } void Address::setSubject(const std::string& subject) { impl->subject = subject; } const Variant::Map& Address::getOptions() const { return impl->options; } Variant::Map& Address::getOptions() { return impl->options; } @@ -128,7 +127,7 @@ const Variant& find(const Variant::Map& map, const std::string& key) std::string Address::getType() const { - const Variant& props = getOption(NODE_PROPERTIES); + const Variant& props = find(impl->options, NODE_PROPERTIES); if (props.getType() == VAR_MAP) { const Variant& type = find(props.asMap(), TYPE); if (!type.isVoid()) return type.asString(); @@ -143,14 +142,9 @@ void Address::setType(const std::string& type) props.asMap()[TYPE] = type; } -const Variant& Address::getOption(const std::string& key) const -{ - return find(impl->options, key); -} - std::ostream& operator<<(std::ostream& out, const Address& address) { - out << address.toStr(); + out << address.str(); return out; } diff --git a/cpp/src/qpid/messaging/Connection.cpp b/cpp/src/qpid/messaging/Connection.cpp index 853ba1d100..b9437c7931 100644 --- a/cpp/src/qpid/messaging/Connection.cpp +++ b/cpp/src/qpid/messaging/Connection.cpp @@ -56,11 +56,10 @@ Connection::Connection(const Variant::Map& options) void Connection::open(const std::string& url) { impl->open(url); } void Connection::close() { impl->close(); } -Session Connection::newSession(const char* name) { return impl->newSession(false, name); } -Session Connection::newSession(const std::string& name) { return impl->newSession(false, name); } -Session Connection::newSession(bool transactional, const std::string& name) +Session Connection::createSession(const std::string& name) { return impl->newSession(false, name); } +Session Connection::createTransactionalSession(const std::string& name) { - return impl->newSession(transactional, name); + return impl->newSession(true, name); } Session Connection::getSession(const std::string& name) const { return impl->getSession(name); } void Connection::setOption(const std::string& name, const Variant& value) diff --git a/cpp/src/qpid/messaging/ListContent.cpp b/cpp/src/qpid/messaging/ListContent.cpp deleted file mode 100644 index 4bd990e062..0000000000 --- a/cpp/src/qpid/messaging/ListContent.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 "qpid/messaging/ListContent.h" -#include "qpid/messaging/Message.h" -#include "qpid/client/amqp0_10/Codecs.h" - -namespace qpid { -namespace messaging { - -using namespace qpid::types; - -class ListContentImpl : public Variant -{ - Message* msg; - public: - ListContentImpl(Message& m) : Variant(Variant::List()), msg(&m) - { - if (msg->getContent().size()) { - qpid::client::amqp0_10::ListCodec codec; - codec.decode(msg->getContent(), *this); - } - } - - ListContentImpl(Message& m, const Variant::List& i) : Variant(i), msg(&m) - { - msg->getContent().clear(); - } - - void encode() - { - qpid::client::amqp0_10::ListCodec codec; - codec.encode(*this, msg->getContent()); - } -}; - -ListContent::ListContent(Message& m) : impl(new ListContentImpl(m)) {} -ListContent::ListContent(Message& m, const Variant::List& i) : impl(new ListContentImpl(m, i)) {} -ListContent::~ListContent() { delete impl; } -ListContent& ListContent::operator=(const ListContent& l) { *impl = *l.impl; return *this; } - -ListContent::const_iterator ListContent::begin() const { return impl->asList().begin(); } -ListContent::const_iterator ListContent::end() const { return impl->asList().end(); } -ListContent::const_reverse_iterator ListContent::rbegin() const { return impl->asList().rbegin(); } -ListContent::const_reverse_iterator ListContent::rend() const { return impl->asList().rend(); } - -ListContent::iterator ListContent::begin() { return impl->asList().begin(); } -ListContent::iterator ListContent::end() { return impl->asList().end(); } -ListContent::reverse_iterator ListContent::rbegin() { return impl->asList().rbegin(); } -ListContent::reverse_iterator ListContent::rend() { return impl->asList().rend(); } - -bool ListContent::empty() const { return impl->asList().empty(); } -size_t ListContent::size() const { return impl->asList().size(); } - -const Variant& ListContent::front() const { return impl->asList().front(); } -Variant& ListContent::front() { return impl->asList().front(); } -const Variant& ListContent::back() const { return impl->asList().back(); } -Variant& ListContent::back() { return impl->asList().back(); } - -void ListContent::push_front(const Variant& v) { impl->asList().push_front(v); } -void ListContent::push_back(const Variant& v) { impl->asList().push_back(v); } - -void ListContent::pop_front() { impl->asList().pop_front(); } -void ListContent::pop_back() { impl->asList().pop_back(); } - -ListContent::iterator ListContent::insert(iterator position, const Variant& v) -{ - return impl->asList().insert(position, v); -} -void ListContent::insert(iterator position, size_t n, const Variant& v) -{ - impl->asList().insert(position, n, v); -} -ListContent::iterator ListContent::erase(iterator position) { return impl->asList().erase(position); } -ListContent::iterator ListContent::erase(iterator first, iterator last) { return impl->asList().erase(first, last); } -void ListContent::clear() { impl->asList().clear(); } - -void ListContent::encode() { impl->encode(); } - -const Variant::List& ListContent::asList() const { return impl->asList(); } -Variant::List& ListContent::asList() { return impl->asList(); } - -std::ostream& operator<<(std::ostream& out, const ListContent& m) -{ - out << m.asList(); - return out; -} - -}} // namespace qpid::messaging diff --git a/cpp/src/qpid/messaging/ListView.cpp b/cpp/src/qpid/messaging/ListView.cpp deleted file mode 100644 index 5cf453254f..0000000000 --- a/cpp/src/qpid/messaging/ListView.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 "qpid/messaging/ListView.h" -#include "qpid/messaging/Message.h" -#include "qpid/client/amqp0_10/Codecs.h" - -namespace qpid { -namespace messaging { - -using namespace qpid::types; - -class ListViewImpl : public Variant -{ - public: - ListViewImpl(const Message& msg) : Variant(Variant::List()) - { - if (msg.getContent().size()) { - qpid::client::amqp0_10::ListCodec codec; - codec.decode(msg.getContent(), *this); - } - } -}; - -ListView::ListView(const Message& m) :impl(new ListViewImpl(m)) {} -ListView::~ListView() { delete impl; } -ListView& ListView::operator=(const ListView& l) { *impl = *l.impl; return *this; } - -ListView::const_iterator ListView::begin() const { return impl->asList().begin(); } -ListView::const_iterator ListView::end() const { return impl->asList().end(); } -ListView::const_reverse_iterator ListView::rbegin() const { return impl->asList().rbegin(); } -ListView::const_reverse_iterator ListView::rend() const { return impl->asList().rend(); } - -bool ListView::empty() const { return impl->asList().empty(); } -size_t ListView::size() const { return impl->asList().size(); } - -const Variant& ListView::front() const { return impl->asList().front(); } -const Variant& ListView::back() const { return impl->asList().back(); } - -const Variant::List& ListView::asList() const { return impl->asList(); } - -std::ostream& operator<<(std::ostream& out, const ListView& m) -{ - out << m.asList(); - return out; -} - -}} // namespace qpid::messaging diff --git a/cpp/src/qpid/messaging/MapContent.cpp b/cpp/src/qpid/messaging/MapContent.cpp deleted file mode 100644 index 11dcfbaf70..0000000000 --- a/cpp/src/qpid/messaging/MapContent.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 "qpid/messaging/MapContent.h" -#include "qpid/messaging/Message.h" -#include "qpid/client/amqp0_10/Codecs.h" - -namespace qpid { -namespace messaging { - -using namespace qpid::types; - -class MapContentImpl : public Variant -{ - Message* msg; - public: - MapContentImpl(Message& m) : Variant(Variant::Map()), msg(&m) - { - if (msg->getContent().size()) { - qpid::client::amqp0_10::MapCodec codec; - codec.decode(msg->getContent(), *this); - } - } - - MapContentImpl(Message& m, const Variant::Map& i) : Variant(i), msg(&m) - { - msg->getContent().clear(); - } - - void encode() - { - qpid::client::amqp0_10::MapCodec codec; - codec.encode(*this, msg->getContent()); - msg->setContentType(qpid::client::amqp0_10::MapCodec::contentType); - } -}; - -MapContent::MapContent(Message& m) : impl(new MapContentImpl(m)) {} -MapContent::MapContent(Message& m, const Variant::Map& i) : impl(new MapContentImpl(m, i)) {} -MapContent::~MapContent() { delete impl; } -MapContent& MapContent::operator=(const MapContent& m) { *impl = *m.impl; return *this; } - -MapContent::const_iterator MapContent::begin() const { return impl->asMap().begin(); } -MapContent::const_iterator MapContent::end() const { return impl->asMap().end(); } -MapContent::const_reverse_iterator MapContent::rbegin() const { return impl->asMap().rbegin(); } -MapContent::const_reverse_iterator MapContent::rend() const { return impl->asMap().rend(); } -MapContent::iterator MapContent::begin() { return impl->asMap().begin(); } -MapContent::iterator MapContent::end() { return impl->asMap().end(); } -MapContent::reverse_iterator MapContent::rbegin() { return impl->asMap().rbegin(); } -MapContent::reverse_iterator MapContent::rend() { return impl->asMap().rend(); } - -bool MapContent::empty() const { return impl->asMap().empty(); } -size_t MapContent::size() const { return impl->asMap().size(); } - -MapContent::const_iterator MapContent::find(const key_type& key) const { return impl->asMap().find(key); } -MapContent::iterator MapContent::find(const key_type& key) { return impl->asMap().find(key); } -const Variant& MapContent::operator[](const key_type& key) const { return impl->asMap()[key]; } -Variant& MapContent::operator[](const key_type& key) { return impl->asMap()[key]; } - -std::pair<MapContent::iterator,bool> MapContent::insert(const value_type& item) { return impl->asMap().insert(item); } -MapContent::iterator MapContent::insert(iterator position, const value_type& item) { return impl->asMap().insert(position, item); } -void MapContent::erase(iterator position) { impl->asMap().erase(position); } -void MapContent::erase(iterator first, iterator last) { impl->asMap().erase(first, last); } -size_t MapContent::erase(const key_type& key) { return impl->asMap().erase(key); } -void MapContent::clear() { impl->asMap().clear(); } - -void MapContent::encode() { impl->encode(); } - -const std::map<MapContent::key_type, Variant>& MapContent::asMap() const { return impl->asMap(); } -std::map<MapContent::key_type, Variant>& MapContent::asMap() { return impl->asMap(); } - - -std::ostream& operator<<(std::ostream& out, const MapContent& m) -{ - out << m.asMap(); - return out; -} - -}} // namespace qpid::messaging diff --git a/cpp/src/qpid/messaging/MapView.cpp b/cpp/src/qpid/messaging/MapView.cpp deleted file mode 100644 index 8bb0a724d2..0000000000 --- a/cpp/src/qpid/messaging/MapView.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 "qpid/messaging/MapView.h" -#include "qpid/messaging/Message.h" -#include "qpid/client/amqp0_10/Codecs.h" - -namespace qpid { -namespace messaging { - -using namespace qpid::types; - -class MapViewImpl : public Variant -{ - public: - MapViewImpl(const Message& msg) : Variant(Variant::Map()) - { - if (msg.getContent().size()) { - qpid::client::amqp0_10::MapCodec codec; - codec.decode(msg.getContent(), *this); - } - } -}; - -MapView::MapView(const Message& m) : impl(new MapViewImpl(m)) {} -MapView::~MapView() { delete impl; } -MapView& MapView::operator=(const MapView& m) { *impl = *m.impl; return *this; } - -MapView::const_iterator MapView::begin() const { return impl->asMap().begin(); } -MapView::const_iterator MapView::end() const { return impl->asMap().end(); } -MapView::const_reverse_iterator MapView::rbegin() const { return impl->asMap().rbegin(); } -MapView::const_reverse_iterator MapView::rend() const { return impl->asMap().rend(); } - -bool MapView::empty() const { return impl->asMap().empty(); } -size_t MapView::size() const { return impl->asMap().size(); } - -MapView::const_iterator MapView::find(const key_type& key) const { return impl->asMap().find(key); } -const Variant& MapView::operator[](const key_type& key) const { return impl->asMap()[key]; } - -const std::map<MapView::key_type, Variant>& MapView::asMap() const { return impl->asMap(); } - -std::ostream& operator<<(std::ostream& out, const MapView& m) -{ - out << m.asMap(); - return out; -} - -}} // namespace qpid::messaging diff --git a/cpp/src/qpid/messaging/Message.cpp b/cpp/src/qpid/messaging/Message.cpp index 84245b7296..bbbb257b18 100644 --- a/cpp/src/qpid/messaging/Message.cpp +++ b/cpp/src/qpid/messaging/Message.cpp @@ -20,6 +20,8 @@ */ #include "qpid/messaging/Message.h" #include "qpid/messaging/MessageImpl.h" +#include "qpid/amqp_0_10/Codecs.h" +#include <boost/format.hpp> namespace qpid { namespace messaging { @@ -64,18 +66,73 @@ bool Message::getDurable() const { return impl->durable; } bool Message::getRedelivered() const { return impl->redelivered; } void Message::setRedelivered(bool redelivered) { impl->redelivered = redelivered; } -const VariantMap& Message::getProperties() const { return impl->getHeaders(); } -VariantMap& Message::getProperties() { return impl->getHeaders(); } +const Variant::Map& Message::getProperties() const { return impl->getHeaders(); } +Variant::Map& Message::getProperties() { return impl->getHeaders(); } void Message::setContent(const std::string& c) { impl->setBytes(c); } void Message::setContent(const char* chars, size_t count) { impl->setBytes(chars, count); } -const std::string& Message::getContent() const { return impl->getBytes(); } -std::string& Message::getContent() { return impl->getBytes(); } +std::string Message::getContent() const { return impl->getBytes(); } -void Message::getContent(std::pair<const char*, size_t>& content) const +const char* Message::getContentPtr() const { - content.first = impl->getBytes().data(); - content.second = impl->getBytes().size(); + return impl->getBytes().data(); +} + +size_t Message::getContentSize() const +{ + return impl->getBytes().size(); +} + + +EncodingException::EncodingException(const std::string& msg) : qpid::Exception(msg) {} + +const std::string BAD_ENCODING("Unsupported encoding: %1% (only %2% is supported at present)."); + +bool checkEncoding(const std::string& requested, const std::string& supported) +{ + if (requested.size()) { + if (requested == supported) return true; + else throw EncodingException((boost::format(BAD_ENCODING) % requested % supported).str()); + } else { + return false; + } +} + +/* + * Currently only support a single encoding type for both list and + * map, based on AMQP 0-10, though wider support is anticipated in the + * future. This method simply checks that the desired encoding (if one + * is specified, either through the message-content or through an + * override) is indeed supported. + */ +void checkEncoding(const Message& message, const std::string& requested, const std::string& supported) +{ + checkEncoding(requested, supported) || checkEncoding(message.getContentType(), supported); +} + +void decode(const Message& message, Variant::Map& map, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::MapCodec::contentType); + qpid::amqp_0_10::MapCodec::decode(message.getContent(), map); +} +void decode(const Message& message, Variant::List& list, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::ListCodec::contentType); + qpid::amqp_0_10::ListCodec::decode(message.getContent(), list); +} +void encode(const Variant::Map& map, Message& message, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::MapCodec::contentType); + std::string content; + qpid::amqp_0_10::MapCodec::encode(map, content); + message.setContent(content); +} +void encode(const Variant::List& list, Message& message, const std::string& encoding) +{ + checkEncoding(message, encoding, qpid::amqp_0_10::ListCodec::contentType); + std::string content; + qpid::amqp_0_10::ListCodec::encode(list, content); + message.setContent(content); } }} // namespace qpid::messaging diff --git a/cpp/src/qpid/messaging/MessageImpl.cpp b/cpp/src/qpid/messaging/MessageImpl.cpp index dea6681244..6138ab4a2c 100644 --- a/cpp/src/qpid/messaging/MessageImpl.cpp +++ b/cpp/src/qpid/messaging/MessageImpl.cpp @@ -54,8 +54,8 @@ const std::string& MessageImpl::getSubject() const { return subject; } void MessageImpl::setContentType(const std::string& s) { contentType = s; } const std::string& MessageImpl::getContentType() const { return contentType; } -const VariantMap& MessageImpl::getHeaders() const { return headers; } -VariantMap& MessageImpl::getHeaders() { return headers; } +const Variant::Map& MessageImpl::getHeaders() const { return headers; } +Variant::Map& MessageImpl::getHeaders() { return headers; } //should these methods be on MessageContent? void MessageImpl::setBytes(const std::string& c) { bytes = c; } diff --git a/cpp/src/qpid/messaging/Receiver.cpp b/cpp/src/qpid/messaging/Receiver.cpp index df13052671..ff67650cf8 100644 --- a/cpp/src/qpid/messaging/Receiver.cpp +++ b/cpp/src/qpid/messaging/Receiver.cpp @@ -39,8 +39,8 @@ bool Receiver::fetch(Message& message, Duration timeout) { return impl->fetch(me Message Receiver::fetch(Duration timeout) { return impl->fetch(timeout); } void Receiver::setCapacity(uint32_t c) { impl->setCapacity(c); } uint32_t Receiver::getCapacity() { return impl->getCapacity(); } -uint32_t Receiver::available() { return impl->available(); } -uint32_t Receiver::pendingAck() { return impl->pendingAck(); } +uint32_t Receiver::getAvailable() { return impl->available(); } +uint32_t Receiver::getPendingAck() { return impl->pendingAck(); } void Receiver::close() { impl->close(); } const std::string& Receiver::getName() const { return impl->getName(); } Session Receiver::getSession() const { return impl->getSession(); } diff --git a/cpp/src/qpid/messaging/Sender.cpp b/cpp/src/qpid/messaging/Sender.cpp index 711a857d7a..2d5cfbcec5 100644 --- a/cpp/src/qpid/messaging/Sender.cpp +++ b/cpp/src/qpid/messaging/Sender.cpp @@ -36,7 +36,7 @@ void Sender::send(const Message& message) { impl->send(message); } void Sender::close() { impl->close(); } void Sender::setCapacity(uint32_t c) { impl->setCapacity(c); } uint32_t Sender::getCapacity() { return impl->getCapacity(); } -uint32_t Sender::pending() { return impl->pending(); } +uint32_t Sender::getPending() { return impl->pending(); } const std::string& Sender::getName() const { return impl->getName(); } Session Sender::getSession() const { return impl->getSession(); } diff --git a/cpp/src/qpid/messaging/Session.cpp b/cpp/src/qpid/messaging/Session.cpp index 2ac19727e3..4d1e633a86 100644 --- a/cpp/src/qpid/messaging/Session.cpp +++ b/cpp/src/qpid/messaging/Session.cpp @@ -81,8 +81,8 @@ Receiver Session::nextReceiver(Duration timeout) return impl->nextReceiver(timeout); } -uint32_t Session::available() { return impl->available(); } -uint32_t Session::pendingAck() { return impl->pendingAck(); } +uint32_t Session::getAvailable() { return impl->available(); } +uint32_t Session::getPendingAck() { return impl->pendingAck(); } Sender Session::getSender(const std::string& name) const { diff --git a/cpp/src/qpid/types/Variant.cpp b/cpp/src/qpid/types/Variant.cpp index 3729b6c947..904a596e82 100644 --- a/cpp/src/qpid/types/Variant.cpp +++ b/cpp/src/qpid/types/Variant.cpp @@ -633,7 +633,7 @@ Variant::operator int32_t() const { return asInt32(); } Variant::operator int64_t() const { return asInt64(); } Variant::operator float() const { return asFloat(); } Variant::operator double() const { return asDouble(); } -Variant::operator const char*() const { return asString().c_str(); } +Variant::operator std::string() const { return asString(); } Variant::operator Uuid() const { return asUuid(); } std::ostream& operator<<(std::ostream& out, const Variant::Map& map) |