xref: /AOO41X/main/comphelper/inc/comphelper/proxyaggregation.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_PROXY_AGGREGATION
25 #define COMPHELPER_PROXY_AGGREGATION
26 
27 #include <com/sun/star/uno/XAggregation.hpp>
28 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
29 #include <com/sun/star/lang/XComponent.hpp>
30 #include <cppuhelper/implbase1.hxx>
31 #include <cppuhelper/interfacecontainer.hxx>
32 #include <comphelper/uno3.hxx>
33 #include <comphelper/broadcasthelper.hxx>
34 #include <cppuhelper/compbase_ex.hxx>
35 #include "comphelper/comphelperdllapi.h"
36 
37 /* class hierarchy herein:
38 
39          +-------------------+          helper class for aggregating the proxy to another object
40          | OProxyAggregation |          - not ref counted
41          +-------------------+          - no UNO implementation, i.e. not derived from XInterface
42                    ^                      (neither direct nor indirect)
43                    |
44                    |
45   +----------------------------------+  helper class for aggregating a proxy to an XComponent
46   | OComponentProxyAggregationHelper |  - life time coupling: if the inner component (the "aggregate")
47   +----------------------------------+    is disposed, the outer (the delegator) is disposed, too, and
48                    ^                      vice versa
49                    |                    - UNO based, implementing XEventListener
50                    |
51      +----------------------------+     component aggregating another XComponent
52      | OComponentProxyAggregation |     - life time coupling as above
53      +----------------------------+     - ref-counted
54                                         - implements an XComponent itself
55 
56   If you need to
57 
58   - wrap a foreign object which is a XComponent
59     => use OComponentProxyAggregation
60        - call componentAggregateProxyFor in your ctor
61        - call implEnsureDisposeInDtor in your dtor
62 
63   - wrap a foreign object which is a XComponent, but already have ref-counting mechanisms
64     inherited from somewhere else
65     => use OComponentProxyAggregationHelper
66        - override dispose - don't forget to call the base class' dispose!
67        - call componentAggregateProxyFor in your ctor
68 
69   - wrap a foreign object which is no XComponent
70     => use OProxyAggregation
71        - call baseAggregateProxyFor in your ctor
72 */
73 
74 //.............................................................................
75 namespace comphelper
76 {
77 //.............................................................................
78 
79     //=========================================================================
80     //= OProxyAggregation
81     //=========================================================================
82     /** helper class for aggregating a proxy for a foreign object
83     */
84     class OProxyAggregation
85     {
86     private:
87         ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >             m_xProxyAggregate;
88         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider >           m_xProxyTypeAccess;
89         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >    m_xORB;
90 
91     protected:
getORB()92         inline const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& getORB()
93         {
94             return m_xORB;
95         }
96 
97     protected:
98         OProxyAggregation( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB );
99         ~OProxyAggregation();
100 
101         /// to be called from within your ctor
102         void baseAggregateProxyFor(
103             const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxComponent,
104             oslInterlockedCount& _rRefCount,
105             ::cppu::OWeakObject& _rDelegator
106         );
107 
108         // XInterface and XTypeProvider
109         ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException);
110         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw (::com::sun::star::uno::RuntimeException);
111 
112     private:
113         OProxyAggregation( );                                       // never implemented
114         OProxyAggregation( const OProxyAggregation& );              // never implemented
115         OProxyAggregation& operator=( const OProxyAggregation& );   // never implemented
116     };
117 
118     //=========================================================================
119     //= OComponentProxyAggregationHelper
120     //=========================================================================
121     /** a helper class for aggregating a proxy to an XComponent
122 
123         <p>The object couples the life time of itself and the component: if one of the both
124         dies (in a sense of being disposed), the other one dies, too.</p>
125 
126         <p>The class itself does not implement XComponent so you need to forward any XComponent::dispose
127         calls which your derived class gets to the dispose method of this class.</p>
128     */
129 
130     class COMPHELPER_DLLPUBLIC OComponentProxyAggregationHelper :public ::cppu::ImplHelper1 <   com::sun::star::lang::XEventListener
131                                                                         >
132                                             ,private OProxyAggregation
133     {
134     private:
135         typedef ::cppu::ImplHelper1 <   ::com::sun::star::lang::XEventListener
136                                     >   BASE;   // prevents some MSVC problems
137 
138     protected:
139         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >
140                                             m_xInner;
141         ::cppu::OBroadcastHelper&           m_rBHelper;
142 
143     protected:
144         // OProxyAggregation
145         using OProxyAggregation::getORB;
146 
147         // XInterface
148         ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException);
149 
150         // XTypeProvider
151         DECLARE_XTYPEPROVIDER( )
152 
153     protected:
154         OComponentProxyAggregationHelper(
155             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
156             ::cppu::OBroadcastHelper& _rBHelper
157         );
158         virtual ~OComponentProxyAggregationHelper( );
159 
160         /// to be called from within your ctor
161         void componentAggregateProxyFor(
162             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& _rxComponent,
163             oslInterlockedCount& _rRefCount,
164             ::cppu::OWeakObject& _rDelegator
165         );
166 
167         // XEventListener
168         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
169 
170         // XComponent
171         virtual void SAL_CALL dispose() throw( ::com::sun::star::uno::RuntimeException );
172 
173     private:
174         COMPHELPER_DLLPRIVATE OComponentProxyAggregationHelper( );                                                  // never implemented
175         COMPHELPER_DLLPRIVATE OComponentProxyAggregationHelper( const OComponentProxyAggregationHelper& );          // never implemented
176         COMPHELPER_DLLPRIVATE OComponentProxyAggregationHelper& operator=( const OComponentProxyAggregationHelper& );   // never implemented
177     };
178 
179     //=========================================================================
180     //= OComponentProxyAggregation
181     //=========================================================================
182     typedef ::cppu::WeakComponentImplHelperBase OComponentProxyAggregation_CBase;
183 
184     class COMPHELPER_DLLPUBLIC OComponentProxyAggregation   :public OBaseMutex
185                                         ,public OComponentProxyAggregation_CBase
186                                         ,public OComponentProxyAggregationHelper
187     {
188     protected:
189         OComponentProxyAggregation(
190             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
191             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& _rxComponent
192         );
193 
194         virtual ~OComponentProxyAggregation();
195 
196         // XInterface
197         DECLARE_XINTERFACE()
198         // XTypeProvider
199         DECLARE_XTYPEPROVIDER()
200 
201         // OComponentHelper
202         virtual void SAL_CALL disposing()  throw (::com::sun::star::uno::RuntimeException);
203 
204         // XEventListener
205         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException);
206 
207         // XComponent/OComponentProxyAggregationHelper
208         virtual void SAL_CALL dispose() throw( ::com::sun::star::uno::RuntimeException );
209 
210     protected:
211         // be called from within the dtor of derived classes
212         void implEnsureDisposeInDtor( );
213 
214     private:
215         COMPHELPER_DLLPRIVATE OComponentProxyAggregation( );                                                // never implemented
216         COMPHELPER_DLLPRIVATE OComponentProxyAggregation( const OComponentProxyAggregation& );          // never implemented
217         COMPHELPER_DLLPRIVATE OComponentProxyAggregation& operator=( const OComponentProxyAggregation& );   // never implemented
218     };
219 
220 //.............................................................................
221 }   // namespace comphelper
222 //.............................................................................
223 
224 
225 #endif // COMPHELPER_PROXY_AGGREGATION
226