You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2010/08/20 15:58:21 UTC

svn commit: r987510 - in /qpid/trunk/qpid/cpp/bindings/qpid/dotnet: examples/csharp.example.drain/ examples/csharp.map.receiver/ examples/csharp.map.sender/ src/ src/sessionreceiver/

Author: tross
Date: Fri Aug 20 13:58:20 2010
New Revision: 987510

URL: http://svn.apache.org/viewvc?rev=987510&view=rev
Log:
QPID-2798 - C++ Messaging Client .NET binding fails to clone managed objects correctly
Patch from Chuck Rolke

Modified:
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.example.drain/csharp.example.drain.cs
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.receiver/csharp.map.recevier.cs
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.cpp
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.h
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.cpp
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.h
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.h
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h
    qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/sessionreceiver/sessionreceiver.cs

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.example.drain/csharp.example.drain.cs
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.example.drain/csharp.example.drain.cs?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.example.drain/csharp.example.drain.cs (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.example.drain/csharp.example.drain.cs Fri Aug 20 13:58:20 2010
@@ -43,8 +43,9 @@ namespace Org.Apache.Qpid.Messaging.Exam
                 Duration timeout = options.Forever ? 
                                    DurationConstants.FORVER : 
                                    DurationConstants.SECOND * options.Timeout;
-                Message message = new Message();
-                while (receiver.Fetch(message, timeout))
+                Message message;
+
+                while ((message = receiver.Fetch(timeout)) != null)
                 {
                     Dictionary<string, object> properties = new Dictionary<string, object>();
                     properties = message.Properties;

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.receiver/csharp.map.recevier.cs
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.receiver/csharp.map.recevier.cs?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.receiver/csharp.map.recevier.cs (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.receiver/csharp.map.recevier.cs Fri Aug 20 13:58:20 2010
@@ -35,8 +35,11 @@ namespace Org.Apache.Qpid.Messaging.exam
         static void Main(string[] args)
         {
             string url = "amqp:tcp:localhost:5672";
+            string address = "message_queue; {create: always}";
             if (args.Length > 0)
                 url = args[0];
+            if (args.Length > 1)
+                address = args[1];
 
             //
             // Create and open an AMQP connection to the broker URL
@@ -49,7 +52,7 @@ namespace Org.Apache.Qpid.Messaging.exam
             // routing key "map_example".
             //
             Session session = connection.CreateSession();
-            Receiver receiver = session.CreateReceiver("amq.direct/map_example");
+            Receiver receiver = session.CreateReceiver(address);
 
             //
             // Fetch the message from the broker
@@ -61,7 +64,7 @@ namespace Org.Apache.Qpid.Messaging.exam
             //
             Dictionary<string, object> content = new Dictionary<string, object>();
             message.GetContent(content);
-            Console.WriteLine("Received: {0}", message.AsString(content));
+            Console.WriteLine("{0}", message.AsString(content));
 
             //
             // Acknowledge the receipt of all received messages.

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/examples/csharp.map.sender/csharp.map.sender.cs Fri Aug 20 13:58:20 2010
@@ -39,8 +39,11 @@ namespace Org.Apache.Qpid.Messaging.exam
         static void Main(string[] args)
         {
             string url = "amqp:tcp:localhost:5672";
+            string address = "message_queue; {create: always}";
             if (args.Length > 0)
                 url = args[0];
+            if (args.Length > 1)
+                address = args[1];
 
             //
             // Create and open an AMQP connection to the broker URL
@@ -49,11 +52,10 @@ namespace Org.Apache.Qpid.Messaging.exam
             connection.Open();
 
             //
-            // Create a session and a sender to the direct exchange using the
-            // routing key "map_example".
+            // Create a session and a sender to the direct exchange
             //
             Session session = connection.CreateSession();
-            Sender sender = session.CreateSender("amq.direct/map_example");
+            Sender sender = session.CreateSender(address);
 
             //
             // Create structured content for the message.  This example builds a

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.cpp?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.cpp Fri Aug 20 13:58:20 2010
@@ -78,17 +78,16 @@ namespace Messaging {
         Type = type;
     }
 
-    // Copy constructor
+    // copy constructor
     Address::Address(const Address ^ address)
         : addressp(new ::qpid::messaging::Address(
                         *(const_cast<Address ^>(address)->NativeAddress)))
     {
     }
 
-    // Create from received address
-    // The new Address object consumes the unmanaged pointer
-    Address::Address(::qpid::messaging::Address * addrp) :
-        addressp(addrp)
+    // unmanaged clone
+    Address::Address(const ::qpid::messaging::Address & addrp) :
+        addressp(new ::qpid::messaging::Address(addrp))
     {
     }
 

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.h?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Address.h Fri Aug 20 13:58:20 2010
@@ -68,9 +68,8 @@ namespace Messaging {
         // copy constructor
         Address(const Address ^ address);
 
-        // Create from received address
-        // The new Address object consumes the unmanaged pointer
-        Address(::qpid::messaging::Address * addrp);
+        // unmanaged clone
+        Address(const ::qpid::messaging::Address & addrp);
 
         ~Address();
         !Address();
@@ -84,7 +83,8 @@ namespace Messaging {
             }
             else
             {
-                delete addressp;
+                if (NULL != addressp)
+                    delete addressp;
                 addressp = new ::qpid::messaging::Address(
                     *(const_cast<Address %>(rhs).NativeAddress) );
             }

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.cpp?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.cpp Fri Aug 20 13:58:20 2010
@@ -132,16 +132,13 @@ namespace Messaging {
     Session ^ Connection::CreateTransactionalSession(System::String ^ name)
     {
         System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Session * sessionp     = NULL;
         Session                    ^ newSession   = nullptr;
 
         try
         {
-            // allocate native session
-            sessionp = new ::qpid::messaging::Session ;
-
             // create native session
-            *sessionp = connectionp->createTransactionalSession(QpidMarshal::ToNative(name));
+            ::qpid::messaging::Session sessionp = 
+				connectionp->createTransactionalSession(QpidMarshal::ToNative(name));
 
             // create managed session
             newSession = gcnew Session(sessionp, this);
@@ -160,13 +157,6 @@ namespace Messaging {
 				{
 					delete newSession;
 				}
-				else
-				{
-	                if (sessionp != NULL)
-		            {
-			            delete sessionp;
-				    }
-				}
             }
         }
 
@@ -191,16 +181,13 @@ namespace Messaging {
     Session ^ Connection::CreateSession(System::String ^ name)
     {
         System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Session * sessionp     = NULL;
         Session                    ^ newSession   = nullptr;
 
         try
         {
-            // allocate native session
-            sessionp = new ::qpid::messaging::Session ;
-
             // create native session
-            *sessionp = connectionp->createSession(QpidMarshal::ToNative(name));
+            ::qpid::messaging::Session sessionp = 
+				connectionp->createSession(QpidMarshal::ToNative(name));
 
             // create managed session
             newSession = gcnew Session(sessionp, this);
@@ -219,13 +206,6 @@ namespace Messaging {
 				{
 					delete newSession;
 				}
-				else
-				{
-					if (sessionp != NULL)
-					{
-						delete sessionp;
-					}
-				}
             }
         }
 
@@ -241,14 +221,14 @@ namespace Messaging {
     Session ^ Connection::GetSession(System::String ^ name)
     {
         System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Session * sess         = NULL;
         Session                    ^ newSession   = nullptr;
       
         try
         {
             const std::string n = QpidMarshal::ToNative(name);
 
-            *sess = connectionp->::qpid::messaging::Connection::getSession(n);
+            ::qpid::messaging::Session sess = 
+				connectionp->::qpid::messaging::Connection::getSession(n);
             
             newSession = gcnew Session(sess, this);
         }
@@ -266,13 +246,6 @@ namespace Messaging {
 				{
 					delete newSession;
 				}
-				else
-				{
-					if (sess != NULL)
-					{
-						delete sess;
-					}
-				}
             }
         }
 

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.h?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Connection.h Fri Aug 20 13:58:20 2010
@@ -60,6 +60,9 @@ namespace Messaging {
         // copy constructor
         Connection(const Connection ^ connection);
 
+		// unmanaged clone
+		// not defined
+
         ~Connection();
         !Connection();
 
@@ -72,7 +75,8 @@ namespace Messaging {
             }
             else
             {
-                delete connectionp;
+                if (NULL != connectionp)
+                    delete connectionp;
                 connectionp = new ::qpid::messaging::Connection(
                     *(const_cast<Connection %>(rhs).NativeConnection) );
             }
@@ -84,15 +88,6 @@ namespace Messaging {
             ::qpid::messaging::Connection * get () { return connectionp; }
         }
 
-        property System::String ^ NPAddress
-        {
-            System::String ^ get () 
-            {
-                System::IntPtr i((void *)connectionp);
-                return gcnew System::String(i.ToString());
-            }
-        }
-
         void SetOption(System::String ^ name, System::Object ^ value);
 
         void Open();

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.cpp Fri Aug 20 13:58:20 2010
@@ -120,9 +120,9 @@ namespace Messaging {
 	}
 
 
-    // Create from received message
-    Message::Message(::qpid::messaging::Message * msgp) :
-        messagep(msgp)
+	// unmanaged clone
+    Message::Message(const ::qpid::messaging::Message & msgp) :
+        messagep(new ::qpid::messaging::Message(msgp))
     {
     }
 

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.h?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Message.h Fri Aug 20 13:58:20 2010
@@ -69,15 +69,15 @@ namespace Messaging {
         // Create from byte array slice
 		Message(array<System::Byte> ^ bytes, int offset, int size);
 
-        // Create from received message
-        Message(::qpid::messaging::Message * msgp);
-
         ~Message();
         !Message();
 
         // Copy constructor
         Message(const Message ^ message);
 
+	    // unmanaged clone
+        Message(const ::qpid::messaging::Message & msgp);
+
         // assignment operator
         Message % operator=(const Message % rhs)
         {
@@ -87,7 +87,8 @@ namespace Messaging {
             }
             else
             {
-                delete messagep;
+                if (NULL != messagep)
+                    delete messagep;
                 messagep = new ::qpid::messaging::Message(
                     *(const_cast<Message %>(rhs).NativeMessage) );
             }
@@ -117,7 +118,7 @@ namespace Messaging {
                 const ::qpid::messaging::Address & addrp =
                     messagep->::qpid::messaging::Message::getReplyTo();
 
-                return gcnew Address(const_cast<::qpid::messaging::Address *>(&addrp));
+                return gcnew Address(addrp);
             }
         }
 
@@ -299,6 +300,7 @@ namespace Messaging {
                     gcnew System::Collections::Generic::Dictionary<
                               System::String^, System::Object^> ;
 
+
                 TypeTranslator::NativeToManaged(map, dict);
 
                 return dict;

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp Fri Aug 20 13:58:20 2010
@@ -43,13 +43,16 @@ namespace Messaging {
     /// Receiver is a managed wrapper for a ::qpid::messaging::Receiver
     /// </summary>
 
-    Receiver::Receiver(::qpid::messaging::Receiver * r,
+    // unmanaged clone
+    Receiver::Receiver(const ::qpid::messaging::Receiver & r,
                        Org::Apache::Qpid::Messaging::Session ^ sessRef) :
-        receiverp(r),
+        receiverp(new ::qpid::messaging::Receiver (r)),
         parentSession(sessRef)
     {
     }
 
+    // unmanaged clone
+    // undefined
 
     // Destructor
     Receiver::~Receiver()
@@ -88,17 +91,24 @@ namespace Messaging {
     //
     // Get(message)
     //
-    bool Receiver::Get(Message ^ mmsgp)
-    {
-        return Get(mmsgp, DurationConstants::FORVER);
-    }
-
-    bool Receiver::Get(Message ^ mmsgp, Duration ^ durationp)
-    {
-        ::qpid::messaging::Duration dur((*durationp).Milliseconds);
-
-        return receiverp->Receiver::get(*(mmsgp->NativeMessage), dur);
-    }
+    // TBD
+    //bool Receiver::Get(Message ^ mmsgp)
+    //{
+    //    return Get(mmsgp, DurationConstants::FORVER);
+    //}
+    //
+    //bool Receiver::Get(Message ^ mmsgp, Duration ^ durationp)
+    //{
+    //    ::qpid::messaging::Duration dur((*durationp).Milliseconds);
+    //
+    //    ::qpid::messaging::Message tmpMsg;
+    //
+    //    bool result = receiverp->Receiver::get(tmpMsg, dur);
+    //
+    //    mmsgp = gcnew Message(tmpMsg);
+    //
+    //    return result;
+    //}
 
     //
     // message = Get()
@@ -112,22 +122,19 @@ namespace Messaging {
     Message ^ Receiver::Get(Duration ^ durationp)
     {
         System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Message * msgp         = NULL;
         Message                    ^ newMessage   = nullptr;
 
         try
         {
-            // allocate a message
-            msgp = new ::qpid::messaging::Message;
-
             // translate the duration
             ::qpid::messaging::Duration dur((*durationp).Milliseconds);
 
             // get the message
-            *msgp = receiverp->::qpid::messaging::Receiver::get(dur);
+            ::qpid::messaging::Message msg = 
+                receiverp->::qpid::messaging::Receiver::get(dur);
 
             // create new managed message with received message embedded in it
-            newMessage = gcnew Message(msgp);
+            newMessage = gcnew Message(msg);
         } 
         catch (const ::qpid::types::Exception & error) 
         {
@@ -138,10 +145,6 @@ namespace Messaging {
         {
             if (newException != nullptr)
             {
-                if (msgp != NULL)
-                {
-                    delete msgp;
-                }
 				if (newMessage != nullptr)
 				{
 					delete newMessage;
@@ -159,17 +162,24 @@ namespace Messaging {
     //
     // Fetch(message)
     //
-    bool Receiver::Fetch(Message ^ mmsgp)
-    {
-        return Fetch(mmsgp, DurationConstants::FORVER);
-    }
-
-    bool Receiver::Fetch(Message ^ mmsgp, Duration ^ durationp)
-    {
-        ::qpid::messaging::Duration dur((*durationp).Milliseconds);
-
-        return receiverp->::qpid::messaging::Receiver::fetch(*((*mmsgp).NativeMessage), dur);
-    }
+    // TBD
+    //bool Receiver::Fetch(Message ^ mmsgp)
+    //{
+    //    return Fetch(mmsgp, DurationConstants::FORVER);
+    //}
+    //
+    //bool Receiver::Fetch(Message ^ mmsgp, Duration ^ durationp)
+    //{
+    //    ::qpid::messaging::Duration dur((*durationp).Milliseconds);
+    //
+    //    ::qpid::messaging::Message tmpMsg;
+    //
+    //    bool result = receiverp->Receiver::fetch(tmpMsg, dur);
+    //
+    //    mmsgp = gcnew Message(tmpMsg);
+    //
+    //    return result;
+    //}
     
 
     //
@@ -183,23 +193,20 @@ namespace Messaging {
 
     Message ^ Receiver::Fetch(Duration ^ durationp)
     {
-        System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Message * msgp         = NULL;
-         Message                   ^ newMessage   = nullptr;
+        System::Exception         ^ newException = nullptr;
+        Message                   ^ newMessage   = nullptr;
 
         try
         {
-            // allocate a message
-            ::qpid::messaging::Message * msgp = new ::qpid::messaging::Message;
-
             // translate the duration
             ::qpid::messaging::Duration dur((*durationp).Milliseconds);
 
             // get the message
-            *msgp = receiverp->::qpid::messaging::Receiver::fetch(dur);
+            ::qpid::messaging::Message msg =
+                receiverp->::qpid::messaging::Receiver::fetch(dur);
 
             // create new managed message with received message embedded in it
-            newMessage = gcnew Message(msgp);
+            newMessage = gcnew Message(msg);
         } 
         catch (const ::qpid::types::Exception & error) 
         {
@@ -210,10 +217,6 @@ namespace Messaging {
         {
             if (newException != nullptr)
             {
-                if (msgp != NULL)
-                {
-                    delete msgp;
-                }
 				if (newMessage != nullptr)
 				{
 					delete newMessage;

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h Fri Aug 20 13:58:20 2010
@@ -61,12 +61,17 @@ namespace Messaging {
         ::qpid::messaging::Receiver * receiverp;
 
     public:
-        Receiver(::qpid::messaging::Receiver * r,
+
+        // unmanaged clone
+        Receiver(const ::qpid::messaging::Receiver & r,
             Session ^ sessRef);
 
         // copy constructor
         Receiver(const Receiver ^ receiver);
 
+        // unmanaged clone
+        // undefined
+
         ~Receiver();
         !Receiver();
 
@@ -79,7 +84,8 @@ namespace Messaging {
             }
             else
             {
-                delete receiverp;
+                if (NULL != receiverp)
+                    delete receiverp;
                 receiverp = new ::qpid::messaging::Receiver(
                     *(const_cast<Receiver %>(rhs).NativeReceiver));
                 parentSession = rhs.parentSession;
@@ -93,16 +99,18 @@ namespace Messaging {
         }
 
         // Get(message)
-        bool Get(Message ^ mmsgp);
-        bool Get(Message ^ mmsgp, Duration ^ durationp);
+        // TBD
+        //bool Get(Message ^ mmsgp);
+        //bool Get(Message ^ mmsgp, Duration ^ durationp);
 
         // message = Get()
         Message ^ Get();
         Message ^ Get(Duration ^ durationp);
 
         // Fetch(message)
-        bool Fetch(Message ^ mmsgp);
-        bool Fetch(Message ^ mmsgp, Duration ^ duration);
+        // TBD
+        //bool Fetch(Message ^ mmsgp);
+        //bool Fetch(Message ^ mmsgp, Duration ^ duration);
 
         // message = Fetch()
         Message ^ Fetch();

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp Fri Aug 20 13:58:20 2010
@@ -39,9 +39,10 @@ namespace Messaging {
     /// Sender a managed wrapper for a ::qpid::messaging::Sender 
     /// </summary>
 
-    Sender::Sender(::qpid::messaging::Sender * s,
+    // unmanaged clone
+    Sender::Sender(const ::qpid::messaging::Sender & s,
                      Org::Apache::Qpid::Messaging::Session ^ sessRef) :
-        senderp(s),
+		senderp(new ::qpid::messaging::Sender (s)),
         parentSession(sessRef)
     {
     }

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h Fri Aug 20 13:58:20 2010
@@ -59,7 +59,8 @@ namespace Messaging {
         void Cleanup();
 
     public:
-        Sender(::qpid::messaging::Sender * s,
+        // unmanaged clone
+        Sender(const ::qpid::messaging::Sender & s,
             Session ^ sessRef);
         
         // copy constructor
@@ -77,7 +78,8 @@ namespace Messaging {
             }
             else
             {
-                delete senderp;
+                if (NULL != senderp)
+                    delete senderp;
                 senderp = new ::qpid::messaging::Sender(
                     *(const_cast<Sender %>(rhs).NativeSender));
                 parentSession = rhs.parentSession;

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp Fri Aug 20 13:58:20 2010
@@ -45,10 +45,10 @@ namespace Messaging {
     /// Session is a managed wrapper for a ::qpid::messaging::Session
     /// </summary>
 
-    // constructor
-    Session::Session(::qpid::messaging::Session * sp, 
+    // unmanaged clone
+    Session::Session(const ::qpid::messaging::Session & session, 
                      Org::Apache::Qpid::Messaging::Connection ^ connRef) :
-        sessionp(sp),
+        sessionp(new ::qpid::messaging::Session (session)),
         parentConnectionp(connRef)
     {
     }
@@ -180,11 +180,10 @@ namespace Messaging {
         try
         {
             ::qpid::messaging::Duration dur(timeout->Milliseconds);
-            ::qpid::messaging::Receiver * rcvr = new ::qpid::messaging::Receiver;
 
-            *rcvr = sessionp->::qpid::messaging::Session::nextReceiver(dur);
+            ::qpid::messaging::Receiver receiver = sessionp->::qpid::messaging::Session::nextReceiver(dur);
 
-            Receiver ^ newRcvr = gcnew Receiver(rcvr, this);
+            Receiver ^ newRcvr = gcnew Receiver(receiver, this);
 
             return newRcvr;
         } 
@@ -210,19 +209,16 @@ namespace Messaging {
     Sender ^ Session::CreateSender  (System::String ^ address)
     {
         System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Sender  * senderp      = NULL;
         Sender                     ^ newSender    = nullptr;
 
         try
         {
-            // allocate a native sender
-            ::qpid::messaging::Sender * senderp = new ::qpid::messaging::Sender ;
-
             // create the sender
-            *senderp = sessionp->::qpid::messaging::Session::createSender(QpidMarshal::ToNative(address));
+            ::qpid::messaging::Sender sender = 
+				sessionp->::qpid::messaging::Session::createSender(QpidMarshal::ToNative(address));
 
             // create a managed sender
-            newSender = gcnew Sender(senderp, this);
+            newSender = gcnew Sender(sender, this);
         } 
         catch (const ::qpid::types::Exception & error) 
         {
@@ -237,13 +233,6 @@ namespace Messaging {
 				{
 					delete newSender;
 				}
-				else
-				{
-					if (senderp != NULL)
-					{
-						delete senderp;
-					}
-				}
             }
         }
         if (newException != nullptr) 
@@ -258,19 +247,16 @@ namespace Messaging {
     Sender ^ Session::CreateSender  (Address ^ address)
     {
         System::Exception          ^ newException = nullptr;
-        ::qpid::messaging::Sender  * senderp         = NULL;
-        Sender                     ^ newSender       = nullptr;
+        Sender                     ^ newSender    = nullptr;
 
         try
         {
             // allocate a native sender
-            ::qpid::messaging::Sender * senderp = new ::qpid::messaging::Sender ;
-
-            // create the sender
-            *senderp = sessionp->::qpid::messaging::Session::createSender(*(address->NativeAddress));
+            ::qpid::messaging::Sender sender = 
+				sessionp->::qpid::messaging::Session::createSender(*(address->NativeAddress));
 
             // create a managed sender
-            newSender = gcnew Sender(senderp, this);
+            newSender = gcnew Sender(sender, this);
         } 
         catch (const ::qpid::types::Exception & error) 
         {
@@ -285,13 +271,6 @@ namespace Messaging {
 				{
 					delete newSender;
 				}
-				else
-				{
-					if (senderp != NULL)
-					{
-						delete senderp;
-					}
-				}
             }
         }
         if (newException != nullptr) 
@@ -306,19 +285,16 @@ namespace Messaging {
 	Receiver ^ Session::CreateReceiver(System::String ^ address)
     {
         System::Exception           ^ newException = nullptr;
-        ::qpid::messaging::Receiver * receiverp    = NULL;
         Receiver                    ^ newReceiver  = nullptr;
 
         try 
 		{
-            // allocate a native receiver
-            receiverp = new ::qpid::messaging::Receiver;
-
             // create the receiver
-            *receiverp = sessionp->createReceiver(QpidMarshal::ToNative(address));
+            ::qpid::messaging::Receiver receiver = 
+				sessionp->createReceiver(QpidMarshal::ToNative(address));
 
             // create a managed receiver
-            newReceiver = gcnew Receiver(receiverp, this);
+            newReceiver = gcnew Receiver(receiver, this);
         } 
         catch (const ::qpid::types::Exception & error) 
 		{
@@ -333,13 +309,6 @@ namespace Messaging {
 				{
 					delete newReceiver;
 				}
-				else
-				{
-					if (receiverp != NULL)
-					{
-						delete receiverp;
-					}
-				}
             }
         }
         if (newException != nullptr) 
@@ -354,19 +323,16 @@ namespace Messaging {
 	Receiver ^ Session::CreateReceiver(Address ^ address)
     {
         System::Exception           ^ newException = nullptr;
-        ::qpid::messaging::Receiver * receiverp    = NULL;
         Receiver                    ^ newReceiver  = nullptr;
 
         try 
 		{
-            // allocate a native receiver
-            receiverp = new ::qpid::messaging::Receiver;
-
             // create the receiver
-            *receiverp = sessionp->createReceiver(*(address->NativeAddress));
+            ::qpid::messaging::Receiver receiver =
+				sessionp->createReceiver(*(address->NativeAddress));
 
             // create a managed receiver
-            newReceiver = gcnew Receiver(receiverp, this);
+            newReceiver = gcnew Receiver(receiver, this);
         } 
         catch (const ::qpid::types::Exception & error) 
 		{
@@ -381,58 +347,6 @@ namespace Messaging {
 				{
 					delete newReceiver;
 				}
-				else
-				{
-					if (receiverp != NULL)
-					{
-						delete receiverp;
-					}
-				}
-            }
-        }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
-
-        return newReceiver;
-    }
-
-
-    Receiver ^ Session::CreateReceiver()
-    {
-        System::Exception           ^ newException = nullptr;
-        ::qpid::messaging::Receiver * receiverp    = NULL;
-        Receiver                    ^ newReceiver  = nullptr;
-
-        try
-        {
-            // allocate a native receiver
-            receiverp = new ::qpid::messaging::Receiver;
-
-            // create a managed receiver
-            newReceiver = gcnew Receiver(receiverp, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-        {
-            String ^ errmsg = gcnew String(error.what());
-            newException    = gcnew QpidException(errmsg);
-        }
-        finally 
-		{
-            if (newException != nullptr)
-			{
-				if (newReceiver != nullptr)
-				{
-					delete newReceiver;
-				}
-				else
-				{
-					if (receiverp != NULL)
-					{
-						delete receiverp;
-					}
-				}
             }
         }
         if (newException != nullptr) 
@@ -447,14 +361,12 @@ namespace Messaging {
     Sender ^ Session::GetSender(System::String ^ name)
     {
         System::Exception           ^ newException = nullptr;
-        ::qpid::messaging::Sender   * senderp      = NULL;
         Sender                      ^ newSender    = nullptr;
 
         try
         {
-            senderp = new ::qpid::messaging::Sender;
-
-            *senderp = sessionp->::qpid::messaging::Session::getSender(QpidMarshal::ToNative(name));
+            ::qpid::messaging::Sender senderp = 
+				sessionp->::qpid::messaging::Session::getSender(QpidMarshal::ToNative(name));
 
             newSender = gcnew Sender(senderp, this);
         } 
@@ -471,13 +383,6 @@ namespace Messaging {
 				{
 					delete newSender;
 				}
-				else
-				{
-					if (senderp != NULL)
-					{
-						delete senderp;
-					}
-				}
             }
         }
         if (newException != nullptr) 
@@ -493,16 +398,14 @@ namespace Messaging {
     Receiver ^ Session::GetReceiver(System::String ^ name)
     {
         System::Exception           ^ newException = nullptr;
-        ::qpid::messaging::Receiver * receiverp    = NULL;
         Receiver                    ^ newReceiver  = nullptr;
 
         try
         {
-            receiverp = new ::qpid::messaging::Receiver;
+            ::qpid::messaging::Receiver receiver = 
+                sessionp->::qpid::messaging::Session::getReceiver(QpidMarshal::ToNative(name));
 
-            *receiverp = sessionp->::qpid::messaging::Session::getReceiver(QpidMarshal::ToNative(name));
-
-            newReceiver = gcnew Receiver(receiverp, this);
+            newReceiver = gcnew Receiver(receiver, this);
         } 
         catch (const ::qpid::types::Exception & error) 
         {
@@ -517,13 +420,6 @@ namespace Messaging {
 				{
 					delete newReceiver;
 				}
-				else
-				{
-					if (receiverp != NULL)
-					{
-						delete receiverp;
-					}
-				}
             }
         }
         if (newException != nullptr) 

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h Fri Aug 20 13:58:20 2010
@@ -65,7 +65,9 @@ namespace Messaging {
         void Cleanup();
 
     public:
-        Session(::qpid::messaging::Session * sessionp,
+
+        // unmanaged clone
+        Session(const ::qpid::messaging::Session & sessionp,
             Connection ^ connRef);
 
         // copy constructor
@@ -83,9 +85,11 @@ namespace Messaging {
             }
             else
             {
-                delete sessionp;
+                if (NULL != sessionp)
+                    delete sessionp;
                 sessionp = new ::qpid::messaging::Session(
                     *(const_cast<Session %>(rhs).NativeSession) );
+                parentConnectionp = rhs.parentConnectionp;
             }
             return *this;
         }
@@ -129,7 +133,6 @@ namespace Messaging {
 
         Receiver ^ CreateReceiver(System::String ^ address);
 		Receiver ^ CreateReceiver(Address ^ address);
-        Receiver ^ CreateReceiver();
 
         Sender   ^ GetSender(System::String ^ name);
         Receiver ^ GetReceiver(System::String ^ name);

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/sessionreceiver/sessionreceiver.cs
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/sessionreceiver/sessionreceiver.cs?rev=987510&r1=987509&r2=987510&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/sessionreceiver/sessionreceiver.cs (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/sessionreceiver/sessionreceiver.cs Fri Aug 20 13:58:20 2010
@@ -67,13 +67,15 @@ namespace Org.Apache.Qpid.Messaging.Sess
         /// </summary>
         public void Open()
         {
-            Receiver rcvr = session.CreateReceiver();
+            Receiver rcvr;
             Message  msg;
 
             keepRunning = true;
             while (keepRunning)
             {
-                if (session.NextReceiver(rcvr, DurationConstants.SECOND))
+                rcvr = session.NextReceiver(DurationConstants.SECOND);
+
+                if (null != rcvr)
                 {
                     if (keepRunning)
                     {



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org