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_xmlhelp.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski /**************************************************************************
28*b1cdbd2cSJim Jagielski 								TODO
29*b1cdbd2cSJim Jagielski  **************************************************************************
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski  *************************************************************************/
32*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyAccess.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XRow.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/OpenCommandArgument2.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/OpenMode.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XCommandInfo.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSink.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalAccessException.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/UnsupportedDataSinkException.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataStreamer.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XPersistentPropertySet.hpp>
44*b1cdbd2cSJim Jagielski #ifndef _VOS_DIAGNOSE_HXX_
45*b1cdbd2cSJim Jagielski #include <vos/diagnose.hxx>
46*b1cdbd2cSJim Jagielski #endif
47*b1cdbd2cSJim Jagielski #include <ucbhelper/contentidentifier.hxx>
48*b1cdbd2cSJim Jagielski #include <ucbhelper/propertyvalueset.hxx>
49*b1cdbd2cSJim Jagielski #ifndef _UCBHELPER_CANCELCOMMANDEXECUTION_HXX
50*b1cdbd2cSJim Jagielski #include <ucbhelper/cancelcommandexecution.hxx>
51*b1cdbd2cSJim Jagielski #endif
52*b1cdbd2cSJim Jagielski #include "content.hxx"
53*b1cdbd2cSJim Jagielski #include "provider.hxx"
54*b1cdbd2cSJim Jagielski #include "resultset.hxx"
55*b1cdbd2cSJim Jagielski #include "databases.hxx"
56*b1cdbd2cSJim Jagielski #include "resultsetfactory.hxx"
57*b1cdbd2cSJim Jagielski #include "resultsetbase.hxx"
58*b1cdbd2cSJim Jagielski #include "resultsetforroot.hxx"
59*b1cdbd2cSJim Jagielski #include "resultsetforquery.hxx"
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski using namespace com::sun::star;
62*b1cdbd2cSJim Jagielski using namespace chelp;
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski //=========================================================================
65*b1cdbd2cSJim Jagielski //=========================================================================
66*b1cdbd2cSJim Jagielski //
67*b1cdbd2cSJim Jagielski // Content Implementation.
68*b1cdbd2cSJim Jagielski //
69*b1cdbd2cSJim Jagielski //=========================================================================
70*b1cdbd2cSJim Jagielski //=========================================================================
71*b1cdbd2cSJim Jagielski 
Content(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,::ucbhelper::ContentProviderImplHelper * pProvider,const uno::Reference<ucb::XContentIdentifier> & Identifier,Databases * pDatabases)72*b1cdbd2cSJim Jagielski Content::Content( const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
73*b1cdbd2cSJim Jagielski 				  ::ucbhelper::ContentProviderImplHelper* pProvider,
74*b1cdbd2cSJim Jagielski 				  const uno::Reference< ucb::XContentIdentifier >&
75*b1cdbd2cSJim Jagielski                       Identifier,
76*b1cdbd2cSJim Jagielski 				  Databases* pDatabases )
77*b1cdbd2cSJim Jagielski 	: ContentImplHelper( rxSMgr, pProvider, Identifier ),
78*b1cdbd2cSJim Jagielski 	  m_aURLParameter( Identifier->getContentIdentifier(),pDatabases ),
79*b1cdbd2cSJim Jagielski 	  m_pDatabases( pDatabases ) // not owner
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski //=========================================================================
84*b1cdbd2cSJim Jagielski // virtual
~Content()85*b1cdbd2cSJim Jagielski Content::~Content()
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski //=========================================================================
90*b1cdbd2cSJim Jagielski //
91*b1cdbd2cSJim Jagielski // XInterface methods.
92*b1cdbd2cSJim Jagielski //
93*b1cdbd2cSJim Jagielski //=========================================================================
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski // virtual
acquire()96*b1cdbd2cSJim Jagielski void SAL_CALL Content::acquire()
97*b1cdbd2cSJim Jagielski 	throw( )
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski 	ContentImplHelper::acquire();
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski //=========================================================================
103*b1cdbd2cSJim Jagielski // virtual
release()104*b1cdbd2cSJim Jagielski void SAL_CALL Content::release()
105*b1cdbd2cSJim Jagielski 	throw( )
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski 	ContentImplHelper::release();
108*b1cdbd2cSJim Jagielski }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski //=========================================================================
111*b1cdbd2cSJim Jagielski // virtual
queryInterface(const uno::Type & rType)112*b1cdbd2cSJim Jagielski uno::Any SAL_CALL Content::queryInterface( const uno::Type & rType )
113*b1cdbd2cSJim Jagielski 	throw ( uno::RuntimeException )
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski 	uno::Any aRet;
116*b1cdbd2cSJim Jagielski  	return aRet.hasValue() ? aRet : ContentImplHelper::queryInterface( rType );
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski //=========================================================================
120*b1cdbd2cSJim Jagielski //
121*b1cdbd2cSJim Jagielski // XTypeProvider methods.
122*b1cdbd2cSJim Jagielski //
123*b1cdbd2cSJim Jagielski //=========================================================================
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski XTYPEPROVIDER_COMMON_IMPL( Content );
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski //=========================================================================
128*b1cdbd2cSJim Jagielski // virtual
getTypes()129*b1cdbd2cSJim Jagielski uno::Sequence< uno::Type > SAL_CALL Content::getTypes()
130*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	static cppu::OTypeCollection* pCollection = NULL;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	if ( !pCollection )
135*b1cdbd2cSJim Jagielski 	{
136*b1cdbd2cSJim Jagielski 		osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() );
137*b1cdbd2cSJim Jagielski 	  	if ( !pCollection )
138*b1cdbd2cSJim Jagielski 	  	{
139*b1cdbd2cSJim Jagielski 	  		static cppu::OTypeCollection aCollection(
140*b1cdbd2cSJim Jagielski 				CPPU_TYPE_REF( lang::XTypeProvider ),
141*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( lang::XServiceInfo ),
142*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( lang::XComponent ),
143*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( ucb::XContent ),
144*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( ucb::XCommandProcessor ),
145*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( beans::XPropertiesChangeNotifier ),
146*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( ucb::XCommandInfoChangeNotifier ),
147*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( beans::XPropertyContainer ),
148*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( beans::XPropertySetInfoChangeNotifier ),
149*b1cdbd2cSJim Jagielski 			   	CPPU_TYPE_REF( container::XChild ) );
150*b1cdbd2cSJim Jagielski 	  		pCollection = &aCollection;
151*b1cdbd2cSJim Jagielski 		}
152*b1cdbd2cSJim Jagielski 	}
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	return (*pCollection).getTypes();
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski //=========================================================================
158*b1cdbd2cSJim Jagielski //
159*b1cdbd2cSJim Jagielski // XServiceInfo methods.
160*b1cdbd2cSJim Jagielski //
161*b1cdbd2cSJim Jagielski //=========================================================================
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski // virtual
getImplementationName()164*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL Content::getImplementationName()
165*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski 	return rtl::OUString::createFromAscii( "CHelpContent" );
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski //=========================================================================
171*b1cdbd2cSJim Jagielski // virtual
getSupportedServiceNames()172*b1cdbd2cSJim Jagielski uno::Sequence< rtl::OUString > SAL_CALL Content::getSupportedServiceNames()
173*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski 	uno::Sequence< rtl::OUString > aSNS( 1 );
176*b1cdbd2cSJim Jagielski 	aSNS.getArray()[ 0 ]
177*b1cdbd2cSJim Jagielski 			= rtl::OUString::createFromAscii( MYUCP_CONTENT_SERVICE_NAME );
178*b1cdbd2cSJim Jagielski 	return aSNS;
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski //=========================================================================
182*b1cdbd2cSJim Jagielski //
183*b1cdbd2cSJim Jagielski // XContent methods.
184*b1cdbd2cSJim Jagielski //
185*b1cdbd2cSJim Jagielski //=========================================================================
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski // virtual
getContentType()188*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL Content::getContentType()
189*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski 	return rtl::OUString::createFromAscii( MYUCP_CONTENT_TYPE );
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski //=========================================================================
195*b1cdbd2cSJim Jagielski //
196*b1cdbd2cSJim Jagielski // XCommandProcessor methods.
197*b1cdbd2cSJim Jagielski //
198*b1cdbd2cSJim Jagielski //=========================================================================
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski //virtual
abort(sal_Int32)201*b1cdbd2cSJim Jagielski void SAL_CALL Content::abort( sal_Int32 /*CommandId*/ )
202*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski class ResultSetForRootFactory
209*b1cdbd2cSJim Jagielski 	: public ResultSetFactory
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski private:
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 	uno::Reference< lang::XMultiServiceFactory > m_xSMgr;
214*b1cdbd2cSJim Jagielski 	uno::Reference< ucb::XContentProvider >      m_xProvider;
215*b1cdbd2cSJim Jagielski 	sal_Int32                                    m_nOpenMode;
216*b1cdbd2cSJim Jagielski 	uno::Sequence< beans::Property >             m_seq;
217*b1cdbd2cSJim Jagielski 	uno::Sequence< ucb::NumberedSortingInfo >    m_seqSort;
218*b1cdbd2cSJim Jagielski 	URLParameter                                 m_aURLParameter;
219*b1cdbd2cSJim Jagielski 	Databases*                                   m_pDatabases;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski public:
223*b1cdbd2cSJim Jagielski 
ResultSetForRootFactory(const uno::Reference<lang::XMultiServiceFactory> & xSMgr,const uno::Reference<ucb::XContentProvider> & xProvider,sal_Int32 nOpenMode,const uno::Sequence<beans::Property> & seq,const uno::Sequence<ucb::NumberedSortingInfo> & seqSort,URLParameter aURLParameter,Databases * pDatabases)224*b1cdbd2cSJim Jagielski 	ResultSetForRootFactory(
225*b1cdbd2cSJim Jagielski         const uno::Reference< lang::XMultiServiceFactory >& xSMgr,
226*b1cdbd2cSJim Jagielski         const uno::Reference< ucb::XContentProvider >&  xProvider,
227*b1cdbd2cSJim Jagielski         sal_Int32 nOpenMode,
228*b1cdbd2cSJim Jagielski         const uno::Sequence< beans::Property >& seq,
229*b1cdbd2cSJim Jagielski         const uno::Sequence< ucb::NumberedSortingInfo >& seqSort,
230*b1cdbd2cSJim Jagielski         URLParameter aURLParameter,
231*b1cdbd2cSJim Jagielski         Databases* pDatabases )
232*b1cdbd2cSJim Jagielski 		: m_xSMgr( xSMgr ),
233*b1cdbd2cSJim Jagielski 		  m_xProvider( xProvider ),
234*b1cdbd2cSJim Jagielski 		  m_nOpenMode( nOpenMode ),
235*b1cdbd2cSJim Jagielski 		  m_seq( seq ),
236*b1cdbd2cSJim Jagielski 		  m_seqSort( seqSort ),
237*b1cdbd2cSJim Jagielski 		  m_aURLParameter( aURLParameter ),
238*b1cdbd2cSJim Jagielski 		  m_pDatabases( pDatabases )
239*b1cdbd2cSJim Jagielski 	{
240*b1cdbd2cSJim Jagielski 	}
241*b1cdbd2cSJim Jagielski 
createResultSet()242*b1cdbd2cSJim Jagielski 	ResultSetBase* createResultSet()
243*b1cdbd2cSJim Jagielski 	{
244*b1cdbd2cSJim Jagielski 		return new ResultSetForRoot( m_xSMgr,
245*b1cdbd2cSJim Jagielski 									 m_xProvider,
246*b1cdbd2cSJim Jagielski 									 m_nOpenMode,
247*b1cdbd2cSJim Jagielski 									 m_seq,
248*b1cdbd2cSJim Jagielski 									 m_seqSort,
249*b1cdbd2cSJim Jagielski 									 m_aURLParameter,
250*b1cdbd2cSJim Jagielski 									 m_pDatabases );
251*b1cdbd2cSJim Jagielski 	}
252*b1cdbd2cSJim Jagielski };
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski class ResultSetForQueryFactory
257*b1cdbd2cSJim Jagielski 	: public ResultSetFactory
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski private:
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 	uno::Reference< lang::XMultiServiceFactory > m_xSMgr;
262*b1cdbd2cSJim Jagielski 	uno::Reference< ucb::XContentProvider >      m_xProvider;
263*b1cdbd2cSJim Jagielski 	sal_Int32                                    m_nOpenMode;
264*b1cdbd2cSJim Jagielski 	uno::Sequence< beans::Property >             m_seq;
265*b1cdbd2cSJim Jagielski 	uno::Sequence< ucb::NumberedSortingInfo >    m_seqSort;
266*b1cdbd2cSJim Jagielski 	URLParameter                                 m_aURLParameter;
267*b1cdbd2cSJim Jagielski 	Databases*                                   m_pDatabases;
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski public:
271*b1cdbd2cSJim Jagielski 
ResultSetForQueryFactory(const uno::Reference<lang::XMultiServiceFactory> & xSMgr,const uno::Reference<ucb::XContentProvider> & xProvider,sal_Int32 nOpenMode,const uno::Sequence<beans::Property> & seq,const uno::Sequence<ucb::NumberedSortingInfo> & seqSort,URLParameter aURLParameter,Databases * pDatabases)272*b1cdbd2cSJim Jagielski 	ResultSetForQueryFactory(
273*b1cdbd2cSJim Jagielski         const uno::Reference< lang::XMultiServiceFactory >& xSMgr,
274*b1cdbd2cSJim Jagielski         const uno::Reference< ucb::XContentProvider >&  xProvider,
275*b1cdbd2cSJim Jagielski         sal_Int32 nOpenMode,
276*b1cdbd2cSJim Jagielski         const uno::Sequence< beans::Property >& seq,
277*b1cdbd2cSJim Jagielski         const uno::Sequence< ucb::NumberedSortingInfo >& seqSort,
278*b1cdbd2cSJim Jagielski         URLParameter aURLParameter,
279*b1cdbd2cSJim Jagielski         Databases* pDatabases )
280*b1cdbd2cSJim Jagielski 		: m_xSMgr( xSMgr ),
281*b1cdbd2cSJim Jagielski 		  m_xProvider( xProvider ),
282*b1cdbd2cSJim Jagielski 		  m_nOpenMode( nOpenMode ),
283*b1cdbd2cSJim Jagielski 		  m_seq( seq ),
284*b1cdbd2cSJim Jagielski 		  m_seqSort( seqSort ),
285*b1cdbd2cSJim Jagielski 		  m_aURLParameter( aURLParameter ),
286*b1cdbd2cSJim Jagielski 		  m_pDatabases( pDatabases )
287*b1cdbd2cSJim Jagielski 	{
288*b1cdbd2cSJim Jagielski 	}
289*b1cdbd2cSJim Jagielski 
createResultSet()290*b1cdbd2cSJim Jagielski 	ResultSetBase* createResultSet()
291*b1cdbd2cSJim Jagielski 	{
292*b1cdbd2cSJim Jagielski 		return new ResultSetForQuery( m_xSMgr,
293*b1cdbd2cSJim Jagielski 									  m_xProvider,
294*b1cdbd2cSJim Jagielski 									  m_nOpenMode,
295*b1cdbd2cSJim Jagielski 									  m_seq,
296*b1cdbd2cSJim Jagielski 									  m_seqSort,
297*b1cdbd2cSJim Jagielski 									  m_aURLParameter,
298*b1cdbd2cSJim Jagielski 									  m_pDatabases );
299*b1cdbd2cSJim Jagielski 	}
300*b1cdbd2cSJim Jagielski };
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski // virtual
execute(const ucb::Command & aCommand,sal_Int32 CommandId,const uno::Reference<ucb::XCommandEnvironment> & Environment)305*b1cdbd2cSJim Jagielski uno::Any SAL_CALL Content::execute(
306*b1cdbd2cSJim Jagielski         const ucb::Command& aCommand,
307*b1cdbd2cSJim Jagielski         sal_Int32 CommandId,
308*b1cdbd2cSJim Jagielski         const uno::Reference< ucb::XCommandEnvironment >& Environment )
309*b1cdbd2cSJim Jagielski 	throw( uno::Exception,
310*b1cdbd2cSJim Jagielski            ucb::CommandAbortedException,
311*b1cdbd2cSJim Jagielski            uno::RuntimeException )
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski 	uno::Any aRet;
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 	if ( aCommand.Name.compareToAscii( "getPropertyValues" ) == 0 )
316*b1cdbd2cSJim Jagielski     {
317*b1cdbd2cSJim Jagielski 		uno::Sequence< beans::Property > Properties;
318*b1cdbd2cSJim Jagielski 		if ( !( aCommand.Argument >>= Properties ) )
319*b1cdbd2cSJim Jagielski 		{
320*b1cdbd2cSJim Jagielski 			aRet <<= lang::IllegalArgumentException();
321*b1cdbd2cSJim Jagielski 			ucbhelper::cancelCommandExecution(aRet,Environment);
322*b1cdbd2cSJim Jagielski 		}
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 		aRet <<= getPropertyValues( Properties );
325*b1cdbd2cSJim Jagielski     }
326*b1cdbd2cSJim Jagielski 	else if ( aCommand.Name.compareToAscii( "setPropertyValues" ) == 0 )
327*b1cdbd2cSJim Jagielski     {
328*b1cdbd2cSJim Jagielski 		uno::Sequence<beans::PropertyValue> propertyValues;
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski 		if( ! ( aCommand.Argument >>= propertyValues ) ) {
331*b1cdbd2cSJim Jagielski 			aRet <<= lang::IllegalArgumentException();
332*b1cdbd2cSJim Jagielski 			ucbhelper::cancelCommandExecution(aRet,Environment);
333*b1cdbd2cSJim Jagielski 		}
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 		uno::Sequence< uno::Any > ret(propertyValues.getLength());
336*b1cdbd2cSJim Jagielski 		uno::Sequence< beans::Property > props(getProperties(Environment));
337*b1cdbd2cSJim Jagielski 		// No properties can be set
338*b1cdbd2cSJim Jagielski 		for(sal_Int32 i = 0; i < ret.getLength(); ++i) {
339*b1cdbd2cSJim Jagielski 			ret[i] <<= beans::UnknownPropertyException();
340*b1cdbd2cSJim Jagielski 			for(sal_Int32 j = 0; j < props.getLength(); ++j)
341*b1cdbd2cSJim Jagielski 				if(props[j].Name == propertyValues[i].Name) {
342*b1cdbd2cSJim Jagielski 					ret[i] <<= lang::IllegalAccessException();
343*b1cdbd2cSJim Jagielski 					break;
344*b1cdbd2cSJim Jagielski 				}
345*b1cdbd2cSJim Jagielski 		}
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 		aRet <<= ret;
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski 	else if ( aCommand.Name.compareToAscii( "getPropertySetInfo" ) == 0 )
350*b1cdbd2cSJim Jagielski     {
351*b1cdbd2cSJim Jagielski 		// Note: Implemented by base class.
352*b1cdbd2cSJim Jagielski 		aRet <<= getPropertySetInfo( Environment );
353*b1cdbd2cSJim Jagielski     }
354*b1cdbd2cSJim Jagielski 	else if ( aCommand.Name.compareToAscii( "getCommandInfo" ) == 0 )
355*b1cdbd2cSJim Jagielski     {
356*b1cdbd2cSJim Jagielski 		// Note: Implemented by base class.
357*b1cdbd2cSJim Jagielski 		aRet <<= getCommandInfo( Environment );
358*b1cdbd2cSJim Jagielski     }
359*b1cdbd2cSJim Jagielski 	else if ( aCommand.Name.compareToAscii( "open" ) == 0 )
360*b1cdbd2cSJim Jagielski     {
361*b1cdbd2cSJim Jagielski 		ucb::OpenCommandArgument2 aOpenCommand;
362*b1cdbd2cSJim Jagielski 		if ( !( aCommand.Argument >>= aOpenCommand ) )
363*b1cdbd2cSJim Jagielski 		{
364*b1cdbd2cSJim Jagielski 			aRet <<= lang::IllegalArgumentException();
365*b1cdbd2cSJim Jagielski 			ucbhelper::cancelCommandExecution(aRet,Environment);
366*b1cdbd2cSJim Jagielski 		}
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 		uno::Reference< io::XActiveDataSink > xActiveDataSink(
369*b1cdbd2cSJim Jagielski 			aOpenCommand.Sink, uno::UNO_QUERY);
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 		if(xActiveDataSink.is())
372*b1cdbd2cSJim Jagielski             m_aURLParameter.open(m_xSMgr,
373*b1cdbd2cSJim Jagielski 								 aCommand,
374*b1cdbd2cSJim Jagielski 								 CommandId,
375*b1cdbd2cSJim Jagielski 								 Environment,
376*b1cdbd2cSJim Jagielski 								 xActiveDataSink);
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski 		uno::Reference< io::XActiveDataStreamer > xActiveDataStreamer(
379*b1cdbd2cSJim Jagielski 			aOpenCommand.Sink, uno::UNO_QUERY);
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 		if(xActiveDataStreamer.is()) {
382*b1cdbd2cSJim Jagielski 			aRet <<= ucb::UnsupportedDataSinkException();
383*b1cdbd2cSJim Jagielski 			ucbhelper::cancelCommandExecution(aRet,Environment);
384*b1cdbd2cSJim Jagielski 		}
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 		uno::Reference< io::XOutputStream > xOutputStream(
387*b1cdbd2cSJim Jagielski 			aOpenCommand.Sink, uno::UNO_QUERY);
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 		if(xOutputStream.is() )
390*b1cdbd2cSJim Jagielski             m_aURLParameter.open(m_xSMgr,
391*b1cdbd2cSJim Jagielski 								 aCommand,
392*b1cdbd2cSJim Jagielski 								 CommandId,
393*b1cdbd2cSJim Jagielski 								 Environment,
394*b1cdbd2cSJim Jagielski 								 xOutputStream);
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 		if( m_aURLParameter.isRoot() )
397*b1cdbd2cSJim Jagielski 		{
398*b1cdbd2cSJim Jagielski 			uno::Reference< ucb::XDynamicResultSet > xSet
399*b1cdbd2cSJim Jagielski 				= new DynamicResultSet(
400*b1cdbd2cSJim Jagielski 					m_xSMgr,
401*b1cdbd2cSJim Jagielski 					this,
402*b1cdbd2cSJim Jagielski 					aOpenCommand,
403*b1cdbd2cSJim Jagielski 					Environment,
404*b1cdbd2cSJim Jagielski 					new ResultSetForRootFactory(
405*b1cdbd2cSJim Jagielski 						m_xSMgr,
406*b1cdbd2cSJim Jagielski 						m_xProvider.get(),
407*b1cdbd2cSJim Jagielski 						aOpenCommand.Mode,
408*b1cdbd2cSJim Jagielski 						aOpenCommand.Properties,
409*b1cdbd2cSJim Jagielski 						aOpenCommand.SortingInfo,
410*b1cdbd2cSJim Jagielski 						m_aURLParameter,
411*b1cdbd2cSJim Jagielski 						m_pDatabases));
412*b1cdbd2cSJim Jagielski 			aRet <<= xSet;
413*b1cdbd2cSJim Jagielski 		}
414*b1cdbd2cSJim Jagielski 		else if( m_aURLParameter.isQuery() )
415*b1cdbd2cSJim Jagielski 		{
416*b1cdbd2cSJim Jagielski 			uno::Reference< ucb::XDynamicResultSet > xSet
417*b1cdbd2cSJim Jagielski 				= new DynamicResultSet(
418*b1cdbd2cSJim Jagielski 					m_xSMgr,
419*b1cdbd2cSJim Jagielski 					this,
420*b1cdbd2cSJim Jagielski 					aOpenCommand,
421*b1cdbd2cSJim Jagielski 					Environment,
422*b1cdbd2cSJim Jagielski 					new ResultSetForQueryFactory(
423*b1cdbd2cSJim Jagielski 						m_xSMgr,
424*b1cdbd2cSJim Jagielski 						m_xProvider.get(),
425*b1cdbd2cSJim Jagielski 						aOpenCommand.Mode,
426*b1cdbd2cSJim Jagielski 						aOpenCommand.Properties,
427*b1cdbd2cSJim Jagielski 						aOpenCommand.SortingInfo,
428*b1cdbd2cSJim Jagielski 						m_aURLParameter,
429*b1cdbd2cSJim Jagielski 						m_pDatabases ) );
430*b1cdbd2cSJim Jagielski 			aRet <<= xSet;
431*b1cdbd2cSJim Jagielski 		}
432*b1cdbd2cSJim Jagielski     }
433*b1cdbd2cSJim Jagielski 	else
434*b1cdbd2cSJim Jagielski     {
435*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////
436*b1cdbd2cSJim Jagielski 		// Unsupported command
437*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////
438*b1cdbd2cSJim Jagielski 		aRet <<= ucb::UnsupportedCommandException();
439*b1cdbd2cSJim Jagielski 		ucbhelper::cancelCommandExecution(aRet,Environment);
440*b1cdbd2cSJim Jagielski     }
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski 	return aRet;
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski //=========================================================================
getPropertyValues(const uno::Sequence<beans::Property> & rProperties)449*b1cdbd2cSJim Jagielski uno::Reference< sdbc::XRow > Content::getPropertyValues(
450*b1cdbd2cSJim Jagielski     const uno::Sequence< beans::Property >& rProperties )
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski 	osl::MutexGuard aGuard( m_aMutex );
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 	rtl::Reference< ::ucbhelper::PropertyValueSet > xRow =
455*b1cdbd2cSJim Jagielski 		new ::ucbhelper::PropertyValueSet( m_xSMgr );
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 	for ( sal_Int32 n = 0; n < rProperties.getLength(); ++n )
458*b1cdbd2cSJim Jagielski 	{
459*b1cdbd2cSJim Jagielski 		const beans::Property& rProp = rProperties[n];
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski 		if ( rProp.Name.compareToAscii( "ContentType" ) == 0 )
462*b1cdbd2cSJim Jagielski 			xRow->appendString(
463*b1cdbd2cSJim Jagielski 				rProp,
464*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii(
465*b1cdbd2cSJim Jagielski 					"application/vnd.sun.star.help" ) );
466*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "Title" ) == 0 )
467*b1cdbd2cSJim Jagielski 			xRow->appendString ( rProp,m_aURLParameter.get_title() );
468*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "IsReadOnly" ) == 0 )
469*b1cdbd2cSJim Jagielski 			xRow->appendBoolean( rProp,true );
470*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "IsDocument" ) == 0 )
471*b1cdbd2cSJim Jagielski 			xRow->appendBoolean(
472*b1cdbd2cSJim Jagielski 				rProp,
473*b1cdbd2cSJim Jagielski 				m_aURLParameter.isFile() || m_aURLParameter.isRoot() );
474*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "IsFolder" ) == 0 )
475*b1cdbd2cSJim Jagielski 			xRow->appendBoolean(
476*b1cdbd2cSJim Jagielski 				rProp,
477*b1cdbd2cSJim Jagielski 				! m_aURLParameter.isFile() || m_aURLParameter.isRoot() );
478*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "IsErrorDocument" ) == 0 )
479*b1cdbd2cSJim Jagielski 			xRow->appendBoolean( rProp, m_aURLParameter.isErrorDocument() );
480*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "MediaType" ) == 0  )
481*b1cdbd2cSJim Jagielski 			if( m_aURLParameter.isPicture() )
482*b1cdbd2cSJim Jagielski 				xRow->appendString(
483*b1cdbd2cSJim Jagielski 					rProp,
484*b1cdbd2cSJim Jagielski 					rtl::OUString::createFromAscii( "image/gif" ) );
485*b1cdbd2cSJim Jagielski 			else if( m_aURLParameter.isActive() )
486*b1cdbd2cSJim Jagielski 				xRow->appendString(
487*b1cdbd2cSJim Jagielski 					rProp,
488*b1cdbd2cSJim Jagielski 					rtl::OUString::createFromAscii( "text/plain" ) );
489*b1cdbd2cSJim Jagielski 			else if( m_aURLParameter.isFile() )
490*b1cdbd2cSJim Jagielski 				xRow->appendString(
491*b1cdbd2cSJim Jagielski 					rProp,rtl::OUString::createFromAscii( "text/html" ) );
492*b1cdbd2cSJim Jagielski 			else if( m_aURLParameter.isRoot() )
493*b1cdbd2cSJim Jagielski 				xRow->appendString(
494*b1cdbd2cSJim Jagielski 					rProp,
495*b1cdbd2cSJim Jagielski 					rtl::OUString::createFromAscii( "text/css" ) );
496*b1cdbd2cSJim Jagielski 			else
497*b1cdbd2cSJim Jagielski 				xRow->appendVoid( rProp );
498*b1cdbd2cSJim Jagielski 		else if( m_aURLParameter.isModule() )
499*b1cdbd2cSJim Jagielski 			if( rProp.Name.compareToAscii( "KeywordList" ) == 0 )
500*b1cdbd2cSJim Jagielski 			{
501*b1cdbd2cSJim Jagielski 				KeywordInfo *inf =
502*b1cdbd2cSJim Jagielski 					m_pDatabases->getKeyword( m_aURLParameter.get_module(),
503*b1cdbd2cSJim Jagielski 											  m_aURLParameter.get_language() );
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 				uno::Any aAny;
506*b1cdbd2cSJim Jagielski                 if( inf )
507*b1cdbd2cSJim Jagielski                     aAny <<= inf->getKeywordList();
508*b1cdbd2cSJim Jagielski 				xRow->appendObject( rProp,aAny );
509*b1cdbd2cSJim Jagielski 			}
510*b1cdbd2cSJim Jagielski 			else if( rProp.Name.compareToAscii( "KeywordRef" ) == 0 )
511*b1cdbd2cSJim Jagielski 			{
512*b1cdbd2cSJim Jagielski 				KeywordInfo *inf =
513*b1cdbd2cSJim Jagielski 					m_pDatabases->getKeyword( m_aURLParameter.get_module(),
514*b1cdbd2cSJim Jagielski 											  m_aURLParameter.get_language() );
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 				uno::Any aAny;
517*b1cdbd2cSJim Jagielski                 if( inf )
518*b1cdbd2cSJim Jagielski                     aAny <<= inf->getIdList();
519*b1cdbd2cSJim Jagielski 				xRow->appendObject( rProp,aAny );
520*b1cdbd2cSJim Jagielski 			}
521*b1cdbd2cSJim Jagielski 			else if( rProp.Name.compareToAscii( "KeywordAnchorForRef" ) == 0 )
522*b1cdbd2cSJim Jagielski 			{
523*b1cdbd2cSJim Jagielski 				KeywordInfo *inf =
524*b1cdbd2cSJim Jagielski 					m_pDatabases->getKeyword( m_aURLParameter.get_module(),
525*b1cdbd2cSJim Jagielski 											  m_aURLParameter.get_language() );
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski 				uno::Any aAny;
528*b1cdbd2cSJim Jagielski                 if( inf )
529*b1cdbd2cSJim Jagielski                     aAny <<= inf->getAnchorList();
530*b1cdbd2cSJim Jagielski 				xRow->appendObject( rProp,aAny );
531*b1cdbd2cSJim Jagielski 			}
532*b1cdbd2cSJim Jagielski 			else if( rProp.Name.compareToAscii( "KeywordTitleForRef" ) == 0 )
533*b1cdbd2cSJim Jagielski 			{
534*b1cdbd2cSJim Jagielski 				KeywordInfo *inf =
535*b1cdbd2cSJim Jagielski 					m_pDatabases->getKeyword( m_aURLParameter.get_module(),
536*b1cdbd2cSJim Jagielski 											  m_aURLParameter.get_language() );
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski 				uno::Any aAny;
539*b1cdbd2cSJim Jagielski                 if( inf )
540*b1cdbd2cSJim Jagielski                     aAny <<= inf->getTitleList();
541*b1cdbd2cSJim Jagielski                 xRow->appendObject( rProp,aAny );
542*b1cdbd2cSJim Jagielski 			}
543*b1cdbd2cSJim Jagielski 			else if( rProp.Name.compareToAscii( "SearchScopes" ) == 0 )
544*b1cdbd2cSJim Jagielski 			{
545*b1cdbd2cSJim Jagielski 				uno::Sequence< rtl::OUString > seq( 2 );
546*b1cdbd2cSJim Jagielski 				seq[0] = rtl::OUString::createFromAscii( "Heading" );
547*b1cdbd2cSJim Jagielski 				seq[1] = rtl::OUString::createFromAscii( "FullText" );
548*b1cdbd2cSJim Jagielski 				uno::Any aAny;
549*b1cdbd2cSJim Jagielski 				aAny <<= seq;
550*b1cdbd2cSJim Jagielski 				xRow->appendObject( rProp,aAny );
551*b1cdbd2cSJim Jagielski 			}
552*b1cdbd2cSJim Jagielski 			else if( rProp.Name.compareToAscii( "Order" ) == 0 )
553*b1cdbd2cSJim Jagielski 			{
554*b1cdbd2cSJim Jagielski 				StaticModuleInformation *inf =
555*b1cdbd2cSJim Jagielski 					m_pDatabases->getStaticInformationForModule(
556*b1cdbd2cSJim Jagielski 						m_aURLParameter.get_module(),
557*b1cdbd2cSJim Jagielski 						m_aURLParameter.get_language() );
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 				uno::Any aAny;
560*b1cdbd2cSJim Jagielski                 if( inf )
561*b1cdbd2cSJim Jagielski                     aAny <<= sal_Int32( inf->get_order() );
562*b1cdbd2cSJim Jagielski                 xRow->appendObject( rProp,aAny );
563*b1cdbd2cSJim Jagielski 			}
564*b1cdbd2cSJim Jagielski 			else
565*b1cdbd2cSJim Jagielski 				xRow->appendVoid( rProp );
566*b1cdbd2cSJim Jagielski 		else if( rProp.Name.compareToAscii( "AnchorName" ) == 0 &&
567*b1cdbd2cSJim Jagielski 				 m_aURLParameter.isFile() )
568*b1cdbd2cSJim Jagielski 			xRow->appendString( rProp,m_aURLParameter.get_tag() );
569*b1cdbd2cSJim Jagielski 		else
570*b1cdbd2cSJim Jagielski 			xRow->appendVoid( rProp );
571*b1cdbd2cSJim Jagielski 	}
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 	return uno::Reference< sdbc::XRow >( xRow.get() );
574*b1cdbd2cSJim Jagielski }
575