xref: /AOO41X/main/comphelper/source/container/containermultiplexer.cxx (revision dde7d3faf6dcd9cbeb7b48ba6d0cea5ffcc883d0)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_comphelper.hxx"
26 #include "comphelper/containermultiplexer.hxx"
27 #include "comphelper/uno3.hxx"
28 #include <osl/diagnose.h>
29 //.........................................................................
30 namespace comphelper
31 {
32 //.........................................................................
33 
34     using namespace ::com::sun::star::uno;
35     using namespace ::com::sun::star::lang;
36     using namespace ::com::sun::star::container;
37 
38     //=====================================================================
39     //= OContainerListener
40     //=====================================================================
41     //---------------------------------------------------------------------
OContainerListener(::osl::Mutex & _rMutex)42     OContainerListener::OContainerListener(::osl::Mutex& _rMutex)
43         :m_pAdapter(NULL)
44         ,m_rMutex(_rMutex)
45     {
46     }
47 
48     //---------------------------------------------------------------------
~OContainerListener()49     OContainerListener::~OContainerListener()
50     {
51         if (m_pAdapter)
52         {
53             m_pAdapter->dispose();
54             m_pAdapter = NULL;
55         }
56     }
57 
58     //---------------------------------------------------------------------
_elementInserted(const ContainerEvent &)59     void OContainerListener::_elementInserted( const ContainerEvent& /*_rEvent*/ ) throw(RuntimeException)
60     {
61     }
62 
63     //---------------------------------------------------------------------
_elementRemoved(const ContainerEvent &)64     void OContainerListener::_elementRemoved( const ContainerEvent& ) throw(RuntimeException)
65     {
66     }
67 
68     //---------------------------------------------------------------------
_elementReplaced(const ContainerEvent &)69     void OContainerListener::_elementReplaced( const ContainerEvent& /*_rEvent*/ ) throw(RuntimeException)
70     {
71     }
72 
73     //---------------------------------------------------------------------
_disposing(const EventObject &)74     void OContainerListener::_disposing(const EventObject& ) throw( RuntimeException)
75     {
76     }
77 
78     //------------------------------------------------------------------
setAdapter(OContainerListenerAdapter * pAdapter)79     void OContainerListener::setAdapter(OContainerListenerAdapter* pAdapter)
80     {
81         if (m_pAdapter)
82         {
83             ::osl::MutexGuard aGuard(m_rMutex);
84             m_pAdapter->release();
85             m_pAdapter = NULL;
86         }
87 
88         if (pAdapter)
89         {
90             ::osl::MutexGuard aGuard(m_rMutex);
91             m_pAdapter = pAdapter;
92             m_pAdapter->acquire();
93         }
94     }
95 
96     //=====================================================================
97     //= OContainerListenerAdapter
98     //=====================================================================
99     //---------------------------------------------------------------------
OContainerListenerAdapter(OContainerListener * _pListener,const Reference<XContainer> & _rxContainer)100     OContainerListenerAdapter::OContainerListenerAdapter(OContainerListener* _pListener,
101             const  Reference< XContainer >& _rxContainer)
102         :m_xContainer(_rxContainer)
103         ,m_pListener(_pListener)
104         ,m_nLockCount(0)
105     {
106         if (m_pListener)
107             m_pListener->setAdapter(this);
108 
109         ::comphelper::increment(m_refCount);
110         try
111         {
112             m_xContainer->addContainerListener(this);
113         }
114         catch(const Exception&)
115         {
116             OSL_ENSURE(0,"Exceptiopn catched!");
117         }
118         ::comphelper::decrement(m_refCount);
119     }
120 
121     //---------------------------------------------------------------------
~OContainerListenerAdapter()122     OContainerListenerAdapter::~OContainerListenerAdapter()
123     {
124     }
125 
126     //------------------------------------------------------------------
lock()127     void OContainerListenerAdapter::lock()
128     {
129         ++m_nLockCount;
130     }
131 
132     //------------------------------------------------------------------
unlock()133     void OContainerListenerAdapter::unlock()
134     {
135         --m_nLockCount;
136     }
137 
138     //------------------------------------------------------------------
dispose()139     void OContainerListenerAdapter::dispose()
140     {
141         if (m_xContainer.is())
142         {
143             try
144             {
145                 Reference< XContainerListener > xPreventDelete(this);
146                 m_xContainer->removeContainerListener(xPreventDelete);
147                 m_pListener->setAdapter(NULL);
148             }
149             catch(const Exception&)
150             {
151                 OSL_ENSURE(0,"Exception catched!");
152             }
153             m_xContainer = NULL;
154             m_pListener = NULL;
155         }
156     }
157 
158     //------------------------------------------------------------------
disposing(const EventObject & _rSource)159     void SAL_CALL OContainerListenerAdapter::disposing( const  EventObject& _rSource) throw(RuntimeException)
160     {
161         if (m_pListener)
162         {
163              // tell the listener
164             if (!locked())
165                 m_pListener->_disposing(_rSource);
166             // disconnect the listener
167             if ( m_pListener )
168                 m_pListener->setAdapter(NULL);
169         }
170 
171         m_xContainer = NULL;
172         m_pListener = NULL;
173     }
174 
175     //------------------------------------------------------------------
elementInserted(const ContainerEvent & _rEvent)176     void SAL_CALL OContainerListenerAdapter::elementInserted( const ContainerEvent& _rEvent ) throw(RuntimeException)
177     {
178         if (m_pListener && !locked())
179             m_pListener->_elementInserted(_rEvent);
180     }
181 
182     //------------------------------------------------------------------
elementRemoved(const ContainerEvent & _rEvent)183     void SAL_CALL OContainerListenerAdapter::elementRemoved( const ContainerEvent& _rEvent ) throw(RuntimeException)
184     {
185         if (m_pListener && !locked())
186             m_pListener->_elementRemoved(_rEvent);
187     }
188 
189     //------------------------------------------------------------------
elementReplaced(const ContainerEvent & _rEvent)190     void SAL_CALL OContainerListenerAdapter::elementReplaced( const ContainerEvent& _rEvent ) throw(RuntimeException)
191     {
192         if (m_pListener && !locked())
193             m_pListener->_elementReplaced(_rEvent);
194     }
195 
196 //.........................................................................
197 }   // namespace comphelper
198 //.........................................................................
199 
200