xref: /aoo42x/main/ucb/source/ucp/file/filrset.cxx (revision 421ed02e)
12f86921cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
32f86921cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
42f86921cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
52f86921cSAndrew Rist  * distributed with this work for additional information
62f86921cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
72f86921cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
82f86921cSAndrew Rist  * "License"); you may not use this file except in compliance
92f86921cSAndrew Rist  * with the License.  You may obtain a copy of the License at
102f86921cSAndrew Rist  *
112f86921cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
122f86921cSAndrew Rist  *
132f86921cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
142f86921cSAndrew Rist  * software distributed under the License is distributed on an
152f86921cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162f86921cSAndrew Rist  * KIND, either express or implied.  See the License for the
172f86921cSAndrew Rist  * specific language governing permissions and limitations
182f86921cSAndrew Rist  * under the License.
192f86921cSAndrew Rist  *
202f86921cSAndrew Rist  *************************************************************/
212f86921cSAndrew Rist 
222f86921cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25*421ed02eSdamjan #include "precompiled_file.hxx"
26cdf0e10cSrcweir #include <com/sun/star/ucb/WelcomeDynamicResultSetStruct.hpp>
27cdf0e10cSrcweir #include "filid.hxx"
28cdf0e10cSrcweir #include "shell.hxx"
29cdf0e10cSrcweir #include "filprp.hxx"
30cdf0e10cSrcweir #include "filrset.hxx"
31cdf0e10cSrcweir #include <com/sun/star/ucb/OpenMode.hpp>
32cdf0e10cSrcweir #include "prov.hxx"
33cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBBUTE_HPP_
36cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir #include <com/sun/star/ucb/ListActionType.hpp>
39cdf0e10cSrcweir #include <com/sun/star/ucb/XSourceInitialization.hpp>
40cdf0e10cSrcweir #include <com/sun/star/ucb/XCachedDynamicResultSetStubFactory.hpp>
41cdf0e10cSrcweir #include <ucbhelper/resultsetmetadata.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir using namespace fileaccess;
44cdf0e10cSrcweir using namespace com::sun::star;
45cdf0e10cSrcweir 
XResultSet_impl(shell * pMyShell,const rtl::OUString & aUnqPath,sal_Int32 OpenMode,const uno::Sequence<beans::Property> & seq,const uno::Sequence<ucb::NumberedSortingInfo> & seqSort)46cdf0e10cSrcweir XResultSet_impl::XResultSet_impl(
47cdf0e10cSrcweir     shell* pMyShell,
48cdf0e10cSrcweir     const rtl::OUString& aUnqPath,
49cdf0e10cSrcweir     sal_Int32 OpenMode,
50cdf0e10cSrcweir     const uno::Sequence< beans::Property >& seq,
51cdf0e10cSrcweir     const uno::Sequence< ucb::NumberedSortingInfo >& seqSort )
52cdf0e10cSrcweir 	: m_pMyShell( pMyShell ),
53cdf0e10cSrcweir 	  m_xProvider( pMyShell->m_pProvider ),
54cdf0e10cSrcweir 	  m_nRow( -1 ),
55cdf0e10cSrcweir 	  m_nOpenMode( OpenMode ),
56cdf0e10cSrcweir 	  m_bRowCountFinal( false ),
57cdf0e10cSrcweir 	  m_aBaseDirectory( aUnqPath ),
58cdf0e10cSrcweir 	  m_aFolder( aUnqPath ),
59cdf0e10cSrcweir 	  m_sProperty( seq ),
60cdf0e10cSrcweir 	  m_sSortingInfo( seqSort ),
61cdf0e10cSrcweir 	  m_pDisposeEventListeners( 0 ),
62cdf0e10cSrcweir 	  m_pRowCountListeners( 0 ),
63cdf0e10cSrcweir 	  m_pIsFinalListeners( 0 ),
64cdf0e10cSrcweir 	  m_bStatic( false ),
65cdf0e10cSrcweir 	  m_nErrorCode( TASKHANDLER_NO_ERROR ),
66cdf0e10cSrcweir 	  m_nMinorErrorCode( TASKHANDLER_NO_ERROR )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir     osl::FileBase::RC err = m_aFolder.open();
69cdf0e10cSrcweir     if(  err != osl::FileBase::E_None )
70cdf0e10cSrcweir     {
71cdf0e10cSrcweir         m_nIsOpen = false;
72cdf0e10cSrcweir         m_aFolder.close();
73cdf0e10cSrcweir 
74cdf0e10cSrcweir         m_nErrorCode = TASKHANDLING_OPEN_FOR_DIRECTORYLISTING;
75cdf0e10cSrcweir         m_nMinorErrorCode = err;
76cdf0e10cSrcweir     }
77cdf0e10cSrcweir     else
78cdf0e10cSrcweir         m_nIsOpen = true;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	m_pMyShell->registerNotifier( m_aBaseDirectory,this );
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
~XResultSet_impl()84cdf0e10cSrcweir XResultSet_impl::~XResultSet_impl()
85cdf0e10cSrcweir {
86cdf0e10cSrcweir 	m_pMyShell->deregisterNotifier( m_aBaseDirectory,this );
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     if( m_nIsOpen )
89cdf0e10cSrcweir 		m_aFolder.close();
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	delete m_pDisposeEventListeners;
92cdf0e10cSrcweir 	delete m_pRowCountListeners;
93cdf0e10cSrcweir 	delete m_pIsFinalListeners;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 
CtorSuccess()98cdf0e10cSrcweir sal_Int32 SAL_CALL XResultSet_impl::CtorSuccess()
99cdf0e10cSrcweir {
100cdf0e10cSrcweir 	return m_nErrorCode;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
getMinorError()105cdf0e10cSrcweir sal_Int32 SAL_CALL XResultSet_impl::getMinorError()
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	return m_nMinorErrorCode;
108cdf0e10cSrcweir }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 
111cdf0e10cSrcweir void SAL_CALL
acquire(void)112cdf0e10cSrcweir XResultSet_impl::acquire(
113cdf0e10cSrcweir 	void )
114cdf0e10cSrcweir 	throw()
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 	OWeakObject::acquire();
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 
120cdf0e10cSrcweir void SAL_CALL
release(void)121cdf0e10cSrcweir XResultSet_impl::release(
122cdf0e10cSrcweir 	void )
123cdf0e10cSrcweir 	throw()
124cdf0e10cSrcweir {
125cdf0e10cSrcweir 	OWeakObject::release();
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 
130cdf0e10cSrcweir uno::Any SAL_CALL
queryInterface(const uno::Type & rType)131cdf0e10cSrcweir XResultSet_impl::queryInterface(
132cdf0e10cSrcweir 	const uno::Type& rType )
133cdf0e10cSrcweir 	throw( uno::RuntimeException )
134cdf0e10cSrcweir {
135cdf0e10cSrcweir 	uno::Any aRet = cppu::queryInterface(
136cdf0e10cSrcweir         rType,
137cdf0e10cSrcweir         SAL_STATIC_CAST( lang::XComponent*, this),
138cdf0e10cSrcweir         SAL_STATIC_CAST( lang::XTypeProvider*, this),
139cdf0e10cSrcweir         SAL_STATIC_CAST( lang::XEventListener*, this),
140cdf0e10cSrcweir         SAL_STATIC_CAST( sdbc::XRow*, this),
141cdf0e10cSrcweir         SAL_STATIC_CAST( sdbc::XResultSet*, this),
142cdf0e10cSrcweir         SAL_STATIC_CAST( sdbc::XCloseable*, this),
143cdf0e10cSrcweir         SAL_STATIC_CAST( sdbc::XResultSetMetaDataSupplier*, this),
144cdf0e10cSrcweir         SAL_STATIC_CAST( beans::XPropertySet*, this ),
145cdf0e10cSrcweir         SAL_STATIC_CAST( ucb::XContentAccess*, this),
146cdf0e10cSrcweir         SAL_STATIC_CAST( ucb::XDynamicResultSet*,this) );
147cdf0e10cSrcweir 	return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 
151cdf0e10cSrcweir void SAL_CALL
disposing(const lang::EventObject &)152cdf0e10cSrcweir XResultSet_impl::disposing( const lang::EventObject& )
153cdf0e10cSrcweir 	throw( uno::RuntimeException )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir 	// To do, but what
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 
XTYPEPROVIDER_IMPL_10(XResultSet_impl,lang::XTypeProvider,lang::XTypeProvider,lang::XEventListener,sdbc::XRow,sdbc::XResultSet,XDynamicResultSet,sdbc::XCloseable,sdbc::XResultSetMetaDataSupplier,beans::XPropertySet,ucb::XContentAccess)159cdf0e10cSrcweir XTYPEPROVIDER_IMPL_10( XResultSet_impl,
160cdf0e10cSrcweir 					   lang::XTypeProvider,
161cdf0e10cSrcweir 					   lang::XTypeProvider,
162cdf0e10cSrcweir 					   lang::XEventListener,
163cdf0e10cSrcweir 					   sdbc::XRow,
164cdf0e10cSrcweir 					   sdbc::XResultSet,
165cdf0e10cSrcweir 					   XDynamicResultSet,
166cdf0e10cSrcweir 					   sdbc::XCloseable,
167cdf0e10cSrcweir 					   sdbc::XResultSetMetaDataSupplier,
168cdf0e10cSrcweir 					   beans::XPropertySet,
169cdf0e10cSrcweir 					   ucb::XContentAccess )
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 
172cdf0e10cSrcweir void SAL_CALL
173cdf0e10cSrcweir XResultSet_impl::addEventListener(
174cdf0e10cSrcweir 	const uno::Reference< lang::XEventListener >& Listener )
175cdf0e10cSrcweir 	throw( uno::RuntimeException )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 	if ( ! m_pDisposeEventListeners )
180cdf0e10cSrcweir 		m_pDisposeEventListeners =
181cdf0e10cSrcweir 			new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	m_pDisposeEventListeners->addInterface( Listener );
184cdf0e10cSrcweir }
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 
187cdf0e10cSrcweir void SAL_CALL
removeEventListener(const uno::Reference<lang::XEventListener> & Listener)188cdf0e10cSrcweir XResultSet_impl::removeEventListener(
189cdf0e10cSrcweir 	const uno::Reference< lang::XEventListener >& Listener )
190cdf0e10cSrcweir 	throw( uno::RuntimeException )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 	if ( m_pDisposeEventListeners )
195cdf0e10cSrcweir 		m_pDisposeEventListeners->removeInterface( Listener );
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 
200cdf0e10cSrcweir void SAL_CALL
dispose()201cdf0e10cSrcweir XResultSet_impl::dispose()
202cdf0e10cSrcweir 	throw( uno::RuntimeException )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	lang::EventObject aEvt;
207cdf0e10cSrcweir 	aEvt.Source = static_cast< lang::XComponent * >( this );
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 	if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
210cdf0e10cSrcweir 	{
211cdf0e10cSrcweir 		m_pDisposeEventListeners->disposeAndClear( aEvt );
212cdf0e10cSrcweir 	}
213cdf0e10cSrcweir 	if( m_pRowCountListeners && m_pRowCountListeners->getLength() )
214cdf0e10cSrcweir 	{
215cdf0e10cSrcweir 		m_pRowCountListeners->disposeAndClear( aEvt );
216cdf0e10cSrcweir 	}
217cdf0e10cSrcweir 	if( m_pIsFinalListeners && m_pIsFinalListeners->getLength() )
218cdf0e10cSrcweir 	{
219cdf0e10cSrcweir 		m_pIsFinalListeners->disposeAndClear( aEvt );
220cdf0e10cSrcweir 	}
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 
rowCountChanged()225cdf0e10cSrcweir void XResultSet_impl::rowCountChanged()
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	sal_Int32 aOldValue,aNewValue;
228cdf0e10cSrcweir 	uno::Sequence< uno::Reference< uno::XInterface > > seq;
229cdf0e10cSrcweir 	{
230cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
231cdf0e10cSrcweir 		if( m_pRowCountListeners )
232cdf0e10cSrcweir 			seq = m_pRowCountListeners->getElements();
233cdf0e10cSrcweir 		aNewValue = m_aItems.size();
234cdf0e10cSrcweir 		aOldValue = aNewValue-1;
235cdf0e10cSrcweir 	}
236cdf0e10cSrcweir 	beans::PropertyChangeEvent aEv;
237cdf0e10cSrcweir 	aEv.PropertyName = rtl::OUString::createFromAscii( "RowCount" );
238cdf0e10cSrcweir 	aEv.Further = false;
239cdf0e10cSrcweir 	aEv.PropertyHandle = -1;
240cdf0e10cSrcweir 	aEv.OldValue <<= aOldValue;
241cdf0e10cSrcweir 	aEv.NewValue <<= aNewValue;
242cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < seq.getLength(); ++i )
243cdf0e10cSrcweir 	{
244cdf0e10cSrcweir 		uno::Reference< beans::XPropertyChangeListener > listener(
245cdf0e10cSrcweir             seq[i], uno::UNO_QUERY );
246cdf0e10cSrcweir 		if( listener.is() )
247cdf0e10cSrcweir 			listener->propertyChange( aEv );
248cdf0e10cSrcweir 	}
249cdf0e10cSrcweir }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 
isFinalChanged()252cdf0e10cSrcweir void XResultSet_impl::isFinalChanged()
253cdf0e10cSrcweir {
254cdf0e10cSrcweir 	uno::Sequence< uno::Reference< XInterface > > seq;
255cdf0e10cSrcweir 	{
256cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
257cdf0e10cSrcweir 		if( m_pIsFinalListeners )
258cdf0e10cSrcweir 			seq = m_pIsFinalListeners->getElements();
259cdf0e10cSrcweir 		m_bRowCountFinal = true;
260cdf0e10cSrcweir 	}
261cdf0e10cSrcweir 	beans::PropertyChangeEvent aEv;
262cdf0e10cSrcweir 	aEv.PropertyName = rtl::OUString::createFromAscii( "IsRowCountFinal" );
263cdf0e10cSrcweir 	aEv.Further = false;
264cdf0e10cSrcweir 	aEv.PropertyHandle = -1;
265cdf0e10cSrcweir 	sal_Bool fval = false;
266cdf0e10cSrcweir 	sal_Bool tval = true;
267cdf0e10cSrcweir 	aEv.OldValue <<= fval;
268cdf0e10cSrcweir 	aEv.NewValue <<= tval;
269cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < seq.getLength(); ++i )
270cdf0e10cSrcweir 	{
271cdf0e10cSrcweir 		uno::Reference< beans::XPropertyChangeListener > listener(
272cdf0e10cSrcweir             seq[i], uno::UNO_QUERY );
273cdf0e10cSrcweir 		if( listener.is() )
274cdf0e10cSrcweir 			listener->propertyChange( aEv );
275cdf0e10cSrcweir 	}
276cdf0e10cSrcweir }
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 
279cdf0e10cSrcweir sal_Bool SAL_CALL
OneMore(void)280cdf0e10cSrcweir XResultSet_impl::OneMore(
281cdf0e10cSrcweir 	void )
282cdf0e10cSrcweir 	throw( sdbc::SQLException,
283cdf0e10cSrcweir 		   uno::RuntimeException )
284cdf0e10cSrcweir {
285cdf0e10cSrcweir 	if( ! m_nIsOpen )
286cdf0e10cSrcweir         return false;
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 	osl::FileBase::RC err;
289cdf0e10cSrcweir 	sal_Bool IsRegular;
290cdf0e10cSrcweir 	rtl::OUString aUnqPath;
291cdf0e10cSrcweir 	osl::DirectoryItem  m_aDirIte;
292cdf0e10cSrcweir 	uno::Reference< sdbc::XRow > aRow;
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 	while( true )
295cdf0e10cSrcweir 	{
296cdf0e10cSrcweir 		err = m_aFolder.getNextItem( m_aDirIte );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 		if( err == osl::FileBase::E_NOENT || err == osl::FileBase::E_INVAL )
299cdf0e10cSrcweir 		{
300cdf0e10cSrcweir 			m_aFolder.close();
301cdf0e10cSrcweir 			isFinalChanged();
302cdf0e10cSrcweir 			return ( m_nIsOpen = false );
303cdf0e10cSrcweir 		}
304cdf0e10cSrcweir 		else if( err == osl::FileBase::E_None )
305cdf0e10cSrcweir 		{
306cdf0e10cSrcweir 			aRow = m_pMyShell->getv(
307cdf0e10cSrcweir                 this, m_sProperty, m_aDirIte, aUnqPath, IsRegular );
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 			if( m_nOpenMode == ucb::OpenMode::DOCUMENTS && IsRegular )
310cdf0e10cSrcweir 			{
311cdf0e10cSrcweir 				osl::MutexGuard aGuard( m_aMutex );
312cdf0e10cSrcweir 				m_aItems.push_back( aRow );
313cdf0e10cSrcweir 				m_aIdents.push_back(
314cdf0e10cSrcweir                     uno::Reference< ucb::XContentIdentifier >() );
315cdf0e10cSrcweir 				m_aUnqPath.push_back( aUnqPath );
316cdf0e10cSrcweir 				rowCountChanged();
317cdf0e10cSrcweir 				return true;
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 			}
320cdf0e10cSrcweir 			else if( m_nOpenMode == ucb::OpenMode::DOCUMENTS && ! IsRegular )
321cdf0e10cSrcweir 			{
322cdf0e10cSrcweir 				continue;
323cdf0e10cSrcweir 			}
324cdf0e10cSrcweir 			else if( m_nOpenMode == ucb::OpenMode::FOLDERS && ! IsRegular )
325cdf0e10cSrcweir 			{
326cdf0e10cSrcweir 				osl::MutexGuard aGuard( m_aMutex );
327cdf0e10cSrcweir 				m_aItems.push_back( aRow );
328cdf0e10cSrcweir 				m_aIdents.push_back(
329cdf0e10cSrcweir                     uno::Reference< ucb::XContentIdentifier >() );
330cdf0e10cSrcweir 				m_aUnqPath.push_back( aUnqPath );
331cdf0e10cSrcweir 				rowCountChanged();
332cdf0e10cSrcweir 				return true;
333cdf0e10cSrcweir 			}
334cdf0e10cSrcweir 			else if( m_nOpenMode == ucb::OpenMode::FOLDERS && IsRegular )
335cdf0e10cSrcweir 			{
336cdf0e10cSrcweir 				continue;
337cdf0e10cSrcweir 			}
338cdf0e10cSrcweir 			else
339cdf0e10cSrcweir 			{
340cdf0e10cSrcweir 				osl::MutexGuard aGuard( m_aMutex );
341cdf0e10cSrcweir 				m_aItems.push_back( aRow );
342cdf0e10cSrcweir 				m_aIdents.push_back(
343cdf0e10cSrcweir                     uno::Reference< ucb::XContentIdentifier >() );
344cdf0e10cSrcweir 				m_aUnqPath.push_back( aUnqPath );
345cdf0e10cSrcweir 				rowCountChanged();
346cdf0e10cSrcweir 				return true;
347cdf0e10cSrcweir 			}
348cdf0e10cSrcweir 		}
349cdf0e10cSrcweir 		else  // error fetching anything
350cdf0e10cSrcweir 		{
351cdf0e10cSrcweir 			throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
352cdf0e10cSrcweir 		}
353cdf0e10cSrcweir 	}
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 
360cdf0e10cSrcweir sal_Bool SAL_CALL
next(void)361cdf0e10cSrcweir XResultSet_impl::next(
362cdf0e10cSrcweir 	void )
363cdf0e10cSrcweir 	throw( sdbc::SQLException,
364cdf0e10cSrcweir 		   uno::RuntimeException )
365cdf0e10cSrcweir {
366cdf0e10cSrcweir 	sal_Bool test;
367cdf0e10cSrcweir 	if( ++m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) ) test = true;
368cdf0e10cSrcweir 	else
369cdf0e10cSrcweir         test = OneMore();
370cdf0e10cSrcweir 	return test;
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 
374cdf0e10cSrcweir sal_Bool SAL_CALL
isBeforeFirst(void)375cdf0e10cSrcweir XResultSet_impl::isBeforeFirst(
376cdf0e10cSrcweir 	void )
377cdf0e10cSrcweir 	throw( sdbc::SQLException,
378cdf0e10cSrcweir 		   uno::RuntimeException )
379cdf0e10cSrcweir {
380cdf0e10cSrcweir 	return m_nRow == -1;
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 
384cdf0e10cSrcweir sal_Bool SAL_CALL
isAfterLast(void)385cdf0e10cSrcweir XResultSet_impl::isAfterLast(
386cdf0e10cSrcweir 	void )
387cdf0e10cSrcweir 	throw( sdbc::SQLException,
388cdf0e10cSrcweir 		   uno::RuntimeException )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	return m_nRow >= sal::static_int_cast<sal_Int32>(m_aItems.size());   // Cannot happen, if m_aFolder.isOpen()
391cdf0e10cSrcweir }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 
394cdf0e10cSrcweir sal_Bool SAL_CALL
isFirst(void)395cdf0e10cSrcweir XResultSet_impl::isFirst(
396cdf0e10cSrcweir 	void )
397cdf0e10cSrcweir 	throw( sdbc::SQLException,
398cdf0e10cSrcweir 		   uno::RuntimeException )
399cdf0e10cSrcweir {
400cdf0e10cSrcweir 	return m_nRow == 0;
401cdf0e10cSrcweir }
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 
404cdf0e10cSrcweir sal_Bool SAL_CALL
isLast(void)405cdf0e10cSrcweir XResultSet_impl::isLast(
406cdf0e10cSrcweir 	void  )
407cdf0e10cSrcweir 	throw( sdbc::SQLException,
408cdf0e10cSrcweir 		   uno::RuntimeException)
409cdf0e10cSrcweir {
410cdf0e10cSrcweir 	if( m_nRow ==  sal::static_int_cast<sal_Int32>(m_aItems.size()) - 1 )
411cdf0e10cSrcweir 		return ! OneMore();
412cdf0e10cSrcweir 	else
413cdf0e10cSrcweir 		return false;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 
417cdf0e10cSrcweir void SAL_CALL
beforeFirst(void)418cdf0e10cSrcweir XResultSet_impl::beforeFirst(
419cdf0e10cSrcweir 	void  )
420cdf0e10cSrcweir 	throw( sdbc::SQLException,
421cdf0e10cSrcweir 		   uno::RuntimeException)
422cdf0e10cSrcweir {
423cdf0e10cSrcweir 	m_nRow = -1;
424cdf0e10cSrcweir }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 
427cdf0e10cSrcweir void SAL_CALL
afterLast(void)428cdf0e10cSrcweir XResultSet_impl::afterLast(
429cdf0e10cSrcweir 	void  )
430cdf0e10cSrcweir 	throw( sdbc::SQLException,
431cdf0e10cSrcweir 		   uno::RuntimeException )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir 	m_nRow = sal::static_int_cast<sal_Int32>(m_aItems.size());
434cdf0e10cSrcweir 	while( OneMore() )
435cdf0e10cSrcweir 		++m_nRow;
436cdf0e10cSrcweir }
437cdf0e10cSrcweir 
438cdf0e10cSrcweir 
439cdf0e10cSrcweir sal_Bool SAL_CALL
first(void)440cdf0e10cSrcweir XResultSet_impl::first(
441cdf0e10cSrcweir 	void  )
442cdf0e10cSrcweir 	throw( sdbc::SQLException,
443cdf0e10cSrcweir 		   uno::RuntimeException)
444cdf0e10cSrcweir {
445cdf0e10cSrcweir 	m_nRow = -1;
446cdf0e10cSrcweir 	return next();
447cdf0e10cSrcweir }
448cdf0e10cSrcweir 
449cdf0e10cSrcweir 
450cdf0e10cSrcweir sal_Bool SAL_CALL
last(void)451cdf0e10cSrcweir XResultSet_impl::last(
452cdf0e10cSrcweir 	void  )
453cdf0e10cSrcweir 	throw( sdbc::SQLException,
454cdf0e10cSrcweir 		   uno::RuntimeException )
455cdf0e10cSrcweir {
456cdf0e10cSrcweir 	m_nRow = sal::static_int_cast<sal_Int32>(m_aItems.size()) - 1;
457cdf0e10cSrcweir 	while( OneMore() )
458cdf0e10cSrcweir 		++m_nRow;
459cdf0e10cSrcweir 	return true;
460cdf0e10cSrcweir }
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 
463cdf0e10cSrcweir sal_Int32 SAL_CALL
getRow(void)464cdf0e10cSrcweir XResultSet_impl::getRow(
465cdf0e10cSrcweir 	void )
466cdf0e10cSrcweir 	throw( sdbc::SQLException,
467cdf0e10cSrcweir 		   uno::RuntimeException)
468cdf0e10cSrcweir {
469cdf0e10cSrcweir 	// Test, whether behind last row
470cdf0e10cSrcweir 	if( -1 == m_nRow || m_nRow >= sal::static_int_cast<sal_Int32>(m_aItems.size()) )
471cdf0e10cSrcweir 		return 0;
472cdf0e10cSrcweir 	else
473cdf0e10cSrcweir 		return m_nRow+1;
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 
absolute(sal_Int32 row)478cdf0e10cSrcweir sal_Bool SAL_CALL XResultSet_impl::absolute( sal_Int32 row )
479cdf0e10cSrcweir 	throw( sdbc::SQLException, uno::RuntimeException)
480cdf0e10cSrcweir {
481cdf0e10cSrcweir 	if( row >= 0 )
482cdf0e10cSrcweir 	{
483cdf0e10cSrcweir 		m_nRow = row - 1;
484cdf0e10cSrcweir 		if( row >= sal::static_int_cast<sal_Int32>(m_aItems.size()) )
485cdf0e10cSrcweir 			while( row-- && OneMore() )
486cdf0e10cSrcweir 				;
487cdf0e10cSrcweir 	}
488cdf0e10cSrcweir 	else
489cdf0e10cSrcweir 	{
490cdf0e10cSrcweir 		last();
491cdf0e10cSrcweir 		m_nRow += ( row + 1 );
492cdf0e10cSrcweir 		if( m_nRow < -1 )
493cdf0e10cSrcweir 			m_nRow = -1;
494cdf0e10cSrcweir 	}
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 	return 0<= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size());
497cdf0e10cSrcweir }
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 
501cdf0e10cSrcweir 
502cdf0e10cSrcweir sal_Bool SAL_CALL
relative(sal_Int32 row)503cdf0e10cSrcweir XResultSet_impl::relative(
504cdf0e10cSrcweir 	sal_Int32 row )
505cdf0e10cSrcweir 	throw( sdbc::SQLException,
506cdf0e10cSrcweir 		   uno::RuntimeException)
507cdf0e10cSrcweir {
508cdf0e10cSrcweir 	if( isAfterLast() || isBeforeFirst() )
509cdf0e10cSrcweir 		throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
510cdf0e10cSrcweir 	if( row > 0 )
511cdf0e10cSrcweir 		while( row-- ) next();
512cdf0e10cSrcweir 	else if( row < 0 )
513cdf0e10cSrcweir 		while( row++ && m_nRow > - 1 ) previous();
514cdf0e10cSrcweir 
515cdf0e10cSrcweir 	return 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size());
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 
520cdf0e10cSrcweir sal_Bool SAL_CALL
previous(void)521cdf0e10cSrcweir XResultSet_impl::previous(
522cdf0e10cSrcweir 	void )
523cdf0e10cSrcweir 	throw( sdbc::SQLException,
524cdf0e10cSrcweir 		   uno::RuntimeException)
525cdf0e10cSrcweir {
526cdf0e10cSrcweir 	if( m_nRow > sal::static_int_cast<sal_Int32>(m_aItems.size()) )
527cdf0e10cSrcweir 		m_nRow = sal::static_int_cast<sal_Int32>(m_aItems.size());  // Correct Handling of afterLast
528cdf0e10cSrcweir 	if( 0 <= m_nRow ) -- m_nRow;
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 	return 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size());
531cdf0e10cSrcweir }
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 
534cdf0e10cSrcweir void SAL_CALL
refreshRow(void)535cdf0e10cSrcweir XResultSet_impl::refreshRow(
536cdf0e10cSrcweir 	void )
537cdf0e10cSrcweir 	throw( sdbc::SQLException,
538cdf0e10cSrcweir 		   uno::RuntimeException)
539cdf0e10cSrcweir {
540cdf0e10cSrcweir 	// get the row from the filesystem
541cdf0e10cSrcweir 	return;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 
545cdf0e10cSrcweir sal_Bool SAL_CALL
rowUpdated(void)546cdf0e10cSrcweir XResultSet_impl::rowUpdated(
547cdf0e10cSrcweir 	void )
548cdf0e10cSrcweir 	throw( sdbc::SQLException,
549cdf0e10cSrcweir 		   uno::RuntimeException )
550cdf0e10cSrcweir {
551cdf0e10cSrcweir 	return false;
552cdf0e10cSrcweir }
553cdf0e10cSrcweir 
554cdf0e10cSrcweir sal_Bool SAL_CALL
rowInserted(void)555cdf0e10cSrcweir XResultSet_impl::rowInserted(
556cdf0e10cSrcweir 	void  )
557cdf0e10cSrcweir 	throw( sdbc::SQLException,
558cdf0e10cSrcweir 		   uno::RuntimeException )
559cdf0e10cSrcweir {
560cdf0e10cSrcweir 	return false;
561cdf0e10cSrcweir }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir sal_Bool SAL_CALL
rowDeleted(void)564cdf0e10cSrcweir XResultSet_impl::rowDeleted(
565cdf0e10cSrcweir 	void  )
566cdf0e10cSrcweir 	throw( sdbc::SQLException,
567cdf0e10cSrcweir 		   uno::RuntimeException )
568cdf0e10cSrcweir {
569cdf0e10cSrcweir 	return false;
570cdf0e10cSrcweir }
571cdf0e10cSrcweir 
572cdf0e10cSrcweir 
573cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL
getStatement(void)574cdf0e10cSrcweir XResultSet_impl::getStatement(
575cdf0e10cSrcweir 	void  )
576cdf0e10cSrcweir 	throw( sdbc::SQLException,
577cdf0e10cSrcweir 		   uno::RuntimeException )
578cdf0e10cSrcweir {
579cdf0e10cSrcweir 	return uno::Reference< uno::XInterface >();
580cdf0e10cSrcweir }
581cdf0e10cSrcweir 
582cdf0e10cSrcweir 
583cdf0e10cSrcweir // XCloseable
584cdf0e10cSrcweir 
585cdf0e10cSrcweir void SAL_CALL
close(void)586cdf0e10cSrcweir XResultSet_impl::close(
587cdf0e10cSrcweir 	void )
588cdf0e10cSrcweir 	throw( sdbc::SQLException,
589cdf0e10cSrcweir 		   uno::RuntimeException)
590cdf0e10cSrcweir {
591cdf0e10cSrcweir 	if( m_nIsOpen )
592cdf0e10cSrcweir 	{
593cdf0e10cSrcweir         m_aFolder.close();
594cdf0e10cSrcweir 		isFinalChanged();
595cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
596cdf0e10cSrcweir 		m_nIsOpen = false;
597cdf0e10cSrcweir 	}
598cdf0e10cSrcweir }
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 
602cdf0e10cSrcweir rtl::OUString SAL_CALL
queryContentIdentifierString(void)603cdf0e10cSrcweir XResultSet_impl::queryContentIdentifierString(
604cdf0e10cSrcweir 	void )
605cdf0e10cSrcweir 	throw( uno::RuntimeException )
606cdf0e10cSrcweir {
607cdf0e10cSrcweir 	uno::Reference< ucb::XContentIdentifier > xContentId
608cdf0e10cSrcweir         = queryContentIdentifier();
609cdf0e10cSrcweir 
610cdf0e10cSrcweir 	if( xContentId.is() )
611cdf0e10cSrcweir 		return xContentId->getContentIdentifier();
612cdf0e10cSrcweir 	else
613cdf0e10cSrcweir 		return rtl::OUString();
614cdf0e10cSrcweir }
615cdf0e10cSrcweir 
616cdf0e10cSrcweir 
617cdf0e10cSrcweir uno::Reference< ucb::XContentIdentifier > SAL_CALL
queryContentIdentifier(void)618cdf0e10cSrcweir XResultSet_impl::queryContentIdentifier(
619cdf0e10cSrcweir 	void )
620cdf0e10cSrcweir 	throw( uno::RuntimeException )
621cdf0e10cSrcweir {
622cdf0e10cSrcweir 	if( 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) )
623cdf0e10cSrcweir 	{
624cdf0e10cSrcweir 		if( ! m_aIdents[m_nRow].is() )
625cdf0e10cSrcweir 		{
626cdf0e10cSrcweir 			FileContentIdentifier* p
627cdf0e10cSrcweir                 = new FileContentIdentifier( m_pMyShell,
628cdf0e10cSrcweir                                              m_aUnqPath[  m_nRow ] );
629cdf0e10cSrcweir 			m_aIdents[m_nRow] = uno::Reference< ucb::XContentIdentifier >(p);
630cdf0e10cSrcweir 		}
631cdf0e10cSrcweir 		return m_aIdents[m_nRow];
632cdf0e10cSrcweir 	}
633cdf0e10cSrcweir 	return uno::Reference< ucb::XContentIdentifier >();
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir 
637cdf0e10cSrcweir uno::Reference< ucb::XContent > SAL_CALL
queryContent(void)638cdf0e10cSrcweir XResultSet_impl::queryContent(
639cdf0e10cSrcweir 	void )
640cdf0e10cSrcweir 	throw( uno::RuntimeException )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir 	if( 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) )
643cdf0e10cSrcweir 		return m_pMyShell->m_pProvider->queryContent( queryContentIdentifier() );
644cdf0e10cSrcweir 	else
645cdf0e10cSrcweir 		return uno::Reference< ucb::XContent >();
646cdf0e10cSrcweir }
647cdf0e10cSrcweir 
648cdf0e10cSrcweir 
649cdf0e10cSrcweir // XDynamicResultSet
650cdf0e10cSrcweir 
651cdf0e10cSrcweir 
652cdf0e10cSrcweir // virtual
653cdf0e10cSrcweir uno::Reference< sdbc::XResultSet > SAL_CALL
getStaticResultSet()654cdf0e10cSrcweir XResultSet_impl::getStaticResultSet()
655cdf0e10cSrcweir 	throw( ucb::ListenerAlreadySetException,
656cdf0e10cSrcweir 		   uno::RuntimeException )
657cdf0e10cSrcweir {
658cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
659cdf0e10cSrcweir 
660cdf0e10cSrcweir 	if ( m_xListener.is() )
661cdf0e10cSrcweir 		throw ucb::ListenerAlreadySetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
662cdf0e10cSrcweir 
663cdf0e10cSrcweir 	return uno::Reference< sdbc::XResultSet >( this );
664cdf0e10cSrcweir }
665cdf0e10cSrcweir 
666cdf0e10cSrcweir //=========================================================================
667cdf0e10cSrcweir // virtual
668cdf0e10cSrcweir void SAL_CALL
setListener(const uno::Reference<ucb::XDynamicResultSetListener> & Listener)669cdf0e10cSrcweir XResultSet_impl::setListener(
670cdf0e10cSrcweir 	const uno::Reference< ucb::XDynamicResultSetListener >& Listener )
671cdf0e10cSrcweir 	throw( ucb::ListenerAlreadySetException,
672cdf0e10cSrcweir 		   uno::RuntimeException )
673cdf0e10cSrcweir {
674cdf0e10cSrcweir 	osl::ClearableMutexGuard aGuard( m_aMutex );
675cdf0e10cSrcweir 
676cdf0e10cSrcweir 	if ( m_xListener.is() )
677cdf0e10cSrcweir 		throw ucb::ListenerAlreadySetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
678cdf0e10cSrcweir 
679cdf0e10cSrcweir 	m_xListener = Listener;
680cdf0e10cSrcweir 
681cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
682cdf0e10cSrcweir 	// Create "welcome event" and send it to listener.
683cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
684cdf0e10cSrcweir 
685cdf0e10cSrcweir 	// Note: We only have the implementation for a static result set at the
686cdf0e10cSrcweir 	//       moment (src590). The dynamic result sets passed to the listener
687cdf0e10cSrcweir 	//       are a fake. This implementation will never call "notify" at the
688cdf0e10cSrcweir 	//       listener to propagate any changes!!!
689cdf0e10cSrcweir 
690cdf0e10cSrcweir 	uno::Any aInfo;
691cdf0e10cSrcweir 	aInfo <<= ucb::WelcomeDynamicResultSetStruct( this, /* "old" */
692cdf0e10cSrcweir                                                   this /* "new" */ );
693cdf0e10cSrcweir 
694cdf0e10cSrcweir 	uno::Sequence< ucb::ListAction > aActions( 1 );
695cdf0e10cSrcweir 	aActions.getArray()[ 0 ] = ucb::ListAction( 0, // Position; not used
696cdf0e10cSrcweir                                                 0, // Count; not used
697cdf0e10cSrcweir                                                 ucb::ListActionType::WELCOME,
698cdf0e10cSrcweir                                                 aInfo );
699cdf0e10cSrcweir 	aGuard.clear();
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 	Listener->notify(
702cdf0e10cSrcweir 		ucb::ListEvent(
703cdf0e10cSrcweir             static_cast< cppu::OWeakObject * >( this ), aActions ) );
704cdf0e10cSrcweir }
705cdf0e10cSrcweir 
706cdf0e10cSrcweir //=========================================================================
707cdf0e10cSrcweir // virtual
708cdf0e10cSrcweir void SAL_CALL
connectToCache(const uno::Reference<ucb::XDynamicResultSet> & xCache)709cdf0e10cSrcweir XResultSet_impl::connectToCache(
710cdf0e10cSrcweir 	const uno::Reference< ucb::XDynamicResultSet > & xCache )
711cdf0e10cSrcweir 	throw( ucb::ListenerAlreadySetException,
712cdf0e10cSrcweir 		   ucb::AlreadyInitializedException,
713cdf0e10cSrcweir 		   ucb::ServiceNotFoundException,
714cdf0e10cSrcweir 		   uno::RuntimeException )
715cdf0e10cSrcweir {
716cdf0e10cSrcweir 	uno::Reference< lang::XMultiServiceFactory > mxSMgr
717cdf0e10cSrcweir 		= m_pMyShell->m_xMultiServiceFactory;
718cdf0e10cSrcweir 
719cdf0e10cSrcweir 	if( m_xListener.is() )
720cdf0e10cSrcweir 		throw ucb::ListenerAlreadySetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
721cdf0e10cSrcweir 	if( m_bStatic )
722cdf0e10cSrcweir 		throw ucb::ListenerAlreadySetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
723cdf0e10cSrcweir 
724cdf0e10cSrcweir 	uno::Reference< ucb::XSourceInitialization > xTarget(
725cdf0e10cSrcweir         xCache, uno::UNO_QUERY );
726cdf0e10cSrcweir 	if( xTarget.is() && mxSMgr.is() )
727cdf0e10cSrcweir 	{
728cdf0e10cSrcweir 		uno::Reference< ucb::XCachedDynamicResultSetStubFactory > xStubFactory;
729cdf0e10cSrcweir 		try
730cdf0e10cSrcweir 		{
731cdf0e10cSrcweir 			xStubFactory
732cdf0e10cSrcweir                 = uno::Reference< ucb::XCachedDynamicResultSetStubFactory >(
733cdf0e10cSrcweir                     mxSMgr->createInstance(
734cdf0e10cSrcweir                         rtl::OUString::createFromAscii(
735cdf0e10cSrcweir                             "com.sun.star.ucb.CachedDynamicResultSetStubFactory" ) ),
736cdf0e10cSrcweir                     uno::UNO_QUERY );
737cdf0e10cSrcweir 		}
738cdf0e10cSrcweir 		catch ( uno::Exception const & )
739cdf0e10cSrcweir 		{
740cdf0e10cSrcweir 		}
741cdf0e10cSrcweir 
742cdf0e10cSrcweir 		if( xStubFactory.is() )
743cdf0e10cSrcweir 		{
744cdf0e10cSrcweir 			xStubFactory->connectToCache(
745cdf0e10cSrcweir 				this, xCache,m_sSortingInfo, NULL );
746cdf0e10cSrcweir 			return;
747cdf0e10cSrcweir 		}
748cdf0e10cSrcweir 	}
749cdf0e10cSrcweir 	throw ucb::ServiceNotFoundException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
750cdf0e10cSrcweir }
751cdf0e10cSrcweir 
752cdf0e10cSrcweir //=========================================================================
753cdf0e10cSrcweir // virtual
754cdf0e10cSrcweir sal_Int16 SAL_CALL
getCapabilities()755cdf0e10cSrcweir XResultSet_impl::getCapabilities()
756cdf0e10cSrcweir   throw( uno::RuntimeException )
757cdf0e10cSrcweir {
758cdf0e10cSrcweir 	// Never set ucb::ContentResultSetCapability::SORTED
759cdf0e10cSrcweir 	// 	- Underlying content cannot provide sorted data...
760cdf0e10cSrcweir 	return 0;
761cdf0e10cSrcweir }
762cdf0e10cSrcweir 
763cdf0e10cSrcweir // XResultSetMetaDataSupplier
764cdf0e10cSrcweir uno::Reference< sdbc::XResultSetMetaData > SAL_CALL
getMetaData(void)765cdf0e10cSrcweir XResultSet_impl::getMetaData(
766cdf0e10cSrcweir 	void )
767cdf0e10cSrcweir 	throw( sdbc::SQLException,
768cdf0e10cSrcweir 		   uno::RuntimeException )
769cdf0e10cSrcweir {
770cdf0e10cSrcweir 	for ( sal_Int32 n = 0; n < m_sProperty.getLength(); ++n )
771cdf0e10cSrcweir 	{
772cdf0e10cSrcweir 		if ( m_sProperty.getConstArray()[ n ].Name.compareToAscii( "Title" )
773cdf0e10cSrcweir              == 0 )
774cdf0e10cSrcweir 		{
775cdf0e10cSrcweir 			// @@@ #82177# - Determine correct value!
776cdf0e10cSrcweir 			sal_Bool bCaseSensitiveChildren = sal_False;
777cdf0e10cSrcweir 
778cdf0e10cSrcweir 			std::vector< ::ucbhelper::ResultSetColumnData >
779cdf0e10cSrcweir 									aColumnData( m_sProperty.getLength() );
780cdf0e10cSrcweir 			aColumnData[ n ].isCaseSensitive = bCaseSensitiveChildren;
781cdf0e10cSrcweir 
782cdf0e10cSrcweir 			::ucbhelper::ResultSetMetaData* p =
783cdf0e10cSrcweir 				new ::ucbhelper::ResultSetMetaData(
784cdf0e10cSrcweir 					m_pMyShell->m_xMultiServiceFactory,
785cdf0e10cSrcweir                     m_sProperty,
786cdf0e10cSrcweir                     aColumnData );
787cdf0e10cSrcweir 			return uno::Reference< sdbc::XResultSetMetaData >( p );
788cdf0e10cSrcweir 		}
789cdf0e10cSrcweir 	}
790cdf0e10cSrcweir 
791cdf0e10cSrcweir 	::ucbhelper::ResultSetMetaData* p =
792cdf0e10cSrcweir 			new ::ucbhelper::ResultSetMetaData(
793cdf0e10cSrcweir 				m_pMyShell->m_xMultiServiceFactory, m_sProperty );
794cdf0e10cSrcweir 	return uno::Reference< sdbc::XResultSetMetaData >( p );
795cdf0e10cSrcweir }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir 
798cdf0e10cSrcweir 
799cdf0e10cSrcweir // XPropertySet
800cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()801cdf0e10cSrcweir XResultSet_impl::getPropertySetInfo()
802cdf0e10cSrcweir 	throw( uno::RuntimeException)
803cdf0e10cSrcweir {
804cdf0e10cSrcweir 
805cdf0e10cSrcweir 	uno::Sequence< beans::Property > seq(2);
806cdf0e10cSrcweir 	seq[0].Name = rtl::OUString::createFromAscii( "RowCount" );
807cdf0e10cSrcweir 	seq[0].Handle = -1;
808cdf0e10cSrcweir 	seq[0].Type = getCppuType( static_cast< sal_Int32* >(0) );
809cdf0e10cSrcweir 	seq[0].Attributes = beans::PropertyAttribute::READONLY;
810cdf0e10cSrcweir 
811cdf0e10cSrcweir 	seq[0].Name = rtl::OUString::createFromAscii( "IsRowCountFinal" );
812cdf0e10cSrcweir 	seq[0].Handle = -1;
813cdf0e10cSrcweir 	seq[0].Type = getCppuType( static_cast< sal_Bool* >(0) );
814cdf0e10cSrcweir 	seq[0].Attributes = beans::PropertyAttribute::READONLY;
815cdf0e10cSrcweir 
816cdf0e10cSrcweir 	XPropertySetInfo_impl* p = new XPropertySetInfo_impl( m_pMyShell,
817cdf0e10cSrcweir 														  seq );
818cdf0e10cSrcweir 	return uno::Reference< beans::XPropertySetInfo > ( p );
819cdf0e10cSrcweir }
820cdf0e10cSrcweir 
821cdf0e10cSrcweir 
822cdf0e10cSrcweir 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any &)823cdf0e10cSrcweir void SAL_CALL XResultSet_impl::setPropertyValue(
824cdf0e10cSrcweir 	const rtl::OUString& aPropertyName, const uno::Any& )
825cdf0e10cSrcweir 	throw( beans::UnknownPropertyException,
826cdf0e10cSrcweir 		   beans::PropertyVetoException,
827cdf0e10cSrcweir 		   lang::IllegalArgumentException,
828cdf0e10cSrcweir 		   lang::WrappedTargetException,
829cdf0e10cSrcweir 		   uno::RuntimeException)
830cdf0e10cSrcweir {
831cdf0e10cSrcweir 	if( aPropertyName == rtl::OUString::createFromAscii( "IsRowCountFinal" ) ||
832cdf0e10cSrcweir 		aPropertyName == rtl::OUString::createFromAscii( "RowCount" ) )
833cdf0e10cSrcweir 		return;
834cdf0e10cSrcweir 	throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
835cdf0e10cSrcweir }
836cdf0e10cSrcweir 
837cdf0e10cSrcweir 
getPropertyValue(const rtl::OUString & PropertyName)838cdf0e10cSrcweir uno::Any SAL_CALL XResultSet_impl::getPropertyValue(
839cdf0e10cSrcweir 	const rtl::OUString& PropertyName )
840cdf0e10cSrcweir 	throw( beans::UnknownPropertyException,
841cdf0e10cSrcweir 		   lang::WrappedTargetException,
842cdf0e10cSrcweir 		   uno::RuntimeException)
843cdf0e10cSrcweir {
844cdf0e10cSrcweir 	if( PropertyName == rtl::OUString::createFromAscii( "IsRowCountFinal" ) )
845cdf0e10cSrcweir 	{
846cdf0e10cSrcweir 		uno::Any aAny;
847cdf0e10cSrcweir 		aAny <<= m_bRowCountFinal;
848cdf0e10cSrcweir 		return aAny;
849cdf0e10cSrcweir 	}
850cdf0e10cSrcweir 	else if ( PropertyName == rtl::OUString::createFromAscii( "RowCount" ) )
851cdf0e10cSrcweir 	{
852cdf0e10cSrcweir 		uno::Any aAny;
853cdf0e10cSrcweir 		sal_Int32 count = sal::static_int_cast<sal_Int32>(m_aItems.size());
854cdf0e10cSrcweir 		aAny <<= count;
855cdf0e10cSrcweir 		return aAny;
856cdf0e10cSrcweir 	}
857cdf0e10cSrcweir 	else
858cdf0e10cSrcweir 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
859cdf0e10cSrcweir }
860cdf0e10cSrcweir 
861cdf0e10cSrcweir 
addPropertyChangeListener(const rtl::OUString & aPropertyName,const uno::Reference<beans::XPropertyChangeListener> & xListener)862cdf0e10cSrcweir void SAL_CALL XResultSet_impl::addPropertyChangeListener(
863cdf0e10cSrcweir 	const rtl::OUString& aPropertyName,
864cdf0e10cSrcweir 	const uno::Reference< beans::XPropertyChangeListener >& xListener )
865cdf0e10cSrcweir 	throw( beans::UnknownPropertyException,
866cdf0e10cSrcweir 		   lang::WrappedTargetException,
867cdf0e10cSrcweir 		   uno::RuntimeException)
868cdf0e10cSrcweir {
869cdf0e10cSrcweir 	if( aPropertyName == rtl::OUString::createFromAscii( "IsRowCountFinal" ) )
870cdf0e10cSrcweir 	{
871cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
872cdf0e10cSrcweir 		if ( ! m_pIsFinalListeners )
873cdf0e10cSrcweir 			m_pIsFinalListeners =
874cdf0e10cSrcweir 				new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
875cdf0e10cSrcweir 
876cdf0e10cSrcweir 		m_pIsFinalListeners->addInterface( xListener );
877cdf0e10cSrcweir 	}
878cdf0e10cSrcweir 	else if ( aPropertyName == rtl::OUString::createFromAscii( "RowCount" ) )
879cdf0e10cSrcweir 	{
880cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
881cdf0e10cSrcweir 		if ( ! m_pRowCountListeners )
882cdf0e10cSrcweir 			m_pRowCountListeners =
883cdf0e10cSrcweir 				new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
884cdf0e10cSrcweir 		m_pRowCountListeners->addInterface( xListener );
885cdf0e10cSrcweir 	}
886cdf0e10cSrcweir 	else
887cdf0e10cSrcweir 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
888cdf0e10cSrcweir }
889cdf0e10cSrcweir 
890cdf0e10cSrcweir 
removePropertyChangeListener(const rtl::OUString & aPropertyName,const uno::Reference<beans::XPropertyChangeListener> & aListener)891cdf0e10cSrcweir void SAL_CALL XResultSet_impl::removePropertyChangeListener(
892cdf0e10cSrcweir 	const rtl::OUString& aPropertyName,
893cdf0e10cSrcweir 	const uno::Reference< beans::XPropertyChangeListener >& aListener )
894cdf0e10cSrcweir 	throw( beans::UnknownPropertyException,
895cdf0e10cSrcweir 		   lang::WrappedTargetException,
896cdf0e10cSrcweir 		   uno::RuntimeException)
897cdf0e10cSrcweir {
898cdf0e10cSrcweir 	if( aPropertyName == rtl::OUString::createFromAscii( "IsRowCountFinal" ) &&
899cdf0e10cSrcweir 		m_pIsFinalListeners )
900cdf0e10cSrcweir 	{
901cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
902cdf0e10cSrcweir 		m_pIsFinalListeners->removeInterface( aListener );
903cdf0e10cSrcweir 	}
904cdf0e10cSrcweir 	else if ( aPropertyName == rtl::OUString::createFromAscii( "RowCount" ) &&
905cdf0e10cSrcweir 			  m_pRowCountListeners )
906cdf0e10cSrcweir 	{
907cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
908cdf0e10cSrcweir 
909cdf0e10cSrcweir 		m_pRowCountListeners->removeInterface( aListener );
910cdf0e10cSrcweir 	}
911cdf0e10cSrcweir 	else
912cdf0e10cSrcweir 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
913cdf0e10cSrcweir }
914cdf0e10cSrcweir 
addVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)915cdf0e10cSrcweir void SAL_CALL XResultSet_impl::addVetoableChangeListener(
916cdf0e10cSrcweir 	const rtl::OUString&,
917cdf0e10cSrcweir 	const uno::Reference< beans::XVetoableChangeListener >& )
918cdf0e10cSrcweir 	throw( beans::UnknownPropertyException,
919cdf0e10cSrcweir 		   lang::WrappedTargetException,
920cdf0e10cSrcweir 		   uno::RuntimeException)
921cdf0e10cSrcweir {
922cdf0e10cSrcweir }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir 
removeVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)925cdf0e10cSrcweir void SAL_CALL XResultSet_impl::removeVetoableChangeListener(
926cdf0e10cSrcweir 	const rtl::OUString&,
927cdf0e10cSrcweir 	const uno::Reference< beans::XVetoableChangeListener >& )
928cdf0e10cSrcweir 	throw( beans::UnknownPropertyException,
929cdf0e10cSrcweir 		   lang::WrappedTargetException,
930cdf0e10cSrcweir 		   uno::RuntimeException)
931cdf0e10cSrcweir {
932cdf0e10cSrcweir }
933