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 
24*421ed02eSdamjan #include "precompiled_ext.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "ucpext_datasupplier.hxx"
27cdf0e10cSrcweir #include "ucpext_content.hxx"
28cdf0e10cSrcweir #include "ucpext_provider.hxx"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir /** === begin UNO includes === **/
31cdf0e10cSrcweir #include <com/sun/star/deployment/XPackageInformationProvider.hpp>
32cdf0e10cSrcweir /** === end UNO includes === **/
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <ucbhelper/contentidentifier.hxx>
35cdf0e10cSrcweir #include <comphelper/componentcontext.hxx>
36cdf0e10cSrcweir #include <ucbhelper/providerhelper.hxx>
37cdf0e10cSrcweir #include <ucbhelper/content.hxx>
38cdf0e10cSrcweir #include <ucbhelper/propertyvalueset.hxx>
39cdf0e10cSrcweir #include <tools/diagnose_ex.h>
40cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <vector>
43cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir //......................................................................................................................
46cdf0e10cSrcweir namespace ucb { namespace ucp { namespace ext
47cdf0e10cSrcweir {
48cdf0e10cSrcweir //......................................................................................................................
49cdf0e10cSrcweir 
50cdf0e10cSrcweir 	/** === begin UNO using === **/
51cdf0e10cSrcweir 	using ::com::sun::star::uno::Reference;
52cdf0e10cSrcweir 	using ::com::sun::star::uno::XInterface;
53cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_QUERY;
54cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_QUERY_THROW;
55cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_SET_THROW;
56cdf0e10cSrcweir 	using ::com::sun::star::uno::Exception;
57cdf0e10cSrcweir 	using ::com::sun::star::uno::RuntimeException;
58cdf0e10cSrcweir 	using ::com::sun::star::uno::Any;
59cdf0e10cSrcweir 	using ::com::sun::star::uno::makeAny;
60cdf0e10cSrcweir 	using ::com::sun::star::uno::Sequence;
61cdf0e10cSrcweir 	using ::com::sun::star::uno::Type;
62cdf0e10cSrcweir     using ::com::sun::star::ucb::XContent;
63cdf0e10cSrcweir     using ::com::sun::star::ucb::XContentIdentifier;
64cdf0e10cSrcweir     using ::com::sun::star::sdbc::XRow;
65cdf0e10cSrcweir     using ::com::sun::star::lang::XMultiServiceFactory;
66cdf0e10cSrcweir     using ::com::sun::star::ucb::IllegalIdentifierException;
67cdf0e10cSrcweir     using ::com::sun::star::ucb::ResultSetException;
68cdf0e10cSrcweir     using ::com::sun::star::deployment::XPackageInformationProvider;
69cdf0e10cSrcweir     using ::com::sun::star::beans::Property;
70cdf0e10cSrcweir     using ::com::sun::star::sdbc::XResultSet;
71cdf0e10cSrcweir     using ::com::sun::star::sdbc::XRow;
72cdf0e10cSrcweir     using ::com::sun::star::ucb::XCommandEnvironment;
73cdf0e10cSrcweir 	/** === end UNO using === **/
74cdf0e10cSrcweir     //==================================================================================================================
75cdf0e10cSrcweir     //= ResultListEntry
76cdf0e10cSrcweir     //==================================================================================================================
77cdf0e10cSrcweir     struct ResultListEntry
78cdf0e10cSrcweir     {
79cdf0e10cSrcweir         ::rtl::OUString					sId;
80cdf0e10cSrcweir 	    Reference< XContentIdentifier > xId;
81cdf0e10cSrcweir         ::rtl::Reference< Content >     pContent;
82cdf0e10cSrcweir 	    Reference< XRow > 			    xRow;
83cdf0e10cSrcweir     };
84cdf0e10cSrcweir 
85cdf0e10cSrcweir     typedef ::std::vector< ResultListEntry >    ResultList;
86cdf0e10cSrcweir 
87cdf0e10cSrcweir     //==================================================================================================================
88cdf0e10cSrcweir     //= DataSupplier_Impl
89cdf0e10cSrcweir     //==================================================================================================================
90cdf0e10cSrcweir     struct DataSupplier_Impl
91cdf0e10cSrcweir     {
92cdf0e10cSrcweir         ::osl::Mutex                                m_aMutex;
93cdf0e10cSrcweir         ResultList					                m_aResults;
94cdf0e10cSrcweir         ::rtl::Reference< Content >                 m_xContent;
95cdf0e10cSrcweir         Reference< XMultiServiceFactory >           m_xSMgr;
96cdf0e10cSrcweir         sal_Int32                                   m_nOpenMode;
97cdf0e10cSrcweir 
DataSupplier_Implucb::ucp::ext::DataSupplier_Impl98cdf0e10cSrcweir         DataSupplier_Impl( const Reference< XMultiServiceFactory >& i_rORB, const ::rtl::Reference< Content >& i_rContent,
99cdf0e10cSrcweir 					       const sal_Int32 i_nOpenMode )
100cdf0e10cSrcweir 	        :m_xContent( i_rContent )
101cdf0e10cSrcweir             ,m_xSMgr( i_rORB )
102cdf0e10cSrcweir             ,m_nOpenMode( i_nOpenMode )
103cdf0e10cSrcweir         {
104cdf0e10cSrcweir         }
105cdf0e10cSrcweir 	    ~DataSupplier_Impl();
106cdf0e10cSrcweir     };
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
~DataSupplier_Impl()109cdf0e10cSrcweir     DataSupplier_Impl::~DataSupplier_Impl()
110cdf0e10cSrcweir     {
111cdf0e10cSrcweir     }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     //==================================================================================================================
114cdf0e10cSrcweir     //= helper
115cdf0e10cSrcweir     //==================================================================================================================
116cdf0e10cSrcweir     namespace
117cdf0e10cSrcweir     {
lcl_compose(const::rtl::OUString & i_rBaseURL,const::rtl::OUString & i_rRelativeURL)118cdf0e10cSrcweir         ::rtl::OUString lcl_compose( const ::rtl::OUString& i_rBaseURL, const ::rtl::OUString& i_rRelativeURL )
119cdf0e10cSrcweir         {
120cdf0e10cSrcweir             ENSURE_OR_RETURN( i_rBaseURL.getLength(), "illegal base URL", i_rRelativeURL );
121cdf0e10cSrcweir 
122cdf0e10cSrcweir             ::rtl::OUStringBuffer aComposer( i_rBaseURL );
123cdf0e10cSrcweir             if ( i_rBaseURL.getStr()[ i_rBaseURL.getLength() - 1 ] != '/' )
124cdf0e10cSrcweir                 aComposer.append( sal_Unicode( '/' ) );
125cdf0e10cSrcweir             aComposer.append( i_rRelativeURL );
126cdf0e10cSrcweir             return aComposer.makeStringAndClear();
127cdf0e10cSrcweir         }
128cdf0e10cSrcweir     }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     //==================================================================================================================
132cdf0e10cSrcweir     //= DataSupplier
133cdf0e10cSrcweir     //==================================================================================================================
134cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
DataSupplier(const Reference<XMultiServiceFactory> & i_rORB,const::rtl::Reference<Content> & i_rContent,const sal_Int32 i_nOpenMode)135cdf0e10cSrcweir     DataSupplier::DataSupplier( const Reference< XMultiServiceFactory >& i_rORB,
136cdf0e10cSrcweir 							    const ::rtl::Reference< Content >& i_rContent,
137cdf0e10cSrcweir 							    const sal_Int32 i_nOpenMode )
138cdf0e10cSrcweir         :m_pImpl( new DataSupplier_Impl( i_rORB, i_rContent, i_nOpenMode ) )
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir     }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
fetchData()143cdf0e10cSrcweir     void DataSupplier::fetchData()
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         try
146cdf0e10cSrcweir         {
147cdf0e10cSrcweir             const ::comphelper::ComponentContext aContext( m_pImpl->m_xSMgr );
148cdf0e10cSrcweir             const Reference< XPackageInformationProvider > xPackageInfo(
149cdf0e10cSrcweir                 aContext.getSingleton( "com.sun.star.deployment.PackageInformationProvider" ), UNO_QUERY_THROW );
150cdf0e10cSrcweir 
151cdf0e10cSrcweir             const ::rtl::OUString sContentIdentifier( m_pImpl->m_xContent->getIdentifier()->getContentIdentifier() );
152cdf0e10cSrcweir 
153cdf0e10cSrcweir             switch ( m_pImpl->m_xContent->getExtensionContentType() )
154cdf0e10cSrcweir             {
155cdf0e10cSrcweir             case E_ROOT:
156cdf0e10cSrcweir             {
157cdf0e10cSrcweir                 Sequence< Sequence< ::rtl::OUString > > aExtensionInfo( xPackageInfo->getExtensionList() );
158cdf0e10cSrcweir                 for (   const Sequence< ::rtl::OUString >* pExtInfo = aExtensionInfo.getConstArray();
159cdf0e10cSrcweir                         pExtInfo != aExtensionInfo.getConstArray() + aExtensionInfo.getLength();
160cdf0e10cSrcweir                         ++pExtInfo
161cdf0e10cSrcweir                     )
162cdf0e10cSrcweir                 {
163cdf0e10cSrcweir                     ENSURE_OR_CONTINUE( pExtInfo->getLength() > 0, "illegal extension info" );
164cdf0e10cSrcweir 
165cdf0e10cSrcweir                     const ::rtl::OUString& rLocalId = (*pExtInfo)[0];
166cdf0e10cSrcweir                     ResultListEntry aEntry;
167cdf0e10cSrcweir                     aEntry.sId = ContentProvider::getRootURL() + Content::encodeIdentifier( rLocalId ) + ::rtl::OUString( sal_Unicode( '/' ) );
168cdf0e10cSrcweir                     m_pImpl->m_aResults.push_back( aEntry );
169cdf0e10cSrcweir                 }
170cdf0e10cSrcweir             }
171cdf0e10cSrcweir             break;
172cdf0e10cSrcweir             case E_EXTENSION_ROOT:
173cdf0e10cSrcweir             case E_EXTENSION_CONTENT:
174cdf0e10cSrcweir             {
175cdf0e10cSrcweir                 const ::rtl::OUString sPackageLocation( m_pImpl->m_xContent->getPhysicalURL() );
176cdf0e10cSrcweir                 ::ucbhelper::Content aWrappedContent( sPackageLocation, getResultSet()->getEnvironment() );
177cdf0e10cSrcweir 
178cdf0e10cSrcweir                 // obtain the properties which our result set is set up for from the wrapped content
179cdf0e10cSrcweir                 Sequence< ::rtl::OUString > aPropertyNames(1);
180cdf0e10cSrcweir                 aPropertyNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) );
181cdf0e10cSrcweir 
182cdf0e10cSrcweir                 const Reference< XResultSet > xFolderContent( aWrappedContent.createCursor( aPropertyNames ), UNO_SET_THROW );
183cdf0e10cSrcweir                 const Reference< XRow > xContentRow( xFolderContent, UNO_QUERY_THROW );
184cdf0e10cSrcweir                 while ( xFolderContent->next() )
185cdf0e10cSrcweir                 {
186cdf0e10cSrcweir                     ResultListEntry aEntry;
187cdf0e10cSrcweir                     aEntry.sId = lcl_compose( sContentIdentifier, xContentRow->getString( 1 ) );
188cdf0e10cSrcweir                     m_pImpl->m_aResults.push_back( aEntry );
189cdf0e10cSrcweir                 }
190cdf0e10cSrcweir             }
191cdf0e10cSrcweir             break;
192cdf0e10cSrcweir             default:
193cdf0e10cSrcweir                 OSL_ENSURE( false, "DataSupplier::fetchData: unimplemented content type!" );
194cdf0e10cSrcweir                 break;
195cdf0e10cSrcweir             }
196cdf0e10cSrcweir         }
197cdf0e10cSrcweir         catch( const Exception& )
198cdf0e10cSrcweir         {
199cdf0e10cSrcweir         	DBG_UNHANDLED_EXCEPTION();
200cdf0e10cSrcweir         }
201cdf0e10cSrcweir     }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
~DataSupplier()204cdf0e10cSrcweir     DataSupplier::~DataSupplier()
205cdf0e10cSrcweir     {
206cdf0e10cSrcweir     }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
queryContentIdentifierString(sal_uInt32 i_nIndex)209cdf0e10cSrcweir     ::rtl::OUString DataSupplier::queryContentIdentifierString( sal_uInt32 i_nIndex )
210cdf0e10cSrcweir     {
211cdf0e10cSrcweir 	    ::osl::Guard< ::osl::Mutex > aGuard( m_pImpl->m_aMutex );
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 	    if ( i_nIndex < m_pImpl->m_aResults.size() )
214cdf0e10cSrcweir 	    {
215cdf0e10cSrcweir             const ::rtl::OUString sId = m_pImpl->m_aResults[ i_nIndex ].sId;
216cdf0e10cSrcweir 		    if ( sId.getLength() )
217cdf0e10cSrcweir 			    return sId;
218cdf0e10cSrcweir 	    }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir         OSL_ENSURE( false, "DataSupplier::queryContentIdentifierString: illegal index, or illegal result entry id!" );
221cdf0e10cSrcweir 	    return ::rtl::OUString();
222cdf0e10cSrcweir     }
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
queryContentIdentifier(sal_uInt32 i_nIndex)225cdf0e10cSrcweir     Reference< XContentIdentifier > DataSupplier::queryContentIdentifier( sal_uInt32 i_nIndex )
226cdf0e10cSrcweir     {
227cdf0e10cSrcweir 	    ::osl::Guard< ::osl::Mutex > aGuard( m_pImpl->m_aMutex );
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 	    if ( i_nIndex < m_pImpl->m_aResults.size() )
230cdf0e10cSrcweir 	    {
231cdf0e10cSrcweir 		    Reference< XContentIdentifier > xId( m_pImpl->m_aResults[ i_nIndex ].xId );
232cdf0e10cSrcweir 		    if ( xId.is() )
233cdf0e10cSrcweir 			    return xId;
234cdf0e10cSrcweir 	    }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 	    ::rtl::OUString sId = queryContentIdentifierString( i_nIndex );
237cdf0e10cSrcweir 	    if ( sId.getLength() )
238cdf0e10cSrcweir 	    {
239cdf0e10cSrcweir 		    Reference< XContentIdentifier > xId = new ::ucbhelper::ContentIdentifier( sId );
240cdf0e10cSrcweir 		    m_pImpl->m_aResults[ i_nIndex ].xId = xId;
241cdf0e10cSrcweir 		    return xId;
242cdf0e10cSrcweir 	    }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 	    return Reference< XContentIdentifier >();
245cdf0e10cSrcweir     }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
queryContent(sal_uInt32 i_nIndex)248cdf0e10cSrcweir     Reference< XContent > DataSupplier::queryContent( sal_uInt32 i_nIndex )
249cdf0e10cSrcweir     {
250cdf0e10cSrcweir         ::osl::Guard< ::osl::Mutex > aGuard( m_pImpl->m_aMutex );
251cdf0e10cSrcweir         ENSURE_OR_RETURN( i_nIndex < m_pImpl->m_aResults.size(), "illegal index!", NULL );
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 
254cdf0e10cSrcweir         ::rtl::Reference< Content > pContent( m_pImpl->m_aResults[ i_nIndex ].pContent );
255cdf0e10cSrcweir 	    if ( pContent.is() )
256cdf0e10cSrcweir 		    return pContent.get();
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 	    Reference< XContentIdentifier > xId( queryContentIdentifier( i_nIndex ) );
259cdf0e10cSrcweir 	    if ( xId.is() )
260cdf0e10cSrcweir 	    {
261cdf0e10cSrcweir 		    try
262cdf0e10cSrcweir 		    {
263cdf0e10cSrcweir 			    Reference< XContent > xContent( m_pImpl->m_xContent->getProvider()->queryContent( xId ) );
264cdf0e10cSrcweir                 pContent.set( dynamic_cast< Content* >( xContent.get() ) );
265cdf0e10cSrcweir                 OSL_ENSURE( pContent.is() || !xContent.is(), "DataSupplier::queryContent: invalid content implementation!" );
266cdf0e10cSrcweir 			    m_pImpl->m_aResults[ i_nIndex ].pContent = pContent;
267cdf0e10cSrcweir 			    return pContent.get();
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 		    }
270cdf0e10cSrcweir 		    catch ( const IllegalIdentifierException& )
271cdf0e10cSrcweir 		    {
272cdf0e10cSrcweir                 DBG_UNHANDLED_EXCEPTION();
273cdf0e10cSrcweir 		    }
274cdf0e10cSrcweir 	    }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 	    return Reference< XContent >();
277cdf0e10cSrcweir     }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
getResult(sal_uInt32 i_nIndex)280cdf0e10cSrcweir     sal_Bool DataSupplier::getResult( sal_uInt32 i_nIndex )
281cdf0e10cSrcweir     {
282cdf0e10cSrcweir 	    ::osl::ClearableGuard< ::osl::Mutex > aGuard( m_pImpl->m_aMutex );
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 	    if ( m_pImpl->m_aResults.size() > i_nIndex )
285cdf0e10cSrcweir 		    // result already present.
286cdf0e10cSrcweir 		    return sal_True;
287cdf0e10cSrcweir 
288cdf0e10cSrcweir         return sal_False;
289cdf0e10cSrcweir     }
290cdf0e10cSrcweir 
291cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
totalCount()292cdf0e10cSrcweir     sal_uInt32 DataSupplier::totalCount()
293cdf0e10cSrcweir     {
294cdf0e10cSrcweir 	    ::osl::ClearableGuard< ::osl::Mutex > aGuard( m_pImpl->m_aMutex );
295cdf0e10cSrcweir 	    return m_pImpl->m_aResults.size();
296cdf0e10cSrcweir     }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
currentCount()299cdf0e10cSrcweir     sal_uInt32 DataSupplier::currentCount()
300cdf0e10cSrcweir     {
301cdf0e10cSrcweir 	    return m_pImpl->m_aResults.size();
302cdf0e10cSrcweir     }
303cdf0e10cSrcweir 
304cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
isCountFinal()305cdf0e10cSrcweir     sal_Bool DataSupplier::isCountFinal()
306cdf0e10cSrcweir     {
307cdf0e10cSrcweir 	    return sal_True;
308cdf0e10cSrcweir     }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
queryPropertyValues(sal_uInt32 i_nIndex)311cdf0e10cSrcweir     Reference< XRow > DataSupplier::queryPropertyValues( sal_uInt32 i_nIndex  )
312cdf0e10cSrcweir     {
313cdf0e10cSrcweir 	    ::osl::MutexGuard aGuard( m_pImpl->m_aMutex );
314cdf0e10cSrcweir         ENSURE_OR_RETURN( i_nIndex < m_pImpl->m_aResults.size(), "DataSupplier::queryPropertyValues: illegal index!", NULL );
315cdf0e10cSrcweir 
316cdf0e10cSrcweir 	    Reference< XRow > xRow = m_pImpl->m_aResults[ i_nIndex ].xRow;
317cdf0e10cSrcweir 	    if ( xRow.is() )
318cdf0e10cSrcweir 		    return xRow;
319cdf0e10cSrcweir 
320cdf0e10cSrcweir         ENSURE_OR_RETURN( queryContent( i_nIndex ).is(), "could not retrieve the content", NULL );
321cdf0e10cSrcweir 
322cdf0e10cSrcweir         switch ( m_pImpl->m_xContent->getExtensionContentType() )
323cdf0e10cSrcweir         {
324cdf0e10cSrcweir         case E_ROOT:
325cdf0e10cSrcweir         {
326cdf0e10cSrcweir             const ::rtl::OUString& rId( m_pImpl->m_aResults[ i_nIndex ].sId );
327cdf0e10cSrcweir             const ::rtl::OUString sRootURL( ContentProvider::getRootURL() );
328cdf0e10cSrcweir             ::rtl::OUString sTitle = Content::decodeIdentifier( rId.copy( sRootURL.getLength() ) );
329cdf0e10cSrcweir             if ( ( sTitle.getLength() > 0 ) && ( sTitle[ sTitle.getLength() - 1 ] == '/' ) )
330cdf0e10cSrcweir                 sTitle = sTitle.copy( 0, sTitle.getLength() - 1 );
331cdf0e10cSrcweir             xRow = Content::getArtificialNodePropertyValues( m_pImpl->m_xSMgr, getResultSet()->getProperties(), sTitle );
332cdf0e10cSrcweir         }
333cdf0e10cSrcweir         break;
334cdf0e10cSrcweir 
335cdf0e10cSrcweir         case E_EXTENSION_ROOT:
336cdf0e10cSrcweir         case E_EXTENSION_CONTENT:
337cdf0e10cSrcweir         {
338cdf0e10cSrcweir             xRow = m_pImpl->m_aResults[ i_nIndex ].pContent->getPropertyValues(
339cdf0e10cSrcweir                 getResultSet()->getProperties(), getResultSet()->getEnvironment() );
340cdf0e10cSrcweir         }
341cdf0e10cSrcweir         break;
342cdf0e10cSrcweir         default:
343cdf0e10cSrcweir             OSL_ENSURE( false, "DataSupplier::queryPropertyValues: unhandled case!" );
344cdf0e10cSrcweir             break;
345cdf0e10cSrcweir         }
346cdf0e10cSrcweir 
347cdf0e10cSrcweir         m_pImpl->m_aResults[ i_nIndex ].xRow = xRow;
348cdf0e10cSrcweir 	    return xRow;
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
releasePropertyValues(sal_uInt32 i_nIndex)352cdf0e10cSrcweir     void DataSupplier::releasePropertyValues( sal_uInt32 i_nIndex )
353cdf0e10cSrcweir     {
354cdf0e10cSrcweir 	    ::osl::Guard< ::osl::Mutex > aGuard( m_pImpl->m_aMutex );
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 	    if ( i_nIndex < m_pImpl->m_aResults.size() )
357cdf0e10cSrcweir 		    m_pImpl->m_aResults[ i_nIndex ].xRow.clear();
358cdf0e10cSrcweir     }
359cdf0e10cSrcweir 
360cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
close()361cdf0e10cSrcweir     void DataSupplier::close()
362cdf0e10cSrcweir     {
363cdf0e10cSrcweir     }
364cdf0e10cSrcweir 
365cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
validate()366cdf0e10cSrcweir     void DataSupplier::validate() throw( ResultSetException )
367cdf0e10cSrcweir     {
368cdf0e10cSrcweir     }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir //......................................................................................................................
371cdf0e10cSrcweir } } }   // namespace ucp::ext
372cdf0e10cSrcweir //......................................................................................................................
373