diff options
author | Andrew Stitcher <astitcher@apache.org> | 2007-10-23 12:41:16 +0000 |
---|---|---|
committer | Andrew Stitcher <astitcher@apache.org> | 2007-10-23 12:41:16 +0000 |
commit | 037c28c0c658b44529783b79a6b895e3b89dc699 (patch) | |
tree | 38667354023added92eff214d939158635f66ef0 /cpp | |
parent | 9e171cd92aeb446b080231ae100d75f4d2b0dfe4 (diff) | |
download | qpid-python-037c28c0c658b44529783b79a6b895e3b89dc699.tar.gz |
More tidying up of field table API
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@587480 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/qpid/broker/QueuePolicy.cpp | 3 | ||||
-rw-r--r-- | cpp/src/qpid/framing/FieldTable.cpp | 6 | ||||
-rw-r--r-- | cpp/src/qpid/framing/FieldTable.h | 8 | ||||
-rw-r--r-- | cpp/src/qpid/framing/FieldValue.h | 29 | ||||
-rw-r--r-- | cpp/src/tests/FieldValue.cpp | 9 | ||||
-rw-r--r-- | cpp/src/tests/Makefile.am | 27 |
6 files changed, 56 insertions, 26 deletions
diff --git a/cpp/src/qpid/broker/QueuePolicy.cpp b/cpp/src/qpid/broker/QueuePolicy.cpp index 620822cddc..9b9717def0 100644 --- a/cpp/src/qpid/broker/QueuePolicy.cpp +++ b/cpp/src/qpid/broker/QueuePolicy.cpp @@ -19,6 +19,7 @@ * */ #include "QueuePolicy.h" +#include "qpid/framing/FieldValue.h" using namespace qpid::broker; using namespace qpid::framing; @@ -60,7 +61,7 @@ int QueuePolicy::getInt(const FieldTable& settings, const std::string& key, int // restricts the values that can be set on the queue policy. try { return settings.getInt(key); - } catch (FieldNotFoundException& ignore) { + } catch (FieldValueException& ignore) { return defaultValue; } } diff --git a/cpp/src/qpid/framing/FieldTable.cpp b/cpp/src/qpid/framing/FieldTable.cpp index f30b49f739..3c0284f2c8 100644 --- a/cpp/src/qpid/framing/FieldTable.cpp +++ b/cpp/src/qpid/framing/FieldTable.cpp @@ -104,9 +104,9 @@ T getValue(const FieldTable::ValuePtr value) return value->get<T>(); } -//std::string FieldTable::getString(const std::string& name) const { -// return getValue<std::string>(name); -//} +std::string FieldTable::getString(const std::string& name) const { + return getValue<std::string>(get(name)); +} int FieldTable::getInt(const std::string& name) const { return getValue<int>(get(name)); diff --git a/cpp/src/qpid/framing/FieldTable.h b/cpp/src/qpid/framing/FieldTable.h index a3e01a968e..707496a861 100644 --- a/cpp/src/qpid/framing/FieldTable.h +++ b/cpp/src/qpid/framing/FieldTable.h @@ -64,7 +64,7 @@ class FieldTable void setTable(const std::string& name, const FieldTable& value); //void setDecimal(string& name, xxx& value); -// std::string getString(const std::string& name) const; + std::string getString(const std::string& name) const; int getInt(const std::string& name) const; // uint64_t getTimestamp(const std::string& name) const; // void getTable(const std::string& name, FieldTable& value) const; @@ -86,9 +86,9 @@ class FieldTable 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/src/qpid/framing/FieldValue.h b/cpp/src/qpid/framing/FieldValue.h index 2a33201254..3ea367c481 100644 --- a/cpp/src/qpid/framing/FieldValue.h +++ b/cpp/src/qpid/framing/FieldValue.h @@ -21,6 +21,7 @@ * */ +#include "qpid/Exception.h" #include "Buffer.h" #include "amqp_types.h" @@ -34,6 +35,22 @@ namespace qpid { namespace framing { /** + * Exception that is base exception for all field table errors + * + * \ingroup clientapi + */ +class FieldValueException : public qpid::Exception {}; + +/** + * Exception thrown when we can't perform requested conversion + * + * \ingroup clientapi + */ +struct InvalidConversionException : public FieldValueException { + InvalidConversionException() {} +}; + +/** * Value that can appear in an AMQP field table * * \ingroup clientapi @@ -51,10 +68,10 @@ class FieldValue { virtual void decode(Buffer& buffer) = 0; virtual bool operator==(const Data&) const = 0; - virtual bool convertsToInt() const { assert(0!=0); return false; } + virtual bool convertsToInt() const { return false; } virtual bool convertsToString() const { return false; } - virtual int64_t getInt() const { assert(0!=0); return 0;} - virtual std::string getString() const { assert(0!=0); return ""; } + virtual int64_t getInt() const { throw InvalidConversionException();} + virtual std::string getString() const { throw InvalidConversionException(); } virtual void print(std::ostream& out) const = 0; }; @@ -70,7 +87,7 @@ class FieldValue { void print(std::ostream& out) const { out << "(0x" << std::hex << int(typeOctet) << ")"; data->print(out); } template <typename T> bool convertsTo() const { return false; } - template <typename T> T get() const; + template <typename T> T get() const { throw InvalidConversionException(); } protected: FieldValue(uint8_t t, Data* d): typeOctet(t), data(d) {} @@ -172,6 +189,10 @@ class VariableWidthValue : public FieldValue::Data { if (rhs == 0) return false; else return octets==rhs->octets; } + + bool convertsToString() const { return true; } + std::string getString() const { return std::string(octets.begin(), octets.end()); } + void print(std::ostream& o) const { o << "V" << lenwidth << ":" << octets.size() << ":"; }; }; diff --git a/cpp/src/tests/FieldValue.cpp b/cpp/src/tests/FieldValue.cpp index f2a859c95e..311061b646 100644 --- a/cpp/src/tests/FieldValue.cpp +++ b/cpp/src/tests/FieldValue.cpp @@ -35,7 +35,12 @@ BOOST_AUTO_TEST_CASE(testStringValueEquals) BOOST_CHECK(StringValue("abc") == s); BOOST_CHECK(StringValue("foo") != s); BOOST_CHECK(s != i); + BOOST_CHECK(s.convertsTo<std::string>() == true); + BOOST_CHECK(s.convertsTo<int>() == false); + BOOST_CHECK(s.get<std::string>() == "abc"); + BOOST_CHECK_THROW(s.get<int>(), InvalidConversionException); // BOOST_CHECK(s != ft); + } BOOST_AUTO_TEST_CASE(testIntegerValueEquals) @@ -43,6 +48,10 @@ BOOST_AUTO_TEST_CASE(testIntegerValueEquals) BOOST_CHECK(IntegerValue(42) == i); BOOST_CHECK(IntegerValue(5) != i); BOOST_CHECK(i != s); + BOOST_CHECK(i.convertsTo<std::string>() == false); + BOOST_CHECK(i.convertsTo<int>() == true); + BOOST_CHECK_THROW(i.get<std::string>(), InvalidConversionException); + BOOST_CHECK(i.get<int>() == 42); // BOOST_CHECK(i != ft); } diff --git a/cpp/src/tests/Makefile.am b/cpp/src/tests/Makefile.am index b484bc19c7..233614367d 100644 --- a/cpp/src/tests/Makefile.am +++ b/cpp/src/tests/Makefile.am @@ -113,7 +113,7 @@ broker_unit_tests = \ ClientSessionTest #client_unit_tests = \ - ClientChannelTest +# ClientChannelTest framing_unit_tests = \ FramingTest \ @@ -139,8 +139,7 @@ testprogs= \ topic_publisher # echo_service -#check_PROGRAMS += $(testprogs) interop_runner -check_PROGRAMS += $(testprogs) +check_PROGRAMS += $(testprogs) interop_runner TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir) $(srcdir)/run_test @@ -201,14 +200,14 @@ all-am: .valgrind.supp .valgrindrc CLEANFILES+=valgrind.out *.log *.vglog .valgrindrc .valgrind.supp dummy_test $(unit_wrappers) MAINTAINERCLEANFILES=gen.mk -#interop_runner_SOURCES = \ -# interop_runner.cpp \ -# SimpleTestCaseBase.cpp \ -# BasicP2PTest.cpp \ -# BasicPubSubTest.cpp \ -# SimpleTestCaseBase.h \ -# BasicP2PTest.h \ -# BasicPubSubTest.h \ -# TestCase.h \ -# TestOptions.h -#interop_runner_LDADD = $(lib_client) $(lib_common) $(extra_libs) +interop_runner_SOURCES = \ + interop_runner.cpp \ + SimpleTestCaseBase.cpp \ + BasicP2PTest.cpp \ + BasicPubSubTest.cpp \ + SimpleTestCaseBase.h \ + BasicP2PTest.h \ + BasicPubSubTest.h \ + TestCase.h \ + TestOptions.h +interop_runner_LDADD = $(lib_client) $(lib_common) $(extra_libs) |