summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/README3
-rw-r--r--cpp/src/Makefile.am2
-rw-r--r--cpp/src/qpid/framing/Uuid.cpp47
-rw-r--r--cpp/src/qpid/framing/Uuid.h56
-rw-r--r--cpp/src/tests/Makefile.am5
-rw-r--r--cpp/src/tests/Uuid.cpp60
6 files changed, 172 insertions, 1 deletions
diff --git a/cpp/README b/cpp/README
index 805a42cd86..ed740cdcc8 100644
--- a/cpp/README
+++ b/cpp/README
@@ -39,6 +39,7 @@ Qpid is compiled against libraries:
* boost <http://www.boost.org> (1.33.1)
* cppunit <http://cppunit.sourceforge.net> (1.11.4)
* libdaemon <http://www.stud.uni-hamburg.de/users/lennart/projects/libdaemon> (0.10)
+ * uuid <http://e2fsprogs.sourceforge.net/> (1.39)
Using tools:
@@ -73,7 +74,7 @@ If building from a source distribution you do not need:
On linux most packages can be installed using your distribution's package
management tool. For example on Fedora:
- # yum install apr-devel boost-devel cppunit-devel libdaemon-devel
+ # yum install apr-devel boost-devel cppunit-devel libdaemon-devel e2fsprogs-devel
# yum install pkgconfig doxygen graphviz help2man
Follow the manual installation instruction below for any packages not
diff --git a/cpp/src/Makefile.am b/cpp/src/Makefile.am
index 9f4440323e..d898a25562 100644
--- a/cpp/src/Makefile.am
+++ b/cpp/src/Makefile.am
@@ -152,6 +152,7 @@ libqpidcommon_la_SOURCES = \
qpid/framing/Correlator.cpp \
qpid/framing/Value.cpp \
qpid/framing/Proxy.cpp \
+ qpid/framing/Uuid.cpp \
qpid/framing/Handler.h \
qpid/framing/FrameHandler.h \
qpid/framing/HandlerUpdater.h \
@@ -345,6 +346,7 @@ nobase_include_HEADERS = \
qpid/framing/Requester.h \
qpid/framing/Responder.h \
qpid/framing/Value.h \
+ qpid/framing/Uuid.h \
qpid/framing/amqp_framing.h \
qpid/framing/amqp_types.h \
qpid/framing/amqp_types_full.h \
diff --git a/cpp/src/qpid/framing/Uuid.cpp b/cpp/src/qpid/framing/Uuid.cpp
new file mode 100644
index 0000000000..47010ba515
--- /dev/null
+++ b/cpp/src/qpid/framing/Uuid.cpp
@@ -0,0 +1,47 @@
+/*
+ *
+ * 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 "Uuid.h"
+#include "uuid/uuid.h"
+
+namespace qpid {
+namespace framing {
+
+using namespace std;
+
+Uuid::Uuid() { uuid_generate(c_array()); }
+
+Uuid::Uuid(uint8_t* uu) { uuid_copy(c_array(),uu); }
+
+static const size_t UNPARSED_SIZE=36;
+
+ostream& operator<<(ostream& out, const Uuid& uuid) {
+ char unparsed[UNPARSED_SIZE + 1];
+ uuid_unparse(uuid.data(), unparsed);
+ return out << unparsed;
+}
+
+istream& operator>>(istream& in, Uuid& uuid) {
+ char unparsed[UNPARSED_SIZE + 1] = {0};
+ in.get(unparsed, sizeof(unparsed));
+ if (uuid_parse(unparsed, uuid.c_array()) != 0)
+ in.setstate(ios::failbit);
+ return in;
+}
+
+}} // namespace qpid::framing
diff --git a/cpp/src/qpid/framing/Uuid.h b/cpp/src/qpid/framing/Uuid.h
new file mode 100644
index 0000000000..8fa5abd4dc
--- /dev/null
+++ b/cpp/src/qpid/framing/Uuid.h
@@ -0,0 +1,56 @@
+#ifndef QPID_FRAMING_UUID_H
+#define QPID_FRAMING_UUID_H
+
+/*
+ *
+ * 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 <boost/array.hpp>
+#include <ostream>
+#include <istream>
+
+namespace qpid {
+namespace framing {
+
+/**
+ * A UUID is represented as a boost::array of 16 bytes.
+ *
+ * Full value semantics, operators ==, < etc. are provided by
+ * boost::array so Uuid can be the key type in a map etc.
+ */
+struct Uuid : public boost::array<uint8_t, 16> {
+ /** Geneate universally unique identifier */
+ Uuid();
+
+ /** Initialize from 16 bytes of data */
+ Uuid(uint8_t* data);
+
+ // Default op= and copy ctor are fine.
+ // boost::array gives us ==, < etc.
+};
+
+/** Print in format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb */
+std::ostream& operator<<(std::ostream&, const Uuid&);
+
+/** Read from format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb */
+std::istream& operator>>(std::istream&, Uuid&);
+
+}} // namespace qpid::framing
+
+
+
+#endif /*!QPID_FRAMING_UUID_H*/
diff --git a/cpp/src/tests/Makefile.am b/cpp/src/tests/Makefile.am
index 5a8ad1bde6..5bb2c80b2c 100644
--- a/cpp/src/tests/Makefile.am
+++ b/cpp/src/tests/Makefile.am
@@ -27,6 +27,11 @@ check_PROGRAMS+=Url
Url_SOURCES=Url.cpp test_tools.h
Url_LDADD=-lboost_unit_test_framework $(lib_common)
+TESTS+=Uuid
+check_PROGRAMS+=Uuid
+Uuid_SOURCES=Uuid.cpp test_tools.h
+Uuid_LDADD=-lboost_unit_test_framework $(lib_common)
+
include cluster.mk
# NB: CppUnit test libraries below will be migrated to boost test programs.
diff --git a/cpp/src/tests/Uuid.cpp b/cpp/src/tests/Uuid.cpp
new file mode 100644
index 0000000000..97e7518c85
--- /dev/null
+++ b/cpp/src/tests/Uuid.cpp
@@ -0,0 +1,60 @@
+/*
+ *
+ * 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 "qpid/framing/Uuid.h"
+
+#define BOOST_AUTO_TEST_MAIN
+#include <boost/test/auto_unit_test.hpp>
+
+#include <set>
+
+using namespace std;
+using namespace qpid::framing;
+
+struct UniqueSet : public std::set<Uuid> {
+ void operator()(const Uuid& uuid) {
+ BOOST_REQUIRE(find(uuid) == end());
+ insert(uuid);
+ }
+};
+
+BOOST_AUTO_TEST_CASE(testUuidCtor) {
+ // Uniqueness
+ boost::array<Uuid,1000> uuids;
+ UniqueSet unique;
+ for_each(uuids.begin(), uuids.end(), unique);
+}
+
+boost::array<uint8_t, 16> sample = {{'\x1b', '\x4e', '\x28', '\xba', '\x2f', '\xa1', '\x11', '\xd2', '\x88', '\x3f', '\xb9', '\xa7', '\x61', '\xbd', '\xe3', '\xfb'}};
+const string sampleStr("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb");
+
+BOOST_AUTO_TEST_CASE(testUuidIstream) {
+ Uuid uuid;
+ istringstream in(sampleStr);
+ in >> uuid;
+ BOOST_CHECK(!in.fail());
+ BOOST_CHECK(uuid == sample);
+}
+
+BOOST_AUTO_TEST_CASE(testUuidOstream) {
+ Uuid uuid(sample.c_array());
+ ostringstream out;
+ out << uuid;
+ BOOST_CHECK(out.good());
+ BOOST_CHECK_EQUAL(out.str(), sampleStr);
+}