1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_ucb.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <cachedcontentresultset.hxx>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/FetchDirection.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/FetchError.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/ResultSetException.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XTypeConverter.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/ResultSetType.hpp>
34*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
35*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski using namespace com::sun::star::beans;
38*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
39*b1cdbd2cSJim Jagielski using namespace com::sun::star::script;
40*b1cdbd2cSJim Jagielski using namespace com::sun::star::sdbc;
41*b1cdbd2cSJim Jagielski using namespace com::sun::star::ucb;
42*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
43*b1cdbd2cSJim Jagielski using namespace com::sun::star::util;
44*b1cdbd2cSJim Jagielski using namespace cppu;
45*b1cdbd2cSJim Jagielski using namespace rtl;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #define COMSUNSTARUCBCCRS_DEFAULT_FETCH_SIZE 256
48*b1cdbd2cSJim Jagielski #define COMSUNSTARUCBCCRS_DEFAULT_FETCH_DIRECTION FetchDirection::FORWARD
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
51*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
52*b1cdbd2cSJim Jagielski //define for getXXX methods of interface XRow
53*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
54*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski //if you change this macro please pay attention to
57*b1cdbd2cSJim Jagielski //function ::getObject, where this is similar implemented
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski #define XROW_GETXXX( getXXX, Type )						\
60*b1cdbd2cSJim Jagielski impl_EnsureNotDisposed();								\
61*b1cdbd2cSJim Jagielski ReacquireableGuard aGuard( m_aMutex );					\
62*b1cdbd2cSJim Jagielski sal_Int32 nRow = m_nRow;								\
63*b1cdbd2cSJim Jagielski sal_Int32 nFetchSize = m_nFetchSize;					\
64*b1cdbd2cSJim Jagielski sal_Int32 nFetchDirection = m_nFetchDirection;			\
65*b1cdbd2cSJim Jagielski if( !m_aCache.hasRow( nRow ) )							\
66*b1cdbd2cSJim Jagielski {														\
67*b1cdbd2cSJim Jagielski 	if( !m_aCache.hasCausedException( nRow ) )			\
68*b1cdbd2cSJim Jagielski {														\
69*b1cdbd2cSJim Jagielski 		if( !m_xFetchProvider.is() )					\
70*b1cdbd2cSJim Jagielski 		{												\
71*b1cdbd2cSJim Jagielski 			OSL_ENSURE( sal_False, "broadcaster was disposed already" );	\
72*b1cdbd2cSJim Jagielski 			throw SQLException();						\
73*b1cdbd2cSJim Jagielski 		}												\
74*b1cdbd2cSJim Jagielski 		aGuard.clear();									\
75*b1cdbd2cSJim Jagielski 		if( impl_isForwardOnly() )						\
76*b1cdbd2cSJim Jagielski 			applyPositionToOrigin( nRow );				\
77*b1cdbd2cSJim Jagielski 														\
78*b1cdbd2cSJim Jagielski 		impl_fetchData( nRow, nFetchSize, nFetchDirection ); \
79*b1cdbd2cSJim Jagielski 	}													\
80*b1cdbd2cSJim Jagielski 	aGuard.reacquire();									\
81*b1cdbd2cSJim Jagielski 	if( !m_aCache.hasRow( nRow ) )						\
82*b1cdbd2cSJim Jagielski 	{													\
83*b1cdbd2cSJim Jagielski 		m_bLastReadWasFromCache = sal_False;			\
84*b1cdbd2cSJim Jagielski 		aGuard.clear();									\
85*b1cdbd2cSJim Jagielski 		applyPositionToOrigin( nRow );					\
86*b1cdbd2cSJim Jagielski 		impl_init_xRowOrigin();							\
87*b1cdbd2cSJim Jagielski 		return m_xRowOrigin->getXXX( columnIndex );		\
88*b1cdbd2cSJim Jagielski 	}													\
89*b1cdbd2cSJim Jagielski }														\
90*b1cdbd2cSJim Jagielski const Any& rValue = m_aCache.getAny( nRow, columnIndex );\
91*b1cdbd2cSJim Jagielski Type aRet = Type();                                     \
92*b1cdbd2cSJim Jagielski m_bLastReadWasFromCache = sal_True;						\
93*b1cdbd2cSJim Jagielski m_bLastCachedReadWasNull = !( rValue >>= aRet );		\
94*b1cdbd2cSJim Jagielski /* Last chance. Try type converter service... */        \
95*b1cdbd2cSJim Jagielski if ( m_bLastCachedReadWasNull && rValue.hasValue() )    \
96*b1cdbd2cSJim Jagielski {                                                       \
97*b1cdbd2cSJim Jagielski     Reference< XTypeConverter > xConverter              \
98*b1cdbd2cSJim Jagielski                                 = getTypeConverter();   \
99*b1cdbd2cSJim Jagielski     if ( xConverter.is() )                              \
100*b1cdbd2cSJim Jagielski     {                                                   \
101*b1cdbd2cSJim Jagielski         try                                             \
102*b1cdbd2cSJim Jagielski         {                                               \
103*b1cdbd2cSJim Jagielski             Any aConvAny = xConverter->convertTo(       \
104*b1cdbd2cSJim Jagielski                 rValue,                                 \
105*b1cdbd2cSJim Jagielski                 getCppuType( static_cast<               \
106*b1cdbd2cSJim Jagielski                     const Type * >( 0 ) ) );            \
107*b1cdbd2cSJim Jagielski             m_bLastCachedReadWasNull = !( aConvAny >>= aRet ); \
108*b1cdbd2cSJim Jagielski         }                                               \
109*b1cdbd2cSJim Jagielski         catch ( IllegalArgumentException )              \
110*b1cdbd2cSJim Jagielski         {                                               \
111*b1cdbd2cSJim Jagielski         }                                               \
112*b1cdbd2cSJim Jagielski         catch ( CannotConvertException )                \
113*b1cdbd2cSJim Jagielski         {                                               \
114*b1cdbd2cSJim Jagielski         }                                               \
115*b1cdbd2cSJim Jagielski     }                                                   \
116*b1cdbd2cSJim Jagielski }                                                       \
117*b1cdbd2cSJim Jagielski return aRet;
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
120*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
121*b1cdbd2cSJim Jagielski // CCRS_Cache methoeds.
122*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
123*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
124*b1cdbd2cSJim Jagielski 
CCRS_Cache(const Reference<XContentIdentifierMapping> & xMapping)125*b1cdbd2cSJim Jagielski CachedContentResultSet::CCRS_Cache::CCRS_Cache(
126*b1cdbd2cSJim Jagielski 	const Reference< XContentIdentifierMapping > & xMapping )
127*b1cdbd2cSJim Jagielski 	: m_pResult( NULL )
128*b1cdbd2cSJim Jagielski 	, m_xContentIdentifierMapping( xMapping )
129*b1cdbd2cSJim Jagielski 	, m_pMappedReminder( NULL )
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
~CCRS_Cache()133*b1cdbd2cSJim Jagielski CachedContentResultSet::CCRS_Cache::~CCRS_Cache()
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski 	delete m_pResult;
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet::CCRS_Cache
clear()139*b1cdbd2cSJim Jagielski 	::clear()
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski 	if( m_pResult )
142*b1cdbd2cSJim Jagielski 	{
143*b1cdbd2cSJim Jagielski 		delete m_pResult;
144*b1cdbd2cSJim Jagielski 		m_pResult = NULL;
145*b1cdbd2cSJim Jagielski 	}
146*b1cdbd2cSJim Jagielski 	clearMappedReminder();
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet::CCRS_Cache
loadData(const FetchResult & rResult)150*b1cdbd2cSJim Jagielski 	::loadData( const FetchResult& rResult )
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski 	clear();
153*b1cdbd2cSJim Jagielski 	m_pResult = new FetchResult( rResult );
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
hasRow(sal_Int32 row)157*b1cdbd2cSJim Jagielski 	::hasRow( sal_Int32 row )
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski 	if( !m_pResult )
160*b1cdbd2cSJim Jagielski 		return sal_False;
161*b1cdbd2cSJim Jagielski 	long nStart = m_pResult->StartIndex;
162*b1cdbd2cSJim Jagielski 	long nEnd = nStart;
163*b1cdbd2cSJim Jagielski 	if( m_pResult->Orientation )
164*b1cdbd2cSJim Jagielski 		nEnd += m_pResult->Rows.getLength() - 1;
165*b1cdbd2cSJim Jagielski 	else
166*b1cdbd2cSJim Jagielski 		nStart -= m_pResult->Rows.getLength() + 1;
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 	return nStart <= row && row <= nEnd;
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL CachedContentResultSet::CCRS_Cache
getMaxRow()172*b1cdbd2cSJim Jagielski 	::getMaxRow()
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski 	if( !m_pResult )
175*b1cdbd2cSJim Jagielski 		return 0;
176*b1cdbd2cSJim Jagielski 	long nEnd = m_pResult->StartIndex;
177*b1cdbd2cSJim Jagielski 	if( m_pResult->Orientation )
178*b1cdbd2cSJim Jagielski 		return nEnd += m_pResult->Rows.getLength() - 1;
179*b1cdbd2cSJim Jagielski 	else
180*b1cdbd2cSJim Jagielski 		return nEnd;
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
hasKnownLast()184*b1cdbd2cSJim Jagielski 	::hasKnownLast()
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	if( !m_pResult )
187*b1cdbd2cSJim Jagielski 		return sal_False;
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	if( ( m_pResult->FetchError & FetchError::ENDOFDATA )
190*b1cdbd2cSJim Jagielski 		&& m_pResult->Orientation
191*b1cdbd2cSJim Jagielski 		&& m_pResult->Rows.getLength() )
192*b1cdbd2cSJim Jagielski 		return sal_True;
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 	return sal_False;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
hasCausedException(sal_Int32 nRow)198*b1cdbd2cSJim Jagielski 	::hasCausedException( sal_Int32 nRow )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski 	if( !m_pResult )
201*b1cdbd2cSJim Jagielski 		return sal_False;
202*b1cdbd2cSJim Jagielski 	if( !( m_pResult->FetchError & FetchError::EXCEPTION ) )
203*b1cdbd2cSJim Jagielski 		return sal_False;
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	long nEnd = m_pResult->StartIndex;
206*b1cdbd2cSJim Jagielski 	if( m_pResult->Orientation )
207*b1cdbd2cSJim Jagielski 		nEnd += m_pResult->Rows.getLength();
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 	return nRow == nEnd+1;
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski Any& SAL_CALL CachedContentResultSet::CCRS_Cache
getRowAny(sal_Int32 nRow)213*b1cdbd2cSJim Jagielski 	::getRowAny( sal_Int32 nRow )
214*b1cdbd2cSJim Jagielski 	throw( SQLException,
215*b1cdbd2cSJim Jagielski 	RuntimeException )
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski 	if( !nRow )
218*b1cdbd2cSJim Jagielski 		throw SQLException();
219*b1cdbd2cSJim Jagielski 	if( !m_pResult )
220*b1cdbd2cSJim Jagielski 		throw SQLException();
221*b1cdbd2cSJim Jagielski 	if( !hasRow( nRow ) )
222*b1cdbd2cSJim Jagielski 		throw SQLException();
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	long nDiff = nRow - m_pResult->StartIndex;
225*b1cdbd2cSJim Jagielski 	if( nDiff < 0 )
226*b1cdbd2cSJim Jagielski 		nDiff *= -1;
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	return (m_pResult->Rows)[nDiff];
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet::CCRS_Cache
remindMapped(sal_Int32 nRow)232*b1cdbd2cSJim Jagielski 	::remindMapped( sal_Int32 nRow )
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	//remind that this row was mapped
235*b1cdbd2cSJim Jagielski 	if( !m_pResult )
236*b1cdbd2cSJim Jagielski 		return;
237*b1cdbd2cSJim Jagielski 	long nDiff = nRow - m_pResult->StartIndex;
238*b1cdbd2cSJim Jagielski 	if( nDiff < 0 )
239*b1cdbd2cSJim Jagielski 		nDiff *= -1;
240*b1cdbd2cSJim Jagielski 	Sequence< sal_Bool >* pMappedReminder = getMappedReminder();
241*b1cdbd2cSJim Jagielski 	if( nDiff < pMappedReminder->getLength() )
242*b1cdbd2cSJim Jagielski 		(*pMappedReminder)[nDiff] = sal_True;
243*b1cdbd2cSJim Jagielski }
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
isRowMapped(sal_Int32 nRow)246*b1cdbd2cSJim Jagielski 	::isRowMapped( sal_Int32 nRow )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski 	if( !m_pMappedReminder || !m_pResult )
249*b1cdbd2cSJim Jagielski 		return sal_False;
250*b1cdbd2cSJim Jagielski 	long nDiff = nRow - m_pResult->StartIndex;
251*b1cdbd2cSJim Jagielski 	if( nDiff < 0 )
252*b1cdbd2cSJim Jagielski 		nDiff *= -1;
253*b1cdbd2cSJim Jagielski 	if( nDiff < m_pMappedReminder->getLength() )
254*b1cdbd2cSJim Jagielski 		return (*m_pMappedReminder)[nDiff];
255*b1cdbd2cSJim Jagielski 	return sal_False;
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet::CCRS_Cache
clearMappedReminder()259*b1cdbd2cSJim Jagielski 	::clearMappedReminder()
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski 	delete m_pMappedReminder;
262*b1cdbd2cSJim Jagielski 	m_pMappedReminder = NULL;
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski Sequence< sal_Bool >* SAL_CALL CachedContentResultSet::CCRS_Cache
getMappedReminder()266*b1cdbd2cSJim Jagielski 	::getMappedReminder()
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski 	if( !m_pMappedReminder )
269*b1cdbd2cSJim Jagielski 	{
270*b1cdbd2cSJim Jagielski 		sal_Int32 nCount = m_pResult->Rows.getLength();
271*b1cdbd2cSJim Jagielski 		m_pMappedReminder = new Sequence< sal_Bool >( nCount );
272*b1cdbd2cSJim Jagielski 		for( ;nCount; nCount-- )
273*b1cdbd2cSJim Jagielski 			(*m_pMappedReminder)[nCount] = sal_False;
274*b1cdbd2cSJim Jagielski 	}
275*b1cdbd2cSJim Jagielski 	return m_pMappedReminder;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski const Any& SAL_CALL CachedContentResultSet::CCRS_Cache
getAny(sal_Int32 nRow,sal_Int32 nColumnIndex)279*b1cdbd2cSJim Jagielski 	::getAny( sal_Int32 nRow, sal_Int32 nColumnIndex )
280*b1cdbd2cSJim Jagielski 	throw( SQLException,
281*b1cdbd2cSJim Jagielski 	RuntimeException )
282*b1cdbd2cSJim Jagielski {
283*b1cdbd2cSJim Jagielski 	if( !nColumnIndex )
284*b1cdbd2cSJim Jagielski 		throw SQLException();
285*b1cdbd2cSJim Jagielski 	if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
286*b1cdbd2cSJim Jagielski 	{
287*b1cdbd2cSJim Jagielski 		Any& rRow = getRowAny( nRow );
288*b1cdbd2cSJim Jagielski 		Sequence< Any > aValue;
289*b1cdbd2cSJim Jagielski 		rRow >>= aValue;
290*b1cdbd2cSJim Jagielski 		if( m_xContentIdentifierMapping->mapRow( aValue ) )
291*b1cdbd2cSJim Jagielski 		{
292*b1cdbd2cSJim Jagielski 			rRow <<= aValue;
293*b1cdbd2cSJim Jagielski 			remindMapped( nRow );
294*b1cdbd2cSJim Jagielski 		}
295*b1cdbd2cSJim Jagielski 		else
296*b1cdbd2cSJim Jagielski 			m_xContentIdentifierMapping.clear();
297*b1cdbd2cSJim Jagielski 	}
298*b1cdbd2cSJim Jagielski 	const Sequence< Any >& rRow =
299*b1cdbd2cSJim Jagielski 		(* reinterpret_cast< const Sequence< Any > * >
300*b1cdbd2cSJim Jagielski 		(getRowAny( nRow ).getValue() ));
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 	if( nColumnIndex > rRow.getLength() )
303*b1cdbd2cSJim Jagielski 		throw SQLException();
304*b1cdbd2cSJim Jagielski 	return rRow[nColumnIndex-1];
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski const rtl::OUString& SAL_CALL CachedContentResultSet::CCRS_Cache
getContentIdentifierString(sal_Int32 nRow)308*b1cdbd2cSJim Jagielski 	::getContentIdentifierString( sal_Int32 nRow )
309*b1cdbd2cSJim Jagielski 	throw( com::sun::star::uno::RuntimeException )
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski 	try
312*b1cdbd2cSJim Jagielski 	{
313*b1cdbd2cSJim Jagielski 		if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
314*b1cdbd2cSJim Jagielski 		{
315*b1cdbd2cSJim Jagielski 			Any& rRow = getRowAny( nRow );
316*b1cdbd2cSJim Jagielski 			rtl::OUString aValue;
317*b1cdbd2cSJim Jagielski 			rRow >>= aValue;
318*b1cdbd2cSJim Jagielski 			rRow <<= m_xContentIdentifierMapping->mapContentIdentifierString( aValue );
319*b1cdbd2cSJim Jagielski 			remindMapped( nRow );
320*b1cdbd2cSJim Jagielski 		}
321*b1cdbd2cSJim Jagielski 		return (* reinterpret_cast< const rtl::OUString * >
322*b1cdbd2cSJim Jagielski 				(getRowAny( nRow ).getValue() ));
323*b1cdbd2cSJim Jagielski 	}
324*b1cdbd2cSJim Jagielski 	catch( SQLException )
325*b1cdbd2cSJim Jagielski 	{
326*b1cdbd2cSJim Jagielski 		throw RuntimeException();
327*b1cdbd2cSJim Jagielski 	}
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski const Reference< XContentIdentifier >& SAL_CALL CachedContentResultSet::CCRS_Cache
getContentIdentifier(sal_Int32 nRow)331*b1cdbd2cSJim Jagielski 	::getContentIdentifier( sal_Int32 nRow )
332*b1cdbd2cSJim Jagielski 	throw( com::sun::star::uno::RuntimeException )
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski 	try
335*b1cdbd2cSJim Jagielski 	{
336*b1cdbd2cSJim Jagielski 		if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
337*b1cdbd2cSJim Jagielski 		{
338*b1cdbd2cSJim Jagielski 			Any& rRow = getRowAny( nRow );
339*b1cdbd2cSJim Jagielski 			Reference< XContentIdentifier > aValue;
340*b1cdbd2cSJim Jagielski 			rRow >>= aValue;
341*b1cdbd2cSJim Jagielski 			rRow <<= m_xContentIdentifierMapping->mapContentIdentifier( aValue );
342*b1cdbd2cSJim Jagielski 			remindMapped( nRow );
343*b1cdbd2cSJim Jagielski 		}
344*b1cdbd2cSJim Jagielski 		return (* reinterpret_cast< const Reference< XContentIdentifier > * >
345*b1cdbd2cSJim Jagielski 				(getRowAny( nRow ).getValue() ));
346*b1cdbd2cSJim Jagielski 	}
347*b1cdbd2cSJim Jagielski 	catch( SQLException )
348*b1cdbd2cSJim Jagielski 	{
349*b1cdbd2cSJim Jagielski 		throw RuntimeException();
350*b1cdbd2cSJim Jagielski 	}
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski const Reference< XContent >& SAL_CALL CachedContentResultSet::CCRS_Cache
getContent(sal_Int32 nRow)354*b1cdbd2cSJim Jagielski 	::getContent( sal_Int32 nRow )
355*b1cdbd2cSJim Jagielski 	throw( com::sun::star::uno::RuntimeException )
356*b1cdbd2cSJim Jagielski {
357*b1cdbd2cSJim Jagielski 	try
358*b1cdbd2cSJim Jagielski 	{
359*b1cdbd2cSJim Jagielski 		if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
360*b1cdbd2cSJim Jagielski 		{
361*b1cdbd2cSJim Jagielski 			Any& rRow = getRowAny( nRow );
362*b1cdbd2cSJim Jagielski 			Reference< XContent > aValue;
363*b1cdbd2cSJim Jagielski 			rRow >>= aValue;
364*b1cdbd2cSJim Jagielski 			rRow <<= m_xContentIdentifierMapping->mapContent( aValue );
365*b1cdbd2cSJim Jagielski 			remindMapped( nRow );
366*b1cdbd2cSJim Jagielski 		}
367*b1cdbd2cSJim Jagielski 		return (* reinterpret_cast< const Reference< XContent > * >
368*b1cdbd2cSJim Jagielski 				(getRowAny( nRow ).getValue() ));
369*b1cdbd2cSJim Jagielski 	}
370*b1cdbd2cSJim Jagielski 	catch( SQLException )
371*b1cdbd2cSJim Jagielski 	{
372*b1cdbd2cSJim Jagielski 		throw RuntimeException();
373*b1cdbd2cSJim Jagielski 	}
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
377*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
378*b1cdbd2cSJim Jagielski // class CCRS_PropertySetInfo
379*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
380*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski class CCRS_PropertySetInfo :
383*b1cdbd2cSJim Jagielski 				public cppu::OWeakObject,
384*b1cdbd2cSJim Jagielski 				public com::sun::star::lang::XTypeProvider,
385*b1cdbd2cSJim Jagielski 				public com::sun::star::beans::XPropertySetInfo
386*b1cdbd2cSJim Jagielski {
387*b1cdbd2cSJim Jagielski     friend class CachedContentResultSet;
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 	//my Properties
390*b1cdbd2cSJim Jagielski 	Sequence< com::sun::star::beans::Property >*
391*b1cdbd2cSJim Jagielski 							m_pProperties;
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 	//some helping variables ( names for my special properties )
394*b1cdbd2cSJim Jagielski 	static rtl::OUString	m_aPropertyNameForCount;
395*b1cdbd2cSJim Jagielski 	static rtl::OUString	m_aPropertyNameForFinalCount;
396*b1cdbd2cSJim Jagielski 	static rtl::OUString	m_aPropertyNameForFetchSize;
397*b1cdbd2cSJim Jagielski 	static rtl::OUString	m_aPropertyNameForFetchDirection;
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 	long					m_nFetchSizePropertyHandle;
400*b1cdbd2cSJim Jagielski 	long					m_nFetchDirectionPropertyHandle;
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski private:
403*b1cdbd2cSJim Jagielski 	sal_Int32 SAL_CALL
404*b1cdbd2cSJim Jagielski 	impl_getRemainedHandle() const;
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski     sal_Bool SAL_CALL
407*b1cdbd2cSJim Jagielski 	impl_queryProperty(
408*b1cdbd2cSJim Jagielski 			const rtl::OUString& rName
409*b1cdbd2cSJim Jagielski 			, com::sun::star::beans::Property& rProp ) const;
410*b1cdbd2cSJim Jagielski 	sal_Int32 SAL_CALL
411*b1cdbd2cSJim Jagielski 	impl_getPos( const rtl::OUString& rName ) const;
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	static sal_Bool SAL_CALL
414*b1cdbd2cSJim Jagielski 	impl_isMyPropertyName( const rtl::OUString& rName );
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski public:
417*b1cdbd2cSJim Jagielski 	CCRS_PropertySetInfo(	Reference<
418*b1cdbd2cSJim Jagielski 			XPropertySetInfo > xPropertySetInfoOrigin );
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 	virtual ~CCRS_PropertySetInfo();
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski 	// XInterface
423*b1cdbd2cSJim Jagielski 	XINTERFACE_DECL()
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 	// XTypeProvider
426*b1cdbd2cSJim Jagielski 	XTYPEPROVIDER_DECL()
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 	// XPropertySetInfo
429*b1cdbd2cSJim Jagielski     virtual Sequence< com::sun::star::beans::Property > SAL_CALL
430*b1cdbd2cSJim Jagielski 	getProperties()
431*b1cdbd2cSJim Jagielski 		throw( RuntimeException );
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski     virtual com::sun::star::beans::Property SAL_CALL
434*b1cdbd2cSJim Jagielski 	getPropertyByName( const rtl::OUString& aName )
435*b1cdbd2cSJim Jagielski 		throw( com::sun::star::beans::UnknownPropertyException, RuntimeException );
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL
438*b1cdbd2cSJim Jagielski 	hasPropertyByName( const rtl::OUString& Name )
439*b1cdbd2cSJim Jagielski 		throw( RuntimeException );
440*b1cdbd2cSJim Jagielski };
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski OUString	CCRS_PropertySetInfo::m_aPropertyNameForCount( OUString::createFromAscii( "RowCount" ) );
443*b1cdbd2cSJim Jagielski OUString	CCRS_PropertySetInfo::m_aPropertyNameForFinalCount( OUString::createFromAscii( "IsRowCountFinal" ) );
444*b1cdbd2cSJim Jagielski OUString	CCRS_PropertySetInfo::m_aPropertyNameForFetchSize( OUString::createFromAscii( "FetchSize" ) );
445*b1cdbd2cSJim Jagielski OUString	CCRS_PropertySetInfo::m_aPropertyNameForFetchDirection( OUString::createFromAscii( "FetchDirection" ) );
446*b1cdbd2cSJim Jagielski 
CCRS_PropertySetInfo(Reference<XPropertySetInfo> xInfo)447*b1cdbd2cSJim Jagielski CCRS_PropertySetInfo::CCRS_PropertySetInfo(
448*b1cdbd2cSJim Jagielski 		Reference< XPropertySetInfo > xInfo )
449*b1cdbd2cSJim Jagielski 		: m_pProperties( NULL )
450*b1cdbd2cSJim Jagielski 		, m_nFetchSizePropertyHandle( -1 )
451*b1cdbd2cSJim Jagielski 		, m_nFetchDirectionPropertyHandle( -1 )
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski 	//initialize list of properties:
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 	// it is required, that the received xInfo contains the two
456*b1cdbd2cSJim Jagielski 	// properties with names 'm_aPropertyNameForCount' and
457*b1cdbd2cSJim Jagielski 	// 'm_aPropertyNameForFinalCount'
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	if( xInfo.is() )
460*b1cdbd2cSJim Jagielski 	{
461*b1cdbd2cSJim Jagielski 		Sequence<Property> aProps = xInfo->getProperties();
462*b1cdbd2cSJim Jagielski 		m_pProperties = new Sequence<Property> ( aProps );
463*b1cdbd2cSJim Jagielski 	}
464*b1cdbd2cSJim Jagielski 	else
465*b1cdbd2cSJim Jagielski 	{
466*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "The received XPropertySetInfo doesn't contain required properties" );
467*b1cdbd2cSJim Jagielski 		m_pProperties = new Sequence<Property>;
468*b1cdbd2cSJim Jagielski 	}
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski 	//ensure, that we haven't got the Properties 'FetchSize' and 'Direction' twice:
471*b1cdbd2cSJim Jagielski 	sal_Int32 nFetchSize = impl_getPos( m_aPropertyNameForFetchSize );
472*b1cdbd2cSJim Jagielski 	sal_Int32 nFetchDirection = impl_getPos( m_aPropertyNameForFetchDirection );
473*b1cdbd2cSJim Jagielski 	sal_Int32 nDeleted = 0;
474*b1cdbd2cSJim Jagielski 	if( nFetchSize != -1 )
475*b1cdbd2cSJim Jagielski 		nDeleted++;
476*b1cdbd2cSJim Jagielski 	if( nFetchDirection != -1 )
477*b1cdbd2cSJim Jagielski 		nDeleted++;
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 	Sequence< Property >* pOrigProps = new Sequence<Property> ( *m_pProperties );
480*b1cdbd2cSJim Jagielski 	sal_Int32 nOrigProps = pOrigProps->getLength();
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	m_pProperties->realloc( nOrigProps + 2 - nDeleted );//note that nDeleted is <= 2
483*b1cdbd2cSJim Jagielski 	for( sal_Int32 n = 0, m = 0; n < nOrigProps; n++, m++ )
484*b1cdbd2cSJim Jagielski 	{
485*b1cdbd2cSJim Jagielski 		if( n == nFetchSize || n == nFetchDirection )
486*b1cdbd2cSJim Jagielski 			m--;
487*b1cdbd2cSJim Jagielski 		else
488*b1cdbd2cSJim Jagielski 			(*m_pProperties)[ m ] = (*pOrigProps)[ n ];
489*b1cdbd2cSJim Jagielski 	}
490*b1cdbd2cSJim Jagielski 	{
491*b1cdbd2cSJim Jagielski 		Property& rMyProp = (*m_pProperties)[ nOrigProps - nDeleted ];
492*b1cdbd2cSJim Jagielski 		rMyProp.Name = m_aPropertyNameForFetchSize;
493*b1cdbd2cSJim Jagielski 		rMyProp.Type = getCppuType( static_cast< const sal_Int32 * >( 0 ) );
494*b1cdbd2cSJim Jagielski 		rMyProp.Attributes = PropertyAttribute::BOUND | PropertyAttribute::MAYBEDEFAULT;
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 		if( nFetchSize != -1 )
497*b1cdbd2cSJim Jagielski 			m_nFetchSizePropertyHandle = (*pOrigProps)[nFetchSize].Handle;
498*b1cdbd2cSJim Jagielski 		else
499*b1cdbd2cSJim Jagielski 			m_nFetchSizePropertyHandle = impl_getRemainedHandle();
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 		rMyProp.Handle = m_nFetchSizePropertyHandle;
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 	}
504*b1cdbd2cSJim Jagielski 	{
505*b1cdbd2cSJim Jagielski 		Property& rMyProp = (*m_pProperties)[ nOrigProps - nDeleted + 1 ];
506*b1cdbd2cSJim Jagielski 		rMyProp.Name = m_aPropertyNameForFetchDirection;
507*b1cdbd2cSJim Jagielski 		rMyProp.Type = getCppuType( static_cast< const sal_Bool * >( 0 ) );
508*b1cdbd2cSJim Jagielski 		rMyProp.Attributes = PropertyAttribute::BOUND | PropertyAttribute::MAYBEDEFAULT;
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski 		if( nFetchSize != -1 )
511*b1cdbd2cSJim Jagielski 			m_nFetchDirectionPropertyHandle = (*pOrigProps)[nFetchDirection].Handle;
512*b1cdbd2cSJim Jagielski 		else
513*b1cdbd2cSJim Jagielski 			m_nFetchDirectionPropertyHandle = impl_getRemainedHandle();
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 		m_nFetchDirectionPropertyHandle = rMyProp.Handle;
516*b1cdbd2cSJim Jagielski 	}
517*b1cdbd2cSJim Jagielski 	delete pOrigProps;
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski 
~CCRS_PropertySetInfo()520*b1cdbd2cSJim Jagielski CCRS_PropertySetInfo::~CCRS_PropertySetInfo()
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	delete m_pProperties;
523*b1cdbd2cSJim Jagielski }
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
526*b1cdbd2cSJim Jagielski // XInterface methods.
527*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
528*b1cdbd2cSJim Jagielski //list all interfaces inclusive baseclasses of interfaces
529*b1cdbd2cSJim Jagielski XINTERFACE_IMPL_2( CCRS_PropertySetInfo
530*b1cdbd2cSJim Jagielski 				  , XTypeProvider
531*b1cdbd2cSJim Jagielski 				  , XPropertySetInfo
532*b1cdbd2cSJim Jagielski 				  );
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
535*b1cdbd2cSJim Jagielski // XTypeProvider methods.
536*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
537*b1cdbd2cSJim Jagielski //list all interfaces exclusive baseclasses
538*b1cdbd2cSJim Jagielski XTYPEPROVIDER_IMPL_2( CCRS_PropertySetInfo
539*b1cdbd2cSJim Jagielski 					, XTypeProvider
540*b1cdbd2cSJim Jagielski 					, XPropertySetInfo
541*b1cdbd2cSJim Jagielski 					);
542*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
543*b1cdbd2cSJim Jagielski // XPropertySetInfo methods.
544*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
545*b1cdbd2cSJim Jagielski //virtual
546*b1cdbd2cSJim Jagielski Sequence< Property > SAL_CALL CCRS_PropertySetInfo
getProperties()547*b1cdbd2cSJim Jagielski 	::getProperties() throw( RuntimeException )
548*b1cdbd2cSJim Jagielski {
549*b1cdbd2cSJim Jagielski 	return *m_pProperties;
550*b1cdbd2cSJim Jagielski }
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski //virtual
553*b1cdbd2cSJim Jagielski Property SAL_CALL CCRS_PropertySetInfo
getPropertyByName(const rtl::OUString & aName)554*b1cdbd2cSJim Jagielski 	::getPropertyByName( const rtl::OUString& aName )
555*b1cdbd2cSJim Jagielski 		throw( UnknownPropertyException, RuntimeException )
556*b1cdbd2cSJim Jagielski {
557*b1cdbd2cSJim Jagielski 	if ( !aName.getLength() )
558*b1cdbd2cSJim Jagielski 		throw UnknownPropertyException();
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 	Property aProp;
561*b1cdbd2cSJim Jagielski 	if ( impl_queryProperty( aName, aProp ) )
562*b1cdbd2cSJim Jagielski 		return aProp;
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 	throw UnknownPropertyException();
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski //virtual
568*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CCRS_PropertySetInfo
hasPropertyByName(const rtl::OUString & Name)569*b1cdbd2cSJim Jagielski 	::hasPropertyByName( const rtl::OUString& Name )
570*b1cdbd2cSJim Jagielski 		throw( RuntimeException )
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski 	return ( impl_getPos( Name ) != -1 );
573*b1cdbd2cSJim Jagielski }
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
576*b1cdbd2cSJim Jagielski // impl_ methods.
577*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL CCRS_PropertySetInfo
impl_getPos(const OUString & rName) const580*b1cdbd2cSJim Jagielski 			::impl_getPos( const OUString& rName ) const
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski 	for( sal_Int32 nN = m_pProperties->getLength(); nN--; )
583*b1cdbd2cSJim Jagielski 	{
584*b1cdbd2cSJim Jagielski 		const Property& rMyProp = (*m_pProperties)[nN];
585*b1cdbd2cSJim Jagielski 		if( rMyProp.Name == rName )
586*b1cdbd2cSJim Jagielski 			return nN;
587*b1cdbd2cSJim Jagielski 	}
588*b1cdbd2cSJim Jagielski 	return -1;
589*b1cdbd2cSJim Jagielski }
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CCRS_PropertySetInfo
impl_queryProperty(const OUString & rName,Property & rProp) const592*b1cdbd2cSJim Jagielski 		::impl_queryProperty( const OUString& rName, Property& rProp ) const
593*b1cdbd2cSJim Jagielski {
594*b1cdbd2cSJim Jagielski 	for( sal_Int32 nN = m_pProperties->getLength(); nN--; )
595*b1cdbd2cSJim Jagielski 	{
596*b1cdbd2cSJim Jagielski 		const Property& rMyProp = (*m_pProperties)[nN];
597*b1cdbd2cSJim Jagielski 		if( rMyProp.Name == rName )
598*b1cdbd2cSJim Jagielski 		{
599*b1cdbd2cSJim Jagielski 			rProp.Name = rMyProp.Name;
600*b1cdbd2cSJim Jagielski 			rProp.Handle = rMyProp.Handle;
601*b1cdbd2cSJim Jagielski 			rProp.Type = rMyProp.Type;
602*b1cdbd2cSJim Jagielski 			rProp.Attributes = rMyProp.Attributes;
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski 			return sal_True;
605*b1cdbd2cSJim Jagielski 		}
606*b1cdbd2cSJim Jagielski 	}
607*b1cdbd2cSJim Jagielski 	return sal_False;
608*b1cdbd2cSJim Jagielski }
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski //static
611*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CCRS_PropertySetInfo
impl_isMyPropertyName(const OUString & rPropertyName)612*b1cdbd2cSJim Jagielski 		::impl_isMyPropertyName( const OUString& rPropertyName )
613*b1cdbd2cSJim Jagielski {
614*b1cdbd2cSJim Jagielski 	return ( rPropertyName == m_aPropertyNameForCount
615*b1cdbd2cSJim Jagielski 	|| rPropertyName == m_aPropertyNameForFinalCount
616*b1cdbd2cSJim Jagielski 	|| rPropertyName == m_aPropertyNameForFetchSize
617*b1cdbd2cSJim Jagielski 	|| rPropertyName == m_aPropertyNameForFetchDirection );
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL CCRS_PropertySetInfo
impl_getRemainedHandle() const621*b1cdbd2cSJim Jagielski 			::impl_getRemainedHandle( ) const
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski 	sal_Int32 nHandle = 1;
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 	if( !m_pProperties )
626*b1cdbd2cSJim Jagielski 	{
627*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "Properties not initialized yet" );
628*b1cdbd2cSJim Jagielski 		return nHandle;
629*b1cdbd2cSJim Jagielski 	}
630*b1cdbd2cSJim Jagielski 	sal_Bool bFound = sal_True;
631*b1cdbd2cSJim Jagielski 	while( bFound )
632*b1cdbd2cSJim Jagielski 	{
633*b1cdbd2cSJim Jagielski 		bFound = sal_False;
634*b1cdbd2cSJim Jagielski 		for( sal_Int32 nN = m_pProperties->getLength(); nN--; )
635*b1cdbd2cSJim Jagielski 		{
636*b1cdbd2cSJim Jagielski 			if( nHandle == (*m_pProperties)[nN].Handle )
637*b1cdbd2cSJim Jagielski 			{
638*b1cdbd2cSJim Jagielski 				bFound = sal_True;
639*b1cdbd2cSJim Jagielski 				nHandle++;
640*b1cdbd2cSJim Jagielski 				break;
641*b1cdbd2cSJim Jagielski 			}
642*b1cdbd2cSJim Jagielski 		}
643*b1cdbd2cSJim Jagielski 	}
644*b1cdbd2cSJim Jagielski 	return nHandle;
645*b1cdbd2cSJim Jagielski }
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
648*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
649*b1cdbd2cSJim Jagielski // class CachedContentResultSet
650*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
651*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
652*b1cdbd2cSJim Jagielski 
CachedContentResultSet(const Reference<XMultiServiceFactory> & xSMgr,const Reference<XResultSet> & xOrigin,const Reference<XContentIdentifierMapping> & xContentIdentifierMapping)653*b1cdbd2cSJim Jagielski CachedContentResultSet::CachedContentResultSet(
654*b1cdbd2cSJim Jagielski                   const Reference< XMultiServiceFactory > & xSMgr
655*b1cdbd2cSJim Jagielski                 , const Reference< XResultSet > & xOrigin
656*b1cdbd2cSJim Jagielski                 , const Reference< XContentIdentifierMapping > &
657*b1cdbd2cSJim Jagielski 					xContentIdentifierMapping )
658*b1cdbd2cSJim Jagielski 				: ContentResultSetWrapper( xOrigin )
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski                 , m_xSMgr( xSMgr )
661*b1cdbd2cSJim Jagielski 				, m_xFetchProvider( NULL )
662*b1cdbd2cSJim Jagielski 				, m_xFetchProviderForContentAccess( NULL )
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski 				, m_xMyPropertySetInfo( NULL )
665*b1cdbd2cSJim Jagielski 				, m_pMyPropSetInfo( NULL )
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski 				, m_xContentIdentifierMapping( xContentIdentifierMapping )
668*b1cdbd2cSJim Jagielski 				, m_nRow( 0 ) // Position is one-based. Zero means: before first element.
669*b1cdbd2cSJim Jagielski 				, m_bAfterLast( sal_False )
670*b1cdbd2cSJim Jagielski 				, m_nLastAppliedPos( 0 )
671*b1cdbd2cSJim Jagielski 				, m_bAfterLastApplied( sal_False )
672*b1cdbd2cSJim Jagielski 				, m_nKnownCount( 0 )
673*b1cdbd2cSJim Jagielski 				, m_bFinalCount( sal_False )
674*b1cdbd2cSJim Jagielski 				, m_nFetchSize(
675*b1cdbd2cSJim Jagielski 					COMSUNSTARUCBCCRS_DEFAULT_FETCH_SIZE )
676*b1cdbd2cSJim Jagielski 				, m_nFetchDirection(
677*b1cdbd2cSJim Jagielski 					COMSUNSTARUCBCCRS_DEFAULT_FETCH_DIRECTION )
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 				, m_bLastReadWasFromCache( sal_False )
680*b1cdbd2cSJim Jagielski 				, m_bLastCachedReadWasNull( sal_True )
681*b1cdbd2cSJim Jagielski 				, m_aCache( m_xContentIdentifierMapping )
682*b1cdbd2cSJim Jagielski 				, m_aCacheContentIdentifierString( m_xContentIdentifierMapping )
683*b1cdbd2cSJim Jagielski 				, m_aCacheContentIdentifier( m_xContentIdentifierMapping )
684*b1cdbd2cSJim Jagielski 				, m_aCacheContent( m_xContentIdentifierMapping )
685*b1cdbd2cSJim Jagielski                 , m_bTriedToGetTypeConverter( sal_False )
686*b1cdbd2cSJim Jagielski                 , m_xTypeConverter( NULL )
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski 	m_xFetchProvider = Reference< XFetchProvider >( m_xResultSetOrigin, UNO_QUERY );
689*b1cdbd2cSJim Jagielski 	OSL_ENSURE( m_xFetchProvider.is(), "interface XFetchProvider is required" );
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski 	m_xFetchProviderForContentAccess = Reference< XFetchProviderForContentAccess >( m_xResultSetOrigin, UNO_QUERY );
692*b1cdbd2cSJim Jagielski 	OSL_ENSURE( m_xFetchProviderForContentAccess.is(), "interface XFetchProviderForContentAccess is required" );
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	impl_init();
695*b1cdbd2cSJim Jagielski };
696*b1cdbd2cSJim Jagielski 
~CachedContentResultSet()697*b1cdbd2cSJim Jagielski CachedContentResultSet::~CachedContentResultSet()
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski 	impl_deinit();
700*b1cdbd2cSJim Jagielski 	//do not delete m_pMyPropSetInfo, cause it is hold via reference
701*b1cdbd2cSJim Jagielski };
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
704*b1cdbd2cSJim Jagielski // impl_ methods.
705*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
applyPositionToOrigin(sal_Int32 nRow)708*b1cdbd2cSJim Jagielski 	::applyPositionToOrigin( sal_Int32 nRow )
709*b1cdbd2cSJim Jagielski 	throw( SQLException,
710*b1cdbd2cSJim Jagielski 		   RuntimeException )
711*b1cdbd2cSJim Jagielski {
712*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
713*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------
714*b1cdbd2cSJim Jagielski     /**
715*b1cdbd2cSJim Jagielski 	@returns
716*b1cdbd2cSJim Jagielski 		<TRUE/> if the cursor is on a valid row; <FALSE/> if it is off
717*b1cdbd2cSJim Jagielski 		the result set.
718*b1cdbd2cSJim Jagielski 	*/
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
721*b1cdbd2cSJim Jagielski 	OSL_ENSURE( nRow >= 0, "only positive values supported" );
722*b1cdbd2cSJim Jagielski 	if( !m_xResultSetOrigin.is() )
723*b1cdbd2cSJim Jagielski 	{
724*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
725*b1cdbd2cSJim Jagielski 		return sal_False;
726*b1cdbd2cSJim Jagielski 	}
727*b1cdbd2cSJim Jagielski //	OSL_ENSURE( nRow <= m_nKnownCount, "don't step into regions you don't know with this method" );
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski 	sal_Int32 nLastAppliedPos = m_nLastAppliedPos;
730*b1cdbd2cSJim Jagielski 	sal_Bool bAfterLastApplied = m_bAfterLastApplied;
731*b1cdbd2cSJim Jagielski 	sal_Bool bAfterLast = m_bAfterLast;
732*b1cdbd2cSJim Jagielski 	sal_Int32 nForwardOnly = m_nForwardOnly;
733*b1cdbd2cSJim Jagielski 
734*b1cdbd2cSJim Jagielski 	aGuard.clear();
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski 	if( bAfterLastApplied || nLastAppliedPos != nRow )
737*b1cdbd2cSJim Jagielski 	{
738*b1cdbd2cSJim Jagielski 		if( nForwardOnly == 1 )
739*b1cdbd2cSJim Jagielski 		{
740*b1cdbd2cSJim Jagielski 			if( bAfterLastApplied || bAfterLast || !nRow || nRow < nLastAppliedPos )
741*b1cdbd2cSJim Jagielski 				throw SQLException();
742*b1cdbd2cSJim Jagielski 
743*b1cdbd2cSJim Jagielski 			sal_Int32 nN = nRow - nLastAppliedPos;
744*b1cdbd2cSJim Jagielski 			sal_Int32 nM;
745*b1cdbd2cSJim Jagielski 			for( nM = 0; nN--; nM++ )
746*b1cdbd2cSJim Jagielski 			{
747*b1cdbd2cSJim Jagielski 				if( !m_xResultSetOrigin->next() )
748*b1cdbd2cSJim Jagielski 					break;
749*b1cdbd2cSJim Jagielski 			}
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 			aGuard.reacquire();
752*b1cdbd2cSJim Jagielski 			m_nLastAppliedPos += nM;
753*b1cdbd2cSJim Jagielski 			m_bAfterLastApplied = nRow != m_nLastAppliedPos;
754*b1cdbd2cSJim Jagielski 			return nRow == m_nLastAppliedPos;
755*b1cdbd2cSJim Jagielski 		}
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski 		if( !nRow ) //absolute( 0 ) will throw exception
758*b1cdbd2cSJim Jagielski 		{
759*b1cdbd2cSJim Jagielski 			m_xResultSetOrigin->beforeFirst();
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski 			aGuard.reacquire();
762*b1cdbd2cSJim Jagielski 			m_nLastAppliedPos = 0;
763*b1cdbd2cSJim Jagielski 			m_bAfterLastApplied = sal_False;
764*b1cdbd2cSJim Jagielski 			return sal_False;
765*b1cdbd2cSJim Jagielski 		}
766*b1cdbd2cSJim Jagielski 		try
767*b1cdbd2cSJim Jagielski 		{
768*b1cdbd2cSJim Jagielski 			//move absolute, if !nLastAppliedPos
769*b1cdbd2cSJim Jagielski 			//because move relative would throw exception
770*b1cdbd2cSJim Jagielski 			if( !nLastAppliedPos || bAfterLast || bAfterLastApplied )
771*b1cdbd2cSJim Jagielski 			{
772*b1cdbd2cSJim Jagielski 				sal_Bool bValid = m_xResultSetOrigin->absolute( nRow );
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski 				aGuard.reacquire();
775*b1cdbd2cSJim Jagielski 				m_nLastAppliedPos = nRow;
776*b1cdbd2cSJim Jagielski 				m_bAfterLastApplied = !bValid;
777*b1cdbd2cSJim Jagielski 				return bValid;
778*b1cdbd2cSJim Jagielski 			}
779*b1cdbd2cSJim Jagielski 			else
780*b1cdbd2cSJim Jagielski 			{
781*b1cdbd2cSJim Jagielski 				sal_Bool bValid = m_xResultSetOrigin->relative( nRow - nLastAppliedPos );
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 				aGuard.reacquire();
784*b1cdbd2cSJim Jagielski 				m_nLastAppliedPos += ( nRow - nLastAppliedPos );
785*b1cdbd2cSJim Jagielski 				m_bAfterLastApplied = !bValid;
786*b1cdbd2cSJim Jagielski 				return bValid;
787*b1cdbd2cSJim Jagielski 			}
788*b1cdbd2cSJim Jagielski 		}
789*b1cdbd2cSJim Jagielski 		catch( SQLException& rEx )
790*b1cdbd2cSJim Jagielski 		{
791*b1cdbd2cSJim Jagielski 			if( !bAfterLastApplied && !bAfterLast && nRow > nLastAppliedPos && impl_isForwardOnly() )
792*b1cdbd2cSJim Jagielski 			{
793*b1cdbd2cSJim Jagielski 				sal_Int32 nN = nRow - nLastAppliedPos;
794*b1cdbd2cSJim Jagielski 				sal_Int32 nM;
795*b1cdbd2cSJim Jagielski 				for( nM = 0; nN--; nM++ )
796*b1cdbd2cSJim Jagielski 				{
797*b1cdbd2cSJim Jagielski 					if( !m_xResultSetOrigin->next() )
798*b1cdbd2cSJim Jagielski 						break;
799*b1cdbd2cSJim Jagielski 				}
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski 				aGuard.reacquire();
802*b1cdbd2cSJim Jagielski 				m_nLastAppliedPos += nM;
803*b1cdbd2cSJim Jagielski 				m_bAfterLastApplied = nRow != m_nLastAppliedPos;
804*b1cdbd2cSJim Jagielski 			}
805*b1cdbd2cSJim Jagielski 			else
806*b1cdbd2cSJim Jagielski 				throw rEx;
807*b1cdbd2cSJim Jagielski 		}
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski 		return nRow == m_nLastAppliedPos;
810*b1cdbd2cSJim Jagielski 	}
811*b1cdbd2cSJim Jagielski     return sal_True;
812*b1cdbd2cSJim Jagielski };
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
815*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
816*b1cdbd2cSJim Jagielski //define for fetching data
817*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
818*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski #define FETCH_XXX( aCache, fetchInterface, fetchMethod )			\
821*b1cdbd2cSJim Jagielski sal_Bool bDirection = !!(											\
822*b1cdbd2cSJim Jagielski 	nFetchDirection != FetchDirection::REVERSE );					\
823*b1cdbd2cSJim Jagielski FetchResult aResult =												\
824*b1cdbd2cSJim Jagielski 	fetchInterface->fetchMethod( nRow, nFetchSize, bDirection );	\
825*b1cdbd2cSJim Jagielski osl::ClearableGuard< osl::Mutex > aGuard2( m_aMutex );				\
826*b1cdbd2cSJim Jagielski aCache.loadData( aResult );											\
827*b1cdbd2cSJim Jagielski sal_Int32 nMax = aCache.getMaxRow();								\
828*b1cdbd2cSJim Jagielski sal_Int32 nCurCount = m_nKnownCount;								\
829*b1cdbd2cSJim Jagielski sal_Bool bIsFinalCount = aCache.hasKnownLast();						\
830*b1cdbd2cSJim Jagielski sal_Bool bCurIsFinalCount = m_bFinalCount;							\
831*b1cdbd2cSJim Jagielski aGuard2.clear();													\
832*b1cdbd2cSJim Jagielski if( nMax > nCurCount )												\
833*b1cdbd2cSJim Jagielski 	impl_changeRowCount( nCurCount, nMax );							\
834*b1cdbd2cSJim Jagielski if( bIsFinalCount && !bCurIsFinalCount )							\
835*b1cdbd2cSJim Jagielski 	impl_changeIsRowCountFinal( bCurIsFinalCount, bIsFinalCount );
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_fetchData(sal_Int32 nRow,sal_Int32 nFetchSize,sal_Int32 nFetchDirection)838*b1cdbd2cSJim Jagielski 	::impl_fetchData( sal_Int32 nRow
839*b1cdbd2cSJim Jagielski 		, sal_Int32 nFetchSize, sal_Int32 nFetchDirection )
840*b1cdbd2cSJim Jagielski 		throw( com::sun::star::uno::RuntimeException )
841*b1cdbd2cSJim Jagielski {
842*b1cdbd2cSJim Jagielski 	FETCH_XXX( m_aCache, m_xFetchProvider, fetch );
843*b1cdbd2cSJim Jagielski }
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_changeRowCount(sal_Int32 nOld,sal_Int32 nNew)846*b1cdbd2cSJim Jagielski 	::impl_changeRowCount( sal_Int32 nOld, sal_Int32 nNew )
847*b1cdbd2cSJim Jagielski {
848*b1cdbd2cSJim Jagielski 	OSL_ENSURE( nNew > nOld, "RowCount only can grow" );
849*b1cdbd2cSJim Jagielski 	if( nNew <= nOld )
850*b1cdbd2cSJim Jagielski 		return;
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski 	//create PropertyChangeEvent and set value
853*b1cdbd2cSJim Jagielski 	PropertyChangeEvent aEvt;
854*b1cdbd2cSJim Jagielski 	{
855*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
856*b1cdbd2cSJim Jagielski 		aEvt.Source =  static_cast< XPropertySet * >( this );
857*b1cdbd2cSJim Jagielski 		aEvt.Further = sal_False;
858*b1cdbd2cSJim Jagielski 		aEvt.OldValue <<= nOld;
859*b1cdbd2cSJim Jagielski 		aEvt.NewValue <<= nNew;
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski 		m_nKnownCount = nNew;
862*b1cdbd2cSJim Jagielski 	}
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski 	//send PropertyChangeEvent to listeners
865*b1cdbd2cSJim Jagielski 	impl_notifyPropertyChangeListeners( aEvt );
866*b1cdbd2cSJim Jagielski }
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_changeIsRowCountFinal(sal_Bool bOld,sal_Bool bNew)869*b1cdbd2cSJim Jagielski 	::impl_changeIsRowCountFinal( sal_Bool bOld, sal_Bool bNew )
870*b1cdbd2cSJim Jagielski {
871*b1cdbd2cSJim Jagielski 	OSL_ENSURE( !bOld && bNew, "This change is not allowed for IsRowCountFinal" );
872*b1cdbd2cSJim Jagielski 	if( ! (!bOld && bNew ) )
873*b1cdbd2cSJim Jagielski 		return;
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski 	//create PropertyChangeEvent and set value
876*b1cdbd2cSJim Jagielski 	PropertyChangeEvent aEvt;
877*b1cdbd2cSJim Jagielski 	{
878*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
879*b1cdbd2cSJim Jagielski 		aEvt.Source =  static_cast< XPropertySet * >( this );
880*b1cdbd2cSJim Jagielski 		aEvt.Further = sal_False;
881*b1cdbd2cSJim Jagielski 		aEvt.OldValue <<= bOld;
882*b1cdbd2cSJim Jagielski 		aEvt.NewValue <<= bNew;
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 		m_bFinalCount = bNew;
885*b1cdbd2cSJim Jagielski 	}
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 	//send PropertyChangeEvent to listeners
888*b1cdbd2cSJim Jagielski 	impl_notifyPropertyChangeListeners( aEvt );
889*b1cdbd2cSJim Jagielski }
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
impl_isKnownValidPosition(sal_Int32 nRow)892*b1cdbd2cSJim Jagielski 	::impl_isKnownValidPosition( sal_Int32 nRow )
893*b1cdbd2cSJim Jagielski {
894*b1cdbd2cSJim Jagielski 	return m_nKnownCount && nRow
895*b1cdbd2cSJim Jagielski 			&& nRow <= m_nKnownCount;
896*b1cdbd2cSJim Jagielski }
897*b1cdbd2cSJim Jagielski 
898*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
impl_isKnownInvalidPosition(sal_Int32 nRow)899*b1cdbd2cSJim Jagielski 	::impl_isKnownInvalidPosition( sal_Int32 nRow )
900*b1cdbd2cSJim Jagielski {
901*b1cdbd2cSJim Jagielski 	if( !nRow )
902*b1cdbd2cSJim Jagielski 		return sal_True;
903*b1cdbd2cSJim Jagielski 	if( !m_bFinalCount )
904*b1cdbd2cSJim Jagielski 		return sal_False;
905*b1cdbd2cSJim Jagielski 	return nRow > m_nKnownCount;
906*b1cdbd2cSJim Jagielski }
907*b1cdbd2cSJim Jagielski 
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski //virtual
910*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_initPropertySetInfo()911*b1cdbd2cSJim Jagielski 	::impl_initPropertySetInfo()
912*b1cdbd2cSJim Jagielski {
913*b1cdbd2cSJim Jagielski 	ContentResultSetWrapper::impl_initPropertySetInfo();
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
916*b1cdbd2cSJim Jagielski 	if( m_pMyPropSetInfo )
917*b1cdbd2cSJim Jagielski 		return;
918*b1cdbd2cSJim Jagielski 	m_pMyPropSetInfo = new CCRS_PropertySetInfo( m_xPropertySetInfo );
919*b1cdbd2cSJim Jagielski 	m_xMyPropertySetInfo = m_pMyPropSetInfo;
920*b1cdbd2cSJim Jagielski 	m_xPropertySetInfo = m_xMyPropertySetInfo;
921*b1cdbd2cSJim Jagielski }
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
924*b1cdbd2cSJim Jagielski // XInterface methods. ( inherited )
925*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
XINTERFACE_COMMON_IMPL(CachedContentResultSet)926*b1cdbd2cSJim Jagielski XINTERFACE_COMMON_IMPL( CachedContentResultSet )
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski Any SAL_CALL CachedContentResultSet
929*b1cdbd2cSJim Jagielski 	::queryInterface( const Type&  rType )
930*b1cdbd2cSJim Jagielski 	throw ( RuntimeException )
931*b1cdbd2cSJim Jagielski {
932*b1cdbd2cSJim Jagielski 	//list all interfaces inclusive baseclasses of interfaces
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski 	Any aRet = ContentResultSetWrapper::queryInterface( rType );
935*b1cdbd2cSJim Jagielski 	if( aRet.hasValue() )
936*b1cdbd2cSJim Jagielski 		return aRet;
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski 	aRet = cppu::queryInterface( rType,
939*b1cdbd2cSJim Jagielski 				static_cast< XTypeProvider* >( this ),
940*b1cdbd2cSJim Jagielski 				static_cast< XServiceInfo* >( this ) );
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski 	return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
943*b1cdbd2cSJim Jagielski }
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
946*b1cdbd2cSJim Jagielski // XTypeProvider methods.
947*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
948*b1cdbd2cSJim Jagielski //list all interfaces exclusive baseclasses
949*b1cdbd2cSJim Jagielski XTYPEPROVIDER_IMPL_11( CachedContentResultSet
950*b1cdbd2cSJim Jagielski 					, XTypeProvider
951*b1cdbd2cSJim Jagielski 					, XServiceInfo
952*b1cdbd2cSJim Jagielski 					, XComponent
953*b1cdbd2cSJim Jagielski 					, XCloseable
954*b1cdbd2cSJim Jagielski 					, XResultSetMetaDataSupplier
955*b1cdbd2cSJim Jagielski 					, XPropertySet
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski 					, XPropertyChangeListener
958*b1cdbd2cSJim Jagielski 					, XVetoableChangeListener
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski 					, XContentAccess
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski 					, XResultSet
963*b1cdbd2cSJim Jagielski 					, XRow );
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
966*b1cdbd2cSJim Jagielski // XServiceInfo methods.
967*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski XSERVICEINFO_NOFACTORY_IMPL_1( CachedContentResultSet,
970*b1cdbd2cSJim Jagielski 		 		   		   OUString::createFromAscii(
971*b1cdbd2cSJim Jagielski 							"com.sun.star.comp.ucb.CachedContentResultSet" ),
972*b1cdbd2cSJim Jagielski 					 	   OUString::createFromAscii(
973*b1cdbd2cSJim Jagielski 							CACHED_CONTENT_RESULTSET_SERVICE_NAME ) );
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
976*b1cdbd2cSJim Jagielski // XPropertySet methods. ( inherited )
977*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski // virtual
980*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
setPropertyValue(const OUString & aPropertyName,const Any & aValue)981*b1cdbd2cSJim Jagielski 	::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
982*b1cdbd2cSJim Jagielski 	throw( UnknownPropertyException,
983*b1cdbd2cSJim Jagielski 		   PropertyVetoException,
984*b1cdbd2cSJim Jagielski 		   IllegalArgumentException,
985*b1cdbd2cSJim Jagielski 		   WrappedTargetException,
986*b1cdbd2cSJim Jagielski 		   RuntimeException )
987*b1cdbd2cSJim Jagielski {
988*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski 	if( !getPropertySetInfo().is() )
991*b1cdbd2cSJim Jagielski 	{
992*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
993*b1cdbd2cSJim Jagielski 		throw UnknownPropertyException();
994*b1cdbd2cSJim Jagielski 	}
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski 	Property aProp = m_pMyPropSetInfo->getPropertyByName( aPropertyName );
997*b1cdbd2cSJim Jagielski 		//throws UnknownPropertyException, if so
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski 	if( aProp.Attributes & PropertyAttribute::READONLY )
1000*b1cdbd2cSJim Jagielski 	{
1001*b1cdbd2cSJim Jagielski 		//It is assumed, that the properties
1002*b1cdbd2cSJim Jagielski 		//'RowCount' and 'IsRowCountFinal' are readonly!
1003*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException();
1004*b1cdbd2cSJim Jagielski 	}
1005*b1cdbd2cSJim Jagielski 	if( aProp.Name == CCRS_PropertySetInfo
1006*b1cdbd2cSJim Jagielski 						::m_aPropertyNameForFetchDirection )
1007*b1cdbd2cSJim Jagielski 	{
1008*b1cdbd2cSJim Jagielski 		//check value
1009*b1cdbd2cSJim Jagielski 		sal_Int32 nNew;
1010*b1cdbd2cSJim Jagielski 		if( !( aValue >>= nNew ) )
1011*b1cdbd2cSJim Jagielski 		{
1012*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException();
1013*b1cdbd2cSJim Jagielski 		}
1014*b1cdbd2cSJim Jagielski 
1015*b1cdbd2cSJim Jagielski 		if( nNew == FetchDirection::UNKNOWN )
1016*b1cdbd2cSJim Jagielski 		{
1017*b1cdbd2cSJim Jagielski 			nNew = COMSUNSTARUCBCCRS_DEFAULT_FETCH_DIRECTION;
1018*b1cdbd2cSJim Jagielski 		}
1019*b1cdbd2cSJim Jagielski 		else if( !(	nNew == FetchDirection::FORWARD
1020*b1cdbd2cSJim Jagielski 				|| nNew == FetchDirection::REVERSE ) )
1021*b1cdbd2cSJim Jagielski 		{
1022*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException();
1023*b1cdbd2cSJim Jagielski 		}
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski 		//create PropertyChangeEvent and set value
1026*b1cdbd2cSJim Jagielski 		PropertyChangeEvent aEvt;
1027*b1cdbd2cSJim Jagielski 		{
1028*b1cdbd2cSJim Jagielski 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
1029*b1cdbd2cSJim Jagielski 			aEvt.Source =  static_cast< XPropertySet * >( this );
1030*b1cdbd2cSJim Jagielski 			aEvt.PropertyName = aPropertyName;
1031*b1cdbd2cSJim Jagielski 			aEvt.Further = sal_False;
1032*b1cdbd2cSJim Jagielski 			aEvt.PropertyHandle = m_pMyPropSetInfo->
1033*b1cdbd2cSJim Jagielski 									m_nFetchDirectionPropertyHandle;
1034*b1cdbd2cSJim Jagielski 			aEvt.OldValue <<= m_nFetchDirection;
1035*b1cdbd2cSJim Jagielski 			aEvt.NewValue <<= nNew;
1036*b1cdbd2cSJim Jagielski 
1037*b1cdbd2cSJim Jagielski 			m_nFetchDirection = nNew;
1038*b1cdbd2cSJim Jagielski 		}
1039*b1cdbd2cSJim Jagielski 
1040*b1cdbd2cSJim Jagielski 		//send PropertyChangeEvent to listeners
1041*b1cdbd2cSJim Jagielski 		impl_notifyPropertyChangeListeners( aEvt );
1042*b1cdbd2cSJim Jagielski 	}
1043*b1cdbd2cSJim Jagielski 	else if( aProp.Name == CCRS_PropertySetInfo
1044*b1cdbd2cSJim Jagielski 						::m_aPropertyNameForFetchSize )
1045*b1cdbd2cSJim Jagielski 	{
1046*b1cdbd2cSJim Jagielski 		//check value
1047*b1cdbd2cSJim Jagielski 		sal_Int32 nNew;
1048*b1cdbd2cSJim Jagielski 		if( !( aValue >>= nNew ) )
1049*b1cdbd2cSJim Jagielski 		{
1050*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException();
1051*b1cdbd2cSJim Jagielski 		}
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski 		if( nNew < 0 )
1054*b1cdbd2cSJim Jagielski 		{
1055*b1cdbd2cSJim Jagielski 			nNew = COMSUNSTARUCBCCRS_DEFAULT_FETCH_SIZE;
1056*b1cdbd2cSJim Jagielski 		}
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski 		//create PropertyChangeEvent and set value
1059*b1cdbd2cSJim Jagielski 		PropertyChangeEvent aEvt;
1060*b1cdbd2cSJim Jagielski 		{
1061*b1cdbd2cSJim Jagielski 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
1062*b1cdbd2cSJim Jagielski 			aEvt.Source =  static_cast< XPropertySet * >( this );
1063*b1cdbd2cSJim Jagielski 			aEvt.PropertyName = aPropertyName;
1064*b1cdbd2cSJim Jagielski 			aEvt.Further = sal_False;
1065*b1cdbd2cSJim Jagielski 			aEvt.PropertyHandle = m_pMyPropSetInfo->
1066*b1cdbd2cSJim Jagielski 									m_nFetchSizePropertyHandle;
1067*b1cdbd2cSJim Jagielski 			aEvt.OldValue <<= m_nFetchSize;
1068*b1cdbd2cSJim Jagielski 			aEvt.NewValue <<= nNew;
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski 			m_nFetchSize = nNew;
1071*b1cdbd2cSJim Jagielski 		}
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski 		//send PropertyChangeEvent to listeners
1074*b1cdbd2cSJim Jagielski 		impl_notifyPropertyChangeListeners( aEvt );
1075*b1cdbd2cSJim Jagielski 	}
1076*b1cdbd2cSJim Jagielski 	else
1077*b1cdbd2cSJim Jagielski 	{
1078*b1cdbd2cSJim Jagielski 		impl_init_xPropertySetOrigin();
1079*b1cdbd2cSJim Jagielski 		{
1080*b1cdbd2cSJim Jagielski 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
1081*b1cdbd2cSJim Jagielski 			if( !m_xPropertySetOrigin.is() )
1082*b1cdbd2cSJim Jagielski 			{
1083*b1cdbd2cSJim Jagielski 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1084*b1cdbd2cSJim Jagielski 				return;
1085*b1cdbd2cSJim Jagielski 			}
1086*b1cdbd2cSJim Jagielski 		}
1087*b1cdbd2cSJim Jagielski 		m_xPropertySetOrigin->setPropertyValue( aPropertyName, aValue );
1088*b1cdbd2cSJim Jagielski 	}
1089*b1cdbd2cSJim Jagielski }
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1092*b1cdbd2cSJim Jagielski // virtual
1093*b1cdbd2cSJim Jagielski Any SAL_CALL CachedContentResultSet
getPropertyValue(const OUString & rPropertyName)1094*b1cdbd2cSJim Jagielski 	::getPropertyValue( const OUString& rPropertyName )
1095*b1cdbd2cSJim Jagielski 	throw( UnknownPropertyException,
1096*b1cdbd2cSJim Jagielski 		   WrappedTargetException,
1097*b1cdbd2cSJim Jagielski 		   RuntimeException )
1098*b1cdbd2cSJim Jagielski {
1099*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1100*b1cdbd2cSJim Jagielski 
1101*b1cdbd2cSJim Jagielski 	if( !getPropertySetInfo().is() )
1102*b1cdbd2cSJim Jagielski 	{
1103*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1104*b1cdbd2cSJim Jagielski 		throw UnknownPropertyException();
1105*b1cdbd2cSJim Jagielski 	}
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski 	Property aProp = m_pMyPropSetInfo->getPropertyByName( rPropertyName );
1108*b1cdbd2cSJim Jagielski 		//throws UnknownPropertyException, if so
1109*b1cdbd2cSJim Jagielski 
1110*b1cdbd2cSJim Jagielski 	Any aValue;
1111*b1cdbd2cSJim Jagielski 	if( rPropertyName == CCRS_PropertySetInfo
1112*b1cdbd2cSJim Jagielski 						::m_aPropertyNameForCount )
1113*b1cdbd2cSJim Jagielski 	{
1114*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1115*b1cdbd2cSJim Jagielski 		aValue <<= m_nKnownCount;
1116*b1cdbd2cSJim Jagielski 	}
1117*b1cdbd2cSJim Jagielski 	else if( rPropertyName == CCRS_PropertySetInfo
1118*b1cdbd2cSJim Jagielski 							::m_aPropertyNameForFinalCount )
1119*b1cdbd2cSJim Jagielski 	{
1120*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1121*b1cdbd2cSJim Jagielski 		aValue <<= m_bFinalCount;
1122*b1cdbd2cSJim Jagielski 	}
1123*b1cdbd2cSJim Jagielski 	else if( rPropertyName == CCRS_PropertySetInfo
1124*b1cdbd2cSJim Jagielski 							::m_aPropertyNameForFetchSize )
1125*b1cdbd2cSJim Jagielski 	{
1126*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1127*b1cdbd2cSJim Jagielski 		aValue <<= m_nFetchSize;
1128*b1cdbd2cSJim Jagielski 	}
1129*b1cdbd2cSJim Jagielski 	else if( rPropertyName == CCRS_PropertySetInfo
1130*b1cdbd2cSJim Jagielski 							::m_aPropertyNameForFetchDirection )
1131*b1cdbd2cSJim Jagielski 	{
1132*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1133*b1cdbd2cSJim Jagielski 		aValue <<= m_nFetchDirection;
1134*b1cdbd2cSJim Jagielski 	}
1135*b1cdbd2cSJim Jagielski 	else
1136*b1cdbd2cSJim Jagielski 	{
1137*b1cdbd2cSJim Jagielski 		impl_init_xPropertySetOrigin();
1138*b1cdbd2cSJim Jagielski 		{
1139*b1cdbd2cSJim Jagielski 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
1140*b1cdbd2cSJim Jagielski 			if( !m_xPropertySetOrigin.is() )
1141*b1cdbd2cSJim Jagielski 			{
1142*b1cdbd2cSJim Jagielski 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1143*b1cdbd2cSJim Jagielski 				throw UnknownPropertyException();
1144*b1cdbd2cSJim Jagielski 			}
1145*b1cdbd2cSJim Jagielski 		}
1146*b1cdbd2cSJim Jagielski 		aValue = m_xPropertySetOrigin->getPropertyValue( rPropertyName );
1147*b1cdbd2cSJim Jagielski 	}
1148*b1cdbd2cSJim Jagielski 	return aValue;
1149*b1cdbd2cSJim Jagielski }
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1152*b1cdbd2cSJim Jagielski // own methods.  ( inherited )
1153*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski //virtual
1156*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_disposing(const EventObject & rEventObject)1157*b1cdbd2cSJim Jagielski 	::impl_disposing( const EventObject& rEventObject )
1158*b1cdbd2cSJim Jagielski 	throw( RuntimeException )
1159*b1cdbd2cSJim Jagielski {
1160*b1cdbd2cSJim Jagielski 	{
1161*b1cdbd2cSJim Jagielski 		impl_EnsureNotDisposed();
1162*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1163*b1cdbd2cSJim Jagielski 		//release all references to the broadcaster:
1164*b1cdbd2cSJim Jagielski 		m_xFetchProvider.clear();
1165*b1cdbd2cSJim Jagielski 		m_xFetchProviderForContentAccess.clear();
1166*b1cdbd2cSJim Jagielski 	}
1167*b1cdbd2cSJim Jagielski 	ContentResultSetWrapper::impl_disposing( rEventObject );
1168*b1cdbd2cSJim Jagielski }
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski //virtual
1171*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_propertyChange(const PropertyChangeEvent & rEvt)1172*b1cdbd2cSJim Jagielski 	::impl_propertyChange( const PropertyChangeEvent& rEvt )
1173*b1cdbd2cSJim Jagielski 	throw( RuntimeException )
1174*b1cdbd2cSJim Jagielski {
1175*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1176*b1cdbd2cSJim Jagielski 
1177*b1cdbd2cSJim Jagielski 	PropertyChangeEvent aEvt( rEvt );
1178*b1cdbd2cSJim Jagielski 	aEvt.Source = static_cast< XPropertySet * >( this );
1179*b1cdbd2cSJim Jagielski 	aEvt.Further = sal_False;
1180*b1cdbd2cSJim Jagielski 	//---------
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski 	if( CCRS_PropertySetInfo
1183*b1cdbd2cSJim Jagielski 			::impl_isMyPropertyName( rEvt.PropertyName ) )
1184*b1cdbd2cSJim Jagielski 	{
1185*b1cdbd2cSJim Jagielski 		//don't notify foreign events on fetchsize and fetchdirection
1186*b1cdbd2cSJim Jagielski 		if( aEvt.PropertyName == CCRS_PropertySetInfo
1187*b1cdbd2cSJim Jagielski 								::m_aPropertyNameForFetchSize
1188*b1cdbd2cSJim Jagielski 		|| aEvt.PropertyName == CCRS_PropertySetInfo
1189*b1cdbd2cSJim Jagielski 								::m_aPropertyNameForFetchDirection )
1190*b1cdbd2cSJim Jagielski 			return;
1191*b1cdbd2cSJim Jagielski 
1192*b1cdbd2cSJim Jagielski 		//adjust my props 'RowCount' and 'IsRowCountFinal'
1193*b1cdbd2cSJim Jagielski 		if( aEvt.PropertyName == CCRS_PropertySetInfo
1194*b1cdbd2cSJim Jagielski 							::m_aPropertyNameForCount )
1195*b1cdbd2cSJim Jagielski 		{//RowCount changed
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 			//check value
1198*b1cdbd2cSJim Jagielski 			sal_Int32 nNew = 0;
1199*b1cdbd2cSJim Jagielski 			if( !( aEvt.NewValue >>= nNew ) )
1200*b1cdbd2cSJim Jagielski 			{
1201*b1cdbd2cSJim Jagielski 				OSL_ENSURE( sal_False, "PropertyChangeEvent contains wrong data" );
1202*b1cdbd2cSJim Jagielski 				return;
1203*b1cdbd2cSJim Jagielski 			}
1204*b1cdbd2cSJim Jagielski 
1205*b1cdbd2cSJim Jagielski 			impl_changeRowCount( m_nKnownCount, nNew );
1206*b1cdbd2cSJim Jagielski 		}
1207*b1cdbd2cSJim Jagielski 		else if( aEvt.PropertyName == CCRS_PropertySetInfo
1208*b1cdbd2cSJim Jagielski 								::m_aPropertyNameForFinalCount )
1209*b1cdbd2cSJim Jagielski 		{//IsRowCountFinal changed
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski 			//check value
1212*b1cdbd2cSJim Jagielski 			sal_Bool bNew = sal_False;
1213*b1cdbd2cSJim Jagielski 			if( !( aEvt.NewValue >>= bNew ) )
1214*b1cdbd2cSJim Jagielski 			{
1215*b1cdbd2cSJim Jagielski 				OSL_ENSURE( sal_False, "PropertyChangeEvent contains wrong data" );
1216*b1cdbd2cSJim Jagielski 				return;
1217*b1cdbd2cSJim Jagielski 			}
1218*b1cdbd2cSJim Jagielski 			impl_changeIsRowCountFinal( m_bFinalCount, bNew );
1219*b1cdbd2cSJim Jagielski 		}
1220*b1cdbd2cSJim Jagielski 		return;
1221*b1cdbd2cSJim Jagielski 	}
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski 	//-----------
1224*b1cdbd2cSJim Jagielski 	impl_notifyPropertyChangeListeners(	aEvt );
1225*b1cdbd2cSJim Jagielski }
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski 
1228*b1cdbd2cSJim Jagielski //virtual
1229*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
impl_vetoableChange(const PropertyChangeEvent & rEvt)1230*b1cdbd2cSJim Jagielski 	::impl_vetoableChange( const PropertyChangeEvent& rEvt )
1231*b1cdbd2cSJim Jagielski 	throw( PropertyVetoException,
1232*b1cdbd2cSJim Jagielski 		   RuntimeException )
1233*b1cdbd2cSJim Jagielski {
1234*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1235*b1cdbd2cSJim Jagielski 
1236*b1cdbd2cSJim Jagielski 	//don't notify events on my properties, cause they are not vetoable
1237*b1cdbd2cSJim Jagielski 	if( CCRS_PropertySetInfo
1238*b1cdbd2cSJim Jagielski 			::impl_isMyPropertyName( rEvt.PropertyName ) )
1239*b1cdbd2cSJim Jagielski 	{
1240*b1cdbd2cSJim Jagielski 		return;
1241*b1cdbd2cSJim Jagielski 	}
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski 	PropertyChangeEvent aEvt( rEvt );
1245*b1cdbd2cSJim Jagielski 	aEvt.Source = static_cast< XPropertySet * >( this );
1246*b1cdbd2cSJim Jagielski 	aEvt.Further = sal_False;
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski 	impl_notifyVetoableChangeListeners( aEvt );
1249*b1cdbd2cSJim Jagielski }
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1252*b1cdbd2cSJim Jagielski // XContentAccess methods. ( inherited ) ( -- position dependent )
1253*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski #define XCONTENTACCESS_queryXXX( queryXXX, XXX, TYPE )				\
1256*b1cdbd2cSJim Jagielski impl_EnsureNotDisposed();									\
1257*b1cdbd2cSJim Jagielski ReacquireableGuard aGuard( m_aMutex );						\
1258*b1cdbd2cSJim Jagielski sal_Int32 nRow = m_nRow;									\
1259*b1cdbd2cSJim Jagielski sal_Int32 nFetchSize = m_nFetchSize;						\
1260*b1cdbd2cSJim Jagielski sal_Int32 nFetchDirection = m_nFetchDirection;				\
1261*b1cdbd2cSJim Jagielski if( !m_aCache##XXX.hasRow( nRow ) )							\
1262*b1cdbd2cSJim Jagielski {															\
1263*b1cdbd2cSJim Jagielski 	if( !m_aCache##XXX.hasCausedException( nRow ) )			\
1264*b1cdbd2cSJim Jagielski {															\
1265*b1cdbd2cSJim Jagielski 		if( !m_xFetchProviderForContentAccess.is() )		\
1266*b1cdbd2cSJim Jagielski 		{													\
1267*b1cdbd2cSJim Jagielski 			OSL_ENSURE( sal_False, "broadcaster was disposed already" );\
1268*b1cdbd2cSJim Jagielski 			throw RuntimeException();						\
1269*b1cdbd2cSJim Jagielski 		}													\
1270*b1cdbd2cSJim Jagielski 		aGuard.clear();										\
1271*b1cdbd2cSJim Jagielski 		if( impl_isForwardOnly() )							\
1272*b1cdbd2cSJim Jagielski 			applyPositionToOrigin( nRow );					\
1273*b1cdbd2cSJim Jagielski 															\
1274*b1cdbd2cSJim Jagielski 		FETCH_XXX( m_aCache##XXX, m_xFetchProviderForContentAccess, fetch##XXX##s ); \
1275*b1cdbd2cSJim Jagielski 	}														\
1276*b1cdbd2cSJim Jagielski 	aGuard.reacquire();										\
1277*b1cdbd2cSJim Jagielski 	if( !m_aCache##XXX.hasRow( nRow ) )						\
1278*b1cdbd2cSJim Jagielski 	{														\
1279*b1cdbd2cSJim Jagielski 		aGuard.clear();										\
1280*b1cdbd2cSJim Jagielski 		applyPositionToOrigin( nRow );						\
1281*b1cdbd2cSJim Jagielski 		TYPE aRet = ContentResultSetWrapper::queryXXX();	\
1282*b1cdbd2cSJim Jagielski 		if( m_xContentIdentifierMapping.is() )				\
1283*b1cdbd2cSJim Jagielski 			return m_xContentIdentifierMapping->map##XXX( aRet );\
1284*b1cdbd2cSJim Jagielski 		return aRet;										\
1285*b1cdbd2cSJim Jagielski 	}														\
1286*b1cdbd2cSJim Jagielski }															\
1287*b1cdbd2cSJim Jagielski return m_aCache##XXX.get##XXX( nRow );
1288*b1cdbd2cSJim Jagielski 
1289*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1290*b1cdbd2cSJim Jagielski // virtual
1291*b1cdbd2cSJim Jagielski OUString SAL_CALL CachedContentResultSet
queryContentIdentifierString()1292*b1cdbd2cSJim Jagielski 	::queryContentIdentifierString()
1293*b1cdbd2cSJim Jagielski 	throw( RuntimeException )
1294*b1cdbd2cSJim Jagielski {
1295*b1cdbd2cSJim Jagielski 	XCONTENTACCESS_queryXXX( queryContentIdentifierString, ContentIdentifierString, OUString )
1296*b1cdbd2cSJim Jagielski }
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1299*b1cdbd2cSJim Jagielski // virtual
1300*b1cdbd2cSJim Jagielski Reference< XContentIdentifier > SAL_CALL CachedContentResultSet
queryContentIdentifier()1301*b1cdbd2cSJim Jagielski 	::queryContentIdentifier()
1302*b1cdbd2cSJim Jagielski 	throw( RuntimeException )
1303*b1cdbd2cSJim Jagielski {
1304*b1cdbd2cSJim Jagielski 	XCONTENTACCESS_queryXXX( queryContentIdentifier, ContentIdentifier, Reference< XContentIdentifier > )
1305*b1cdbd2cSJim Jagielski }
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
1308*b1cdbd2cSJim Jagielski // virtual
1309*b1cdbd2cSJim Jagielski Reference< XContent > SAL_CALL CachedContentResultSet
queryContent()1310*b1cdbd2cSJim Jagielski 	::queryContent()
1311*b1cdbd2cSJim Jagielski 	throw( RuntimeException )
1312*b1cdbd2cSJim Jagielski {
1313*b1cdbd2cSJim Jagielski 	XCONTENTACCESS_queryXXX( queryContent, Content, Reference< XContent > )
1314*b1cdbd2cSJim Jagielski }
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------
1317*b1cdbd2cSJim Jagielski // XResultSet methods. ( inherited )
1318*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------
1319*b1cdbd2cSJim Jagielski //virtual
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
next()1322*b1cdbd2cSJim Jagielski 	::next()
1323*b1cdbd2cSJim Jagielski 	throw( SQLException,
1324*b1cdbd2cSJim Jagielski 		   RuntimeException )
1325*b1cdbd2cSJim Jagielski {
1326*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1327*b1cdbd2cSJim Jagielski 
1328*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1329*b1cdbd2cSJim Jagielski 	//after last
1330*b1cdbd2cSJim Jagielski 	if( m_bAfterLast )
1331*b1cdbd2cSJim Jagielski 		return sal_False;
1332*b1cdbd2cSJim Jagielski 	//last
1333*b1cdbd2cSJim Jagielski 	aGuard.clear();
1334*b1cdbd2cSJim Jagielski 	if( isLast() )
1335*b1cdbd2cSJim Jagielski 	{
1336*b1cdbd2cSJim Jagielski 		aGuard.reacquire();
1337*b1cdbd2cSJim Jagielski 		m_nRow++;
1338*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_True;
1339*b1cdbd2cSJim Jagielski 		return sal_False;
1340*b1cdbd2cSJim Jagielski 	}
1341*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1342*b1cdbd2cSJim Jagielski 	//known valid position
1343*b1cdbd2cSJim Jagielski 	if( impl_isKnownValidPosition( m_nRow + 1 ) )
1344*b1cdbd2cSJim Jagielski 	{
1345*b1cdbd2cSJim Jagielski 		m_nRow++;
1346*b1cdbd2cSJim Jagielski 		return sal_True;
1347*b1cdbd2cSJim Jagielski 	}
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski 	//unknown position
1350*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = m_nRow;
1351*b1cdbd2cSJim Jagielski 	aGuard.clear();
1352*b1cdbd2cSJim Jagielski 
1353*b1cdbd2cSJim Jagielski 	sal_Bool bValid = applyPositionToOrigin( nRow + 1 );
1354*b1cdbd2cSJim Jagielski 
1355*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1356*b1cdbd2cSJim Jagielski 	m_nRow = nRow + 1;
1357*b1cdbd2cSJim Jagielski 	m_bAfterLast = !bValid;
1358*b1cdbd2cSJim Jagielski 	return bValid;
1359*b1cdbd2cSJim Jagielski }
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski //virtual
1362*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
previous()1363*b1cdbd2cSJim Jagielski 	::previous()
1364*b1cdbd2cSJim Jagielski 	throw( SQLException,
1365*b1cdbd2cSJim Jagielski 		   RuntimeException )
1366*b1cdbd2cSJim Jagielski {
1367*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1368*b1cdbd2cSJim Jagielski 
1369*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1370*b1cdbd2cSJim Jagielski 		throw SQLException();
1371*b1cdbd2cSJim Jagielski 
1372*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1373*b1cdbd2cSJim Jagielski 	//before first ?:
1374*b1cdbd2cSJim Jagielski 	if( !m_bAfterLast && !m_nRow )
1375*b1cdbd2cSJim Jagielski 		return sal_False;
1376*b1cdbd2cSJim Jagielski 	//first ?:
1377*b1cdbd2cSJim Jagielski 	if( !m_bAfterLast && m_nKnownCount && m_nRow == 1 )
1378*b1cdbd2cSJim Jagielski 	{
1379*b1cdbd2cSJim Jagielski 		m_nRow--;
1380*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1381*b1cdbd2cSJim Jagielski 		return sal_False;
1382*b1cdbd2cSJim Jagielski 	}
1383*b1cdbd2cSJim Jagielski 	//known valid position ?:
1384*b1cdbd2cSJim Jagielski 	if( impl_isKnownValidPosition( m_nRow - 1 ) )
1385*b1cdbd2cSJim Jagielski 	{
1386*b1cdbd2cSJim Jagielski 		m_nRow--;
1387*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1388*b1cdbd2cSJim Jagielski 		return sal_True;
1389*b1cdbd2cSJim Jagielski 	}
1390*b1cdbd2cSJim Jagielski 	//unknown position:
1391*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = m_nRow;
1392*b1cdbd2cSJim Jagielski 	aGuard.clear();
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski 	sal_Bool bValid = applyPositionToOrigin( nRow - 1  );
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1397*b1cdbd2cSJim Jagielski 	m_nRow = nRow - 1;
1398*b1cdbd2cSJim Jagielski 	m_bAfterLast = sal_False;
1399*b1cdbd2cSJim Jagielski 	return bValid;
1400*b1cdbd2cSJim Jagielski }
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski //virtual
1403*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
absolute(sal_Int32 row)1404*b1cdbd2cSJim Jagielski 	::absolute( sal_Int32 row )
1405*b1cdbd2cSJim Jagielski 	throw( SQLException,
1406*b1cdbd2cSJim Jagielski 		   RuntimeException )
1407*b1cdbd2cSJim Jagielski {
1408*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski 	if( !row )
1411*b1cdbd2cSJim Jagielski 		throw SQLException();
1412*b1cdbd2cSJim Jagielski 
1413*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1414*b1cdbd2cSJim Jagielski 		throw SQLException();
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1417*b1cdbd2cSJim Jagielski 
1418*b1cdbd2cSJim Jagielski 	if( !m_xResultSetOrigin.is() )
1419*b1cdbd2cSJim Jagielski 	{
1420*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1421*b1cdbd2cSJim Jagielski 		return sal_False;
1422*b1cdbd2cSJim Jagielski 	}
1423*b1cdbd2cSJim Jagielski 	if( row < 0 )
1424*b1cdbd2cSJim Jagielski 	{
1425*b1cdbd2cSJim Jagielski 		if( m_bFinalCount )
1426*b1cdbd2cSJim Jagielski 		{
1427*b1cdbd2cSJim Jagielski 			sal_Int32 nNewRow = m_nKnownCount + 1 + row;
1428*b1cdbd2cSJim Jagielski 			sal_Bool bValid = sal_True;
1429*b1cdbd2cSJim Jagielski 			if( nNewRow <= 0 )
1430*b1cdbd2cSJim Jagielski 			{
1431*b1cdbd2cSJim Jagielski 				nNewRow = 0;
1432*b1cdbd2cSJim Jagielski 				bValid = sal_False;
1433*b1cdbd2cSJim Jagielski 			}
1434*b1cdbd2cSJim Jagielski 			m_nRow = nNewRow;
1435*b1cdbd2cSJim Jagielski 			m_bAfterLast = sal_False;
1436*b1cdbd2cSJim Jagielski 			return bValid;
1437*b1cdbd2cSJim Jagielski 		}
1438*b1cdbd2cSJim Jagielski 		//unknown final count:
1439*b1cdbd2cSJim Jagielski 		aGuard.clear();
1440*b1cdbd2cSJim Jagielski 
1441*b1cdbd2cSJim Jagielski 		// Solaris has problems catching or propagating derived exceptions
1442*b1cdbd2cSJim Jagielski 		// when only the base class is known, so make ResultSetException
1443*b1cdbd2cSJim Jagielski 		// (derived from SQLException) known here:
1444*b1cdbd2cSJim Jagielski 		sal_Bool bValid;
1445*b1cdbd2cSJim Jagielski 		try
1446*b1cdbd2cSJim Jagielski 		{
1447*b1cdbd2cSJim Jagielski 			bValid = m_xResultSetOrigin->absolute( row );
1448*b1cdbd2cSJim Jagielski 		}
1449*b1cdbd2cSJim Jagielski 		catch (ResultSetException &)
1450*b1cdbd2cSJim Jagielski 		{
1451*b1cdbd2cSJim Jagielski 			throw;
1452*b1cdbd2cSJim Jagielski 		}
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski 		aGuard.reacquire();
1455*b1cdbd2cSJim Jagielski 		if( m_bFinalCount )
1456*b1cdbd2cSJim Jagielski 		{
1457*b1cdbd2cSJim Jagielski 			sal_Int32 nNewRow = m_nKnownCount + 1 + row;
1458*b1cdbd2cSJim Jagielski 			if( nNewRow < 0 )
1459*b1cdbd2cSJim Jagielski 				nNewRow = 0;
1460*b1cdbd2cSJim Jagielski 			m_nLastAppliedPos = nNewRow;
1461*b1cdbd2cSJim Jagielski 			m_nRow = nNewRow;
1462*b1cdbd2cSJim Jagielski 			m_bAfterLastApplied = m_bAfterLast = sal_False;
1463*b1cdbd2cSJim Jagielski 			return bValid;
1464*b1cdbd2cSJim Jagielski 		}
1465*b1cdbd2cSJim Jagielski 		aGuard.clear();
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski 		sal_Int32 nCurRow = m_xResultSetOrigin->getRow();
1468*b1cdbd2cSJim Jagielski 
1469*b1cdbd2cSJim Jagielski 		aGuard.reacquire();
1470*b1cdbd2cSJim Jagielski 		m_nLastAppliedPos = nCurRow;
1471*b1cdbd2cSJim Jagielski 		m_nRow = nCurRow;
1472*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1473*b1cdbd2cSJim Jagielski 		return nCurRow != 0;
1474*b1cdbd2cSJim Jagielski 	}
1475*b1cdbd2cSJim Jagielski 	//row > 0:
1476*b1cdbd2cSJim Jagielski 	if( m_bFinalCount )
1477*b1cdbd2cSJim Jagielski 	{
1478*b1cdbd2cSJim Jagielski 		if( row > m_nKnownCount )
1479*b1cdbd2cSJim Jagielski 		{
1480*b1cdbd2cSJim Jagielski 			m_nRow = m_nKnownCount + 1;
1481*b1cdbd2cSJim Jagielski 			m_bAfterLast = sal_True;
1482*b1cdbd2cSJim Jagielski 			return sal_False;
1483*b1cdbd2cSJim Jagielski 		}
1484*b1cdbd2cSJim Jagielski 		m_nRow = row;
1485*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1486*b1cdbd2cSJim Jagielski 		return sal_True;
1487*b1cdbd2cSJim Jagielski 	}
1488*b1cdbd2cSJim Jagielski 	//unknown new position:
1489*b1cdbd2cSJim Jagielski 	aGuard.clear();
1490*b1cdbd2cSJim Jagielski 
1491*b1cdbd2cSJim Jagielski 	sal_Bool bValid = m_xResultSetOrigin->absolute( row );
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1494*b1cdbd2cSJim Jagielski 	if( m_bFinalCount )
1495*b1cdbd2cSJim Jagielski 	{
1496*b1cdbd2cSJim Jagielski 		sal_Int32 nNewRow = row;
1497*b1cdbd2cSJim Jagielski 		if( nNewRow > m_nKnownCount )
1498*b1cdbd2cSJim Jagielski 		{
1499*b1cdbd2cSJim Jagielski 			nNewRow = m_nKnownCount + 1;
1500*b1cdbd2cSJim Jagielski 			m_bAfterLastApplied = m_bAfterLast = sal_True;
1501*b1cdbd2cSJim Jagielski 		}
1502*b1cdbd2cSJim Jagielski 		else
1503*b1cdbd2cSJim Jagielski 			m_bAfterLastApplied = m_bAfterLast = sal_False;
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski 		m_nLastAppliedPos = nNewRow;
1506*b1cdbd2cSJim Jagielski 		m_nRow = nNewRow;
1507*b1cdbd2cSJim Jagielski 		return bValid;
1508*b1cdbd2cSJim Jagielski 	}
1509*b1cdbd2cSJim Jagielski 	aGuard.clear();
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski 	sal_Int32 nCurRow = m_xResultSetOrigin->getRow();
1512*b1cdbd2cSJim Jagielski 	sal_Bool bIsAfterLast = m_xResultSetOrigin->isAfterLast();
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1515*b1cdbd2cSJim Jagielski 	m_nLastAppliedPos = nCurRow;
1516*b1cdbd2cSJim Jagielski 	m_nRow = nCurRow;
1517*b1cdbd2cSJim Jagielski 	m_bAfterLastApplied = m_bAfterLast = bIsAfterLast;
1518*b1cdbd2cSJim Jagielski 	return nCurRow && !bIsAfterLast;
1519*b1cdbd2cSJim Jagielski }
1520*b1cdbd2cSJim Jagielski 
1521*b1cdbd2cSJim Jagielski //virtual
1522*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
relative(sal_Int32 rows)1523*b1cdbd2cSJim Jagielski 	::relative( sal_Int32 rows )
1524*b1cdbd2cSJim Jagielski 	throw( SQLException,
1525*b1cdbd2cSJim Jagielski 		   RuntimeException )
1526*b1cdbd2cSJim Jagielski {
1527*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1530*b1cdbd2cSJim Jagielski 		throw SQLException();
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1533*b1cdbd2cSJim Jagielski 	if( m_bAfterLast || impl_isKnownInvalidPosition( m_nRow ) )
1534*b1cdbd2cSJim Jagielski 		throw SQLException();
1535*b1cdbd2cSJim Jagielski 
1536*b1cdbd2cSJim Jagielski 	if( !rows )
1537*b1cdbd2cSJim Jagielski 		return sal_True;
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski 	sal_Int32 nNewRow = m_nRow + rows;
1540*b1cdbd2cSJim Jagielski 		if( nNewRow < 0 )
1541*b1cdbd2cSJim Jagielski 			nNewRow = 0;
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski 	if( impl_isKnownValidPosition( nNewRow ) )
1544*b1cdbd2cSJim Jagielski 	{
1545*b1cdbd2cSJim Jagielski 		m_nRow = nNewRow;
1546*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1547*b1cdbd2cSJim Jagielski 		return sal_True;
1548*b1cdbd2cSJim Jagielski 	}
1549*b1cdbd2cSJim Jagielski 	else
1550*b1cdbd2cSJim Jagielski 	{
1551*b1cdbd2cSJim Jagielski 		//known invalid new position:
1552*b1cdbd2cSJim Jagielski 		if( nNewRow == 0 )
1553*b1cdbd2cSJim Jagielski 		{
1554*b1cdbd2cSJim Jagielski 			m_bAfterLast = sal_False;
1555*b1cdbd2cSJim Jagielski 			m_nRow = 0;
1556*b1cdbd2cSJim Jagielski 			return sal_False;
1557*b1cdbd2cSJim Jagielski 		}
1558*b1cdbd2cSJim Jagielski 		if( m_bFinalCount && nNewRow > m_nKnownCount )
1559*b1cdbd2cSJim Jagielski 		{
1560*b1cdbd2cSJim Jagielski 			m_bAfterLast = sal_True;
1561*b1cdbd2cSJim Jagielski 			m_nRow = m_nKnownCount + 1;
1562*b1cdbd2cSJim Jagielski 			return sal_False;
1563*b1cdbd2cSJim Jagielski 		}
1564*b1cdbd2cSJim Jagielski 		//unknown new position:
1565*b1cdbd2cSJim Jagielski 		aGuard.clear();
1566*b1cdbd2cSJim Jagielski 		sal_Bool bValid = applyPositionToOrigin( nNewRow );
1567*b1cdbd2cSJim Jagielski 
1568*b1cdbd2cSJim Jagielski 		aGuard.reacquire();
1569*b1cdbd2cSJim Jagielski 		m_nRow = nNewRow;
1570*b1cdbd2cSJim Jagielski 		m_bAfterLast = !bValid && nNewRow > 0;
1571*b1cdbd2cSJim Jagielski 		return bValid;
1572*b1cdbd2cSJim Jagielski 	}
1573*b1cdbd2cSJim Jagielski }
1574*b1cdbd2cSJim Jagielski 
1575*b1cdbd2cSJim Jagielski 
1576*b1cdbd2cSJim Jagielski //virtual
1577*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
first()1578*b1cdbd2cSJim Jagielski 	::first()
1579*b1cdbd2cSJim Jagielski 	throw( SQLException,
1580*b1cdbd2cSJim Jagielski 		   RuntimeException )
1581*b1cdbd2cSJim Jagielski {
1582*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1583*b1cdbd2cSJim Jagielski 
1584*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1585*b1cdbd2cSJim Jagielski 		throw SQLException();
1586*b1cdbd2cSJim Jagielski 
1587*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1588*b1cdbd2cSJim Jagielski 	if( impl_isKnownValidPosition( 1 ) )
1589*b1cdbd2cSJim Jagielski 	{
1590*b1cdbd2cSJim Jagielski 		m_nRow = 1;
1591*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1592*b1cdbd2cSJim Jagielski 		return sal_True;
1593*b1cdbd2cSJim Jagielski 	}
1594*b1cdbd2cSJim Jagielski 	if( impl_isKnownInvalidPosition( 1 ) )
1595*b1cdbd2cSJim Jagielski 	{
1596*b1cdbd2cSJim Jagielski 		m_nRow = 1;
1597*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1598*b1cdbd2cSJim Jagielski 		return sal_False;
1599*b1cdbd2cSJim Jagielski 	}
1600*b1cdbd2cSJim Jagielski 	//unknown position
1601*b1cdbd2cSJim Jagielski 	aGuard.clear();
1602*b1cdbd2cSJim Jagielski 
1603*b1cdbd2cSJim Jagielski 	sal_Bool bValid = applyPositionToOrigin( 1 );
1604*b1cdbd2cSJim Jagielski 
1605*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1606*b1cdbd2cSJim Jagielski 	m_nRow = 1;
1607*b1cdbd2cSJim Jagielski 	m_bAfterLast = sal_False;
1608*b1cdbd2cSJim Jagielski 	return bValid;
1609*b1cdbd2cSJim Jagielski }
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski //virtual
1612*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
last()1613*b1cdbd2cSJim Jagielski 	::last()
1614*b1cdbd2cSJim Jagielski 	throw( SQLException,
1615*b1cdbd2cSJim Jagielski 		   RuntimeException )
1616*b1cdbd2cSJim Jagielski {
1617*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1618*b1cdbd2cSJim Jagielski 
1619*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1620*b1cdbd2cSJim Jagielski 		throw SQLException();
1621*b1cdbd2cSJim Jagielski 
1622*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1623*b1cdbd2cSJim Jagielski 	if( m_bFinalCount )
1624*b1cdbd2cSJim Jagielski 	{
1625*b1cdbd2cSJim Jagielski 		m_nRow = m_nKnownCount;
1626*b1cdbd2cSJim Jagielski 		m_bAfterLast = sal_False;
1627*b1cdbd2cSJim Jagielski 		return m_nKnownCount != 0;
1628*b1cdbd2cSJim Jagielski 	}
1629*b1cdbd2cSJim Jagielski 	//unknown position
1630*b1cdbd2cSJim Jagielski 	if( !m_xResultSetOrigin.is() )
1631*b1cdbd2cSJim Jagielski 	{
1632*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1633*b1cdbd2cSJim Jagielski 		return sal_False;
1634*b1cdbd2cSJim Jagielski 	}
1635*b1cdbd2cSJim Jagielski 	aGuard.clear();
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski 	sal_Bool bValid = m_xResultSetOrigin->last();
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1640*b1cdbd2cSJim Jagielski 	m_bAfterLastApplied = m_bAfterLast = sal_False;
1641*b1cdbd2cSJim Jagielski 	if( m_bFinalCount )
1642*b1cdbd2cSJim Jagielski 	{
1643*b1cdbd2cSJim Jagielski 		m_nLastAppliedPos = m_nKnownCount;
1644*b1cdbd2cSJim Jagielski 		m_nRow = m_nKnownCount;
1645*b1cdbd2cSJim Jagielski 		return bValid;
1646*b1cdbd2cSJim Jagielski 	}
1647*b1cdbd2cSJim Jagielski 	aGuard.clear();
1648*b1cdbd2cSJim Jagielski 
1649*b1cdbd2cSJim Jagielski 	sal_Int32 nCurRow = m_xResultSetOrigin->getRow();
1650*b1cdbd2cSJim Jagielski 
1651*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1652*b1cdbd2cSJim Jagielski 	m_nLastAppliedPos = nCurRow;
1653*b1cdbd2cSJim Jagielski 	m_nRow = nCurRow;
1654*b1cdbd2cSJim Jagielski 	OSL_ENSURE( nCurRow >= m_nKnownCount, "position of last row < known Count, that could not be" );
1655*b1cdbd2cSJim Jagielski 	m_nKnownCount = nCurRow;
1656*b1cdbd2cSJim Jagielski 	m_bFinalCount = sal_True;
1657*b1cdbd2cSJim Jagielski 	return nCurRow != 0;
1658*b1cdbd2cSJim Jagielski }
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski //virtual
1661*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
beforeFirst()1662*b1cdbd2cSJim Jagielski 	::beforeFirst()
1663*b1cdbd2cSJim Jagielski 	throw( SQLException,
1664*b1cdbd2cSJim Jagielski 		   RuntimeException )
1665*b1cdbd2cSJim Jagielski {
1666*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1667*b1cdbd2cSJim Jagielski 
1668*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1669*b1cdbd2cSJim Jagielski 		throw SQLException();
1670*b1cdbd2cSJim Jagielski 
1671*b1cdbd2cSJim Jagielski 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
1672*b1cdbd2cSJim Jagielski 	m_nRow = 0;
1673*b1cdbd2cSJim Jagielski 	m_bAfterLast = sal_False;
1674*b1cdbd2cSJim Jagielski }
1675*b1cdbd2cSJim Jagielski 
1676*b1cdbd2cSJim Jagielski //virtual
1677*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
afterLast()1678*b1cdbd2cSJim Jagielski 	::afterLast()
1679*b1cdbd2cSJim Jagielski 	throw( SQLException,
1680*b1cdbd2cSJim Jagielski 		   RuntimeException )
1681*b1cdbd2cSJim Jagielski {
1682*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski 	if( impl_isForwardOnly() )
1685*b1cdbd2cSJim Jagielski 		throw SQLException();
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
1688*b1cdbd2cSJim Jagielski 	m_nRow = 1;
1689*b1cdbd2cSJim Jagielski 	m_bAfterLast = sal_True;
1690*b1cdbd2cSJim Jagielski }
1691*b1cdbd2cSJim Jagielski 
1692*b1cdbd2cSJim Jagielski //virtual
1693*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
isAfterLast()1694*b1cdbd2cSJim Jagielski 	::isAfterLast()
1695*b1cdbd2cSJim Jagielski 	throw( SQLException,
1696*b1cdbd2cSJim Jagielski 		   RuntimeException )
1697*b1cdbd2cSJim Jagielski {
1698*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1701*b1cdbd2cSJim Jagielski 	if( !m_bAfterLast )
1702*b1cdbd2cSJim Jagielski 		return sal_False;
1703*b1cdbd2cSJim Jagielski 	if( m_nKnownCount )
1704*b1cdbd2cSJim Jagielski 		return m_bAfterLast;
1705*b1cdbd2cSJim Jagielski 	if( m_bFinalCount )
1706*b1cdbd2cSJim Jagielski 		return sal_False;
1707*b1cdbd2cSJim Jagielski 
1708*b1cdbd2cSJim Jagielski 	if( !m_xResultSetOrigin.is() )
1709*b1cdbd2cSJim Jagielski 	{
1710*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1711*b1cdbd2cSJim Jagielski 		return sal_False;
1712*b1cdbd2cSJim Jagielski 	}
1713*b1cdbd2cSJim Jagielski 	aGuard.clear();
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski 	//find out whethter the original resultset contains rows or not
1716*b1cdbd2cSJim Jagielski 	m_xResultSetOrigin->afterLast();
1717*b1cdbd2cSJim Jagielski 
1718*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1719*b1cdbd2cSJim Jagielski 	m_bAfterLastApplied = sal_True;
1720*b1cdbd2cSJim Jagielski 	aGuard.clear();
1721*b1cdbd2cSJim Jagielski 
1722*b1cdbd2cSJim Jagielski 	return m_xResultSetOrigin->isAfterLast();
1723*b1cdbd2cSJim Jagielski }
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski //virtual
1726*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
isBeforeFirst()1727*b1cdbd2cSJim Jagielski 	::isBeforeFirst()
1728*b1cdbd2cSJim Jagielski 	throw( SQLException,
1729*b1cdbd2cSJim Jagielski 		   RuntimeException )
1730*b1cdbd2cSJim Jagielski {
1731*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1732*b1cdbd2cSJim Jagielski 
1733*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
1734*b1cdbd2cSJim Jagielski 	if( m_bAfterLast )
1735*b1cdbd2cSJim Jagielski 		return sal_False;
1736*b1cdbd2cSJim Jagielski 	if( m_nRow )
1737*b1cdbd2cSJim Jagielski 		return sal_False;
1738*b1cdbd2cSJim Jagielski 	if( m_nKnownCount )
1739*b1cdbd2cSJim Jagielski 		return !m_nRow;
1740*b1cdbd2cSJim Jagielski 	if( m_bFinalCount )
1741*b1cdbd2cSJim Jagielski 		return sal_False;
1742*b1cdbd2cSJim Jagielski 
1743*b1cdbd2cSJim Jagielski 	if( !m_xResultSetOrigin.is() )
1744*b1cdbd2cSJim Jagielski 	{
1745*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1746*b1cdbd2cSJim Jagielski 		return sal_False;
1747*b1cdbd2cSJim Jagielski 	}
1748*b1cdbd2cSJim Jagielski 	aGuard.clear();
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski 	//find out whethter the original resultset contains rows or not
1751*b1cdbd2cSJim Jagielski 	m_xResultSetOrigin->beforeFirst();
1752*b1cdbd2cSJim Jagielski 
1753*b1cdbd2cSJim Jagielski 	aGuard.reacquire();
1754*b1cdbd2cSJim Jagielski 	m_bAfterLastApplied = sal_False;
1755*b1cdbd2cSJim Jagielski 	m_nLastAppliedPos = 0;
1756*b1cdbd2cSJim Jagielski 	aGuard.clear();
1757*b1cdbd2cSJim Jagielski 
1758*b1cdbd2cSJim Jagielski 	return m_xResultSetOrigin->isBeforeFirst();
1759*b1cdbd2cSJim Jagielski }
1760*b1cdbd2cSJim Jagielski 
1761*b1cdbd2cSJim Jagielski //virtual
1762*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
isFirst()1763*b1cdbd2cSJim Jagielski 	::isFirst()
1764*b1cdbd2cSJim Jagielski 	throw( SQLException,
1765*b1cdbd2cSJim Jagielski 		   RuntimeException )
1766*b1cdbd2cSJim Jagielski {
1767*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = 0;
1770*b1cdbd2cSJim Jagielski 	Reference< XResultSet > xResultSetOrigin;
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski 	{
1773*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1774*b1cdbd2cSJim Jagielski 		if( m_bAfterLast )
1775*b1cdbd2cSJim Jagielski 			return sal_False;
1776*b1cdbd2cSJim Jagielski 		if( m_nRow != 1 )
1777*b1cdbd2cSJim Jagielski 			return sal_False;
1778*b1cdbd2cSJim Jagielski 		if( m_nKnownCount )
1779*b1cdbd2cSJim Jagielski 			return m_nRow == 1;
1780*b1cdbd2cSJim Jagielski 		if( m_bFinalCount )
1781*b1cdbd2cSJim Jagielski 			return sal_False;
1782*b1cdbd2cSJim Jagielski 
1783*b1cdbd2cSJim Jagielski 		nRow = m_nRow;
1784*b1cdbd2cSJim Jagielski 		xResultSetOrigin = m_xResultSetOrigin;
1785*b1cdbd2cSJim Jagielski 	}
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski 	//need to ask origin
1788*b1cdbd2cSJim Jagielski 	{
1789*b1cdbd2cSJim Jagielski 		if( applyPositionToOrigin( nRow ) )
1790*b1cdbd2cSJim Jagielski 			return xResultSetOrigin->isFirst();
1791*b1cdbd2cSJim Jagielski 		else
1792*b1cdbd2cSJim Jagielski 			return sal_False;
1793*b1cdbd2cSJim Jagielski 	}
1794*b1cdbd2cSJim Jagielski }
1795*b1cdbd2cSJim Jagielski 
1796*b1cdbd2cSJim Jagielski //virtual
1797*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
isLast()1798*b1cdbd2cSJim Jagielski 	::isLast()
1799*b1cdbd2cSJim Jagielski 	throw( SQLException,
1800*b1cdbd2cSJim Jagielski 		   RuntimeException )
1801*b1cdbd2cSJim Jagielski {
1802*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1803*b1cdbd2cSJim Jagielski 
1804*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = 0;
1805*b1cdbd2cSJim Jagielski 	Reference< XResultSet > xResultSetOrigin;
1806*b1cdbd2cSJim Jagielski 	{
1807*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1808*b1cdbd2cSJim Jagielski 		if( m_bAfterLast )
1809*b1cdbd2cSJim Jagielski 			return sal_False;
1810*b1cdbd2cSJim Jagielski 		if( m_nRow < m_nKnownCount )
1811*b1cdbd2cSJim Jagielski 			return sal_False;
1812*b1cdbd2cSJim Jagielski 		if( m_bFinalCount )
1813*b1cdbd2cSJim Jagielski 			return m_nKnownCount && m_nRow == m_nKnownCount;
1814*b1cdbd2cSJim Jagielski 
1815*b1cdbd2cSJim Jagielski 		nRow = m_nRow;
1816*b1cdbd2cSJim Jagielski 		xResultSetOrigin = m_xResultSetOrigin;
1817*b1cdbd2cSJim Jagielski 	}
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski 	//need to ask origin
1820*b1cdbd2cSJim Jagielski 	{
1821*b1cdbd2cSJim Jagielski 		if( applyPositionToOrigin( nRow ) )
1822*b1cdbd2cSJim Jagielski 			return xResultSetOrigin->isLast();
1823*b1cdbd2cSJim Jagielski 		else
1824*b1cdbd2cSJim Jagielski 			return sal_False;
1825*b1cdbd2cSJim Jagielski 	}
1826*b1cdbd2cSJim Jagielski }
1827*b1cdbd2cSJim Jagielski 
1828*b1cdbd2cSJim Jagielski 
1829*b1cdbd2cSJim Jagielski //virtual
1830*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL CachedContentResultSet
getRow()1831*b1cdbd2cSJim Jagielski 	::getRow()
1832*b1cdbd2cSJim Jagielski 	throw( SQLException,
1833*b1cdbd2cSJim Jagielski 		   RuntimeException )
1834*b1cdbd2cSJim Jagielski {
1835*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1836*b1cdbd2cSJim Jagielski 
1837*b1cdbd2cSJim Jagielski 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
1838*b1cdbd2cSJim Jagielski 	if( m_bAfterLast )
1839*b1cdbd2cSJim Jagielski 		return 0;
1840*b1cdbd2cSJim Jagielski 	return m_nRow;
1841*b1cdbd2cSJim Jagielski }
1842*b1cdbd2cSJim Jagielski 
1843*b1cdbd2cSJim Jagielski //virtual
1844*b1cdbd2cSJim Jagielski void SAL_CALL CachedContentResultSet
refreshRow()1845*b1cdbd2cSJim Jagielski 	::refreshRow()
1846*b1cdbd2cSJim Jagielski 	throw( SQLException,
1847*b1cdbd2cSJim Jagielski 		   RuntimeException )
1848*b1cdbd2cSJim Jagielski {
1849*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1850*b1cdbd2cSJim Jagielski 
1851*b1cdbd2cSJim Jagielski 	//the ContentResultSet is static and will not change
1852*b1cdbd2cSJim Jagielski 	//therefore we don't need to reload anything
1853*b1cdbd2cSJim Jagielski }
1854*b1cdbd2cSJim Jagielski 
1855*b1cdbd2cSJim Jagielski //virtual
1856*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
rowUpdated()1857*b1cdbd2cSJim Jagielski 	::rowUpdated()
1858*b1cdbd2cSJim Jagielski 	throw( SQLException,
1859*b1cdbd2cSJim Jagielski 		   RuntimeException )
1860*b1cdbd2cSJim Jagielski {
1861*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1862*b1cdbd2cSJim Jagielski 
1863*b1cdbd2cSJim Jagielski 	//the ContentResultSet is static and will not change
1864*b1cdbd2cSJim Jagielski 	return sal_False;
1865*b1cdbd2cSJim Jagielski }
1866*b1cdbd2cSJim Jagielski //virtual
1867*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
rowInserted()1868*b1cdbd2cSJim Jagielski 	::rowInserted()
1869*b1cdbd2cSJim Jagielski 	throw( SQLException,
1870*b1cdbd2cSJim Jagielski 		   RuntimeException )
1871*b1cdbd2cSJim Jagielski {
1872*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1873*b1cdbd2cSJim Jagielski 
1874*b1cdbd2cSJim Jagielski 	//the ContentResultSet is static and will not change
1875*b1cdbd2cSJim Jagielski 	return sal_False;
1876*b1cdbd2cSJim Jagielski }
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski //virtual
1879*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
rowDeleted()1880*b1cdbd2cSJim Jagielski 	::rowDeleted()
1881*b1cdbd2cSJim Jagielski 	throw( SQLException,
1882*b1cdbd2cSJim Jagielski 		   RuntimeException )
1883*b1cdbd2cSJim Jagielski {
1884*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1885*b1cdbd2cSJim Jagielski 
1886*b1cdbd2cSJim Jagielski 	//the ContentResultSet is static and will not change
1887*b1cdbd2cSJim Jagielski 	return sal_False;
1888*b1cdbd2cSJim Jagielski }
1889*b1cdbd2cSJim Jagielski 
1890*b1cdbd2cSJim Jagielski //virtual
1891*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL CachedContentResultSet
getStatement()1892*b1cdbd2cSJim Jagielski 	::getStatement()
1893*b1cdbd2cSJim Jagielski 	throw( SQLException,
1894*b1cdbd2cSJim Jagielski 		   RuntimeException )
1895*b1cdbd2cSJim Jagielski {
1896*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1897*b1cdbd2cSJim Jagielski 	//@todo ?return anything
1898*b1cdbd2cSJim Jagielski 	return Reference< XInterface >();
1899*b1cdbd2cSJim Jagielski }
1900*b1cdbd2cSJim Jagielski 
1901*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------
1902*b1cdbd2cSJim Jagielski // XRow methods. ( inherited )
1903*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------
1904*b1cdbd2cSJim Jagielski 
1905*b1cdbd2cSJim Jagielski //virtual
1906*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
wasNull()1907*b1cdbd2cSJim Jagielski 	::wasNull()
1908*b1cdbd2cSJim Jagielski 	throw( SQLException,
1909*b1cdbd2cSJim Jagielski 		   RuntimeException )
1910*b1cdbd2cSJim Jagielski {
1911*b1cdbd2cSJim Jagielski 	impl_EnsureNotDisposed();
1912*b1cdbd2cSJim Jagielski 	impl_init_xRowOrigin();
1913*b1cdbd2cSJim Jagielski 	{
1914*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
1915*b1cdbd2cSJim Jagielski 		if( m_bLastReadWasFromCache )
1916*b1cdbd2cSJim Jagielski 			return m_bLastCachedReadWasNull;
1917*b1cdbd2cSJim Jagielski 		if( !m_xRowOrigin.is() )
1918*b1cdbd2cSJim Jagielski 		{
1919*b1cdbd2cSJim Jagielski 			OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1920*b1cdbd2cSJim Jagielski 			return sal_False;
1921*b1cdbd2cSJim Jagielski 		}
1922*b1cdbd2cSJim Jagielski 	}
1923*b1cdbd2cSJim Jagielski 	return m_xRowOrigin->wasNull();
1924*b1cdbd2cSJim Jagielski }
1925*b1cdbd2cSJim Jagielski 
1926*b1cdbd2cSJim Jagielski //virtual
1927*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL CachedContentResultSet
getString(sal_Int32 columnIndex)1928*b1cdbd2cSJim Jagielski 	::getString( sal_Int32 columnIndex )
1929*b1cdbd2cSJim Jagielski 	throw( SQLException,
1930*b1cdbd2cSJim Jagielski 		   RuntimeException )
1931*b1cdbd2cSJim Jagielski {
1932*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getString, OUString );
1933*b1cdbd2cSJim Jagielski }
1934*b1cdbd2cSJim Jagielski 
1935*b1cdbd2cSJim Jagielski //virtual
1936*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL CachedContentResultSet
getBoolean(sal_Int32 columnIndex)1937*b1cdbd2cSJim Jagielski 	::getBoolean( sal_Int32 columnIndex )
1938*b1cdbd2cSJim Jagielski 	throw( SQLException,
1939*b1cdbd2cSJim Jagielski 		   RuntimeException )
1940*b1cdbd2cSJim Jagielski {
1941*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getBoolean, sal_Bool );
1942*b1cdbd2cSJim Jagielski }
1943*b1cdbd2cSJim Jagielski 
1944*b1cdbd2cSJim Jagielski //virtual
1945*b1cdbd2cSJim Jagielski sal_Int8 SAL_CALL CachedContentResultSet
getByte(sal_Int32 columnIndex)1946*b1cdbd2cSJim Jagielski 	::getByte( sal_Int32 columnIndex )
1947*b1cdbd2cSJim Jagielski 	throw( SQLException,
1948*b1cdbd2cSJim Jagielski 		   RuntimeException )
1949*b1cdbd2cSJim Jagielski {
1950*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getByte, sal_Int8 );
1951*b1cdbd2cSJim Jagielski }
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski //virtual
1954*b1cdbd2cSJim Jagielski sal_Int16 SAL_CALL CachedContentResultSet
getShort(sal_Int32 columnIndex)1955*b1cdbd2cSJim Jagielski 	::getShort( sal_Int32 columnIndex )
1956*b1cdbd2cSJim Jagielski 	throw( SQLException,
1957*b1cdbd2cSJim Jagielski 		   RuntimeException )
1958*b1cdbd2cSJim Jagielski {
1959*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getShort, sal_Int16 );
1960*b1cdbd2cSJim Jagielski }
1961*b1cdbd2cSJim Jagielski 
1962*b1cdbd2cSJim Jagielski //virtual
1963*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL CachedContentResultSet
getInt(sal_Int32 columnIndex)1964*b1cdbd2cSJim Jagielski 	::getInt( sal_Int32 columnIndex )
1965*b1cdbd2cSJim Jagielski 	throw( SQLException,
1966*b1cdbd2cSJim Jagielski 		   RuntimeException )
1967*b1cdbd2cSJim Jagielski {
1968*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getInt, sal_Int32 );
1969*b1cdbd2cSJim Jagielski }
1970*b1cdbd2cSJim Jagielski 
1971*b1cdbd2cSJim Jagielski //virtual
1972*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL CachedContentResultSet
getLong(sal_Int32 columnIndex)1973*b1cdbd2cSJim Jagielski 	::getLong( sal_Int32 columnIndex )
1974*b1cdbd2cSJim Jagielski 	throw( SQLException,
1975*b1cdbd2cSJim Jagielski 		   RuntimeException )
1976*b1cdbd2cSJim Jagielski {
1977*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getLong, sal_Int64 );
1978*b1cdbd2cSJim Jagielski }
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski //virtual
1981*b1cdbd2cSJim Jagielski float SAL_CALL CachedContentResultSet
getFloat(sal_Int32 columnIndex)1982*b1cdbd2cSJim Jagielski 	::getFloat( sal_Int32 columnIndex )
1983*b1cdbd2cSJim Jagielski 	throw( SQLException,
1984*b1cdbd2cSJim Jagielski 		   RuntimeException )
1985*b1cdbd2cSJim Jagielski {
1986*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getFloat, float );
1987*b1cdbd2cSJim Jagielski }
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski //virtual
1990*b1cdbd2cSJim Jagielski double SAL_CALL CachedContentResultSet
getDouble(sal_Int32 columnIndex)1991*b1cdbd2cSJim Jagielski 	::getDouble( sal_Int32 columnIndex )
1992*b1cdbd2cSJim Jagielski 	throw( SQLException,
1993*b1cdbd2cSJim Jagielski 		   RuntimeException )
1994*b1cdbd2cSJim Jagielski {
1995*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getDouble, double );
1996*b1cdbd2cSJim Jagielski }
1997*b1cdbd2cSJim Jagielski 
1998*b1cdbd2cSJim Jagielski //virtual
1999*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > SAL_CALL CachedContentResultSet
getBytes(sal_Int32 columnIndex)2000*b1cdbd2cSJim Jagielski 	::getBytes( sal_Int32 columnIndex )
2001*b1cdbd2cSJim Jagielski 	throw( SQLException,
2002*b1cdbd2cSJim Jagielski 		   RuntimeException )
2003*b1cdbd2cSJim Jagielski {
2004*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getBytes, Sequence< sal_Int8 > );
2005*b1cdbd2cSJim Jagielski }
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski //virtual
2008*b1cdbd2cSJim Jagielski Date SAL_CALL CachedContentResultSet
getDate(sal_Int32 columnIndex)2009*b1cdbd2cSJim Jagielski 	::getDate( sal_Int32 columnIndex )
2010*b1cdbd2cSJim Jagielski 	throw( SQLException,
2011*b1cdbd2cSJim Jagielski 		   RuntimeException )
2012*b1cdbd2cSJim Jagielski {
2013*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getDate, Date );
2014*b1cdbd2cSJim Jagielski }
2015*b1cdbd2cSJim Jagielski 
2016*b1cdbd2cSJim Jagielski //virtual
2017*b1cdbd2cSJim Jagielski Time SAL_CALL CachedContentResultSet
getTime(sal_Int32 columnIndex)2018*b1cdbd2cSJim Jagielski 	::getTime( sal_Int32 columnIndex )
2019*b1cdbd2cSJim Jagielski 	throw( SQLException,
2020*b1cdbd2cSJim Jagielski 		   RuntimeException )
2021*b1cdbd2cSJim Jagielski {
2022*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getTime, Time );
2023*b1cdbd2cSJim Jagielski }
2024*b1cdbd2cSJim Jagielski 
2025*b1cdbd2cSJim Jagielski //virtual
2026*b1cdbd2cSJim Jagielski DateTime SAL_CALL CachedContentResultSet
getTimestamp(sal_Int32 columnIndex)2027*b1cdbd2cSJim Jagielski 	::getTimestamp( sal_Int32 columnIndex )
2028*b1cdbd2cSJim Jagielski 	throw( SQLException,
2029*b1cdbd2cSJim Jagielski 		   RuntimeException )
2030*b1cdbd2cSJim Jagielski {
2031*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getTimestamp, DateTime );
2032*b1cdbd2cSJim Jagielski }
2033*b1cdbd2cSJim Jagielski 
2034*b1cdbd2cSJim Jagielski //virtual
2035*b1cdbd2cSJim Jagielski Reference< com::sun::star::io::XInputStream >
2036*b1cdbd2cSJim Jagielski 	SAL_CALL CachedContentResultSet
getBinaryStream(sal_Int32 columnIndex)2037*b1cdbd2cSJim Jagielski 	::getBinaryStream( sal_Int32 columnIndex )
2038*b1cdbd2cSJim Jagielski 	throw( SQLException,
2039*b1cdbd2cSJim Jagielski 		   RuntimeException )
2040*b1cdbd2cSJim Jagielski {
2041*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getBinaryStream, Reference< com::sun::star::io::XInputStream > );
2042*b1cdbd2cSJim Jagielski }
2043*b1cdbd2cSJim Jagielski 
2044*b1cdbd2cSJim Jagielski //virtual
2045*b1cdbd2cSJim Jagielski Reference< com::sun::star::io::XInputStream >
2046*b1cdbd2cSJim Jagielski 	SAL_CALL CachedContentResultSet
getCharacterStream(sal_Int32 columnIndex)2047*b1cdbd2cSJim Jagielski 	::getCharacterStream( sal_Int32 columnIndex )
2048*b1cdbd2cSJim Jagielski 	throw( SQLException,
2049*b1cdbd2cSJim Jagielski 		   RuntimeException )
2050*b1cdbd2cSJim Jagielski {
2051*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getCharacterStream, Reference< com::sun::star::io::XInputStream > );
2052*b1cdbd2cSJim Jagielski }
2053*b1cdbd2cSJim Jagielski 
2054*b1cdbd2cSJim Jagielski //virtual
2055*b1cdbd2cSJim Jagielski Any SAL_CALL CachedContentResultSet
getObject(sal_Int32 columnIndex,const Reference<com::sun::star::container::XNameAccess> & typeMap)2056*b1cdbd2cSJim Jagielski 	::getObject( sal_Int32 columnIndex,
2057*b1cdbd2cSJim Jagielski 		   const Reference<
2058*b1cdbd2cSJim Jagielski 			com::sun::star::container::XNameAccess >& typeMap )
2059*b1cdbd2cSJim Jagielski 	throw( SQLException,
2060*b1cdbd2cSJim Jagielski 		   RuntimeException )
2061*b1cdbd2cSJim Jagielski {
2062*b1cdbd2cSJim Jagielski 	//if you change this macro please pay attention to
2063*b1cdbd2cSJim Jagielski 	//define XROW_GETXXX, where this is similar implemented
2064*b1cdbd2cSJim Jagielski 
2065*b1cdbd2cSJim Jagielski 	ReacquireableGuard aGuard( m_aMutex );
2066*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = m_nRow;
2067*b1cdbd2cSJim Jagielski 	sal_Int32 nFetchSize = m_nFetchSize;
2068*b1cdbd2cSJim Jagielski 	sal_Int32 nFetchDirection = m_nFetchDirection;
2069*b1cdbd2cSJim Jagielski 	if( !m_aCache.hasRow( nRow ) )
2070*b1cdbd2cSJim Jagielski 	{
2071*b1cdbd2cSJim Jagielski 		if( !m_aCache.hasCausedException( nRow ) )
2072*b1cdbd2cSJim Jagielski 		{
2073*b1cdbd2cSJim Jagielski 			if( !m_xFetchProvider.is() )
2074*b1cdbd2cSJim Jagielski 			{
2075*b1cdbd2cSJim Jagielski 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
2076*b1cdbd2cSJim Jagielski 				return Any();
2077*b1cdbd2cSJim Jagielski 			}
2078*b1cdbd2cSJim Jagielski 			aGuard.clear();
2079*b1cdbd2cSJim Jagielski 
2080*b1cdbd2cSJim Jagielski 			impl_fetchData( nRow, nFetchSize, nFetchDirection );
2081*b1cdbd2cSJim Jagielski 		}
2082*b1cdbd2cSJim Jagielski 		aGuard.reacquire();
2083*b1cdbd2cSJim Jagielski 		if( !m_aCache.hasRow( nRow ) )
2084*b1cdbd2cSJim Jagielski 		{
2085*b1cdbd2cSJim Jagielski 			m_bLastReadWasFromCache = sal_False;
2086*b1cdbd2cSJim Jagielski 			aGuard.clear();
2087*b1cdbd2cSJim Jagielski 			applyPositionToOrigin( nRow );
2088*b1cdbd2cSJim Jagielski 			impl_init_xRowOrigin();
2089*b1cdbd2cSJim Jagielski 			return m_xRowOrigin->getObject( columnIndex, typeMap );
2090*b1cdbd2cSJim Jagielski 		}
2091*b1cdbd2cSJim Jagielski 	}
2092*b1cdbd2cSJim Jagielski 	//@todo: pay attention to typeMap
2093*b1cdbd2cSJim Jagielski 	const Any& rValue = m_aCache.getAny( nRow, columnIndex );
2094*b1cdbd2cSJim Jagielski 	Any aRet;
2095*b1cdbd2cSJim Jagielski 	m_bLastReadWasFromCache = sal_True;
2096*b1cdbd2cSJim Jagielski 	m_bLastCachedReadWasNull = !( rValue >>= aRet );
2097*b1cdbd2cSJim Jagielski 	return aRet;
2098*b1cdbd2cSJim Jagielski }
2099*b1cdbd2cSJim Jagielski 
2100*b1cdbd2cSJim Jagielski //virtual
2101*b1cdbd2cSJim Jagielski Reference< XRef > SAL_CALL CachedContentResultSet
getRef(sal_Int32 columnIndex)2102*b1cdbd2cSJim Jagielski 	::getRef( sal_Int32 columnIndex )
2103*b1cdbd2cSJim Jagielski 	throw( SQLException,
2104*b1cdbd2cSJim Jagielski 		   RuntimeException )
2105*b1cdbd2cSJim Jagielski {
2106*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getRef, Reference< XRef > );
2107*b1cdbd2cSJim Jagielski }
2108*b1cdbd2cSJim Jagielski 
2109*b1cdbd2cSJim Jagielski //virtual
2110*b1cdbd2cSJim Jagielski Reference< XBlob > SAL_CALL CachedContentResultSet
getBlob(sal_Int32 columnIndex)2111*b1cdbd2cSJim Jagielski 	::getBlob( sal_Int32 columnIndex )
2112*b1cdbd2cSJim Jagielski 	throw( SQLException,
2113*b1cdbd2cSJim Jagielski 		   RuntimeException )
2114*b1cdbd2cSJim Jagielski {
2115*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getBlob, Reference< XBlob > );
2116*b1cdbd2cSJim Jagielski }
2117*b1cdbd2cSJim Jagielski 
2118*b1cdbd2cSJim Jagielski //virtual
2119*b1cdbd2cSJim Jagielski Reference< XClob > SAL_CALL CachedContentResultSet
getClob(sal_Int32 columnIndex)2120*b1cdbd2cSJim Jagielski 	::getClob( sal_Int32 columnIndex )
2121*b1cdbd2cSJim Jagielski 	throw( SQLException,
2122*b1cdbd2cSJim Jagielski 		   RuntimeException )
2123*b1cdbd2cSJim Jagielski {
2124*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getClob, Reference< XClob > );
2125*b1cdbd2cSJim Jagielski }
2126*b1cdbd2cSJim Jagielski 
2127*b1cdbd2cSJim Jagielski //virtual
2128*b1cdbd2cSJim Jagielski Reference< XArray > SAL_CALL CachedContentResultSet
getArray(sal_Int32 columnIndex)2129*b1cdbd2cSJim Jagielski 	::getArray( sal_Int32 columnIndex )
2130*b1cdbd2cSJim Jagielski 	throw( SQLException,
2131*b1cdbd2cSJim Jagielski 		   RuntimeException )
2132*b1cdbd2cSJim Jagielski {
2133*b1cdbd2cSJim Jagielski 	XROW_GETXXX( getArray, Reference< XArray > );
2134*b1cdbd2cSJim Jagielski }
2135*b1cdbd2cSJim Jagielski 
2136*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------
2137*b1cdbd2cSJim Jagielski // Type Converter Support
2138*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------
2139*b1cdbd2cSJim Jagielski 
getTypeConverter()2140*b1cdbd2cSJim Jagielski const Reference< XTypeConverter >& CachedContentResultSet::getTypeConverter()
2141*b1cdbd2cSJim Jagielski {
2142*b1cdbd2cSJim Jagielski     osl::Guard< osl::Mutex > aGuard( m_aMutex );
2143*b1cdbd2cSJim Jagielski 
2144*b1cdbd2cSJim Jagielski 	if ( !m_bTriedToGetTypeConverter && !m_xTypeConverter.is() )
2145*b1cdbd2cSJim Jagielski 	{
2146*b1cdbd2cSJim Jagielski 		m_bTriedToGetTypeConverter = sal_True;
2147*b1cdbd2cSJim Jagielski 		m_xTypeConverter = Reference< XTypeConverter >(
2148*b1cdbd2cSJim Jagielski 								m_xSMgr->createInstance(
2149*b1cdbd2cSJim Jagielski 									OUString::createFromAscii(
2150*b1cdbd2cSJim Jagielski 										"com.sun.star.script.Converter" ) ),
2151*b1cdbd2cSJim Jagielski 								UNO_QUERY );
2152*b1cdbd2cSJim Jagielski 
2153*b1cdbd2cSJim Jagielski         OSL_ENSURE( m_xTypeConverter.is(),
2154*b1cdbd2cSJim Jagielski 					"PropertyValueSet::getTypeConverter() - "
2155*b1cdbd2cSJim Jagielski 					"Service 'com.sun.star.script.Converter' n/a!" );
2156*b1cdbd2cSJim Jagielski 	}
2157*b1cdbd2cSJim Jagielski 	return m_xTypeConverter;
2158*b1cdbd2cSJim Jagielski }
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2161*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2162*b1cdbd2cSJim Jagielski // class CachedContentResultSetFactory
2163*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2164*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2165*b1cdbd2cSJim Jagielski 
CachedContentResultSetFactory(const Reference<XMultiServiceFactory> & rSMgr)2166*b1cdbd2cSJim Jagielski CachedContentResultSetFactory::CachedContentResultSetFactory(
2167*b1cdbd2cSJim Jagielski 		const Reference< XMultiServiceFactory > & rSMgr )
2168*b1cdbd2cSJim Jagielski {
2169*b1cdbd2cSJim Jagielski 	m_xSMgr = rSMgr;
2170*b1cdbd2cSJim Jagielski }
2171*b1cdbd2cSJim Jagielski 
~CachedContentResultSetFactory()2172*b1cdbd2cSJim Jagielski CachedContentResultSetFactory::~CachedContentResultSetFactory()
2173*b1cdbd2cSJim Jagielski {
2174*b1cdbd2cSJim Jagielski }
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2177*b1cdbd2cSJim Jagielski // CachedContentResultSetFactory XInterface methods.
2178*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2179*b1cdbd2cSJim Jagielski 
2180*b1cdbd2cSJim Jagielski XINTERFACE_IMPL_3( CachedContentResultSetFactory,
2181*b1cdbd2cSJim Jagielski 				   XTypeProvider,
2182*b1cdbd2cSJim Jagielski 				   XServiceInfo,
2183*b1cdbd2cSJim Jagielski 				   XCachedContentResultSetFactory );
2184*b1cdbd2cSJim Jagielski 
2185*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2186*b1cdbd2cSJim Jagielski // CachedContentResultSetFactory XTypeProvider methods.
2187*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2188*b1cdbd2cSJim Jagielski 
2189*b1cdbd2cSJim Jagielski XTYPEPROVIDER_IMPL_3( CachedContentResultSetFactory,
2190*b1cdbd2cSJim Jagielski 					  XTypeProvider,
2191*b1cdbd2cSJim Jagielski 				   	  XServiceInfo,
2192*b1cdbd2cSJim Jagielski 					  XCachedContentResultSetFactory );
2193*b1cdbd2cSJim Jagielski 
2194*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2195*b1cdbd2cSJim Jagielski // CachedContentResultSetFactory XServiceInfo methods.
2196*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2197*b1cdbd2cSJim Jagielski 
2198*b1cdbd2cSJim Jagielski XSERVICEINFO_IMPL_1( CachedContentResultSetFactory,
2199*b1cdbd2cSJim Jagielski 					 OUString::createFromAscii(
2200*b1cdbd2cSJim Jagielski 			   			"com.sun.star.comp.ucb.CachedContentResultSetFactory" ),
2201*b1cdbd2cSJim Jagielski 	 		   		 OUString::createFromAscii(
2202*b1cdbd2cSJim Jagielski 					 	CACHED_CONTENT_RESULTSET_FACTORY_NAME ) );
2203*b1cdbd2cSJim Jagielski 
2204*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2205*b1cdbd2cSJim Jagielski // Service factory implementation.
2206*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2207*b1cdbd2cSJim Jagielski 
2208*b1cdbd2cSJim Jagielski ONE_INSTANCE_SERVICE_FACTORY_IMPL( CachedContentResultSetFactory );
2209*b1cdbd2cSJim Jagielski 
2210*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2211*b1cdbd2cSJim Jagielski // CachedContentResultSetFactory XCachedContentResultSetFactory methods.
2212*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
2213*b1cdbd2cSJim Jagielski 
2214*b1cdbd2cSJim Jagielski 	//virtual
2215*b1cdbd2cSJim Jagielski Reference< XResultSet > SAL_CALL CachedContentResultSetFactory
createCachedContentResultSet(const Reference<XResultSet> & xSource,const Reference<XContentIdentifierMapping> & xMapping)2216*b1cdbd2cSJim Jagielski 	::createCachedContentResultSet(
2217*b1cdbd2cSJim Jagielski 			const Reference< XResultSet > & xSource,
2218*b1cdbd2cSJim Jagielski 			const Reference< XContentIdentifierMapping > & xMapping )
2219*b1cdbd2cSJim Jagielski 			throw( com::sun::star::uno::RuntimeException )
2220*b1cdbd2cSJim Jagielski {
2221*b1cdbd2cSJim Jagielski 	Reference< XResultSet > xRet;
2222*b1cdbd2cSJim Jagielski     xRet = new CachedContentResultSet( m_xSMgr, xSource, xMapping );
2223*b1cdbd2cSJim Jagielski 	return xRet;
2224*b1cdbd2cSJim Jagielski }
2225*b1cdbd2cSJim Jagielski 
2226