diff options
Diffstat (limited to 'cppuhelper/source/weak.cxx')
-rw-r--r-- | cppuhelper/source/weak.cxx | 36 |
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(); |