Author: gsim
Date: Fri Jan 15 15:17:01 2010
New Revision: 899657

URL: http://svn.apache.org/viewvc?rev=899657&view=rev
Log:
QPID-2323: add a Uuid type and allow it as the value of a Variant.

Added:
    qpid/trunk/qpid/cpp/include/qpid/messaging/Uuid.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Uuid.cpp
Modified:
    qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp
    qpid/trunk/qpid/cpp/examples/messaging/spout.cpp
    qpid/trunk/qpid/cpp/include/qpid/framing/FieldValue.h
    qpid/trunk/qpid/cpp/include/qpid/messaging/Variant.h
    qpid/trunk/qpid/cpp/src/CMakeLists.txt
    qpid/trunk/qpid/cpp/src/Makefile.am
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/Codecs.cpp
    qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/Variant.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h
    qpid/trunk/qpid/cpp/src/tests/CMakeLists.txt
    qpid/trunk/qpid/cpp/src/tests/Uuid.cpp
    qpid/trunk/qpid/cpp/src/tests/Variant.cpp

Modified: qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp Fri Jan 15 15:17:01 
2010
@@ -53,6 +53,7 @@
         colours.push_back(Variant("green"));
         colours.push_back(Variant("white"));
         content["colours"] = colours;
+        content["uuid"] = Uuid(true);
         content.encode();
        
         sender.send(message);

Modified: qpid/trunk/qpid/cpp/examples/messaging/spout.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/spout.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/spout.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/spout.cpp Fri Jan 15 15:17:01 2010
@@ -26,7 +26,6 @@
 #include <qpid/messaging/Sender.h>
 #include <qpid/messaging/Session.h>
 #include <qpid/messaging/Variant.h>
-#include <qpid/framing/Uuid.h>
 #include <qpid/Exception.h>
 #include <qpid/Options.h>
 #include <qpid/log/Logger.h>
@@ -39,7 +38,6 @@
 #include <boost/format.hpp>
 
 using namespace qpid::messaging;
-using qpid::framing::Uuid;
 using qpid::sys::AbsTime;
 using qpid::sys::now;
 using qpid::sys::TIME_INFINITE;

Modified: qpid/trunk/qpid/cpp/include/qpid/framing/FieldValue.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/framing/FieldValue.h?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/framing/FieldValue.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/framing/FieldValue.h Fri Jan 15 15:17:01 
2010
@@ -99,6 +99,7 @@
 
     template <class T, int W> T getIntegerValue() const;
     template <class T, int W> T getFloatingPointValue() const;
+    template <int W> void getFixedWidthValue(unsigned char*) const;
     template <class T> bool get(T&) const;
 
   protected:
@@ -209,6 +210,16 @@
     }
 }
 
+template <int W> void FieldValue::getFixedWidthValue(unsigned char* value) 
const
+{
+    FixedWidthValue<W>* const fwv = dynamic_cast< FixedWidthValue<W>* 
const>(data.get());
+    if (fwv) {
+        for (uint i = 0; i < W; ++i) value[i] = fwv->rawOctets()[i];
+    } else {
+        throw InvalidConversionException();
+    }
+}
+
 template <>
 inline float FieldValue::get<float>() const {
     return getFloatingPointValue<float, 4>();
@@ -417,6 +428,11 @@
     QPID_COMMON_EXTERN ListValue(const List&);
 };
 
+class UuidValue : public FieldValue {
+  public:
+    QPID_COMMON_EXTERN UuidValue(const unsigned char*);
+};
+
 template <class T>
 bool getEncodedValue(FieldTable::ValuePtr vptr, T& value)
 {

Added: qpid/trunk/qpid/cpp/include/qpid/messaging/Uuid.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Uuid.h?rev=899657&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Uuid.h (added)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Uuid.h Fri Jan 15 15:17:01 2010
@@ -0,0 +1,93 @@
+#ifndef QPID_MESSAGING_UUID_H
+#define QPID_MESSAGING_UUID_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/client/ClientImportExport.h"
+#include <iosfwd>
+
+namespace qpid {
+namespace messaging {
+
+class Uuid
+{
+  public:
+    static const size_t SIZE;
+    /** 
+     * If unique is true, this will generate a new unique uuid, if not
+     * it will construct a null uuid.
+     */
+    QPID_CLIENT_EXTERN Uuid(bool unique=false);
+    QPID_CLIENT_EXTERN Uuid(const Uuid&);
+    QPID_CLIENT_EXTERN Uuid& operator=(const Uuid&);
+    /** Copy the UUID from data16, which must point to a 16-byte UUID */
+    QPID_CLIENT_EXTERN Uuid(const unsigned char* data16);
+
+    /** Set to a new unique identifier. */
+    QPID_CLIENT_EXTERN void generate();
+
+    /** Set to all zeros. */
+    QPID_CLIENT_EXTERN void clear();
+
+    /** Test for null (all zeros). */
+    QPID_CLIENT_EXTERN bool isNull() const;
+    QPID_CLIENT_EXTERN operator bool() const;
+    QPID_CLIENT_EXTERN bool operator!() const;
+
+    /** String value in format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb. */
+    QPID_CLIENT_EXTERN std::string str() const;
+
+    QPID_CLIENT_EXTERN size_t size() const;
+    QPID_CLIENT_EXTERN const unsigned char* data() const;
+
+    friend bool operator==(const Uuid&, const Uuid&);
+    friend bool operator!=(const Uuid&, const Uuid&);
+    friend bool operator<(const Uuid&, const Uuid&);
+    friend bool operator>(const Uuid&, const Uuid&);
+    friend bool operator<=(const Uuid&, const Uuid&);
+    friend bool operator>=(const Uuid&, const Uuid&);
+    friend std::ostream& operator<<(std::ostream&, Uuid);
+    friend std::istream& operator>>(std::istream&, Uuid&);
+
+  private:
+    unsigned char bytes[16];
+};
+
+/** Returns true if the uuids are equal, false otherwise. **/
+QPID_CLIENT_EXTERN bool operator==(const Uuid&, const Uuid&);
+/** Returns true if the uuids are NOT equal, false if they are. **/
+QPID_CLIENT_EXTERN bool operator!=(const Uuid&, const Uuid&);
+
+QPID_CLIENT_EXTERN bool operator<(const Uuid&, const Uuid&);
+QPID_CLIENT_EXTERN bool operator>(const Uuid&, const Uuid&);
+QPID_CLIENT_EXTERN bool operator<=(const Uuid&, const Uuid&);
+QPID_CLIENT_EXTERN bool operator>=(const Uuid&, const Uuid&);
+
+/** Print in format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb. */
+QPID_CLIENT_EXTERN std::ostream& operator<<(std::ostream&, Uuid);
+
+/** Read from format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb. */
+QPID_CLIENT_EXTERN std::istream& operator>>(std::istream&, Uuid&);
+
+}} // namespace qpid::messaging
+
+#endif  /*!QPID_MESSAGING_UUID_H*/

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Variant.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Variant.h?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Variant.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Variant.h Fri Jan 15 15:17:01 
2010
@@ -25,6 +25,7 @@
 #include <map>
 #include <ostream>
 #include <string>
+#include "Uuid.h"
 #include "qpid/Exception.h"
 #include "qpid/sys/IntegerTypes.h"
 #include "qpid/client/ClientImportExport.h"
@@ -55,7 +56,8 @@
     VAR_DOUBLE,
     VAR_STRING,
     VAR_MAP,
-    VAR_LIST
+    VAR_LIST,
+    VAR_UUID
 };
 
 class VariantImpl;
@@ -86,6 +88,7 @@
     QPID_CLIENT_EXTERN Variant(const Map&);
     QPID_CLIENT_EXTERN Variant(const List&);
     QPID_CLIENT_EXTERN Variant(const Variant&);
+    QPID_CLIENT_EXTERN Variant(const Uuid&);
 
     QPID_CLIENT_EXTERN ~Variant();
 
@@ -108,6 +111,7 @@
     QPID_CLIENT_EXTERN Variant& operator=(const Map&);
     QPID_CLIENT_EXTERN Variant& operator=(const List&);
     QPID_CLIENT_EXTERN Variant& operator=(const Variant&);
+    QPID_CLIENT_EXTERN Variant& operator=(const Uuid&);
 
     QPID_CLIENT_EXTERN bool asBool() const;
     QPID_CLIENT_EXTERN uint8_t asUint8() const;
@@ -121,6 +125,7 @@
     QPID_CLIENT_EXTERN float asFloat() const;
     QPID_CLIENT_EXTERN double asDouble() const;
     QPID_CLIENT_EXTERN std::string asString() const;
+    QPID_CLIENT_EXTERN Uuid asUuid() const;
 
     QPID_CLIENT_EXTERN operator bool() const;
     QPID_CLIENT_EXTERN operator uint8_t() const;
@@ -134,6 +139,7 @@
     QPID_CLIENT_EXTERN operator float() const;
     QPID_CLIENT_EXTERN operator double() const;
     QPID_CLIENT_EXTERN operator const char*() const;
+    QPID_CLIENT_EXTERN operator Uuid() const;
 
     QPID_CLIENT_EXTERN const Map& asMap() const;
     QPID_CLIENT_EXTERN Map& asMap();

Modified: qpid/trunk/qpid/cpp/src/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/CMakeLists.txt?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/CMakeLists.txt (original)
+++ qpid/trunk/qpid/cpp/src/CMakeLists.txt Fri Jan 15 15:17:01 2010
@@ -652,6 +652,7 @@
      qpid/messaging/SessionImpl.h
      qpid/messaging/Sender.cpp
      qpid/messaging/SenderImpl.h
+     qpid/messaging/Uuid.cpp
      qpid/messaging/Variant.cpp
      qpid/client/amqp0_10/AcceptTracker.h
      qpid/client/amqp0_10/AcceptTracker.cpp

Modified: qpid/trunk/qpid/cpp/src/Makefile.am
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/Makefile.am?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ qpid/trunk/qpid/cpp/src/Makefile.am Fri Jan 15 15:17:01 2010
@@ -705,6 +705,7 @@
   qpid/messaging/Sender.cpp                    \
   qpid/messaging/Receiver.cpp                  \
   qpid/messaging/Session.cpp                   \
+  qpid/messaging/Uuid.cpp                      \
   qpid/messaging/Variant.cpp                   \
   qpid/messaging/ConnectionImpl.h              \
   qpid/messaging/SenderImpl.h                  \
@@ -812,6 +813,7 @@
   ../include/qpid/messaging/Sender.h           \
   ../include/qpid/messaging/Receiver.h                 \
   ../include/qpid/messaging/Session.h          \
+  ../include/qpid/messaging/Uuid.h             \
   ../include/qpid/messaging/Variant.h          \
   ../include/qpid/client/amqp0_10/Codecs.h
 

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/Codecs.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/Codecs.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/Codecs.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/Codecs.cpp Fri Jan 15 15:17:01 
2010
@@ -112,6 +112,13 @@
     }
 }
 
+qpid::messaging::Uuid getUuid(FieldValue& value)
+{
+    unsigned char data[16];
+    value.getFixedWidthValue<16>(data);
+    return qpid::messaging::Uuid(data);
+}
+
 Variant toVariant(boost::shared_ptr<FieldValue> in)
 {
     Variant out;
@@ -123,19 +130,21 @@
       case 0x03: out = in->getIntegerValue<uint8_t, 1>(); break;
       case 0x04: break; //TODO: iso-8859-15 char
       case 0x08: out = in->getIntegerValue<bool, 1>(); break;
-      case 0x010: out.setEncoding(amqp0_10_binary);
-      case 0x011: out = in->getIntegerValue<int16_t, 2>(); break;
-      case 0x012: out = in->getIntegerValue<uint16_t, 2>(); break;
-      case 0x020: out.setEncoding(amqp0_10_binary);
-      case 0x021: out = in->getIntegerValue<int32_t, 4>(); break;
-      case 0x022: out = in->getIntegerValue<uint32_t, 4>(); break;
-      case 0x023: out = in->get<float>(); break;
-      case 0x027: break; //TODO: utf-32 char
-      case 0x030: out.setEncoding(amqp0_10_binary);
-      case 0x031: out = in->getIntegerValue<int64_t, 8>(); break;
-      case 0x038: out.setEncoding(amqp0_10_datetime); //treat datetime as 
uint64_t, but set encoding
-      case 0x032: out = in->getIntegerValue<uint64_t, 8>(); break;
-      case 0x033:out = in->get<double>(); break;
+      case 0x10: out.setEncoding(amqp0_10_binary);
+      case 0x11: out = in->getIntegerValue<int16_t, 2>(); break;
+      case 0x12: out = in->getIntegerValue<uint16_t, 2>(); break;
+      case 0x20: out.setEncoding(amqp0_10_binary);
+      case 0x21: out = in->getIntegerValue<int32_t, 4>(); break;
+      case 0x22: out = in->getIntegerValue<uint32_t, 4>(); break;
+      case 0x23: out = in->get<float>(); break;
+      case 0x27: break; //TODO: utf-32 char
+      case 0x30: out.setEncoding(amqp0_10_binary);
+      case 0x31: out = in->getIntegerValue<int64_t, 8>(); break;
+      case 0x38: out.setEncoding(amqp0_10_datetime); //treat datetime as 
uint64_t, but set encoding
+      case 0x32: out = in->getIntegerValue<uint64_t, 8>(); break;
+      case 0x33: out = in->get<double>(); break;
+
+      case 0x48: out = getUuid(*in); break;
 
         //TODO: figure out whether and how to map values with codes 0x40-0xd8
 
@@ -197,12 +206,11 @@
       case VAR_DOUBLE: out = boost::shared_ptr<FieldValue>(new 
DoubleValue(in.asDouble())); break;
         //TODO: check encoding (and length?) when deciding what AMQP type to 
treat string as
       case VAR_STRING: out = boost::shared_ptr<FieldValue>(new 
Str16Value(in.asString())); break;
+      case VAR_UUID: out = boost::shared_ptr<FieldValue>(new 
UuidValue(in.asUuid().data())); break;
       case VAR_MAP: 
-        //out = 
boost::shared_ptr<FieldValue>(toFieldValueCollection<FieldTableValue>(in.asMap(),
 &toFieldTableEntry));
         out = boost::shared_ptr<FieldValue>(toFieldTableValue(in.asMap()));
         break;
       case VAR_LIST: 
-        //out = 
boost::shared_ptr<FieldValue>(toFieldValueCollection<ListValue>(in.asList(), 
&toFieldValue));
         out = boost::shared_ptr<FieldValue>(toListValue(in.asList()));
         break;
     }

Modified: qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp Fri Jan 15 15:17:01 2010
@@ -197,6 +197,9 @@
 Integer16Value::Integer16Value(int16_t v) :
     FieldValue(0x11, new FixedWidthValue<2>(v))
 {}
+UuidValue::UuidValue(const unsigned char* v) :
+    FieldValue(0x48, new FixedWidthValue<16>(v))
+{}
 
 void FieldValue::print(std::ostream& out) const {
     data->print(out);

Added: qpid/trunk/qpid/cpp/src/qpid/messaging/Uuid.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Uuid.cpp?rev=899657&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Uuid.cpp (added)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Uuid.cpp Fri Jan 15 15:17:01 2010
@@ -0,0 +1,140 @@
+/*
+ *
+ * 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/Uuid.h"
+#include "qpid/sys/uuid.h"
+#include <sstream>
+#include <iostream>
+#include <string.h>
+
+namespace qpid {
+namespace messaging {
+
+using namespace std;
+
+const size_t Uuid::SIZE=16;
+static const size_t UNPARSED_SIZE=36; 
+
+Uuid::Uuid(bool unique)
+{
+    if (unique) {
+        generate();
+    } else {
+        clear();
+    }
+}
+
+Uuid::Uuid(const Uuid& other)
+{
+    ::memcpy(bytes, other.bytes, Uuid::SIZE);
+}
+
+Uuid::Uuid(const unsigned char* uuid)
+{
+    ::memcpy(bytes, uuid, Uuid::SIZE);
+}
+
+Uuid& Uuid::operator=(const Uuid& other)
+{
+    if (this == &other) return *this;
+    ::memcpy(bytes, other.bytes, Uuid::SIZE);
+    return *this;
+}
+
+void Uuid::generate()
+{
+    uuid_generate(bytes);
+}
+
+void Uuid::clear()
+{
+    uuid_clear(bytes);
+}
+
+// Force int 0/!0 to false/true; avoids compile warnings.
+bool Uuid::isNull() const
+{
+    return !!uuid_is_null(bytes);
+}
+
+Uuid::operator bool() const { return !isNull(); }
+bool Uuid::operator!() const { return isNull(); }
+
+size_t Uuid::size() const { return SIZE; }
+
+const unsigned char* Uuid::data() const
+{ 
+    return bytes;
+}
+
+bool operator==(const Uuid& a, const Uuid& b)
+{
+    return uuid_compare(a.bytes, b.bytes) == 0;
+}
+
+bool operator!=(const Uuid& a, const Uuid& b)
+{
+    return !(a == b);
+}
+
+bool operator<(const Uuid& a, const Uuid& b)
+{
+    return uuid_compare(a.bytes, b.bytes) < 0;
+}
+
+bool operator>(const Uuid& a, const Uuid& b)
+{
+    return uuid_compare(a.bytes, b.bytes) > 0;
+}
+
+bool operator<=(const Uuid& a, const Uuid& b)
+{
+    return uuid_compare(a.bytes, b.bytes) <= 0;
+}
+
+bool operator>=(const Uuid& a, const Uuid& b)
+{
+    return uuid_compare(a.bytes, b.bytes) >= 0;
+}
+
+ostream& operator<<(ostream& out, Uuid uuid)
+{
+    char unparsed[UNPARSED_SIZE + 1];
+    uuid_unparse(uuid.bytes, 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.bytes) != 0) 
+        in.setstate(ios::failbit);
+    return in;
+}
+
+std::string Uuid::str() const
+{
+    std::ostringstream os;
+    os << *this;
+    return os.str();
+}
+
+}} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Variant.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Variant.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Variant.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Variant.cpp Fri Jan 15 15:17:01 2010
@@ -52,6 +52,7 @@
     VariantImpl(const std::string&);
     VariantImpl(const Variant::Map&);
     VariantImpl(const Variant::List&);
+    VariantImpl(const Uuid&);
     ~VariantImpl();
 
     VariantType getType() const;
@@ -68,6 +69,7 @@
     float asFloat() const;
     double asDouble() const;
     std::string asString() const;
+    Uuid asUuid() const;
 
     const Variant::Map& asMap() const;
     Variant::Map& asMap();
@@ -130,6 +132,7 @@
 VariantImpl::VariantImpl(const std::string& s) : type(VAR_STRING) { value.v = 
new std::string(s); }
 VariantImpl::VariantImpl(const Variant::Map& m) : type(VAR_MAP) { value.v = 
new Variant::Map(m); }
 VariantImpl::VariantImpl(const Variant::List& l) : type(VAR_LIST) { value.v = 
new Variant::List(l); }
+VariantImpl::VariantImpl(const Uuid& u) : type(VAR_UUID) { value.v = new 
Uuid(u); }
 
 VariantImpl::~VariantImpl() { 
     switch (type) {
@@ -142,6 +145,9 @@
       case VAR_LIST:
         delete reinterpret_cast<Variant::List*>(value.v);
         break;
+      case VAR_UUID:
+        delete reinterpret_cast<Uuid*>(value.v);
+        break;
       default:
         break;
     }
@@ -312,11 +318,19 @@
       case VAR_DOUBLE: return boost::lexical_cast<std::string>(value.d);
       case VAR_FLOAT: return boost::lexical_cast<std::string>(value.f);
       case VAR_STRING: return *reinterpret_cast<std::string*>(value.v);
+      case VAR_UUID: return reinterpret_cast<Uuid*>(value.v)->str();
       case VAR_LIST: return toString(asList());
       case VAR_MAP: return toString(asMap());
       default: throw InvalidConversion(QPID_MSG("Cannot convert from " << 
getTypeName(type) << " to " << getTypeName(VAR_STRING)));
     }
 }
+Uuid VariantImpl::asUuid() const
+{
+    switch(type) {
+      case VAR_UUID: return *reinterpret_cast<Uuid*>(value.v);
+      default: throw InvalidConversion(QPID_MSG("Cannot convert from " << 
getTypeName(type) << " to " << getTypeName(VAR_UUID)));
+    }
+}
 
 bool VariantImpl::isEqualTo(VariantImpl& other) const
 {
@@ -336,6 +350,8 @@
           case VAR_FLOAT: return value.f == other.value.f;
           case VAR_STRING: return *reinterpret_cast<std::string*>(value.v) 
                 == *reinterpret_cast<std::string*>(other.value.v);
+          case VAR_UUID: return *reinterpret_cast<Uuid*>(value.v) 
+                == *reinterpret_cast<Uuid*>(other.value.v);
           case VAR_LIST: return equal(asList(), other.asList());
           case VAR_MAP: return equal(asMap(), other.asMap());
         }
@@ -412,6 +428,7 @@
       case VAR_STRING: return "string";
       case VAR_MAP: return "map";
       case VAR_LIST: return "list";
+      case VAR_UUID: return "uuid";
     }
     return "<unknown>";//should never happen
 }
@@ -433,6 +450,7 @@
       case VAR_STRING: return new VariantImpl(v.asString());
       case VAR_MAP: return new VariantImpl(v.asMap());
       case VAR_LIST: return new VariantImpl(v.asList());
+      case VAR_UUID: return new VariantImpl(v.asUuid());
       default: return new VariantImpl();
     }
 }
@@ -454,6 +472,7 @@
 Variant::Variant(const Map& m) : impl(new VariantImpl(m)) {}
 Variant::Variant(const List& l) : impl(new VariantImpl(l)) {}
 Variant::Variant(const Variant& v) : impl(VariantImpl::create(v)) {}
+Variant::Variant(const Uuid& u) : impl(new VariantImpl(u)) {}
 
 Variant::~Variant() { if (impl) delete impl; }
 
@@ -548,6 +567,13 @@
     return *this;
 }
 
+Variant& Variant::operator=(const Uuid& u)
+{
+    if (impl) delete impl;
+    impl = new VariantImpl(u);
+    return *this;
+}
+
 Variant& Variant::operator=(const Map& m)
 {
     if (impl) delete impl;
@@ -583,6 +609,7 @@
 float Variant::asFloat() const { return impl->asFloat(); }
 double Variant::asDouble() const { return impl->asDouble(); }
 std::string Variant::asString() const { return impl->asString(); }
+Uuid Variant::asUuid() const { return impl->asUuid(); }
 const Variant::Map& Variant::asMap() const { return impl->asMap(); }
 Variant::Map& Variant::asMap() { return impl->asMap(); }
 const Variant::List& Variant::asList() const { return impl->asList(); }
@@ -604,6 +631,7 @@
 Variant::operator float() const { return asFloat(); }
 Variant::operator double() const { return asDouble(); }
 Variant::operator const char*() const { return asString().c_str(); }
+Variant::operator Uuid() const { return asUuid(); }
 
 std::ostream& operator<<(std::ostream& out, const Variant::Map& map)
 {

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.cpp Fri Jan 15 15:17:01 2010
@@ -57,3 +57,6 @@
     }
 }
 
+int uuid_compare (const uuid_t a, const uuid_t b) {
+    return memcmp(a, b, qpid::sys::UuidSize) == 0;
+}

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/uuid.h Fri Jan 15 15:17:01 2010
@@ -34,5 +34,6 @@
 QPID_COMMON_EXTERN int  uuid_is_null (const uuid_t uu);          // Returns 1 
if null, else 0
 QPID_COMMON_EXTERN int  uuid_parse (const char *in, uuid_t uu);  // Returns 0 
on success, else -1
 QPID_COMMON_EXTERN void uuid_unparse (const uuid_t uu, char *out);
+QPID_COMMON_EXTERN void uuid_compare (const uuid_t a, const uuid_t b);
 
 #endif  /*!_sys_windows_uuid_h*/

Modified: qpid/trunk/qpid/cpp/src/tests/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/CMakeLists.txt?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/CMakeLists.txt (original)
+++ qpid/trunk/qpid/cpp/src/tests/CMakeLists.txt Fri Jan 15 15:17:01 2010
@@ -264,6 +264,16 @@
 #sender_SOURCES=sender.cpp  TestOptions.h ConnectionOptions.h
 remember_location(sender)
 
+add_executable (qpid_recv qpid_recv.cpp ${platform_test_additions})
+target_link_libraries (qpid_recv qpidclient)
+#qpid_recv_SOURCES=qpid_recv.cpp  TestOptions.h ConnectionOptions.h
+remember_location(qpid_recv)
+
+add_executable (qpid_send qpid_send.cpp ${platform_test_additions})
+target_link_libraries (qpid_send qpidclient)
+#qpid_send_SOURCES=qpid_send.cpp  TestOptions.h ConnectionOptions.h
+remember_location(qpid_send)
+
 if (CMAKE_SYSTEM_NAME STREQUAL Windows)
   set (ENV{OUTDIR} ${EXECUTABLE_OUTPUT_PATH})
   set (test_script_suffix ".ps1")

Modified: qpid/trunk/qpid/cpp/src/tests/Uuid.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/Uuid.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/Uuid.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/Uuid.cpp Fri Jan 15 15:17:01 2010
@@ -18,6 +18,7 @@
 
 #include "qpid/framing/Uuid.h"
 #include "qpid/framing/Buffer.h"
+#include "qpid/messaging/Uuid.h"
 #include "qpid/sys/alloca.h"
 
 #include "unit_test.h"
@@ -79,6 +80,34 @@
                       string(decoded.begin(), decoded.end()));
 }
 
+QPID_AUTO_TEST_CASE(testMessagingUuid)
+{
+    //tests for the Uuid class in the messaging namespace (introduced
+    //to avoid pulling in dependencies from framing)
+    messaging::Uuid a;
+    messaging::Uuid b(true);
+    messaging::Uuid c(true);
+    messaging::Uuid d(b);
+    messaging::Uuid e;
+    e = c;
+
+    BOOST_CHECK(!a);
+    BOOST_CHECK(b);
+
+    BOOST_CHECK(a != b);
+    BOOST_CHECK(b != c);
+
+    BOOST_CHECK_EQUAL(b, d);
+    BOOST_CHECK_EQUAL(c, e);
+
+    ostringstream out;
+    out << b;    
+    istringstream in(out.str());
+    in >> a;
+    BOOST_CHECK(!in.fail());
+    BOOST_CHECK_EQUAL(a, b);
+}
+
 QPID_AUTO_TEST_SUITE_END()
 
 }} // namespace qpid::tests

Modified: qpid/trunk/qpid/cpp/src/tests/Variant.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/Variant.cpp?rev=899657&r1=899656&r2=899657&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/Variant.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/Variant.cpp Fri Jan 15 15:17:01 2010
@@ -136,12 +136,14 @@
     const std::string red("red");
     const float pi(3.14f);
     const int16_t x(1000);
+    const Uuid u(true);
 
     Variant value = Variant::Map();
     value.asMap()["colour"] = red;
     value.asMap()["pi"] = pi;
     value.asMap()["my-key"] = x;
-    BOOST_CHECK_EQUAL(3u, value.asMap().size());
+    value.asMap()["id"] = u;
+    BOOST_CHECK_EQUAL(4u, value.asMap().size());
 
     BOOST_CHECK_EQUAL(VAR_STRING, value.asMap()["colour"].getType());
     BOOST_CHECK_EQUAL(red, value.asMap()["colour"].asString());
@@ -152,6 +154,9 @@
     BOOST_CHECK_EQUAL(VAR_INT16, value.asMap()["my-key"].getType());
     BOOST_CHECK_EQUAL(x, value.asMap()["my-key"].asInt16());
 
+    BOOST_CHECK_EQUAL(VAR_UUID, value.asMap()["id"].getType());
+    BOOST_CHECK_EQUAL(u, value.asMap()["id"].asUuid());
+
     value.asMap()["my-key"] = "now it's a string";
     BOOST_CHECK_EQUAL(VAR_STRING, value.asMap()["my-key"].getType());
     BOOST_CHECK_EQUAL(std::string("now it's a string"), 
value.asMap()["my-key"].asString());



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to