1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | /* |
3 | * This file is part of the LibreOffice project. |
4 | * |
5 | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | * |
9 | * This file incorporates work covered by the following license notice: |
10 | * |
11 | * Licensed to the Apache Software Foundation (ASF) under one or more |
12 | * contributor license agreements. See the NOTICE file distributed |
13 | * with this work for additional information regarding copyright |
14 | * ownership. The ASF licenses this file to you under the Apache |
15 | * License, Version 2.0 (the "License"); you may not use this file |
16 | * except in compliance with the License. You may obtain a copy of |
17 | * the License at http://www.apache.org/licenses/LICENSE-2.0 . |
18 | */ |
19 | #ifndef INCLUDED_CPPUHELPER_WEAK_HXX |
20 | #define INCLUDED_CPPUHELPER_WEAK_HXX |
21 | |
22 | #include <osl/interlck.h> |
23 | #include <rtl/alloc.h> |
24 | #include <cppuhelper/weakref.hxx> |
25 | #include <cppuhelper/queryinterface.hxx> |
26 | #include <com/sun/star/uno/XWeak.hpp> |
27 | #include <cppuhelper/cppuhelperdllapi.h> |
28 | |
29 | |
30 | namespace cppu |
31 | { |
32 | |
33 | class OWeakConnectionPoint; |
34 | |
35 | /** Base class to implement an UNO object supporting weak references, i.e. the object can be held |
36 | weakly (by a ::com::sun::star::uno::WeakReference). |
37 | This implementation copes with reference counting. Upon last release(), the virtual dtor |
38 | is called. |
39 | |
40 | @derive |
41 | Inherit from this class and delegate acquire()/ release() calls. |
42 | */ |
43 | class CPPUHELPER_DLLPUBLIC OWeakObject : public ::com::sun::star::uno::XWeak |
44 | { |
45 | friend class OWeakConnectionPoint; |
46 | |
47 | protected: |
48 | /** Virtual dtor. |
49 | |
50 | @attention |
51 | Despite the fact that a RuntimeException is allowed to be thrown, you must not throw any |
52 | exception upon destruction! |
53 | */ |
54 | virtual ~OWeakObject() SAL_THROW( (::com::sun::star::uno::RuntimeException) ); |
55 | |
56 | /** disposes and resets m_pWeakConnectionPoint |
57 | @pre |
58 | m_refCount equals 0 |
59 | */ |
60 | void disposeWeakConnectionPoint(); |
61 | |
62 | /** reference count. |
63 | |
64 | @attention |
65 | Don't modify manually! Use acquire() and release(). |
66 | */ |
67 | oslInterlockedCount m_refCount; |
68 | |
69 | /// @cond INTERNAL |
70 | |
71 | /** Container of all weak reference listeners and the connection point from the weak reference. |
72 | */ |
73 | OWeakConnectionPoint * m_pWeakConnectionPoint; |
74 | |
75 | /** reserved for future use. do not use. |
76 | */ |
77 | void * m_pReserved; |
78 | |
79 | /// @endcond |
80 | |
81 | public: |
82 | /// @cond INTERNAL |
83 | // these are here to force memory de/allocation to sal lib. |
84 | inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(()) |
85 | { return ::rtl_allocateMemory( nSize ); } |
86 | inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(()) |
87 | { ::rtl_freeMemory( pMem ); } |
88 | inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW(()) |
89 | { return pMem; } |
90 | inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW(()) |
91 | {} |
92 | /// @endcond |
93 | |
94 | #ifdef _MSC_VER |
95 | /** Default Constructor. Sets the reference count to zero. |
96 | Accidentally occurs in msvc mapfile = > had to be outlined. |
97 | */ |
98 | OWeakObject() SAL_THROW(()); |
99 | #else |
100 | /** Default Constructor. Sets the reference count to zero. |
101 | */ |
102 | inline OWeakObject() SAL_THROW(()) |
103 | : m_refCount( 0 ) |
104 | , m_pWeakConnectionPoint( 0 ) |
105 | {} |
106 | #endif |
107 | /** Dummy copy constructor. Set the reference count to zero. |
108 | |
109 | @param rObj dummy param |
110 | */ |
111 | inline OWeakObject( const OWeakObject & rObj ) SAL_THROW(()) |
112 | : com::sun::star::uno::XWeak() |
113 | , m_refCount( 0 ) |
114 | , m_pWeakConnectionPoint( 0 ) |
115 | { |
116 | (void) rObj; |
117 | } |
118 | /** Dummy assignment operator. Does not affect reference count. |
119 | |
120 | @return this OWeakObject |
121 | */ |
122 | inline OWeakObject & SAL_CALL operator = ( const OWeakObject &) |
123 | SAL_THROW(()) |
124 | { return *this; } |
125 | |
126 | /** Basic queryInterface() implementation supporting \::com::sun::star::uno::XWeak and |
127 | \::com::sun::star::uno::XInterface. |
128 | |
129 | @param rType demanded type |
130 | @return demanded type or empty any |
131 | */ |
132 | virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( |
133 | const ::com::sun::star::uno::Type & rType ) |
134 | throw (::com::sun::star::uno::RuntimeException); |
135 | /** increasing m_refCount |
136 | */ |
137 | virtual void SAL_CALL acquire() |
138 | throw (); |
139 | /** decreasing m_refCount |
140 | */ |
141 | virtual void SAL_CALL release() |
142 | throw (); |
143 | |
144 | /** XWeak::queryAdapter() implementation |
145 | |
146 | @return a \::com::sun::star::uno::XAdapter reference |
147 | */ |
148 | virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAdapter > SAL_CALL queryAdapter() |
149 | throw (::com::sun::star::uno::RuntimeException); |
150 | |
151 | /** Cast operator to XInterface reference. |
152 | |
153 | @return XInterface reference |
154 | */ |
155 | inline SAL_CALL operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > () SAL_THROW(()) |
156 | { return this; } |
157 | }; |
158 | |
159 | /// @cond INTERNAL |
160 | /** Convenience function for constructor-based service implementations. |
161 | |
162 | To be used like: |
163 | |
164 | css::uno::XInterface * FOO_constructor_function(...) { |
165 | return cppu::acquire(new FOO(...)); |
166 | } |
167 | |
168 | @param instance |
169 | Newly created instance that should be acquired. |
170 | */ |
171 | static inline ::com::sun::star::uno::XInterface * acquire(OWeakObject * instance) |
172 | { |
173 | assert(instance != 0); |
174 | instance->acquire(); |
175 | return instance; |
176 | } |
177 | /// @endcond |
178 | |
179 | } |
180 | |
181 | #endif |
182 | |
183 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |
184 | |