From ce527fbfdfe99ec862e01073c9b524c186f47e2b Mon Sep 17 00:00:00 2001 From: "Charles E. Rolke" Date: Wed, 5 Aug 2015 20:44:18 +0000 Subject: QPID-6680: .NET Binding allows UTF-8 string messages - patch from https://github.com/gaborsulyok This closes #8 git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1694323 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/bindings/qpid/dotnet/src/Message.cpp | 2 +- qpid/cpp/bindings/qpid/dotnet/src/QpidMarshal.h | 17 +++++++++++++++++ qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp | 4 ++-- .../test/messaging.test/messaging.test.message.cs | 9 +++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) (limited to 'qpid/cpp') diff --git a/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp b/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp index cbf477bcaa..3409db5a63 100644 --- a/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp +++ b/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp @@ -441,7 +441,7 @@ namespace Messaging { try { - result = gcnew String(nativeObjPtr->getContent().c_str()); + result = QpidMarshal::ToManaged(nativeObjPtr->getContent().c_str()); } catch (const ::qpid::types::Exception & error) { diff --git a/qpid/cpp/bindings/qpid/dotnet/src/QpidMarshal.h b/qpid/cpp/bindings/qpid/dotnet/src/QpidMarshal.h index 60f40afe04..f4aa342eac 100644 --- a/qpid/cpp/bindings/qpid/dotnet/src/QpidMarshal.h +++ b/qpid/cpp/bindings/qpid/dotnet/src/QpidMarshal.h @@ -60,6 +60,23 @@ public: std::string native((char *) pinnedBuf, mbytes->Length); return native; } + + + static System::String^ ToManaged( std::string native ) + { + if( native.length() == 0 ) + { + return gcnew System::String( "" ); + } + + pin_ptr pinnedBuf = (unsigned char *)native.c_str(); + array^ mbytes = gcnew array( (int)native.length() ); + + for( unsigned int idx = 0; idx < native.length(); idx++ ) + mbytes[ idx ] = pinnedBuf[ idx ]; + + return Encoding::UTF8->GetString( mbytes ); + } }; }}}} diff --git a/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp b/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp index 01ec8056c6..4f9a1638ca 100644 --- a/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp +++ b/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp @@ -280,7 +280,7 @@ namespace Messaging { // create a .NET object and add it to the dictionary. for (::qpid::types::Variant::Map::const_iterator i = qpidMap.begin(); i != qpidMap.end(); ++i) { - System::String ^ elementName = gcnew String(i->first.c_str()); + System::String ^ elementName = QpidMarshal::ToManaged(i->first.c_str()); ::qpid::types::Variant variant = i->second; dict[elementName] = NativeToManagedObject(variant); } @@ -394,7 +394,7 @@ namespace Messaging { case ::qpid::types::VAR_STRING: { - System::String ^ elementValue = gcnew System::String(nativeObject.asString().c_str()); + System::String ^ elementValue = QpidMarshal::ToManaged(nativeObject.asString().c_str()); managedObject = elementValue; break; } diff --git a/qpid/cpp/bindings/qpid/dotnet/test/messaging.test/messaging.test.message.cs b/qpid/cpp/bindings/qpid/dotnet/test/messaging.test/messaging.test.message.cs index bf9620d785..eb842bb03b 100644 --- a/qpid/cpp/bindings/qpid/dotnet/test/messaging.test/messaging.test.message.cs +++ b/qpid/cpp/bindings/qpid/dotnet/test/messaging.test/messaging.test.message.cs @@ -57,6 +57,15 @@ namespace Org.Apache.Qpid.Messaging.UnitTest StringAssert.IsMatch("rarely", mString); } + [Test] + public void Utf8MessageStringContent() + { + Message m2 = new Message("€"); + string mString = m2.GetContent(); + + StringAssert.IsMatch("€", mString); + } + [Test] public void MessageReceiveContentAsByteArray() { -- cgit v1.2.1