summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2007-10-23 12:41:16 +0000
committerAndrew Stitcher <astitcher@apache.org>2007-10-23 12:41:16 +0000
commit037c28c0c658b44529783b79a6b895e3b89dc699 (patch)
tree38667354023added92eff214d939158635f66ef0 /cpp
parent9e171cd92aeb446b080231ae100d75f4d2b0dfe4 (diff)
downloadqpid-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.cpp3
-rw-r--r--cpp/src/qpid/framing/FieldTable.cpp6
-rw-r--r--cpp/src/qpid/framing/FieldTable.h8
-rw-r--r--cpp/src/qpid/framing/FieldValue.h29
-rw-r--r--cpp/src/tests/FieldValue.cpp9
-rw-r--r--cpp/src/tests/Makefile.am27
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)