summaryrefslogtreecommitdiffstats
path: root/cppuhelper/source/weak.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cppuhelper/source/weak.cxx')
-rw-r--r--cppuhelper/source/weak.cxx36
1 files changed, 35 insertions, 1 deletions
diff --git a/cppuhelper/source/weak.cxx b/cppuhelper/source/weak.cxx
index f45f433e9ce2..6bb353faa9bd 100644
--- a/cppuhelper/source/weak.cxx
+++ b/cppuhelper/source/weak.cxx
@@ -31,7 +31,6 @@
#include <vector>
#include <mutex>
-using namespace osl;
using namespace com::sun::star::uno;
namespace cppu
@@ -331,6 +330,7 @@ class OWeakRefListener final : public XReference
{
public:
explicit OWeakRefListener(const Reference< XInterface >& xInt);
+ explicit OWeakRefListener(const Reference< XWeak >& xInt);
virtual ~OWeakRefListener();
// noncopyable
@@ -372,6 +372,18 @@ OWeakRefListener::OWeakRefListener(const Reference< XInterface >& xInt)
osl_atomic_decrement( &m_aRefCount );
}
+OWeakRefListener::OWeakRefListener(const Reference< XWeak >& xWeak)
+ : m_aRefCount( 1 )
+{
+ m_XWeakConnectionPoint = xWeak->queryAdapter();
+
+ if (m_XWeakConnectionPoint.is())
+ {
+ m_XWeakConnectionPoint->addReference(static_cast<XReference*>(this));
+ }
+ osl_atomic_decrement( &m_aRefCount );
+}
+
OWeakRefListener::~OWeakRefListener()
{
try
@@ -434,6 +446,16 @@ WeakReferenceHelper::WeakReferenceHelper(const Reference< XInterface >& xInt)
}
}
+WeakReferenceHelper::WeakReferenceHelper(const Reference< XWeak >& xWeak)
+ : m_pImpl( nullptr )
+{
+ if (xWeak.is())
+ {
+ m_pImpl = new OWeakRefListener(xWeak);
+ m_pImpl->acquire();
+ }
+}
+
WeakReferenceHelper::WeakReferenceHelper(const WeakReferenceHelper& rWeakRef)
: m_pImpl( nullptr )
{
@@ -493,6 +515,18 @@ WeakReferenceHelper::operator= (const Reference< XInterface > & xInt)
return *this;
}
+WeakReferenceHelper &
+WeakReferenceHelper::operator= (const Reference< XWeak > & xWeak)
+{
+ clear();
+ if (xWeak)
+ {
+ m_pImpl = new OWeakRefListener(xWeak);
+ m_pImpl->acquire();
+ }
+ return *this;
+}
+
WeakReferenceHelper::~WeakReferenceHelper()
{
clear();