From a813ced95e5b6847cb62980fd793e2fc5cbff80e Mon Sep 17 00:00:00 2001 From: "Charles E. Rolke" Date: Wed, 27 Oct 2010 21:10:46 +0000 Subject: QPID-2915 Qpid Cpp Messaging .NET Binding does not properly handle Qpid type VAR_VOID * In C# map sender example, send null list and map values. * In Message ToString() display "" for null list and map values. * Do not dereference null values when determining their type. * Properly marshal native Qpid VAR_VOID data type. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1028099 13f79535-47bb-0310-9956-ffa450edef68 --- .../examples/csharp.map.sender/csharp.map.sender.cs | 4 ++++ qpid/cpp/bindings/qpid/dotnet/src/Message.cpp | 10 ++++++++++ qpid/cpp/bindings/qpid/dotnet/src/QpidTypeCheck.h | 14 ++++++++++---- qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp | 18 ++++++++++++++++-- 4 files changed, 40 insertions(+), 6 deletions(-) (limited to 'qpid/cpp/bindings') diff --git a/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs b/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs index c35ddf12f0..9383d125bd 100644 --- a/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs +++ b/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs @@ -79,6 +79,8 @@ namespace Org.Apache.Qpid.Messaging.examples colors.Add("red"); colors.Add("green"); colors.Add("white"); + // list contains null value + colors.Add(null); content["colorsList"] = colors; // add one of each supported amqp data type @@ -118,6 +120,8 @@ namespace Org.Apache.Qpid.Messaging.examples Guid myGuid = new Guid("000102030405060708090a0b0c0d0e0f"); content["myGuid"] = myGuid; + content["myNull"] = null; + // // Construct a message with the map content and send it synchronously // via the sender. diff --git a/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp b/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp index 139ecee165..a554d19370 100644 --- a/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp +++ b/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp @@ -277,6 +277,12 @@ namespace Messaging { ListAsString((System::Collections::ObjectModel::Collection< System::Object^> ^)kvp.Value)); } + else if (nullptr == kvp.Value) + { + sb->AppendFormat( + "{0}=", + kvp.Key); + } else sb->AppendFormat("{0}={1}", kvp.Key, kvp.Value); } @@ -310,6 +316,10 @@ namespace Messaging { sb->Append(ListAsString((System::Collections::ObjectModel::Collection< System::Object^> ^)obj)); } + else if (nullptr == obj) + { + // no display for null objects + } else sb->Append(obj->ToString()); } diff --git a/qpid/cpp/bindings/qpid/dotnet/src/QpidTypeCheck.h b/qpid/cpp/bindings/qpid/dotnet/src/QpidTypeCheck.h index 47f391fb05..d0f410b912 100644 --- a/qpid/cpp/bindings/qpid/dotnet/src/QpidTypeCheck.h +++ b/qpid/cpp/bindings/qpid/dotnet/src/QpidTypeCheck.h @@ -68,13 +68,19 @@ namespace Messaging { public: static bool ObjectIsMap (System::Object ^ theValue) - { - return (*theValue).GetType() == QpidTypeCheckConstants::mapTypeP; + { + if (nullptr == theValue) + return false; + else + return (*theValue).GetType() == QpidTypeCheckConstants::mapTypeP; } static bool ObjectIsList(System::Object ^ theValue) - { - return (*theValue).GetType() == QpidTypeCheckConstants::listTypeP; + { + if (nullptr == theValue) + return false; + else + return (*theValue).GetType() == QpidTypeCheckConstants::listTypeP; } }; }}}} diff --git a/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp b/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp index c4587fe0f7..b515095323 100644 --- a/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp +++ b/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp @@ -91,7 +91,10 @@ namespace Messaging { { // Add a simple native type to map ::qpid::types::Variant entryValue; - ManagedToNativeObject(kvp.Value, entryValue); + if (nullptr != kvp.Value) + { + ManagedToNativeObject(kvp.Value, entryValue); + } std::string entryName = QpidMarshal::ToNative(kvp.Key); qpidMap.insert(std::make_pair(entryName, entryValue)); } @@ -144,7 +147,10 @@ namespace Messaging { { // Add a simple native type to list ::qpid::types::Variant entryValue; - ManagedToNativeObject(listObj, entryValue); + if (nullptr != listObj) + { + ManagedToNativeObject(listObj, entryValue); + } qpidList.push_back(entryValue); } } @@ -265,6 +271,10 @@ namespace Messaging { switch (vType) { + case ::qpid::types::VAR_VOID: + dict[elementName] = nullptr; + break; + case ::qpid::types::VAR_BOOL: dict[elementName] = variant.asBool(); break; @@ -358,6 +368,10 @@ namespace Messaging { switch (vType) { + case ::qpid::types::VAR_VOID: + (*managedList).Add(nullptr); + break; + case ::qpid::types::VAR_BOOL: (*managedList).Add(variant.asBool()); break; -- cgit v1.2.1