You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2011/12/21 18:56:00 UTC

svn commit: r1221824 [2/2] - /qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/

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=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.cpp Wed Dec 21 17:55:59 2011
@@ -43,27 +43,36 @@ namespace Messaging {
     /// Receiver is a managed wrapper for a ::qpid::messaging::Receiver
     /// </summary>
 
+    // Disallow access if object has been destroyed.
+    void Receiver::ThrowIfDisposed()
+    {
+        if (IsDisposed)
+            throw gcnew ObjectDisposedException (GetType()->FullName);
+    }
+
+
     // unmanaged clone
     Receiver::Receiver(const ::qpid::messaging::Receiver & r,
-                       Org::Apache::Qpid::Messaging::Session ^ sessRef) :
-        parentSession(sessRef)
+        Org::Apache::Qpid::Messaging::Session ^ sessRef) :
+    parentSession(sessRef)
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            receiverp = new ::qpid::messaging::Receiver (r);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Receiver (r);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     // unmanaged clone
@@ -79,60 +88,65 @@ namespace Messaging {
     // Finalizer
     Receiver::!Receiver()
     {
-        msclr::lock lk(this);
-
-        if (NULL != receiverp)
+        if (NULL != nativeObjPtr)
         {
-            delete receiverp;
-            receiverp = NULL;
+            privateLock = gcnew System::Object();
+
+            if (NULL != nativeObjPtr)
+            {
+                delete nativeObjPtr;
+                nativeObjPtr = NULL;
+            }
         }
     }
 
 
     // Copy constructor look-alike (C#)
     Receiver::Receiver(const Receiver ^ receiver) :
-        parentSession(receiver->parentSession)
+    parentSession(receiver->parentSession)
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            receiverp = new ::qpid::messaging::Receiver(
-                        *(const_cast<Receiver ^>(receiver)->NativeReceiver));
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Receiver(
+                *(const_cast<Receiver ^>(receiver)->NativeReceiver));
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     // Copy constructor implicitly dereferenced (C++)
     Receiver::Receiver(const Receiver % receiver) :
-        parentSession(receiver.parentSession)
+    parentSession(receiver.parentSession)
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            receiverp = new ::qpid::messaging::Receiver(
-                        *(const_cast<Receiver %>(receiver).NativeReceiver));
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Receiver(
+                *(const_cast<Receiver %>(receiver).NativeReceiver));
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
 
@@ -143,36 +157,39 @@ namespace Messaging {
     {
         return Get(mmsgp, DurationConstants::FORVER);
     }
-    
+
     bool Receiver::Get(Message ^% mmsgp, Duration ^ durationp)
     {
         System::Exception           ^ newException = nullptr;
 
-        try 
-		{
+        try
+        {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             ::qpid::messaging::Duration dur((*durationp).Milliseconds);
-        
+
             ::qpid::messaging::Message tmpMsg;
-        
-            bool result = receiverp->Receiver::get(tmpMsg, dur);
-        
+
+            bool result = nativeObjPtr->Receiver::get(tmpMsg, dur);
+
             if (result)
             {
                 mmsgp = gcnew Message(tmpMsg);
             }
-        
+
             return result;
         }
-        catch (const ::qpid::types::Exception & error) 
-		{
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return false;
     }
@@ -193,17 +210,20 @@ namespace Messaging {
 
         try
         {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             // translate the duration
             ::qpid::messaging::Duration dur((*durationp).Milliseconds);
 
             // get the message
-            ::qpid::messaging::Message msg = 
-                receiverp->::qpid::messaging::Receiver::get(dur);
+            ::qpid::messaging::Message msg =
+                nativeObjPtr->::qpid::messaging::Receiver::get(dur);
 
             // create new managed message with received message embedded in it
             newMessage = gcnew Message(msg);
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
@@ -212,16 +232,16 @@ namespace Messaging {
         {
             if (newException != nullptr)
             {
-				if (newMessage != nullptr)
-				{
-					delete newMessage;
-				}
+                if (newMessage != nullptr)
+                {
+                    delete newMessage;
+                }
             }
         }
         if (newException != nullptr)
         {
-			throw newException;
-		}
+            throw newException;
+        }
 
         return newMessage;
     }
@@ -233,39 +253,42 @@ namespace Messaging {
     {
         return Fetch(mmsgp, DurationConstants::FORVER);
     }
-    
+
     bool Receiver::Fetch(Message ^% mmsgp, Duration ^ durationp)
     {
         System::Exception         ^ newException = nullptr;
 
         try
         {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             ::qpid::messaging::Duration dur((*durationp).Milliseconds);
-    
+
             ::qpid::messaging::Message tmpMsg;
-        
-            bool result = receiverp->Receiver::fetch(tmpMsg, dur);
-        
+
+            bool result = nativeObjPtr->Receiver::fetch(tmpMsg, dur);
+
             if (result)
             {
                 mmsgp = gcnew Message(tmpMsg);
             }
-        
+
             return result;
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
         if (newException != nullptr)
         {
-			throw newException;
-		}
+            throw newException;
+        }
 
         return false;
     }
-    
+
 
     //
     // message = Fetch()
@@ -283,17 +306,20 @@ namespace Messaging {
 
         try
         {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             // translate the duration
             ::qpid::messaging::Duration dur((*durationp).Milliseconds);
 
             // get the message
             ::qpid::messaging::Message msg =
-                receiverp->::qpid::messaging::Receiver::fetch(dur);
+                nativeObjPtr->::qpid::messaging::Receiver::fetch(dur);
 
             // create new managed message with received message embedded in it
             newMessage = gcnew Message(msg);
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
@@ -302,22 +328,25 @@ namespace Messaging {
         {
             if (newException != nullptr)
             {
-				if (newMessage != nullptr)
-				{
-					delete newMessage;
-				}
+                if (newMessage != nullptr)
+                {
+                    delete newMessage;
+                }
             }
         }
         if (newException != nullptr)
         {
-			throw newException;
-		}
+            throw newException;
+        }
 
         return newMessage;
     }
 
     void Receiver::Close()
     {
-        receiverp->close();
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
+        nativeObjPtr->close();
     }
 }}}}

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=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Receiver.h Wed Dec 21 17:55:59 2011
@@ -41,7 +41,7 @@ namespace Qpid {
 namespace Messaging {
 
     /// <summary>
-    /// Mreceiver is a managed wrapper for a ::qpid::messaging::Receiver
+    /// Receiver is a managed wrapper for a ::qpid::messaging::Receiver
     /// </summary>
 
     ref class Session;
@@ -55,7 +55,13 @@ namespace Messaging {
         Session ^ parentSession;
 
         // The kept object in the Messaging C++ DLL
-        ::qpid::messaging::Receiver * receiverp;
+        ::qpid::messaging::Receiver * nativeObjPtr;
+
+        // per-instance lock object
+        System::Object ^ privateLock;
+
+        // Disallow use after object is destroyed
+        void ThrowIfDisposed();
 
     public:
 
@@ -76,24 +82,45 @@ namespace Messaging {
         // assignment operator
         Receiver % operator=(const Receiver % rhs)
         {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             if (this == %rhs)
             {
                 // Self assignment, do nothing
             }
             else
             {
-                if (NULL != receiverp)
-                    delete receiverp;
-                receiverp = new ::qpid::messaging::Receiver(
+                if (NULL != nativeObjPtr)
+                    delete nativeObjPtr;
+                nativeObjPtr = new ::qpid::messaging::Receiver(
                     *(const_cast<Receiver %>(rhs).NativeReceiver));
                 parentSession = rhs.parentSession;
             }
             return *this;
         }
 
+        //
+        // IsDisposed
+        //
+        property bool IsDisposed
+        {
+            bool get()
+            {
+                return NULL == nativeObjPtr;
+            }
+        }
+
+
+        //
+        // NativeReceiver
+        //
         property ::qpid::messaging::Receiver * NativeReceiver
         {
-            ::qpid::messaging::Receiver * get () { return receiverp; }
+            ::qpid::messaging::Receiver * get ()
+            {
+                return nativeObjPtr;
+            }
         }
 
         // Get(message)
@@ -119,12 +146,18 @@ namespace Messaging {
         {
             void set (System::UInt32 capacity)
             {
-                receiverp->setCapacity(capacity);
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                nativeObjPtr->setCapacity(capacity);
             }
 
             System::UInt32 get ()
             {
-                return receiverp->getCapacity();
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getCapacity();
             }
         }
 
@@ -135,7 +168,10 @@ namespace Messaging {
         {
             System::UInt32 get ()
             {
-                return receiverp->getAvailable();
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getAvailable();
             }
         }
 
@@ -146,12 +182,15 @@ namespace Messaging {
         {
             System::UInt32 get ()
             {
-                return receiverp->getUnsettled();
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getUnsettled();
             }
         }
 
         void Close();
-        
+
         //
         // IsClosed
         //
@@ -159,7 +198,10 @@ namespace Messaging {
         {
             System::Boolean get ()
             {
-                return receiverp->isClosed();
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->isClosed();
             }
         }
 
@@ -170,7 +212,10 @@ namespace Messaging {
         {
             System::String ^ get ()
             {
-                return gcnew System::String(receiverp->getName().c_str());
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return gcnew System::String(nativeObjPtr->getName().c_str());
             }
         }
 
@@ -181,6 +226,9 @@ namespace Messaging {
         {
             Org::Apache::Qpid::Messaging::Session ^ get ()
             {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
                 return parentSession;
             }
         }

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=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.cpp Wed Dec 21 17:55:59 2011
@@ -37,30 +37,39 @@ namespace Qpid {
 namespace Messaging {
 
     /// <summary>
-    /// Sender a managed wrapper for a ::qpid::messaging::Sender 
+    /// Sender a managed wrapper for a ::qpid::messaging::Sender
     /// </summary>
 
+    // Disallow access if object has been destroyed.
+    void Sender::ThrowIfDisposed()
+    {
+        if (IsDisposed)
+            throw gcnew ObjectDisposedException (GetType()->FullName);
+    }
+
+
     // unmanaged clone
     Sender::Sender(const ::qpid::messaging::Sender & s,
-                     Org::Apache::Qpid::Messaging::Session ^ sessRef) :
-        parentSession(sessRef)
+        Org::Apache::Qpid::Messaging::Session ^ sessRef) :
+    parentSession(sessRef)
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            senderp = new ::qpid::messaging::Sender (s);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Sender (s);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
 
@@ -74,12 +83,15 @@ namespace Messaging {
     // Finalizer
     Sender::!Sender()
     {
-        msclr::lock lk(this);
-
-        if (NULL != senderp)
+        if (NULL != nativeObjPtr)
         {
-            delete senderp;
-            senderp = NULL;
+            privateLock = gcnew System::Object();
+
+            if (NULL != nativeObjPtr)
+            {
+                delete nativeObjPtr;
+                nativeObjPtr = NULL;
+            }
         }
     }
 
@@ -90,21 +102,22 @@ namespace Messaging {
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            senderp = new ::qpid::messaging::Sender(
-                        *(const_cast<Sender ^>(sender)->NativeSender));
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Sender(
+                *(const_cast<Sender ^>(sender)->NativeSender));
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     // Copy constructor implicitly dereferenced (C++)
@@ -113,21 +126,22 @@ namespace Messaging {
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            senderp = new ::qpid::messaging::Sender(
-                        *(const_cast<Sender %>(sender).NativeSender));
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Sender(
+                *(const_cast<Sender %>(sender).NativeSender));
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
 
@@ -141,42 +155,48 @@ namespace Messaging {
 
     void Sender::Send(Message ^ mmsgp, bool sync)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            senderp->::qpid::messaging::Sender::send(*((*mmsgp).NativeMessage), sync);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->::qpid::messaging::Sender::send(*((*mmsgp).NativeMessage), sync);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
 
     void Sender::Close()
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            senderp->close();
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->close();
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 }}}}

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=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Sender.h Wed Dec 21 17:55:59 2011
@@ -40,7 +40,7 @@ namespace Qpid {
 namespace Messaging {
 
     /// <summary>
-    /// Sender is a managed wrapper for a ::qpid::messaging::Sender 
+    /// Sender is a managed wrapper for a ::qpid::messaging::Sender
     /// </summary>
 
     ref class Session;
@@ -50,16 +50,22 @@ namespace Messaging {
     {
     private:
         // The kept object in the Messaging C++ DLL
-        ::qpid::messaging::Sender * senderp;
+        ::qpid::messaging::Sender * nativeObjPtr;
 
         // The session that created this Sender
         Session ^ parentSession;
 
+        // per-instance lock object
+        System::Object ^ privateLock;
+
+        // Disallow use after object is destroyed
+        void ThrowIfDisposed();
+
     public:
         // unmanaged clone
         Sender(const ::qpid::messaging::Sender & s,
             Session ^ sessRef);
-        
+
         // copy constructor
         Sender(const Sender ^ sender);
         Sender(const Sender % sender);
@@ -70,24 +76,45 @@ namespace Messaging {
         // assignment operator
         Sender % operator=(const Sender % rhs)
         {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             if (this == %rhs)
             {
                 // Self assignment, do nothing
             }
             else
             {
-                if (NULL != senderp)
-                    delete senderp;
-                senderp = new ::qpid::messaging::Sender(
+                if (NULL != nativeObjPtr)
+                    delete nativeObjPtr;
+                nativeObjPtr = new ::qpid::messaging::Sender(
                     *(const_cast<Sender %>(rhs).NativeSender));
                 parentSession = rhs.parentSession;
             }
             return *this;
         }
 
+        //
+        // IsDisposed
+        //
+        property bool IsDisposed
+        {
+            bool get()
+            {
+                return NULL == nativeObjPtr;
+            }
+        }
+
+
+        //
+        // NativeSender
+        //
         property ::qpid::messaging::Sender * NativeSender
         {
-            ::qpid::messaging::Sender * get () { return senderp; }
+            ::qpid::messaging::Sender * get ()
+            {
+                return nativeObjPtr;
+            }
         }
 
 
@@ -99,25 +126,52 @@ namespace Messaging {
 
         property System::UInt32 Capacity
         {
-            System::UInt32 get () { return senderp->getCapacity(); }
-            void set (System::UInt32 capacity) { senderp->setCapacity(capacity); }
+            System::UInt32 get ()
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getCapacity();
+            }
+            void set (System::UInt32 capacity)
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                nativeObjPtr->setCapacity(capacity);
+            }
         }
 
         property System::UInt32 Unsettled
         {
-            System::UInt32 get () { return senderp->getUnsettled(); }
+            System::UInt32 get ()
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getUnsettled();
+            }
         }
 
         property System::UInt32 Available
         {
-            System::UInt32 get () { return senderp->getAvailable(); }
+            System::UInt32 get ()
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getAvailable();
+            }
         }
 
         property System::String ^ Name
         {
             System::String ^ get ()
             {
-                return gcnew System::String(senderp->getName().c_str());
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return gcnew System::String(nativeObjPtr->getName().c_str());
             }
         }
 
@@ -128,6 +182,9 @@ namespace Messaging {
         {
             Org::Apache::Qpid::Messaging::Session ^ get ()
             {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
                 return 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=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.cpp Wed Dec 21 17:55:59 2011
@@ -45,27 +45,36 @@ namespace Messaging {
     /// Session is a managed wrapper for a ::qpid::messaging::Session
     /// </summary>
 
+    // Disallow access if object has been destroyed.
+    void Session::ThrowIfDisposed()
+    {
+        if (IsDisposed)
+            throw gcnew ObjectDisposedException (GetType()->FullName);
+    }
+
+
     // unmanaged clone
-    Session::Session(const ::qpid::messaging::Session & session, 
-                     Org::Apache::Qpid::Messaging::Connection ^ connRef) :
-        parentConnectionp(connRef)
+    Session::Session(const ::qpid::messaging::Session & session,
+        Org::Apache::Qpid::Messaging::Connection ^ connRef) :
+    parentConnectionp(connRef)
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp = new ::qpid::messaging::Session (session);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Session (session);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
 
@@ -79,12 +88,15 @@ namespace Messaging {
     // Finalizer
     Session::!Session()
     {
-        msclr::lock lk(this);
-
-        if (NULL != sessionp)
+        if (NULL != nativeObjPtr)
         {
-            delete sessionp;
-            sessionp = NULL;
+            privateLock = gcnew System::Object();
+
+            if (NULL != nativeObjPtr)
+            {
+                delete nativeObjPtr;
+                nativeObjPtr = NULL;
+            }
         }
     }
 
@@ -95,22 +107,23 @@ namespace Messaging {
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp = new ::qpid::messaging::Session(
-                        *(const_cast<Session ^>(session)->NativeSession));
-          
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Session(
+                *(const_cast<Session ^>(session)->NativeSession));
+
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     // Copy constructor implicitly dereferenced (C++)
@@ -119,83 +132,93 @@ namespace Messaging {
     {
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp = new ::qpid::messaging::Session(
-                        *(const_cast<Session %>(session).NativeSession));
-          
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            privateLock = gcnew System::Object();
+            nativeObjPtr = new ::qpid::messaging::Session(
+                *(const_cast<Session %>(session).NativeSession));
+
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
 
     void Session::Close()
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->close();
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->close();
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Commit()
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->commit();
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->commit();
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Rollback()
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->rollback();
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->rollback();
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Acknowledge()
@@ -205,22 +228,25 @@ namespace Messaging {
 
     void Session::Acknowledge(bool sync)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->acknowledge(sync);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->acknowledge(sync);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Acknowledge(Message ^ message)
@@ -230,22 +256,25 @@ namespace Messaging {
 
     void Session::Acknowledge(Message ^ message, bool sync)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->acknowledge(*(message->NativeMessage), sync);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->acknowledge(*(message->NativeMessage), sync);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::AcknowledgeUpTo(Message ^ message)
@@ -255,62 +284,71 @@ namespace Messaging {
 
     void Session::AcknowledgeUpTo(Message ^ message, bool sync)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->acknowledgeUpTo(*(message->NativeMessage), sync);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->acknowledgeUpTo(*(message->NativeMessage), sync);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Reject(Message ^ message)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->::qpid::messaging::Session::reject(*(message->NativeMessage));
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->::qpid::messaging::Session::reject(*(message->NativeMessage));
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Release(Message ^ message)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->::qpid::messaging::Session::release(*(message->NativeMessage));
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->::qpid::messaging::Session::release(*(message->NativeMessage));
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     void Session::Sync()
@@ -320,22 +358,25 @@ namespace Messaging {
 
     void Session::Sync(bool block)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->sync(block);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->sync(block);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 
     // next(receiver)
@@ -346,18 +387,21 @@ namespace Messaging {
 
     bool Session::NextReceiver(Receiver ^ rcvr, Duration ^ timeout)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception           ^ newException = nullptr;
 
-        try 
-		{
-			// create a duration object
+        try
+        {
+            // create a duration object
             ::qpid::messaging::Duration dur(timeout->Milliseconds);
 
-			// wait for the next received message
-            return sessionp->nextReceiver(*(rcvr->NativeReceiver), dur);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+            // wait for the next received message
+            return nativeObjPtr->nextReceiver(*(rcvr->NativeReceiver), dur);
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             if ("No message to fetch" == errmsg){
                 return false;
@@ -365,10 +409,10 @@ namespace Messaging {
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return true;
     }
@@ -381,19 +425,22 @@ namespace Messaging {
 
     Receiver ^ Session::NextReceiver(Duration ^ timeout)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception           ^ newException = nullptr;
 
         try
         {
             ::qpid::messaging::Duration dur(timeout->Milliseconds);
 
-            ::qpid::messaging::Receiver receiver = sessionp->::qpid::messaging::Session::nextReceiver(dur);
+            ::qpid::messaging::Receiver receiver = nativeObjPtr->::qpid::messaging::Session::nextReceiver(dur);
 
             Receiver ^ newRcvr = gcnew Receiver(receiver, this);
 
             return newRcvr;
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             if ("No message to fetch" == errmsg)
@@ -403,30 +450,33 @@ namespace Messaging {
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
-		return nullptr;
+        return nullptr;
     }
 
 
     Sender ^ Session::CreateSender  (System::String ^ address)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception          ^ newException = nullptr;
         Sender                     ^ newSender    = nullptr;
 
         try
         {
             // create the sender
-            ::qpid::messaging::Sender sender = 
-				sessionp->::qpid::messaging::Session::createSender(QpidMarshal::ToNative(address));
+            ::qpid::messaging::Sender sender =
+                nativeObjPtr->::qpid::messaging::Session::createSender(QpidMarshal::ToNative(address));
 
             // create a managed sender
             newSender = gcnew Sender(sender, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
@@ -435,16 +485,16 @@ namespace Messaging {
         {
             if (newException != nullptr)
             {
-				if (newSender != nullptr)
-				{
-					delete newSender;
-				}
+                if (newSender != nullptr)
+                {
+                    delete newSender;
+                }
             }
         }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return newSender;
     }
@@ -452,19 +502,22 @@ namespace Messaging {
 
     Sender ^ Session::CreateSender  (Address ^ address)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception          ^ newException = nullptr;
         Sender                     ^ newSender    = nullptr;
 
         try
         {
             // allocate a native sender
-            ::qpid::messaging::Sender sender = 
-				sessionp->::qpid::messaging::Session::createSender(*(address->NativeAddress));
+            ::qpid::messaging::Sender sender =
+                nativeObjPtr->::qpid::messaging::Session::createSender(*(address->NativeAddress));
 
             // create a managed sender
             newSender = gcnew Sender(sender, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
@@ -473,92 +526,98 @@ namespace Messaging {
         {
             if (newException != nullptr)
             {
-				if (newSender != nullptr)
-				{
-					delete newSender;
-				}
+                if (newSender != nullptr)
+                {
+                    delete newSender;
+                }
             }
         }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return newSender;
     }
 
 
-	Receiver ^ Session::CreateReceiver(System::String ^ address)
+    Receiver ^ Session::CreateReceiver(System::String ^ address)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception           ^ newException = nullptr;
         Receiver                    ^ newReceiver  = nullptr;
 
-        try 
-		{
+        try
+        {
             // create the receiver
-            ::qpid::messaging::Receiver receiver = 
-				sessionp->createReceiver(QpidMarshal::ToNative(address));
+            ::qpid::messaging::Receiver receiver =
+                nativeObjPtr->createReceiver(QpidMarshal::ToNative(address));
 
             // create a managed receiver
             newReceiver = gcnew Receiver(receiver, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
-        finally 
-		{
+        finally
+        {
             if (newException != nullptr)
-			{
-				if (newReceiver != nullptr)
-				{
-					delete newReceiver;
-				}
+            {
+                if (newReceiver != nullptr)
+                {
+                    delete newReceiver;
+                }
             }
         }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return newReceiver;
     }
 
 
-	Receiver ^ Session::CreateReceiver(Address ^ address)
+    Receiver ^ Session::CreateReceiver(Address ^ address)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception           ^ newException = nullptr;
         Receiver                    ^ newReceiver  = nullptr;
 
-        try 
-		{
+        try
+        {
             // create the receiver
             ::qpid::messaging::Receiver receiver =
-				sessionp->createReceiver(*(address->NativeAddress));
+                nativeObjPtr->createReceiver(*(address->NativeAddress));
 
             // create a managed receiver
             newReceiver = gcnew Receiver(receiver, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
-        finally 
-		{
+        finally
+        {
             if (newException != nullptr)
-			{
-				if (newReceiver != nullptr)
-				{
-					delete newReceiver;
-				}
+            {
+                if (newReceiver != nullptr)
+                {
+                    delete newReceiver;
+                }
             }
         }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return newReceiver;
     }
@@ -566,35 +625,38 @@ namespace Messaging {
 
     Sender ^ Session::GetSender(System::String ^ name)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception           ^ newException = nullptr;
         Sender                      ^ newSender    = nullptr;
 
         try
         {
-            ::qpid::messaging::Sender senderp = 
-				sessionp->::qpid::messaging::Session::getSender(QpidMarshal::ToNative(name));
+            ::qpid::messaging::Sender senderp =
+                nativeObjPtr->::qpid::messaging::Session::getSender(QpidMarshal::ToNative(name));
 
             newSender = gcnew Sender(senderp, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
-        finally 
-		{
+        finally
+        {
             if (newException != nullptr)
-			{
-				if (newSender != nullptr)
-				{
-					delete newSender;
-				}
+            {
+                if (newSender != nullptr)
+                {
+                    delete newSender;
+                }
             }
         }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return newSender;
     }
@@ -603,35 +665,38 @@ namespace Messaging {
 
     Receiver ^ Session::GetReceiver(System::String ^ name)
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception           ^ newException = nullptr;
         Receiver                    ^ newReceiver  = nullptr;
 
         try
         {
-            ::qpid::messaging::Receiver receiver = 
-                sessionp->::qpid::messaging::Session::getReceiver(QpidMarshal::ToNative(name));
+            ::qpid::messaging::Receiver receiver =
+                nativeObjPtr->::qpid::messaging::Session::getReceiver(QpidMarshal::ToNative(name));
 
             newReceiver = gcnew Receiver(receiver, this);
-        } 
-        catch (const ::qpid::types::Exception & error) 
+        }
+        catch (const ::qpid::types::Exception & error)
         {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
-        finally 
-		{
+        finally
+        {
             if (newException != nullptr)
-			{
-				if (newReceiver != nullptr)
-				{
-					delete newReceiver;
-				}
+            {
+                if (newReceiver != nullptr)
+                {
+                    delete newReceiver;
+                }
             }
         }
-        if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
 
         return newReceiver;
     }
@@ -640,21 +705,24 @@ namespace Messaging {
 
     void Session::CheckError()
     {
+        msclr::lock lk(privateLock);
+        ThrowIfDisposed();
+
         System::Exception ^ newException = nullptr;
 
-        try 
-		{
-            sessionp->checkError();
-        } 
-        catch (const ::qpid::types::Exception & error) 
-		{
+        try
+        {
+            nativeObjPtr->checkError();
+        }
+        catch (const ::qpid::types::Exception & error)
+        {
             String ^ errmsg = gcnew String(error.what());
             newException    = gcnew QpidException(errmsg);
         }
 
-		if (newException != nullptr) 
-		{
-	        throw newException;
-		}
+        if (newException != nullptr)
+        {
+            throw newException;
+        }
     }
 }}}}

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=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/Session.h Wed Dec 21 17:55:59 2011
@@ -45,7 +45,7 @@ namespace Messaging {
     /// Session is a managed wrapper for a ::qpid::messaging::Session
     /// </summary>
 
-	ref class Address;
+    ref class Address;
     ref class Connection;
     ref class Duration;
     ref class Receiver;
@@ -56,15 +56,21 @@ namespace Messaging {
     {
     private:
         // The kept object in the Messaging C++ DLL
-        ::qpid::messaging::Session * sessionp;
+        ::qpid::messaging::Session * nativeObjPtr;
 
         // The connection that created this session
         Connection ^ parentConnectionp;
 
+        // per-instance lock object
+        System::Object ^ privateLock;
+
+        // Disallow use after object is destroyed
+        void ThrowIfDisposed();
+
     public:
 
         // unmanaged clone
-        Session(const ::qpid::messaging::Session & sessionp,
+        Session(const ::qpid::messaging::Session & nativeObjPtr,
             Connection ^ connRef);
 
         // copy constructor
@@ -77,24 +83,45 @@ namespace Messaging {
         // assignment operator
         Session % operator=(const Session % rhs)
         {
+            msclr::lock lk(privateLock);
+            ThrowIfDisposed();
+
             if (this == %rhs)
             {
                 // Self assignment, do nothing
             }
             else
             {
-                if (NULL != sessionp)
-                    delete sessionp;
-                sessionp = new ::qpid::messaging::Session(
+                if (NULL != nativeObjPtr)
+                    delete nativeObjPtr;
+                nativeObjPtr = new ::qpid::messaging::Session(
                     *(const_cast<Session %>(rhs).NativeSession) );
                 parentConnectionp = rhs.parentConnectionp;
             }
             return *this;
         }
 
+        //
+        // IsDisposed
+        //
+        property bool IsDisposed
+        {
+            bool get()
+            {
+                return NULL == nativeObjPtr;
+            }
+        }
+
+
+        //
+        // NativeSession
+        //
         property ::qpid::messaging::Session * NativeSession
         {
-            ::qpid::messaging::Session * get () { return sessionp; }
+            ::qpid::messaging::Session * get ()
+            {
+                return nativeObjPtr;
+            }
         }
 
         void Close();
@@ -113,12 +140,24 @@ namespace Messaging {
 
         property System::UInt32 Receivable
         {
-            System::UInt32 get () { return sessionp->getReceivable(); }
+            System::UInt32 get ()
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getReceivable();
+            }
         }
 
         property System::UInt32 UnsettledAcks
         {
-            System::UInt32 get () { return sessionp->getUnsettledAcks(); }
+            System::UInt32 get ()
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->getUnsettledAcks();
+            }
         }
 
         // next(receiver)
@@ -131,10 +170,10 @@ namespace Messaging {
 
 
         Sender   ^ CreateSender(System::String ^ address);
-		Sender   ^ CreateSender(Address ^ address);
+        Sender   ^ CreateSender(Address ^ address);
 
         Receiver ^ CreateReceiver(System::String ^ address);
-		Receiver ^ CreateReceiver(Address ^ address);
+        Receiver ^ CreateReceiver(Address ^ address);
 
         Sender   ^ GetSender(System::String ^ name);
         Receiver ^ GetReceiver(System::String ^ name);
@@ -143,6 +182,9 @@ namespace Messaging {
         {
             Org::Apache::Qpid::Messaging::Connection ^ get ()
             {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
                 return parentConnectionp;
             }
         }
@@ -150,7 +192,13 @@ namespace Messaging {
 
         property System::Boolean HasError
         {
-            System::Boolean get () { return sessionp->hasError(); }
+            System::Boolean get ()
+            {
+                msclr::lock lk(privateLock);
+                ThrowIfDisposed();
+
+                return nativeObjPtr->hasError();
+            }
         }
 
         void CheckError();

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp?rev=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.cpp Wed Dec 21 17:55:59 2011
@@ -43,11 +43,11 @@ namespace Messaging {
     // Add its elements to the qpid map.
     //
     void TypeTranslator::ManagedToNative(QpidMap ^ theDictionary,
-										 ::qpid::types::Variant::Map & qpidMap)
+                                         ::qpid::types::Variant::Map & qpidMap)
     {
         // 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 theDictionary)
+            <System::String^, System::Object^> kvp in theDictionary)
         {
             if (QpidTypeCheck::ObjectIsMap(kvp.Value))
             {
@@ -108,7 +108,7 @@ namespace Messaging {
     // Add its elements to the qpid list.
     //
     void TypeTranslator::ManagedToNative(QpidList ^ theList,
-										 ::qpid::types::Variant::List & qpidList)
+                                         ::qpid::types::Variant::List & qpidList)
     {
         // iterate the items, converting each to a variant and adding to the map
         for each (System::Object ^ listObj in theList)
@@ -162,7 +162,7 @@ namespace Messaging {
     // Returns a variant representing simple native type object.
     // Not to be called for Map/List objects.
     //
-    void TypeTranslator::ManagedToNativeObject(System::Object ^ managedValue, 
+    void TypeTranslator::ManagedToNativeObject(System::Object ^ managedValue,
                                ::qpid::types::Variant & qpidVariant)
     {
         System::Type     ^ typeP    = (*managedValue).GetType();
@@ -171,7 +171,7 @@ namespace Messaging {
         switch (typeCode)
         {
         case System::TypeCode::Boolean :
-			qpidVariant = System::Convert::ToBoolean(managedValue, System::Globalization::CultureInfo::InvariantCulture);
+            qpidVariant = System::Convert::ToBoolean(managedValue, System::Globalization::CultureInfo::InvariantCulture);
             break;
 
         case System::TypeCode::Byte :
@@ -258,9 +258,9 @@ namespace Messaging {
     //   extract the qpid elements and put them into the dictionary.
     //
     void TypeTranslator::NativeToManaged(::qpid::types::Variant::Map & qpidMap,
-										 QpidMap ^ dict)
+                                         QpidMap ^ dict)
     {
-        // For each object in the message 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 = qpidMap.begin(); i != qpidMap.end(); ++i) {
             // Get the name
@@ -278,47 +278,47 @@ namespace Messaging {
             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());
@@ -344,7 +344,7 @@ namespace Messaging {
                     dict[elementName] = newList;
                     break;
                 }
-                
+
             case ::qpid::types::VAR_UUID:
                 {
                     System::String ^ elementValue = gcnew System::String(variant.asUuid().str().c_str());
@@ -359,9 +359,9 @@ namespace Messaging {
 
     void TypeTranslator::NativeToManaged(::qpid::types::Variant::List & qpidList, QpidList ^ managedList)
     {
-        // For each object in the qpidList 
+        // For each object in the qpidList
         //  create a .NET object and add it to the managed List.
-        for (::qpid::types::Variant::List::const_iterator i = qpidList.begin(); i != qpidList.end(); ++i) 
+        for (::qpid::types::Variant::List::const_iterator i = qpidList.begin(); i != qpidList.end(); ++i)
         {
             ::qpid::types::Variant     variant = *i;
             ::qpid::types::VariantType vType   = variant.getType();
@@ -375,47 +375,47 @@ namespace Messaging {
             case ::qpid::types::VAR_BOOL:
                 (*managedList).Add(variant.asBool());
                 break;
-                
+
             case ::qpid::types::VAR_UINT8:
                 (*managedList).Add(variant.asUint8());
                 break;
-                
+
             case ::qpid::types::VAR_UINT16:
                 (*managedList).Add(variant.asUint16());
                 break;
-                
+
             case ::qpid::types::VAR_UINT32:
                 (*managedList).Add(variant.asUint32());
                 break;
-                
+
             case ::qpid::types::VAR_UINT64:
                 (*managedList).Add(variant.asUint64());
                 break;
-                
+
             case ::qpid::types::VAR_INT8:
                 (*managedList).Add(variant.asInt8());
                 break;
-                
+
             case ::qpid::types::VAR_INT16:
                 (*managedList).Add(variant.asInt16());
                 break;
-                
+
             case ::qpid::types::VAR_INT32:
                 (*managedList).Add(variant.asInt32());
                 break;
-                
+
             case ::qpid::types::VAR_INT64:
                 (*managedList).Add(variant.asInt64());
                 break;
-                
+
             case ::qpid::types::VAR_FLOAT:
                 (*managedList).Add(variant.asFloat());
                 break;
-                
+
             case ::qpid::types::VAR_DOUBLE:
                 (*managedList).Add(variant.asDouble());
                 break;
-                
+
             case ::qpid::types::VAR_STRING:
                 {
                     System::String ^ elementValue = gcnew System::String(variant.asString().c_str());
@@ -441,7 +441,7 @@ namespace Messaging {
                     (*managedList).Add(newList);
                     break;
                 }
-                
+
             case ::qpid::types::VAR_UUID:
                 {
                     System::String ^ elementValue = gcnew System::String(variant.asUuid().str().c_str());

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.h?rev=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/TypeTranslator.h Wed Dec 21 17:55:59 2011
@@ -39,19 +39,19 @@ namespace Messaging {
     /// </summary>
     public ref class TypeTranslator sealed
     {
-	private:
-		TypeTranslator::TypeTranslator() {}
+    private:
+        TypeTranslator::TypeTranslator() {}
 
     public:
         // The given object is a managed Dictionary.
         // Add its elements to the qpid map.
         static void ManagedToNative(QpidMap ^ theDictionary,
-									::qpid::types::Variant::Map & qpidMap);
+                                    ::qpid::types::Variant::Map & qpidMap);
 
         // The given object is a managed List.
         // Add its elements to the qpid list.
         static void ManagedToNative(QpidList ^ theList,
-									::qpid::types::Variant::List & qpidList);
+                                    ::qpid::types::Variant::List & qpidList);
 
         // The given object is a simple managed type (not a Dictionary or List)
         // Returns a variant representing simple native type object.
@@ -61,11 +61,11 @@ namespace Messaging {
         // The given object is a qpid map.
         // Add its elements to the managed Dictionary.
         static void NativeToManaged(::qpid::types::Variant::Map & qpidMap,
-									QpidMap ^ dict);
+                                    QpidMap ^ dict);
 
         // The given object is a qpid list.
         // Add its elements to the managed List.
         static void NativeToManaged(::qpid::types::Variant::List & qpidList,
-									QpidList ^ managedList);
+                                    QpidList ^ managedList);
     };
 }}}}

Modified: qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/resource1.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/resource1.h?rev=1221824&r1=1221823&r2=1221824&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/resource1.h (original)
+++ qpid/trunk/qpid/cpp/bindings/qpid/dotnet/src/resource1.h Wed Dec 21 17:55:59 2011
@@ -23,7 +23,7 @@
 // Used by org.apache.qpid.messaging.rc
 
 // Next default values for new objects
-// 
+//
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        101



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