summaryrefslogtreecommitdiff
path: root/cpp/bindings/qpid/dotnet/src/Message.cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2010-05-28 18:09:10 +0000
committerTed Ross <tross@apache.org>2010-05-28 18:09:10 +0000
commit947b1491d7a39c87c4560126a6e50646aa2a2b24 (patch)
tree19a5c7ac347d807125f8352ef5f2d41810d79281 /cpp/bindings/qpid/dotnet/src/Message.cpp
parent8d317104053b8258380c47af8d792517c4da10b7 (diff)
downloadqpid-python-947b1491d7a39c87c4560126a6e50646aa2a2b24.tar.gz
QPID-2628 - Patch from Chuck Rolke
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@949245 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/bindings/qpid/dotnet/src/Message.cpp')
-rw-r--r--cpp/bindings/qpid/dotnet/src/Message.cpp515
1 files changed, 111 insertions, 404 deletions
diff --git a/cpp/bindings/qpid/dotnet/src/Message.cpp b/cpp/bindings/qpid/dotnet/src/Message.cpp
index 9c28e728f6..193a2eb976 100644
--- a/cpp/bindings/qpid/dotnet/src/Message.cpp
+++ b/cpp/bindings/qpid/dotnet/src/Message.cpp
@@ -29,7 +29,12 @@
#include "qpid/types/Variant.h"
#include "QpidMarshal.h"
+#include "Address.h"
+#include "Duration.h"
#include "Message.h"
+#include "QpidTypeCheck.h"
+#include "QpidException.h"
+#include "TypeTranslator.h"
namespace org {
namespace apache {
@@ -40,38 +45,26 @@ namespace messaging {
/// Message is a managed wrapper for a ::qpid::messaging::Message
/// </summary>
- // This constructor is used to create a message from bytes to put into the message
- Message::Message(System::String ^ bytes) :
- aVMap(gcnew VMap()),
- aVList(gcnew VList()),
- pVMapType(aVMap.GetType()),
- pVListType(aVList.GetType()),
- messagep(new ::qpid::messaging::Message(QpidMarshal::ToNative(bytes)))
+ // Create empty message
+ Message::Message() :
+ messagep(new ::qpid::messaging::Message(QpidMarshal::ToNative("")))
{
}
- // This constructor creates a message from a native received message
- Message::Message(::qpid::messaging::Message * msgp) :
- aVMap(gcnew VMap()),
- aVList(gcnew VList()),
- pVMapType(aVMap.GetType()),
- pVListType(aVList.GetType()),
- messagep(msgp)
+ // Create from string
+ Message::Message(System::String ^ string) :
+ messagep(new ::qpid::messaging::Message(QpidMarshal::ToNative(string)))
{
}
-
+ // Create from object
Message::Message(System::Object ^ objp) :
- aVMap(gcnew VMap()),
- aVList(gcnew VList()),
- pVMapType(aVMap.GetType()),
- pVListType(aVList.GetType()),
messagep(new ::qpid::messaging::Message(QpidMarshal::ToNative("")))
{
::qpid::types::Variant * variantp = 0;
std::string * variantsp = 0;
- if (objIsMap(objp))
+ if (QpidTypeCheck::ObjectIsMap(objp))
{
// Create a mapped message using given dictionary
@@ -79,7 +72,7 @@ namespace messaging {
::qpid::types::Variant::Map newMap;
// Add the map variables to the map
- Encode(newMap, (VMap ^)objp);
+ TypeTranslator::ManagedToNative(newMap, (QpidMap ^)objp);
// Set message content type
messagep->setContentType("ampq/map");
@@ -87,7 +80,7 @@ namespace messaging {
// Insert the map into the message
::qpid::messaging::encode(newMap, *messagep, QpidMarshal::ToNative("amqp/map"));
}
- else if (objIsList(objp))
+ else if (QpidTypeCheck::ObjectIsList(objp))
{
// Create a list message using given list
@@ -95,7 +88,7 @@ namespace messaging {
::qpid::types::Variant::List newList;
// Add the list variables to the list
- Encode(newList, (VList ^)objp);
+ TypeTranslator::ManagedToNative(newList, (QpidList ^)objp);
// Set message content type
messagep->setContentType("ampq/list");
@@ -110,6 +103,12 @@ namespace messaging {
}
}
+ // Create from received message
+ Message::Message(::qpid::messaging::Message * msgp) :
+ messagep(msgp)
+ {
+ }
+
// Destructor
Message::~Message()
@@ -125,6 +124,7 @@ namespace messaging {
}
// Copy constructor
+ // TODO: prevent copy
Message::Message(const Message % rhs)
{
messagep = rhs.messagep;
@@ -143,209 +143,25 @@ namespace messaging {
//
- // The given object is a Dictionary.
- // Add its elements to the qpid map.
+ // ReplyTo
//
- void Message::Encode(::qpid::types::Variant::Map & theMapp,
- VMap ^ theObjp)
+ void Message::setReplyTo(Address ^ address)
{
- // iterate the items, converting each to a variant and adding to the map
- for each (System::Collections::Generic::KeyValuePair<System::String^, System::Object^> kvp in theObjp)
- {
- if (objIsMap(kvp.Value))
- {
- // Recurse on inner map
- // Allocate a map
- ::qpid::types::Variant::Map newMap;
-
- // Add the map variables to the map
- Encode(newMap, (VMap ^)kvp.Value);
-
- // Create a variant entry for the inner map
- std::auto_ptr<::qpid::types::Variant> newVariantp(new ::qpid::types::Variant(newMap));
-
- // Get map's name
- std::string entryName = QpidMarshal::ToNative(kvp.Key);
-
- // Add inner map to outer map
- theMapp.insert(std::make_pair<std::string, ::qpid::types::Variant>(entryName, *newVariantp));
- }
- else if (objIsList(kvp.Value))
- {
- // Recurse on inner list
- // Allocate a list
- ::qpid::types::Variant::List newList;
-
- // Add the List variables to the list
- Encode(newList, (VList ^)kvp.Value);
-
- // Create a variant entry for the inner map
- ::qpid::types::Variant::List newVariant(newList);
-
- //std::auto_ptr<::qpid::types::Variant> newVariantp(new ::qpid::types::Variant(newList));
-
- // Get list's name
- std::string entryName = QpidMarshal::ToNative(kvp.Key);
-
- // Add inner list to outer map
- theMapp.insert(std::make_pair<std::string, ::qpid::types::Variant>(entryName, newVariant));
- }
- else
- {
- // Add a simple native type to map
- ::qpid::types::Variant entryValue;
- EncodeObject(kvp.Value, entryValue);
- std::string entryName = QpidMarshal::ToNative(kvp.Key);
- theMapp.insert(std::make_pair<std::string, ::qpid::types::Variant>(entryName, entryValue));
- }
- }
+ messagep->setReplyTo(*(address->addressp));
}
-
-
- //
- // The given object is a List.
- // Add its elements to the qpid list.
- //
- void Message::Encode(::qpid::types::Variant::List & theListp,
- VList ^ theObjp)
+ Address ^ Message::getReplyTo()
{
- // iterate the items, converting each to a variant and adding to the map
- for each (System::Object ^ listObj in theObjp)
- {
- if (objIsMap(listObj))
- {
- // Recurse on inner map
- // Allocate a map
- ::qpid::types::Variant::Map newMap;
-
- // Add the map variables to the map
- Encode(newMap, (VMap ^)listObj);
-
- // Create a variant entry for the inner map
- std::auto_ptr<::qpid::types::Variant> newVariantp(new ::qpid::types::Variant(newMap));
-
- // Add inner map to outer list
- theListp.push_back(*newVariantp);
- }
- else if (objIsList(listObj))
- {
- // Recurse on inner list
- // Allocate a list
- ::qpid::types::Variant::List newList;
-
- // Add the List variables to the list
- Encode(newList, (VList ^)listObj);
-
- // Create a variant entry for the inner list
- std::auto_ptr<::qpid::types::Variant> newVariantp(new ::qpid::types::Variant(newList));
-
- // Add inner list to outer list
- theListp.push_back(*newVariantp);
- }
- else
- {
- // Add a simple native type to list
- ::qpid::types::Variant entryValue;
- EncodeObject(listObj, entryValue);
- theListp.push_back(entryValue);
- }
- }
- }
+ const ::qpid::messaging::Address & addrp =
+ messagep->::qpid::messaging::Message::getReplyTo();
+ return gcnew Address(const_cast<::qpid::messaging::Address *>(&addrp));
+ }
//
- // Returns a variant representing simple native type object.
- // Not to be called for Map/List objects.
+ // Subject
//
- void Message::EncodeObject(System::Object ^ theObjp,
- ::qpid::types::Variant & targetp)
- {
- System::Type ^ typeP = (*theObjp).GetType();
- System::TypeCode typeCode = System::Type::GetTypeCode( typeP );
-
- switch (typeCode)
- {
- case System::TypeCode::Boolean :
- targetp = System::Convert::ToBoolean(theObjp);
- break;
-
- case System::TypeCode::Byte :
- targetp = System::Convert::ToByte(theObjp);
- break;
-
- case System::TypeCode::UInt16 :
- targetp = System::Convert::ToUInt16(theObjp);
- break;
-
- case System::TypeCode::UInt32 :
- targetp = System::Convert::ToUInt32(theObjp);
- break;
-
- case System::TypeCode::UInt64 :
- targetp = System::Convert::ToUInt64(theObjp);
- break;
-
- case System::TypeCode::Char :
- case System::TypeCode::SByte :
- targetp = System::Convert::ToSByte(theObjp);
- break;
-
- case System::TypeCode::Int16 :
- targetp = System::Convert::ToInt16(theObjp);
- break;
-
- case System::TypeCode::Int32 :
- targetp = System::Convert::ToInt32(theObjp);
- break;
-
- case System::TypeCode::Int64 :
- targetp = System::Convert::ToInt64(theObjp);
- break;
-
- case System::TypeCode::Single :
- targetp = System::Convert::ToSingle(theObjp);
- break;
-
- case System::TypeCode::Double :
- targetp = System::Convert::ToDouble(theObjp);
- break;
-
- case System::TypeCode::String :
- {
- std::string rString;
- System::String ^ rpString;
-
- rpString = System::Convert::ToString(theObjp);
- rString = QpidMarshal::ToNative(rpString);
- targetp = rString;
- targetp.setEncoding(QpidMarshal::ToNative("utf8"));
- }
- break;
-
-
- default:
-
- throw gcnew System::NotImplementedException();
-
- }
- }
-
-
- // Properties...
-
- //void Message::setReplyTo(System::String ^ address)
- //{
- // messagep->setReplyTo(QpidMarshal::ToNative(address));
- //}
-
- //System::String ^ Message::getReplyTo()
- //{
- // return gcnew String(messagep->getReplyTo().c_str());
- //}
-
-
void Message::setSubject(System::String ^ subject)
{
messagep->setSubject(QpidMarshal::ToNative(subject));
@@ -357,6 +173,9 @@ namespace messaging {
}
+ //
+ // ContentType
+ //
void Message::setContentType(System::String ^ ct)
{
messagep->setContentType(QpidMarshal::ToNative(ct));
@@ -368,6 +187,9 @@ namespace messaging {
}
+ //
+ // MessageId
+ //
void Message::setMessageId(System::String ^ mId)
{
messagep->setMessageId(QpidMarshal::ToNative(mId));
@@ -379,6 +201,9 @@ namespace messaging {
}
+ //
+ // UserId
+ //
void Message::setUserId(System::String ^ uId)
{
messagep->setUserId(QpidMarshal::ToNative(uId));
@@ -390,6 +215,9 @@ namespace messaging {
}
+ //
+ // CorrelationId
+ //
void Message::setCorrelationId(System::String ^ cId)
{
messagep->setCorrelationId(QpidMarshal::ToNative(cId));
@@ -401,6 +229,9 @@ namespace messaging {
}
+ //
+ // Priority
+ //
void Message::setPriority(unsigned char priority)
{
messagep->setPriority(priority);
@@ -412,8 +243,22 @@ namespace messaging {
}
- //void setTtl(Duration ttl);
- //Duration getTtl();
+ //
+ // Ttl
+ //
+ void Message::setTtl(Duration ^ ttl)
+ {
+ ::qpid::messaging::Duration dur(ttl->Milliseconds);
+
+ messagep->setTtl(dur);
+ }
+
+ Duration ^ Message::getTtl()
+ {
+ Duration ^ dur = gcnew Duration(messagep->getTtl().getMilliseconds());
+
+ return dur;
+ }
void Message::setDurable(bool durable)
{
@@ -437,11 +282,22 @@ namespace messaging {
}
- //System::String ^ Message::getProperties()
- //{
- // pqid::types::Variant::Map * mapp = new
- // return gcnew String(messagep->getReplyTo().c_str());
- //}
+ System::Collections::Generic::Dictionary<
+ System::String^, System::Object^> ^ Message::getProperties()
+ {
+ ::qpid::types::Variant::Map map;
+
+ map = messagep->getProperties();
+
+ System::Collections::Generic::Dictionary<
+ System::String^, System::Object^> ^ dict =
+ gcnew System::Collections::Generic::Dictionary<
+ System::String^, System::Object^> ;
+
+ TypeTranslator::NativeToManaged(dict, map);
+
+ return dict;
+ }
void Message::setContent(System::String ^ content)
@@ -468,100 +324,7 @@ namespace messaging {
::qpid::messaging::decode(*messagep, map, QpidMarshal::ToNative("amqp/map"));
- Decode(dict, map);
- }
-
-
- // Given a user Dictionary and a qpid map,
- // extract the qpid elements and put them into the dictionary.
- //
- void Message::Decode(VMap ^ dict, ::qpid::types::Variant::Map & map)
- {
- // For each object in the message map,
- // create a .NET object and add it to the dictionary.
- for (::qpid::types::Variant::Map::const_iterator i = map.begin(); i != map.end(); ++i) {
- // Get the name
- System::String ^ elementName = gcnew String(i->first.c_str());
-
- ::qpid::types::Variant variant = i->second;
- ::qpid::types::VariantType vType = variant.getType();
-
- switch (vType)
- {
- case ::qpid::types::VAR_BOOL:
- dict[elementName] = variant.asBool();
- break;
-
- case ::qpid::types::VAR_UINT8:
- dict[elementName] = variant.asUint8();
- break;
-
- case ::qpid::types::VAR_UINT16:
- dict[elementName] = variant.asUint16();
- break;
-
- case ::qpid::types::VAR_UINT32:
- dict[elementName] = variant.asUint32();
- break;
-
- case ::qpid::types::VAR_UINT64:
- dict[elementName] = variant.asUint64();
- break;
-
- case ::qpid::types::VAR_INT8:
- dict[elementName] = variant.asInt8();
- break;
-
- case ::qpid::types::VAR_INT16:
- dict[elementName] = variant.asInt16();
- break;
-
- case ::qpid::types::VAR_INT32:
- dict[elementName] = variant.asInt32();
- break;
-
- case ::qpid::types::VAR_INT64:
- dict[elementName] = variant.asInt64();
- break;
-
- case ::qpid::types::VAR_FLOAT:
- dict[elementName] = variant.asFloat();
- break;
-
- case ::qpid::types::VAR_DOUBLE:
- dict[elementName] = variant.asDouble();
- break;
-
- case ::qpid::types::VAR_STRING:
- {
- System::String ^ elementValue = gcnew System::String(variant.asString().c_str());
- dict[elementName] = elementValue;
- break;
- }
- case ::qpid::types::VAR_MAP:
- {
- VMap ^ newDict = gcnew VMap();
-
- Decode (newDict, variant.asMap());
-
- dict[elementName] = newDict;
- break;
- }
-
- case ::qpid::types::VAR_LIST:
- {
- VList ^ newList = gcnew VList();
-
- Decode (newList, variant.asList());
-
- dict[elementName] = newList;
- break;
- }
-
- case ::qpid::types::VAR_UUID:
- break;
- }
- }
+ TypeTranslator::NativeToManaged(dict, map);
}
@@ -571,99 +334,43 @@ namespace messaging {
void Message::getContent(System::Collections::Generic::List<
System::Object^> ^ list)
{
- // Extract the message map from the message
- ::qpid::types::Variant::List vList;
+ // allocate a native messaging::List
+ ::qpid::types::Variant::List nativeList;
- ::qpid::messaging::decode(*messagep, vList, QpidMarshal::ToNative("amqp/list"));
+ // Extract the list from the message in native format
+ ::qpid::messaging::decode(*messagep, nativeList, QpidMarshal::ToNative("amqp/list"));
- Decode(list, vList);
+ // translate native list into user's managed list
+ TypeTranslator::NativeToManaged(list, nativeList);
}
-
- void Message::Decode(VList ^ vList, ::qpid::types::Variant::List & qpidList)
+ //
+ // User wants content as bytes.
+ // result array must be correct size already
+ //
+ void Message::getRaw(array<System::Byte> ^ arr)
{
- // For each object in the message map,
- // create a .NET object and add it to the dictionary.
- for (::qpid::types::Variant::List::const_iterator i = qpidList.begin(); i != qpidList.end(); ++i)
+ System::UInt32 size = messagep->getContentSize();
+
+ if (0 == size)
+ throw gcnew QpidException("Message::getRaw - message size is zero");
+
+ if (arr->Length != size)
+ throw gcnew QpidException("Message::getRaw - receive buffer is too small");
+
+ const char * ptr = messagep->getContentPtr();
+
+ // TODO: System::Runtime::InteropServices::Marshal::Copy(ptr, arr, 0, size);
+
+ for (UInt32 i = 0; i < size; i++)
{
- ::qpid::types::Variant variant = *i;
- ::qpid::types::VariantType vType = variant.getType();
-
- switch (vType)
- {
- case ::qpid::types::VAR_BOOL:
- (*vList).Add(variant.asBool());
- break;
-
- case ::qpid::types::VAR_UINT8:
- (*vList).Add(variant.asUint8());
- break;
-
- case ::qpid::types::VAR_UINT16:
- (*vList).Add(variant.asUint16());
- break;
-
- case ::qpid::types::VAR_UINT32:
- (*vList).Add(variant.asUint32());
- break;
-
- case ::qpid::types::VAR_UINT64:
- (*vList).Add(variant.asUint64());
- break;
-
- case ::qpid::types::VAR_INT8:
- (*vList).Add(variant.asInt8());
- break;
-
- case ::qpid::types::VAR_INT16:
- (*vList).Add(variant.asInt16());
- break;
-
- case ::qpid::types::VAR_INT32:
- (*vList).Add(variant.asInt32());
- break;
-
- case ::qpid::types::VAR_INT64:
- (*vList).Add(variant.asInt64());
- break;
-
- case ::qpid::types::VAR_FLOAT:
- (*vList).Add(variant.asFloat());
- break;
-
- case ::qpid::types::VAR_DOUBLE:
- (*vList).Add(variant.asDouble());
- break;
-
- case ::qpid::types::VAR_STRING:
- {
- System::String ^ elementValue = gcnew System::String(variant.asString().c_str());
- (*vList).Add(elementValue);
- break;
- }
- case ::qpid::types::VAR_MAP:
- {
- VMap ^ newDict = gcnew VMap();
-
- Decode (newDict, variant.asMap());
-
- (*vList).Add(newDict);
- break;
- }
-
- case ::qpid::types::VAR_LIST:
- {
- VList ^ newList = gcnew VList();
-
- Decode (newList, variant.asList());
-
- (*vList).Add(newList);
- break;
- }
-
- case ::qpid::types::VAR_UUID:
- break;
- }
+ arr[i] = ptr[i];
}
}
+
+
+ System::UInt64 Message::getContentSize()
+ {
+ return messagep->getContentSize();
+ }
}}}}