xref: /AOO41X/main/comphelper/inc/comphelper/uno3.hxx (revision 9877b273795ec465a3ce9c15d738eb34c0455705)
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 
24 #ifndef _COMPHELPER_UNO3_HXX_
25 #define _COMPHELPER_UNO3_HXX_
26 
27 #include <osl/interlck.h>
28 #include <comphelper/types.hxx>
29 #include <com/sun/star/uno/XAggregation.hpp>
30 #include <comphelper/sequence.hxx>
31 #include <cppuhelper/typeprovider.hxx>
32 
33 //.........................................................................
34 namespace comphelper
35 {
36 //.........................................................................
37 
38 //=========================================================================
39 
40     /// manipulate ref counts without calling acquire/release
increment(oslInterlockedCount & _counter)41     inline oslInterlockedCount increment(oslInterlockedCount& _counter) { return osl_incrementInterlockedCount(&_counter); }
decrement(oslInterlockedCount & _counter)42     inline oslInterlockedCount decrement(oslInterlockedCount& _counter) { return osl_decrementInterlockedCount(&_counter); }
43 
44 //=========================================================================
45 
46     /** used for declaring UNO3-Defaults, i.e. acquire/release
47     */
48     #define DECLARE_UNO3_DEFAULTS(classname, baseclass) \
49         virtual void    SAL_CALL acquire() throw() { baseclass::acquire(); }    \
50         virtual void    SAL_CALL release() throw() { baseclass::release(); }    \
51         void            SAL_CALL PUT_SEMICOLON_AT_THE_END()
52 
53     /** used for declaring UNO3-Defaults, i.e. acquire/release if you want to forward all queryInterfaces to the base class,
54         (e.g. if you overload queryAggregation)
55     */
56     #define DECLARE_UNO3_AGG_DEFAULTS(classname, baseclass) \
57         virtual void            SAL_CALL acquire() throw() { baseclass::acquire(); } \
58         virtual void            SAL_CALL release() throw() { baseclass::release(); }    \
59         virtual ::com::sun::star::uno::Any  SAL_CALL queryInterface(const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException) \
60             { return baseclass::queryInterface(_rType); } \
61         void                    SAL_CALL PUT_SEMICOLON_AT_THE_END()
62 
63     /** Use this macro to forward XComponent methods to base class
64 
65         When using the ::cppu::WeakComponentImplHelper base classes to
66         implement a UNO interface, a problem occurs when the interface
67         itself already derives from XComponent (like e.g. awt::XWindow
68         or awt::XControl): ::cppu::WeakComponentImplHelper is then
69         still abstract. Using this macro in the most derived class
70         definition provides overrides for the XComponent methods,
71         forwarding them to the given baseclass.
72 
73         @param classname
74         Name of the class this macro is issued within
75 
76         @param baseclass
77         Name of the baseclass that should have the XInterface methods
78         forwarded to - that's usually the WeakComponentImplHelperN base
79 
80         @param implhelper
81         Name of the baseclass that should have the XComponent methods
82         forwarded to - in the case of the WeakComponentImplHelper,
83         that would be ::cppu::WeakComponentImplHelperBase
84     */
85     #define DECLARE_UNO3_XCOMPONENT_DEFAULTS(classname, baseclass, implhelper) \
86         virtual void SAL_CALL acquire() throw() { baseclass::acquire(); }   \
87         virtual void SAL_CALL release() throw() { baseclass::release(); }   \
88         virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException) \
89         {                                                                               \
90             implhelper::dispose();                                                      \
91         }                                                                               \
92         virtual void SAL_CALL addEventListener(                                         \
93             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > const & xListener ) throw (::com::sun::star::uno::RuntimeException) \
94         {                                                                               \
95             implhelper::addEventListener(xListener);                                        \
96         }                                                                               \
97         virtual void SAL_CALL removeEventListener(                                      \
98             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > const & xListener ) throw (::com::sun::star::uno::RuntimeException) \
99         {                                                                               \
100             implhelper::removeEventListener(xListener);                                 \
101         }                                                                               \
102         void         SAL_CALL PUT_SEMICOLON_AT_THE_END()
103 
104 
105     /** Use this macro to forward XComponent methods to base class
106 
107         When using the ::cppu::WeakComponentImplHelper base classes to
108         implement a UNO interface, a problem occurs when the interface
109         itself already derives from XComponent (like e.g. awt::XWindow
110         or awt::XControl): ::cppu::WeakComponentImplHelper is then
111         still abstract. Using this macro in the most derived class
112         definition provides overrides for the XComponent methods,
113         forwarding them to the given baseclass.
114 
115         @param classname
116         Name of the class this macro is issued within
117 
118         @param baseclass
119         Name of the baseclass that should have the XInterface methods
120         forwarded to - that's usually the WeakComponentImplHelperN base
121 
122         @param implhelper
123         Name of the baseclass that should have the XComponent methods
124         forwarded to - in the case of the WeakComponentImplHelper,
125         that would be ::cppu::WeakComponentImplHelperBase
126     */
127     #define DECLARE_UNO3_XCOMPONENT_AGG_DEFAULTS(classname, baseclass, implhelper) \
128         virtual void SAL_CALL acquire() throw() { baseclass::acquire(); }   \
129         virtual void SAL_CALL release() throw() { baseclass::release(); }   \
130         virtual ::com::sun::star::uno::Any  SAL_CALL queryInterface(const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException) \
131             { return baseclass::queryInterface(_rType); }                               \
132         virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException) \
133         {                                                                               \
134             implhelper::dispose();                                                      \
135         }                                                                               \
136         virtual void SAL_CALL addEventListener(                                         \
137             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > const & xListener ) throw (::com::sun::star::uno::RuntimeException) \
138         {                                                                               \
139             implhelper::addEventListener(xListener);                                        \
140         }                                                                               \
141         virtual void SAL_CALL removeEventListener(                                      \
142             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > const & xListener ) throw (::com::sun::star::uno::RuntimeException) \
143         {                                                                               \
144             implhelper::removeEventListener(xListener);                                 \
145         }                                                                               \
146         void         SAL_CALL PUT_SEMICOLON_AT_THE_END()
147 
148 
149     //=====================================================================
150     //= deriving from multiple XInterface-derived classes
151     //=====================================================================
152     //= forwarding/merging XInterface funtionality
153     //=====================================================================
154     #define DECLARE_XINTERFACE( )   \
155         virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException); \
156         virtual void SAL_CALL acquire() throw(); \
157         virtual void SAL_CALL release() throw();
158 
159     #define IMPLEMENT_FORWARD_REFCOUNT( classname, refcountbase ) \
160         void SAL_CALL classname::acquire() throw() { refcountbase::acquire(); } \
161         void SAL_CALL classname::release() throw() { refcountbase::release(); }
162 
163     #define IMPLEMENT_FORWARD_XINTERFACE2( classname, refcountbase, baseclass2 ) \
164         IMPLEMENT_FORWARD_REFCOUNT( classname, refcountbase ) \
165         ::com::sun::star::uno::Any SAL_CALL classname::queryInterface( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException) \
166         { \
167             ::com::sun::star::uno::Any aReturn = refcountbase::queryInterface( _rType ); \
168             if ( !aReturn.hasValue() ) \
169                 aReturn = baseclass2::queryInterface( _rType ); \
170             return aReturn; \
171         }
172 
173     #define IMPLEMENT_FORWARD_XINTERFACE3( classname, refcountbase, baseclass2, baseclass3 ) \
174         IMPLEMENT_FORWARD_REFCOUNT( classname, refcountbase ) \
175         ::com::sun::star::uno::Any SAL_CALL classname::queryInterface( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException) \
176         { \
177             ::com::sun::star::uno::Any aReturn = refcountbase::queryInterface( _rType ); \
178             if ( !aReturn.hasValue() ) \
179             { \
180                 aReturn = baseclass2::queryInterface( _rType ); \
181                 if ( !aReturn.hasValue() ) \
182                     aReturn = baseclass3::queryInterface( _rType ); \
183             } \
184             return aReturn; \
185         }
186 
187     //=====================================================================
188     //= forwarding/merging XTypeProvider funtionality
189     //=====================================================================
190     #define DECLARE_XTYPEPROVIDER( )    \
191         virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw (::com::sun::star::uno::RuntimeException); \
192         virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw (::com::sun::star::uno::RuntimeException);
193 
194     #define IMPLEMENT_GET_IMPLEMENTATION_ID( classname ) \
195         ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL classname::getImplementationId(  ) throw (::com::sun::star::uno::RuntimeException) \
196         { \
197             static ::cppu::OImplementationId* pId = NULL; \
198             if (!pId) \
199             { \
200                 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); \
201                 if (!pId) \
202                 { \
203                     static ::cppu::OImplementationId aId; \
204                     pId = &aId; \
205                 } \
206             } \
207             return pId->getImplementationId(); \
208         }
209 
210     #define IMPLEMENT_FORWARD_XTYPEPROVIDER2( classname, baseclass1, baseclass2 ) \
211         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL classname::getTypes(  ) throw (::com::sun::star::uno::RuntimeException) \
212         { \
213             return ::comphelper::concatSequences( \
214                 baseclass1::getTypes(), \
215                 baseclass2::getTypes() \
216             ); \
217         } \
218         \
219         IMPLEMENT_GET_IMPLEMENTATION_ID( classname )
220 
221     #define IMPLEMENT_FORWARD_XTYPEPROVIDER3( classname, baseclass1, baseclass2, baseclass3 ) \
222         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL classname::getTypes(  ) throw (::com::sun::star::uno::RuntimeException) \
223         { \
224             return ::comphelper::concatSequences( \
225                 baseclass1::getTypes(), \
226                 baseclass2::getTypes(), \
227                 baseclass3::getTypes() \
228             ); \
229         } \
230         \
231         IMPLEMENT_GET_IMPLEMENTATION_ID( classname )
232 
233 //=========================================================================
234 
235     /** ask for an iface of an aggregated object
236         usage:<br/>
237             Reference<XFoo> xFoo;<br/>
238             if (query_aggregation(xAggregatedObject, xFoo))<br/>
239                 ....
240     */
241     template <class iface>
query_aggregation(const::com::sun::star::uno::Reference<::com::sun::star::uno::XAggregation> & _rxAggregate,::com::sun::star::uno::Reference<iface> & _rxOut)242     sal_Bool query_aggregation(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >& _rxAggregate, ::com::sun::star::uno::Reference<iface>& _rxOut)
243     {
244         _rxOut = static_cast<iface*>(NULL);
245         if (_rxAggregate.is())
246         {
247             ::com::sun::star::uno::Any aCheck = _rxAggregate->queryAggregation(
248                 iface::static_type());
249             if (aCheck.hasValue())
250                 _rxOut = *(::com::sun::star::uno::Reference<iface>*)aCheck.getValue();
251         }
252         return _rxOut.is();
253     }
254 
255     /** ask for an iface of an object
256         usage:<br/>
257             Reference<XFoo> xFoo;<br/>
258             if (query_interface(xAnything, xFoo))<br/>
259                 ....
260     */
261     template <class iface>
query_interface(const InterfaceRef & _rxObject,::com::sun::star::uno::Reference<iface> & _rxOut)262     sal_Bool query_interface(const InterfaceRef& _rxObject, ::com::sun::star::uno::Reference<iface>& _rxOut)
263     {
264         _rxOut = static_cast<iface*>(NULL);
265         if (_rxObject.is())
266         {
267             ::com::sun::star::uno::Any aCheck = _rxObject->queryInterface(
268                 iface::static_type());
269             if(aCheck.hasValue())
270             {
271                 _rxOut = *(::com::sun::star::uno::Reference<iface>*)aCheck.getValue();
272                 return _rxOut.is();
273             }
274         }
275         return sal_False;
276     }
277     #define FORWARD_DECLARE_INTERFACE(NAME,XFACE) \
278         namespace com \
279         {   \
280             namespace sun \
281             {\
282                 namespace star \
283                 {\
284                     namespace NAME \
285                     {\
286                         class XFACE; \
287                     }\
288                 }\
289             }\
290         }\
291 
292 
293 //.........................................................................
294 }   // namespace comphelper
295 //.........................................................................
296 
297 #endif // _COMPHELPER_UNO3_HXX_
298 
299