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 	//---------------------------------------------------------------------
42 	OContainerListener::OContainerListener(::osl::Mutex& _rMutex)
43 		:m_pAdapter(NULL)
44 		,m_rMutex(_rMutex)
45 	{
46 	}
47 
48 	//---------------------------------------------------------------------
49 	OContainerListener::~OContainerListener()
50 	{
51 		if (m_pAdapter)
52 		{
53 			m_pAdapter->dispose();
54 			m_pAdapter = NULL;
55 		}
56 	}
57 
58 	//---------------------------------------------------------------------
59 	void OContainerListener::_elementInserted( const ContainerEvent& /*_rEvent*/ ) throw(RuntimeException)
60 	{
61 	}
62 
63 	//---------------------------------------------------------------------
64 	void OContainerListener::_elementRemoved( const ContainerEvent& ) throw(RuntimeException)
65 	{
66 	}
67 
68 	//---------------------------------------------------------------------
69 	void OContainerListener::_elementReplaced( const ContainerEvent& /*_rEvent*/ ) throw(RuntimeException)
70 	{
71 	}
72 
73 	//---------------------------------------------------------------------
74 	void OContainerListener::_disposing(const EventObject& ) throw( RuntimeException)
75 	{
76 	}
77 
78 	//------------------------------------------------------------------
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 	//---------------------------------------------------------------------
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 	//---------------------------------------------------------------------
122 	OContainerListenerAdapter::~OContainerListenerAdapter()
123 	{
124 	}
125 
126 	//------------------------------------------------------------------
127 	void OContainerListenerAdapter::lock()
128 	{
129 		++m_nLockCount;
130 	}
131 
132 	//------------------------------------------------------------------
133 	void OContainerListenerAdapter::unlock()
134 	{
135 		--m_nLockCount;
136 	}
137 
138 	//------------------------------------------------------------------
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 	//------------------------------------------------------------------
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 	//------------------------------------------------------------------
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 	//------------------------------------------------------------------
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 	//------------------------------------------------------------------
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