xref: /trunk/main/ucbhelper/source/provider/resultsethelper.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_ucbhelper.hxx"
30 
31 /**************************************************************************
32                                 TODO
33  **************************************************************************
34 
35  - This implementation is far away from completion. It has no interface
36    for changes notifications etc.
37 
38  *************************************************************************/
39 #include <com/sun/star/ucb/ListActionType.hpp>
40 #include <com/sun/star/ucb/WelcomeDynamicResultSetStruct.hpp>
41 #include <com/sun/star/ucb/XCachedDynamicResultSetStubFactory.hpp>
42 #include <com/sun/star/ucb/XSourceInitialization.hpp>
43 #include <cppuhelper/interfacecontainer.hxx>
44 #include <ucbhelper/resultsethelper.hxx>
45 
46 #include "osl/diagnose.h"
47 
48 using namespace com::sun::star;
49 
50 //=========================================================================
51 //=========================================================================
52 //
53 // ResultSetImplHelper Implementation.
54 //
55 //=========================================================================
56 //=========================================================================
57 
58 namespace ucbhelper {
59 
60 //=========================================================================
61 ResultSetImplHelper::ResultSetImplHelper(
62     const uno::Reference< lang::XMultiServiceFactory >& rxSMgr )
63 : m_pDisposeEventListeners( 0 ),
64   m_bStatic( sal_False ),
65   m_bInitDone( sal_False ),
66   m_xSMgr( rxSMgr )
67 {
68 }
69 
70 //=========================================================================
71 ResultSetImplHelper::ResultSetImplHelper(
72     const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
73     const com::sun::star::ucb::OpenCommandArgument2& rCommand )
74 : m_pDisposeEventListeners( 0 ),
75   m_bStatic( sal_False ),
76   m_bInitDone( sal_False ),
77   m_aCommand( rCommand ),
78   m_xSMgr( rxSMgr )
79 {
80 }
81 
82 //=========================================================================
83 // virtual
84 ResultSetImplHelper::~ResultSetImplHelper()
85 {
86     delete m_pDisposeEventListeners;
87 }
88 
89 //=========================================================================
90 //
91 // XInterface methods.
92 //
93 //=========================================================================
94 
95 XINTERFACE_IMPL_4( ResultSetImplHelper,
96                    lang::XTypeProvider,
97                    lang::XServiceInfo,
98                    lang::XComponent, /* base of XDynamicResultSet */
99                    com::sun::star::ucb::XDynamicResultSet );
100 
101 //=========================================================================
102 //
103 // XTypeProvider methods.
104 //
105 //=========================================================================
106 
107 XTYPEPROVIDER_IMPL_3( ResultSetImplHelper,
108                       lang::XTypeProvider,
109                       lang::XServiceInfo,
110                       com::sun::star::ucb::XDynamicResultSet );
111 
112 //=========================================================================
113 //
114 // XServiceInfo methods.
115 //
116 //=========================================================================
117 
118 XSERVICEINFO_NOFACTORY_IMPL_1( ResultSetImplHelper,
119                                rtl::OUString::createFromAscii(
120                                    "ResultSetImplHelper" ),
121                                rtl::OUString::createFromAscii(
122                                    DYNAMICRESULTSET_SERVICE_NAME ) );
123 
124 //=========================================================================
125 //
126 // XComponent methods.
127 //
128 //=========================================================================
129 
130 // virtual
131 void SAL_CALL ResultSetImplHelper::dispose()
132     throw( uno::RuntimeException )
133 {
134     osl::MutexGuard aGuard( m_aMutex );
135 
136     if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
137     {
138         lang::EventObject aEvt;
139         aEvt.Source = static_cast< lang::XComponent * >( this );
140         m_pDisposeEventListeners->disposeAndClear( aEvt );
141     }
142 }
143 
144 //=========================================================================
145 // virtual
146 void SAL_CALL ResultSetImplHelper::addEventListener(
147         const uno::Reference< lang::XEventListener >& Listener )
148     throw( uno::RuntimeException )
149 {
150     osl::MutexGuard aGuard( m_aMutex );
151 
152     if ( !m_pDisposeEventListeners )
153         m_pDisposeEventListeners
154             = new cppu::OInterfaceContainerHelper( m_aMutex );
155 
156     m_pDisposeEventListeners->addInterface( Listener );
157 }
158 
159 //=========================================================================
160 // virtual
161 void SAL_CALL ResultSetImplHelper::removeEventListener(
162         const uno::Reference< lang::XEventListener >& Listener )
163     throw( uno::RuntimeException )
164 {
165     osl::MutexGuard aGuard( m_aMutex );
166 
167     if ( m_pDisposeEventListeners )
168         m_pDisposeEventListeners->removeInterface( Listener );
169 }
170 
171 //=========================================================================
172 //
173 // XDynamicResultSet methods.
174 //
175 //=========================================================================
176 
177 // virtual
178 uno::Reference< sdbc::XResultSet > SAL_CALL
179 ResultSetImplHelper::getStaticResultSet()
180     throw( com::sun::star::ucb::ListenerAlreadySetException,
181            uno::RuntimeException )
182 {
183     osl::MutexGuard aGuard( m_aMutex );
184 
185     if ( m_xListener.is() )
186         throw com::sun::star::ucb::ListenerAlreadySetException();
187 
188     init( sal_True );
189     return m_xResultSet1;
190 }
191 
192 //=========================================================================
193 // virtual
194 void SAL_CALL ResultSetImplHelper::setListener(
195         const uno::Reference< com::sun::star::ucb::XDynamicResultSetListener >&
196             Listener )
197     throw( com::sun::star::ucb::ListenerAlreadySetException,
198            uno::RuntimeException )
199 {
200     osl::ClearableMutexGuard aGuard( m_aMutex );
201 
202     if ( m_bStatic || m_xListener.is() )
203         throw com::sun::star::ucb::ListenerAlreadySetException();
204 
205     m_xListener = Listener;
206 
207     //////////////////////////////////////////////////////////////////////
208     // Create "welcome event" and send it to listener.
209     //////////////////////////////////////////////////////////////////////
210 
211     // Note: We only have the implementation for a static result set at the
212     //       moment (src590). The dynamic result sets passed to the listener
213     //       are a fake. This implementation will never call "notify" at the
214     //       listener to propagate any changes!!!
215 
216     init( sal_False );
217 
218     uno::Any aInfo;
219     aInfo <<= com::sun::star::ucb::WelcomeDynamicResultSetStruct(
220         m_xResultSet1 /* "old" */,
221         m_xResultSet2 /* "new" */ );
222 
223     uno::Sequence< com::sun::star::ucb::ListAction > aActions( 1 );
224     aActions.getArray()[ 0 ]
225         = com::sun::star::ucb::ListAction(
226             0, // Position; not used
227             0, // Count; not used
228             com::sun::star::ucb::ListActionType::WELCOME,
229             aInfo );
230     aGuard.clear();
231 
232     Listener->notify(
233         com::sun::star::ucb::ListEvent(
234             static_cast< cppu::OWeakObject * >( this ), aActions ) );
235 }
236 
237 //=========================================================================
238 // virtual
239 sal_Int16 SAL_CALL ResultSetImplHelper::getCapabilities()
240     throw( uno::RuntimeException )
241 {
242     // ! com::sun::star::ucb::ContentResultSetCapability::SORTED
243     return 0;
244 }
245 
246 //=========================================================================
247 // virtual
248 void SAL_CALL ResultSetImplHelper::connectToCache(
249         const uno::Reference< com::sun::star::ucb::XDynamicResultSet > &
250             xCache )
251     throw( com::sun::star::ucb::ListenerAlreadySetException,
252            com::sun::star::ucb::AlreadyInitializedException,
253            com::sun::star::ucb::ServiceNotFoundException,
254            uno::RuntimeException )
255 {
256     if ( m_xListener.is() )
257         throw com::sun::star::ucb::ListenerAlreadySetException();
258 
259     if ( m_bStatic )
260         throw com::sun::star::ucb::ListenerAlreadySetException();
261 
262     uno::Reference< com::sun::star::ucb::XSourceInitialization >
263         xTarget( xCache, uno::UNO_QUERY );
264     if ( xTarget.is() )
265     {
266         uno::Reference<
267             com::sun::star::ucb::XCachedDynamicResultSetStubFactory >
268                 xStubFactory;
269         try
270         {
271             xStubFactory
272                 = uno::Reference<
273                     com::sun::star::ucb::XCachedDynamicResultSetStubFactory >(
274                         m_xSMgr->createInstance(
275                             rtl::OUString::createFromAscii(
276                                 "com.sun.star.ucb.CachedDynamicResultSetStubFactory" ) ),
277                 uno::UNO_QUERY );
278         }
279         catch ( uno::Exception const & )
280         {
281         }
282 
283         if ( xStubFactory.is() )
284         {
285             xStubFactory->connectToCache(
286                                 this, xCache, m_aCommand.SortingInfo, 0 );
287             return;
288         }
289     }
290     throw com::sun::star::ucb::ServiceNotFoundException();
291 }
292 
293 //=========================================================================
294 //
295 // Non-interface methods.
296 //
297 //=========================================================================
298 
299 void ResultSetImplHelper::init( sal_Bool bStatic )
300 {
301     osl::MutexGuard aGuard( m_aMutex );
302 
303     if ( !m_bInitDone )
304     {
305         if ( bStatic )
306         {
307             // virtual... derived class fills m_xResultSet1
308             initStatic();
309 
310             OSL_ENSURE( m_xResultSet1.is(),
311                         "ResultSetImplHelper::init - No 1st result set!" );
312             m_bStatic = sal_True;
313         }
314         else
315         {
316             // virtual... derived class fills m_xResultSet1 and m_xResultSet2
317             initDynamic();
318 
319             OSL_ENSURE( m_xResultSet1.is(),
320                         "ResultSetImplHelper::init - No 1st result set!" );
321             OSL_ENSURE( m_xResultSet2.is(),
322                         "ResultSetImplHelper::init - No 2nd result set!" );
323             m_bStatic = sal_False;
324         }
325         m_bInitDone = sal_True;
326     }
327 }
328 
329 } // namespace ucbhelper
330