xref: /AOO42X/main/cppuhelper/inc/cppuhelper/weak.hxx (revision 9bce9b0d387299c68bd81d539e1478357a103de5)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _CPPUHELPER_WEAK_HXX_
24 #define _CPPUHELPER_WEAK_HXX_
25 
26 #include <osl/interlck.h>
27 #include <rtl/alloc.h>
28 #include <cppuhelper/weakref.hxx>
29 #include <cppuhelper/queryinterface.hxx>
30 #include "cppuhelper/cppuhelperdllapi.h"
31 #ifndef _COM_SUN_STAR_UNO_WEAK_HPP_
32 #include <com/sun/star/uno/XWeak.hpp>
33 #endif
34 
35 
36 namespace cppu
37 {
38 
39 /** @internal */
40 class OWeakConnectionPoint;
41 
42 /** Base class to implement an UNO object supporting weak references, i.e. the object can be held
43     weakly (by a ::com::sun::star::uno::WeakReference).
44     This implementation copes with reference counting.  Upon last release(), the virtual dtor
45     is called.
46 
47     @derive
48     Inherit from this class and delegate acquire()/ release() calls.
49 */
50 class CPPUHELPER_DLLPUBLIC OWeakObject : public ::com::sun::star::uno::XWeak
51 {
52     /** @internal */
53     friend class OWeakConnectionPoint;
54 
55 protected:
56     /** Virtual dtor.
57 
58         @attention
59         Despite the fact that a RuntimeException is allowed to be thrown, you must not throw any
60         exception upon destruction!
61     */
62     virtual ~OWeakObject() SAL_THROW( (::com::sun::star::uno::RuntimeException) );
63 
64     /** disposes and resets m_pWeakConnectionPoint
65         @precond
66             m_refCount equals 0
67     */
68     void    disposeWeakConnectionPoint();
69 
70     /** reference count.
71 
72         @attention
73         Don't modify manually!  Use acquire() and release().
74     */
75     oslInterlockedCount m_refCount;
76 
77     /** Container of all weak reference listeners and the connection point from the weak reference.
78         @internal
79     */
80     OWeakConnectionPoint * m_pWeakConnectionPoint;
81 
82     /** reserved for future use. do not use.
83         @internal
84     */
85     void * m_pReserved;
86 
87 public:
88     // these are here to force memory de/allocation to sal lib.
89     /** @internal */
operator new(size_t nSize)90     inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW( () )
91         { return ::rtl_allocateMemory( nSize ); }
92     /** @internal */
operator delete(void * pMem)93     inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW( () )
94         { ::rtl_freeMemory( pMem ); }
95     /** @internal */
operator new(size_t,void * pMem)96     inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW( () )
97         { return pMem; }
98     /** @internal */
operator delete(void *,void *)99     inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW( () )
100         {}
101 
102 #ifdef _MSC_VER
103     /** Default Constructor.  Sets the reference count to zero.
104         Accidentally occurs in msvc mapfile = > had to be outlined.
105     */
106     OWeakObject() SAL_THROW( () );
107 #else
108     /** Default Constructor.  Sets the reference count to zero.
109     */
110     inline OWeakObject() SAL_THROW( () )
111         : m_refCount( 0 )
112         , m_pWeakConnectionPoint( 0 )
113         {}
114 #endif
115     /** Dummy copy constructor.  Set the reference count to zero.
116 
117         @param rObj dummy param
118     */
119     inline OWeakObject( const OWeakObject & ) SAL_THROW( () )
120         : com::sun::star::uno::XWeak()
121         , m_refCount( 0 )
122         , m_pWeakConnectionPoint( 0 )
123         {}
124     /** Dummy assignment operator. Does not affect reference count.
125 
126         @return this OWeakObject
127     */
operator =(const OWeakObject &)128     inline OWeakObject & SAL_CALL operator = ( const OWeakObject &)
129         SAL_THROW( () )
130         { return *this; }
131 
132     /** Basic queryInterface() implementation supporting ::com::sun::star::uno::XWeak and
133         ::com::sun::star::uno::XInterface.
134 
135         @param rType demanded type
136         @return demanded type or empty any
137     */
138     virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
139         const ::com::sun::star::uno::Type & rType )
140         throw (::com::sun::star::uno::RuntimeException);
141     /** increasing m_refCount
142     */
143     virtual void SAL_CALL acquire()
144         throw ();
145     /** decreasing m_refCount
146     */
147     virtual void SAL_CALL release()
148         throw ();
149 
150     /** XWeak::queryAdapter() implementation
151 
152         @return a ::com::sun::star::uno::XAdapter reference
153     */
154     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAdapter > SAL_CALL queryAdapter()
155         throw (::com::sun::star::uno::RuntimeException);
156 
157     /** Cast operator to XInterface reference.
158 
159         @return XInterface reference
160     */
operator ::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface>()161     inline SAL_CALL operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > () SAL_THROW( () )
162         { return this; }
163 };
164 
165 }
166 
167 #endif
168