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_ucb.hxx"
26
27 #include <cacheddynamicresultsetstub.hxx>
28 #include <com/sun/star/sdbc/XResultSet.hpp>
29 #include <cachedcontentresultsetstub.hxx>
30 #include <com/sun/star/ucb/ContentResultSetCapability.hpp>
31 #include <com/sun/star/ucb/XSortedDynamicResultSetFactory.hpp>
32 #include <osl/diagnose.h>
33
34 using namespace com::sun::star::lang;
35 using namespace com::sun::star::sdbc;
36 using namespace com::sun::star::ucb;
37 using namespace com::sun::star::uno;
38 using namespace rtl;
39
CachedDynamicResultSetStub(Reference<XDynamicResultSet> xOrigin,const Reference<XMultiServiceFactory> & xSMgr)40 CachedDynamicResultSetStub::CachedDynamicResultSetStub(
41 Reference< XDynamicResultSet > xOrigin
42 , const Reference< XMultiServiceFactory > & xSMgr )
43 : DynamicResultSetWrapper( xOrigin, xSMgr )
44 {
45 OSL_ENSURE( m_xSMgr.is(), "need Multiservicefactory to create stub" );
46 impl_init();
47 }
48
~CachedDynamicResultSetStub()49 CachedDynamicResultSetStub::~CachedDynamicResultSetStub()
50 {
51 impl_deinit();
52 }
53
54 //virtual
55 void SAL_CALL CachedDynamicResultSetStub
impl_InitResultSetOne(const Reference<XResultSet> & xResultSet)56 ::impl_InitResultSetOne( const Reference< XResultSet >& xResultSet )
57 {
58 DynamicResultSetWrapper::impl_InitResultSetOne( xResultSet );
59 OSL_ENSURE( m_xSourceResultOne.is(), "need source resultset" );
60
61 Reference< XResultSet > xStub(
62 new CachedContentResultSetStub( m_xSourceResultOne ) );
63
64 osl::Guard< osl::Mutex > aGuard( m_aMutex );
65 m_xMyResultOne = xStub;
66 }
67
68 //virtual
69 void SAL_CALL CachedDynamicResultSetStub
impl_InitResultSetTwo(const Reference<XResultSet> & xResultSet)70 ::impl_InitResultSetTwo( const Reference< XResultSet >& xResultSet )
71 {
72 DynamicResultSetWrapper::impl_InitResultSetTwo( xResultSet );
73 OSL_ENSURE( m_xSourceResultTwo.is(), "need source resultset" );
74
75 Reference< XResultSet > xStub(
76 new CachedContentResultSetStub( m_xSourceResultTwo ) );
77
78 osl::Guard< osl::Mutex > aGuard( m_aMutex );
79 m_xMyResultTwo = xStub;
80 }
81
82 //--------------------------------------------------------------------------
83 // XInterface methods.
84 //--------------------------------------------------------------------------
XINTERFACE_COMMON_IMPL(CachedDynamicResultSetStub)85 XINTERFACE_COMMON_IMPL( CachedDynamicResultSetStub )
86
87 Any SAL_CALL CachedDynamicResultSetStub
88 ::queryInterface( const Type& rType )
89 throw ( RuntimeException )
90 {
91 //list all interfaces inclusive baseclasses of interfaces
92
93 Any aRet = DynamicResultSetWrapper::queryInterface( rType );
94 if( aRet.hasValue() )
95 return aRet;
96
97 aRet = cppu::queryInterface( rType,
98 static_cast< XTypeProvider* >( this )
99 , static_cast< XServiceInfo* >( this )
100 );
101 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
102 }
103
104 //--------------------------------------------------------------------------
105 // XTypeProvider methods.
106 //--------------------------------------------------------------------------
107 //list all interfaces exclusive baseclasses
108 XTYPEPROVIDER_IMPL_5( CachedDynamicResultSetStub
109 , XTypeProvider
110 , XServiceInfo
111 , XDynamicResultSet
112 , XDynamicResultSetListener
113 , XSourceInitialization
114 );
115
116 //--------------------------------------------------------------------------
117 // XServiceInfo methods.
118 //--------------------------------------------------------------------------
119
120 XSERVICEINFO_NOFACTORY_IMPL_1( CachedDynamicResultSetStub,
121 OUString::createFromAscii(
122 "com.sun.star.comp.ucb.CachedDynamicResultSetStub" ),
123 OUString::createFromAscii(
124 CACHED_DRS_STUB_SERVICE_NAME ) );
125
126 //--------------------------------------------------------------------------
127 //--------------------------------------------------------------------------
128 // class CachedDynamicResultSetStubFactory
129 //--------------------------------------------------------------------------
130 //--------------------------------------------------------------------------
131
CachedDynamicResultSetStubFactory(const Reference<XMultiServiceFactory> & rSMgr)132 CachedDynamicResultSetStubFactory::CachedDynamicResultSetStubFactory(
133 const Reference< XMultiServiceFactory > & rSMgr )
134 {
135 m_xSMgr = rSMgr;
136 }
137
~CachedDynamicResultSetStubFactory()138 CachedDynamicResultSetStubFactory::~CachedDynamicResultSetStubFactory()
139 {
140 }
141
142 //--------------------------------------------------------------------------
143 // CachedDynamicResultSetStubFactory XInterface methods.
144 //--------------------------------------------------------------------------
145
146 XINTERFACE_IMPL_3( CachedDynamicResultSetStubFactory,
147 XTypeProvider,
148 XServiceInfo,
149 XCachedDynamicResultSetStubFactory );
150
151 //--------------------------------------------------------------------------
152 // CachedDynamicResultSetStubFactory XTypeProvider methods.
153 //--------------------------------------------------------------------------
154
155 XTYPEPROVIDER_IMPL_3( CachedDynamicResultSetStubFactory,
156 XTypeProvider,
157 XServiceInfo,
158 XCachedDynamicResultSetStubFactory );
159
160 //--------------------------------------------------------------------------
161 // CachedDynamicResultSetStubFactory XServiceInfo methods.
162 //--------------------------------------------------------------------------
163
164 XSERVICEINFO_IMPL_1( CachedDynamicResultSetStubFactory,
165 OUString::createFromAscii(
166 "com.sun.star.comp.ucb.CachedDynamicResultSetStubFactory" ),
167 OUString::createFromAscii(
168 CACHED_DRS_STUB_FACTORY_NAME ) );
169
170 //--------------------------------------------------------------------------
171 // Service factory implementation.
172 //--------------------------------------------------------------------------
173
174 ONE_INSTANCE_SERVICE_FACTORY_IMPL( CachedDynamicResultSetStubFactory );
175
176 //--------------------------------------------------------------------------
177 // CachedDynamicResultSetStubFactory XCachedDynamicResultSetStubFactory methods.
178 //--------------------------------------------------------------------------
179
180 //virtual
181 Reference< XDynamicResultSet > SAL_CALL CachedDynamicResultSetStubFactory
createCachedDynamicResultSetStub(const Reference<XDynamicResultSet> & Source)182 ::createCachedDynamicResultSetStub(
183 const Reference< XDynamicResultSet > & Source )
184 throw( RuntimeException )
185 {
186 Reference< XDynamicResultSet > xRet;
187 xRet = new CachedDynamicResultSetStub( Source, m_xSMgr );
188 return xRet;
189 }
190
191 //virtual
192 void SAL_CALL CachedDynamicResultSetStubFactory
connectToCache(const Reference<XDynamicResultSet> & Source,const Reference<XDynamicResultSet> & TargetCache,const Sequence<NumberedSortingInfo> & SortingInfo,const Reference<XAnyCompareFactory> & CompareFactory)193 ::connectToCache(
194 const Reference< XDynamicResultSet > & Source
195 , const Reference< XDynamicResultSet > & TargetCache
196 , const Sequence< NumberedSortingInfo > & SortingInfo
197 , const Reference< XAnyCompareFactory > & CompareFactory
198 )
199 throw ( ListenerAlreadySetException
200 , AlreadyInitializedException
201 , RuntimeException )
202 {
203 OSL_ENSURE( Source.is(), "a Source is needed" );
204 OSL_ENSURE( TargetCache.is(), "a TargetCache is needed" );
205
206 Reference< XDynamicResultSet > xSource( Source );
207 if( SortingInfo.getLength() &&
208 !( xSource->getCapabilities() & ContentResultSetCapability::SORTED )
209 )
210 {
211 Reference< XSortedDynamicResultSetFactory > xSortFactory;
212 try
213 {
214 xSortFactory = Reference< XSortedDynamicResultSetFactory >(
215 m_xSMgr->createInstance( OUString::createFromAscii(
216 "com.sun.star.ucb.SortedDynamicResultSetFactory" ) ),
217 UNO_QUERY );
218 }
219 catch ( Exception const & )
220 {
221 }
222
223 if( xSortFactory.is() )
224 {
225 Reference< XDynamicResultSet > xSorted(
226 xSortFactory->createSortedDynamicResultSet(
227 Source, SortingInfo, CompareFactory ) );
228 if( xSorted.is() )
229 xSource = xSorted;
230 }
231 }
232
233 Reference< XDynamicResultSet > xStub(
234 new CachedDynamicResultSetStub( xSource, m_xSMgr ) );
235
236 Reference< XSourceInitialization > xTarget( TargetCache, UNO_QUERY );
237 OSL_ENSURE( xTarget.is(), "Target must have interface XSourceInitialization" );
238
239 xTarget->setSource( xStub );
240 }
241
242