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_webdav.hxx"
26cdf0e10cSrcweir /**************************************************************************
27cdf0e10cSrcweir TODO
28cdf0e10cSrcweir **************************************************************************
29cdf0e10cSrcweir
30cdf0e10cSrcweir *************************************************************************/
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <set>
33cdf0e10cSrcweir #include <com/sun/star/beans/Property.hpp>
34cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
35cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
36cdf0e10cSrcweir #include <com/sun/star/ucb/CommandInfo.hpp>
37cdf0e10cSrcweir #include <com/sun/star/ucb/ContentInfo.hpp>
38cdf0e10cSrcweir #include <com/sun/star/ucb/OpenCommandArgument2.hpp>
39cdf0e10cSrcweir #include <com/sun/star/ucb/InsertCommandArgument.hpp>
40cdf0e10cSrcweir #include <com/sun/star/ucb/PostCommandArgument2.hpp>
4106594b87SAriel Constenla-Haile #include <com/sun/star/ucb/PropertyCommandArgument.hpp>
42cdf0e10cSrcweir #include <com/sun/star/ucb/TransferInfo.hpp>
43cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx>
44cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp>
45cdf0e10cSrcweir #include <com/sun/star/ucb/Lock.hpp>
46cdf0e10cSrcweir #include <com/sun/star/ucb/LockEntry.hpp>
47cdf0e10cSrcweir #include "webdavcontent.hxx"
48cdf0e10cSrcweir #include "webdavprovider.hxx"
49cdf0e10cSrcweir #include "DAVSession.hxx"
50cdf0e10cSrcweir #include "ContentProperties.hxx"
51cdf0e10cSrcweir
52cdf0e10cSrcweir using namespace com::sun::star;
5359ddfc10SAndre Fischer using namespace http_dav_ucp;
54cdf0e10cSrcweir
55cdf0e10cSrcweir //=========================================================================
56cdf0e10cSrcweir //
57cdf0e10cSrcweir // ContentProvider implementation.
58cdf0e10cSrcweir //
59cdf0e10cSrcweir //=========================================================================
60cdf0e10cSrcweir
getProperty(const rtl::OUString & rPropName,beans::Property & rProp,bool bStrict)61cdf0e10cSrcweir bool ContentProvider::getProperty(
62cdf0e10cSrcweir const rtl::OUString & rPropName, beans::Property & rProp, bool bStrict )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir if ( !m_pProps )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex );
67cdf0e10cSrcweir if ( !m_pProps )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir m_pProps = new PropertyMap;
70cdf0e10cSrcweir
71cdf0e10cSrcweir //////////////////////////////////////////////////////////////
72cdf0e10cSrcweir // Fill map of known properties...
73cdf0e10cSrcweir //////////////////////////////////////////////////////////////
74cdf0e10cSrcweir
75cdf0e10cSrcweir // Mandatory UCB properties.
76cdf0e10cSrcweir m_pProps->insert(
77cdf0e10cSrcweir beans::Property(
78cdf0e10cSrcweir rtl::OUString(
79cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
80cdf0e10cSrcweir -1,
81cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
82cdf0e10cSrcweir beans::PropertyAttribute::BOUND
83cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
84cdf0e10cSrcweir
85cdf0e10cSrcweir m_pProps->insert(
86cdf0e10cSrcweir beans::Property(
87cdf0e10cSrcweir rtl::OUString(
88cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
89cdf0e10cSrcweir -1,
90cdf0e10cSrcweir getCppuBooleanType(),
91cdf0e10cSrcweir beans::PropertyAttribute::BOUND
92cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
93cdf0e10cSrcweir
94cdf0e10cSrcweir m_pProps->insert(
95cdf0e10cSrcweir beans::Property(
96cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
97cdf0e10cSrcweir -1,
98cdf0e10cSrcweir getCppuBooleanType(),
99cdf0e10cSrcweir beans::PropertyAttribute::BOUND
100cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
101cdf0e10cSrcweir
102cdf0e10cSrcweir m_pProps->insert(
103cdf0e10cSrcweir beans::Property(
104cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
105cdf0e10cSrcweir -1,
106cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
107cdf0e10cSrcweir beans::PropertyAttribute::BOUND ) );
108cdf0e10cSrcweir
109cdf0e10cSrcweir // Optional UCB properties.
110cdf0e10cSrcweir
111cdf0e10cSrcweir m_pProps->insert(
112cdf0e10cSrcweir beans::Property(
113cdf0e10cSrcweir rtl::OUString(
114cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "DateCreated" ) ),
115cdf0e10cSrcweir -1,
116cdf0e10cSrcweir getCppuType( static_cast< const util::DateTime * >( 0 ) ),
117cdf0e10cSrcweir beans::PropertyAttribute::BOUND
118cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
119cdf0e10cSrcweir
120cdf0e10cSrcweir m_pProps->insert(
121cdf0e10cSrcweir beans::Property(
122cdf0e10cSrcweir rtl::OUString(
123cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "DateModified" ) ),
124cdf0e10cSrcweir -1,
125cdf0e10cSrcweir getCppuType( static_cast< const util::DateTime * >( 0 ) ),
126cdf0e10cSrcweir beans::PropertyAttribute::BOUND
127cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
128cdf0e10cSrcweir
129cdf0e10cSrcweir m_pProps->insert(
130cdf0e10cSrcweir beans::Property(
131cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ),
132cdf0e10cSrcweir -1,
133cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
134cdf0e10cSrcweir beans::PropertyAttribute::BOUND
135cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
136cdf0e10cSrcweir
137cdf0e10cSrcweir m_pProps->insert(
138cdf0e10cSrcweir beans::Property(
139cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Size" ) ),
140cdf0e10cSrcweir -1,
141cdf0e10cSrcweir getCppuType( static_cast< const sal_Int64 * >( 0 ) ),
142cdf0e10cSrcweir beans::PropertyAttribute::BOUND
143cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
144cdf0e10cSrcweir
145cdf0e10cSrcweir m_pProps->insert(
146cdf0e10cSrcweir beans::Property(
147cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BaseURI" ) ),
148cdf0e10cSrcweir -1,
149cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
150cdf0e10cSrcweir beans::PropertyAttribute::BOUND
151cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
152cdf0e10cSrcweir
153cdf0e10cSrcweir m_pProps->insert(
154cdf0e10cSrcweir beans::Property(
155cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
156cdf0e10cSrcweir "CreatableContentsInfo" ) ),
157cdf0e10cSrcweir -1,
158cdf0e10cSrcweir getCppuType( static_cast<
159cdf0e10cSrcweir const uno::Sequence< ucb::ContentInfo > * >( 0 ) ),
160cdf0e10cSrcweir beans::PropertyAttribute::BOUND
161cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
162cdf0e10cSrcweir
163cdf0e10cSrcweir // Standard DAV properties.
164cdf0e10cSrcweir
165cdf0e10cSrcweir m_pProps->insert(
166cdf0e10cSrcweir beans::Property(
167cdf0e10cSrcweir DAVProperties::CREATIONDATE,
168cdf0e10cSrcweir -1,
169cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
170cdf0e10cSrcweir beans::PropertyAttribute::BOUND
171cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
172cdf0e10cSrcweir
173cdf0e10cSrcweir m_pProps->insert(
174cdf0e10cSrcweir beans::Property(
175cdf0e10cSrcweir DAVProperties::DISPLAYNAME,
176cdf0e10cSrcweir -1,
177cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
178cdf0e10cSrcweir beans::PropertyAttribute::BOUND ) );
179cdf0e10cSrcweir
180cdf0e10cSrcweir m_pProps->insert(
181cdf0e10cSrcweir beans::Property(
182cdf0e10cSrcweir DAVProperties::GETCONTENTLANGUAGE,
183cdf0e10cSrcweir -1,
184cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
185cdf0e10cSrcweir beans::PropertyAttribute::BOUND
186cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
187cdf0e10cSrcweir
188cdf0e10cSrcweir m_pProps->insert(
189cdf0e10cSrcweir beans::Property(
190cdf0e10cSrcweir DAVProperties::GETCONTENTLENGTH,
191cdf0e10cSrcweir -1,
192cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
193cdf0e10cSrcweir beans::PropertyAttribute::BOUND
194cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
195cdf0e10cSrcweir
196cdf0e10cSrcweir m_pProps->insert(
197cdf0e10cSrcweir beans::Property(
198cdf0e10cSrcweir DAVProperties::GETCONTENTTYPE ,
199cdf0e10cSrcweir -1,
200cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
201cdf0e10cSrcweir beans::PropertyAttribute::BOUND
202cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
203cdf0e10cSrcweir
204cdf0e10cSrcweir m_pProps->insert(
205cdf0e10cSrcweir beans::Property(
206cdf0e10cSrcweir DAVProperties::GETETAG,
207cdf0e10cSrcweir -1,
208cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
209cdf0e10cSrcweir beans::PropertyAttribute::BOUND
210cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
211cdf0e10cSrcweir
212cdf0e10cSrcweir m_pProps->insert(
213cdf0e10cSrcweir beans::Property(
214cdf0e10cSrcweir DAVProperties::GETLASTMODIFIED,
215cdf0e10cSrcweir -1,
216cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
217cdf0e10cSrcweir beans::PropertyAttribute::BOUND
218cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
219cdf0e10cSrcweir
220cdf0e10cSrcweir m_pProps->insert(
221cdf0e10cSrcweir beans::Property(
222cdf0e10cSrcweir DAVProperties::LOCKDISCOVERY,
223cdf0e10cSrcweir -1,
224cdf0e10cSrcweir getCppuType( static_cast<
225cdf0e10cSrcweir const uno::Sequence< ucb::Lock > * >( 0 ) ),
226cdf0e10cSrcweir beans::PropertyAttribute::BOUND
227cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
228cdf0e10cSrcweir
229cdf0e10cSrcweir m_pProps->insert(
230cdf0e10cSrcweir beans::Property(
231cdf0e10cSrcweir DAVProperties::RESOURCETYPE,
232cdf0e10cSrcweir -1,
233cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
234cdf0e10cSrcweir beans::PropertyAttribute::BOUND
235cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
236cdf0e10cSrcweir
237cdf0e10cSrcweir m_pProps->insert(
238cdf0e10cSrcweir beans::Property(
239cdf0e10cSrcweir DAVProperties::SUPPORTEDLOCK,
240cdf0e10cSrcweir -1,
241cdf0e10cSrcweir getCppuType( static_cast<
242cdf0e10cSrcweir const uno::Sequence<
243cdf0e10cSrcweir ucb::LockEntry > * >( 0 ) ),
244cdf0e10cSrcweir beans::PropertyAttribute::BOUND
245cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) );
246cdf0e10cSrcweir
247cdf0e10cSrcweir m_pProps->insert(
248cdf0e10cSrcweir beans::Property(
249cdf0e10cSrcweir DAVProperties::EXECUTABLE,
250cdf0e10cSrcweir -1,
251cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
252cdf0e10cSrcweir beans::PropertyAttribute::BOUND ) );
253cdf0e10cSrcweir }
254cdf0e10cSrcweir }
255cdf0e10cSrcweir
256cdf0e10cSrcweir //////////////////////////////////////////////////////////////
257cdf0e10cSrcweir // Lookup property.
258cdf0e10cSrcweir //////////////////////////////////////////////////////////////
259cdf0e10cSrcweir
260cdf0e10cSrcweir beans::Property aProp;
261cdf0e10cSrcweir aProp.Name = rPropName;
262cdf0e10cSrcweir const PropertyMap::const_iterator it = m_pProps->find( aProp );
263cdf0e10cSrcweir if ( it != m_pProps->end() )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir rProp = (*it);
266cdf0e10cSrcweir }
267cdf0e10cSrcweir else
268cdf0e10cSrcweir {
269cdf0e10cSrcweir if ( bStrict )
270cdf0e10cSrcweir return false;
271cdf0e10cSrcweir
272cdf0e10cSrcweir // All unknown props are treated as:
273cdf0e10cSrcweir rProp = beans::Property(
274cdf0e10cSrcweir rPropName,
275cdf0e10cSrcweir - 1,
276cdf0e10cSrcweir getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
277cdf0e10cSrcweir beans::PropertyAttribute::BOUND );
278cdf0e10cSrcweir }
279cdf0e10cSrcweir
280cdf0e10cSrcweir return true;
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir //=========================================================================
284cdf0e10cSrcweir //
285cdf0e10cSrcweir // Content implementation.
286cdf0e10cSrcweir //
287cdf0e10cSrcweir //=========================================================================
288cdf0e10cSrcweir
289cdf0e10cSrcweir // virtual
getProperties(const uno::Reference<ucb::XCommandEnvironment> & xEnv)290cdf0e10cSrcweir uno::Sequence< beans::Property > Content::getProperties(
291cdf0e10cSrcweir const uno::Reference< ucb::XCommandEnvironment > & xEnv )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir sal_Bool bTransient;
294cdf0e10cSrcweir std::auto_ptr< DAVResourceAccess > xResAccess;
295cdf0e10cSrcweir std::auto_ptr< ContentProperties > xCachedProps;
296cdf0e10cSrcweir rtl::Reference< ContentProvider > xProvider;
297cdf0e10cSrcweir
298cdf0e10cSrcweir {
299cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
300cdf0e10cSrcweir
301cdf0e10cSrcweir bTransient = m_bTransient;
302cdf0e10cSrcweir xResAccess.reset( new DAVResourceAccess( *m_xResAccess.get() ) );
303cdf0e10cSrcweir if ( m_xCachedProps.get() )
304cdf0e10cSrcweir xCachedProps.reset(
305cdf0e10cSrcweir new ContentProperties( *m_xCachedProps.get() ) );
306cdf0e10cSrcweir xProvider.set( m_pProvider );
307cdf0e10cSrcweir }
308cdf0e10cSrcweir
309cdf0e10cSrcweir typedef std::set< rtl::OUString > StringSet;
310cdf0e10cSrcweir StringSet aPropSet;
311cdf0e10cSrcweir
312cdf0e10cSrcweir // No server access for just created (not yet committed) objects.
313cdf0e10cSrcweir // Only a minimal set of properties supported at this stage.
314cdf0e10cSrcweir if ( !bTransient )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir // Obtain all properties supported for this resource from server.
317cdf0e10cSrcweir try
318cdf0e10cSrcweir {
319cdf0e10cSrcweir std::vector< DAVResourceInfo > props;
320cdf0e10cSrcweir xResAccess->PROPFIND( DAVZERO, props, xEnv );
321cdf0e10cSrcweir
322cdf0e10cSrcweir // Note: vector always contains exactly one resource info, because
323cdf0e10cSrcweir // we used a depth of DAVZERO for PROPFIND.
324cdf0e10cSrcweir aPropSet.insert( (*props.begin()).properties.begin(),
325cdf0e10cSrcweir (*props.begin()).properties.end() );
326cdf0e10cSrcweir }
327cdf0e10cSrcweir catch ( DAVException const & )
328cdf0e10cSrcweir {
329cdf0e10cSrcweir }
330cdf0e10cSrcweir }
331cdf0e10cSrcweir
332cdf0e10cSrcweir // Add DAV properties, map DAV properties to UCB properties.
333cdf0e10cSrcweir sal_Bool bHasCreationDate = sal_False; // creationdate <-> DateCreated
334cdf0e10cSrcweir sal_Bool bHasGetLastModified = sal_False; // getlastmodified <-> DateModified
335cdf0e10cSrcweir sal_Bool bHasGetContentType = sal_False; // getcontenttype <-> MediaType
336cdf0e10cSrcweir sal_Bool bHasGetContentLength = sal_False; // getcontentlength <-> Size
337cdf0e10cSrcweir
338cdf0e10cSrcweir sal_Bool bHasContentType = sal_False;
339cdf0e10cSrcweir sal_Bool bHasIsDocument = sal_False;
340cdf0e10cSrcweir sal_Bool bHasIsFolder = sal_False;
341cdf0e10cSrcweir sal_Bool bHasTitle = sal_False;
342cdf0e10cSrcweir sal_Bool bHasBaseURI = sal_False;
343cdf0e10cSrcweir sal_Bool bHasDateCreated = sal_False;
344cdf0e10cSrcweir sal_Bool bHasDateModified = sal_False;
345cdf0e10cSrcweir sal_Bool bHasMediaType = sal_False;
346cdf0e10cSrcweir sal_Bool bHasSize = sal_False;
347cdf0e10cSrcweir sal_Bool bHasCreatableInfos = sal_False;
348cdf0e10cSrcweir
349cdf0e10cSrcweir {
350cdf0e10cSrcweir std::set< rtl::OUString >::const_iterator it = aPropSet.begin();
351cdf0e10cSrcweir std::set< rtl::OUString >::const_iterator end = aPropSet.end();
352cdf0e10cSrcweir while ( it != end )
353cdf0e10cSrcweir {
354cdf0e10cSrcweir if ( !bHasCreationDate &&
355cdf0e10cSrcweir ( (*it) == DAVProperties::CREATIONDATE ) )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir bHasCreationDate = sal_True;
358cdf0e10cSrcweir }
359cdf0e10cSrcweir else if ( !bHasGetLastModified &&
360cdf0e10cSrcweir ( (*it) == DAVProperties::GETLASTMODIFIED ) )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir bHasGetLastModified = sal_True;
363cdf0e10cSrcweir }
364cdf0e10cSrcweir else if ( !bHasGetContentType &&
365cdf0e10cSrcweir ( (*it) == DAVProperties::GETCONTENTTYPE ) )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir bHasGetContentType = sal_True;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir else if ( !bHasGetContentLength &&
370cdf0e10cSrcweir ( (*it) == DAVProperties::GETCONTENTLENGTH ) )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir bHasGetContentLength = sal_True;
373cdf0e10cSrcweir }
374cdf0e10cSrcweir else if ( !bHasContentType &&
375cdf0e10cSrcweir (*it).equalsAsciiL(
376cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "ContentType" ) ) )
377cdf0e10cSrcweir {
378cdf0e10cSrcweir bHasContentType = sal_True;
379cdf0e10cSrcweir }
380cdf0e10cSrcweir else if ( !bHasIsDocument &&
381cdf0e10cSrcweir (*it).equalsAsciiL(
382cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "IsDocument" ) ) )
383cdf0e10cSrcweir {
384cdf0e10cSrcweir bHasIsDocument = sal_True;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir else if ( !bHasIsFolder &&
387cdf0e10cSrcweir (*it).equalsAsciiL(
388cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "IsFolder" ) ) )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir bHasIsFolder = sal_True;
391cdf0e10cSrcweir }
392cdf0e10cSrcweir else if ( !bHasTitle &&
393cdf0e10cSrcweir (*it).equalsAsciiL(
394cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Title" ) ) )
395cdf0e10cSrcweir {
396cdf0e10cSrcweir bHasTitle = sal_True;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir else if ( !bHasBaseURI &&
399cdf0e10cSrcweir (*it).equalsAsciiL(
400cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "BaseURI" ) ) )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir bHasBaseURI = sal_True;
403cdf0e10cSrcweir }
404cdf0e10cSrcweir else if ( !bHasDateCreated &&
405cdf0e10cSrcweir (*it).equalsAsciiL(
406cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "DateCreated" ) ) )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir bHasDateCreated = sal_True;
409cdf0e10cSrcweir }
410cdf0e10cSrcweir else if ( !bHasDateModified &&
411cdf0e10cSrcweir (*it).equalsAsciiL(
412cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "DateModified" ) ) )
413cdf0e10cSrcweir {
414cdf0e10cSrcweir bHasDateModified = sal_True;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir else if ( !bHasMediaType &&
417cdf0e10cSrcweir (*it).equalsAsciiL(
418cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "MediaType" ) ) )
419cdf0e10cSrcweir {
420cdf0e10cSrcweir bHasMediaType = sal_True;
421cdf0e10cSrcweir }
422cdf0e10cSrcweir else if ( !bHasSize &&
423cdf0e10cSrcweir (*it).equalsAsciiL(
424cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Size" ) ) )
425cdf0e10cSrcweir {
426cdf0e10cSrcweir bHasSize = sal_True;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir else if ( !bHasCreatableInfos &&
429cdf0e10cSrcweir (*it).equalsAsciiL(
430cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(
431cdf0e10cSrcweir "CreatableContentsInfo" ) ) )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir bHasCreatableInfos = sal_True;
434cdf0e10cSrcweir }
435cdf0e10cSrcweir it++;
436cdf0e10cSrcweir }
437cdf0e10cSrcweir }
438cdf0e10cSrcweir
439cdf0e10cSrcweir // Add mandatory properties.
440cdf0e10cSrcweir if ( !bHasContentType )
441cdf0e10cSrcweir aPropSet.insert(
442cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ) );
443cdf0e10cSrcweir
444cdf0e10cSrcweir if ( !bHasIsDocument )
445cdf0e10cSrcweir aPropSet.insert(
446cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ) );
447cdf0e10cSrcweir
448cdf0e10cSrcweir if ( !bHasIsFolder )
449cdf0e10cSrcweir aPropSet.insert(
450cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ) );
451cdf0e10cSrcweir
452cdf0e10cSrcweir if ( !bHasTitle )
453cdf0e10cSrcweir {
454cdf0e10cSrcweir // Always present since it can be calculated from content's URI.
455cdf0e10cSrcweir aPropSet.insert(
456cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ) );
457cdf0e10cSrcweir }
458cdf0e10cSrcweir
459cdf0e10cSrcweir // Add optional properties.
460cdf0e10cSrcweir
461cdf0e10cSrcweir if ( !bHasBaseURI )
462cdf0e10cSrcweir {
463cdf0e10cSrcweir // Always present since it can be calculated from content's URI.
464cdf0e10cSrcweir aPropSet.insert(
465cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BaseURI" ) ) );
466cdf0e10cSrcweir }
467cdf0e10cSrcweir
468cdf0e10cSrcweir if ( !bHasDateCreated && bHasCreationDate )
469cdf0e10cSrcweir aPropSet.insert(
470cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DateCreated" ) ) );
471cdf0e10cSrcweir
472cdf0e10cSrcweir if ( !bHasDateModified && bHasGetLastModified )
473cdf0e10cSrcweir aPropSet.insert(
474cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DateModified" ) ) );
475cdf0e10cSrcweir
476cdf0e10cSrcweir if ( !bHasMediaType && bHasGetContentType )
477cdf0e10cSrcweir aPropSet.insert(
478cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ) );
479cdf0e10cSrcweir
480cdf0e10cSrcweir if ( !bHasSize && bHasGetContentLength )
481cdf0e10cSrcweir aPropSet.insert(
482cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Size" ) ) );
483cdf0e10cSrcweir
484cdf0e10cSrcweir if ( !bHasCreatableInfos )
485cdf0e10cSrcweir aPropSet.insert(
486cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
487cdf0e10cSrcweir "CreatableContentsInfo" ) ) );
488cdf0e10cSrcweir
489cdf0e10cSrcweir // Add cached properties, if present and still missing.
490cdf0e10cSrcweir if ( xCachedProps.get() )
491cdf0e10cSrcweir {
492cdf0e10cSrcweir const std::set< rtl::OUString >::const_iterator set_end
493cdf0e10cSrcweir = aPropSet.end();
494cdf0e10cSrcweir
495cdf0e10cSrcweir const std::auto_ptr< PropertyValueMap > & xProps
496cdf0e10cSrcweir = xCachedProps->getProperties();
497cdf0e10cSrcweir
498cdf0e10cSrcweir PropertyValueMap::const_iterator map_it = xProps->begin();
499cdf0e10cSrcweir const PropertyValueMap::const_iterator map_end = xProps->end();
500cdf0e10cSrcweir
501cdf0e10cSrcweir while ( map_it != map_end )
502cdf0e10cSrcweir {
503cdf0e10cSrcweir if ( aPropSet.find( (*map_it).first ) == set_end )
504cdf0e10cSrcweir aPropSet.insert( (*map_it).first );
505cdf0e10cSrcweir
506cdf0e10cSrcweir ++map_it;
507cdf0e10cSrcweir }
508cdf0e10cSrcweir }
509cdf0e10cSrcweir
510cdf0e10cSrcweir // std::set -> uno::Sequence
511cdf0e10cSrcweir sal_Int32 nCount = aPropSet.size();
512cdf0e10cSrcweir uno::Sequence< beans::Property > aProperties( nCount );
513cdf0e10cSrcweir
514cdf0e10cSrcweir std::set< rtl::OUString >::const_iterator it = aPropSet.begin();
515cdf0e10cSrcweir beans::Property aProp;
516cdf0e10cSrcweir
517cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n, ++it )
518cdf0e10cSrcweir {
519cdf0e10cSrcweir xProvider->getProperty( (*it), aProp );
520cdf0e10cSrcweir aProperties[ n ] = aProp;
521cdf0e10cSrcweir }
522cdf0e10cSrcweir
523cdf0e10cSrcweir return aProperties;
524cdf0e10cSrcweir }
525cdf0e10cSrcweir
526cdf0e10cSrcweir //=========================================================================
527cdf0e10cSrcweir // virtual
getCommands(const uno::Reference<ucb::XCommandEnvironment> & xEnv)528cdf0e10cSrcweir uno::Sequence< ucb::CommandInfo > Content::getCommands(
529cdf0e10cSrcweir const uno::Reference< ucb::XCommandEnvironment > & xEnv )
530cdf0e10cSrcweir {
531cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
532cdf0e10cSrcweir
53306594b87SAriel Constenla-Haile uno::Sequence< ucb::CommandInfo > aCmdInfo( 10 );
534cdf0e10cSrcweir
535cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
536cdf0e10cSrcweir // Mandatory commands
537cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
538cdf0e10cSrcweir
539cdf0e10cSrcweir aCmdInfo[ 0 ] =
540cdf0e10cSrcweir ucb::CommandInfo(
541cdf0e10cSrcweir rtl::OUString(
542cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
543cdf0e10cSrcweir -1,
544cdf0e10cSrcweir getCppuVoidType() );
545cdf0e10cSrcweir aCmdInfo[ 1 ] =
546cdf0e10cSrcweir ucb::CommandInfo(
547cdf0e10cSrcweir rtl::OUString(
548cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
549cdf0e10cSrcweir -1,
550cdf0e10cSrcweir getCppuVoidType() );
551cdf0e10cSrcweir aCmdInfo[ 2 ] =
552cdf0e10cSrcweir ucb::CommandInfo(
553cdf0e10cSrcweir rtl::OUString(
554cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
555cdf0e10cSrcweir -1,
556cdf0e10cSrcweir getCppuType( static_cast<
557cdf0e10cSrcweir uno::Sequence< beans::Property > * >( 0 ) ) );
558cdf0e10cSrcweir aCmdInfo[ 3 ] =
559cdf0e10cSrcweir ucb::CommandInfo(
560cdf0e10cSrcweir rtl::OUString(
561cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
562cdf0e10cSrcweir -1,
563cdf0e10cSrcweir getCppuType( static_cast<
564cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > * >( 0 ) ) );
565cdf0e10cSrcweir
566cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
567cdf0e10cSrcweir // Optional standard commands
568cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
569cdf0e10cSrcweir
570cdf0e10cSrcweir aCmdInfo[ 4 ] =
571cdf0e10cSrcweir ucb::CommandInfo(
572cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "delete" ) ),
573cdf0e10cSrcweir -1,
574cdf0e10cSrcweir getCppuBooleanType() );
575cdf0e10cSrcweir aCmdInfo[ 5 ] =
576cdf0e10cSrcweir ucb::CommandInfo(
577cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "insert" ) ),
578cdf0e10cSrcweir -1,
579cdf0e10cSrcweir getCppuType( static_cast<
580cdf0e10cSrcweir ucb::InsertCommandArgument * >( 0 ) ) );
581cdf0e10cSrcweir aCmdInfo[ 6 ] =
582cdf0e10cSrcweir ucb::CommandInfo(
583cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "open" ) ),
584cdf0e10cSrcweir -1,
585cdf0e10cSrcweir getCppuType( static_cast<
586cdf0e10cSrcweir ucb::OpenCommandArgument2 * >( 0 ) ) );
587cdf0e10cSrcweir
588cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
589cdf0e10cSrcweir // New commands
590cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
591cdf0e10cSrcweir
592cdf0e10cSrcweir aCmdInfo[ 7 ] =
593cdf0e10cSrcweir ucb::CommandInfo(
594cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "post" ) ),
595cdf0e10cSrcweir -1,
596cdf0e10cSrcweir getCppuType( static_cast<
597cdf0e10cSrcweir ucb::PostCommandArgument2 * >( 0 ) ) );
59806594b87SAriel Constenla-Haile aCmdInfo[ 8 ] =
59906594b87SAriel Constenla-Haile ucb::CommandInfo(
60006594b87SAriel Constenla-Haile rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addProperty" ) ),
60106594b87SAriel Constenla-Haile -1,
60206594b87SAriel Constenla-Haile getCppuType( static_cast<
60306594b87SAriel Constenla-Haile ucb::PropertyCommandArgument * >( 0 ) ) );
60406594b87SAriel Constenla-Haile aCmdInfo[ 9 ] =
60506594b87SAriel Constenla-Haile ucb::CommandInfo(
60606594b87SAriel Constenla-Haile rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "removeProperty" ) ),
60706594b87SAriel Constenla-Haile -1,
60806594b87SAriel Constenla-Haile getCppuType( static_cast<
60906594b87SAriel Constenla-Haile rtl::OUString * >( 0 ) ) );
610cdf0e10cSrcweir
611cdf0e10cSrcweir sal_Bool bFolder = sal_False;
612cdf0e10cSrcweir
613cdf0e10cSrcweir try
614cdf0e10cSrcweir {
615cdf0e10cSrcweir bFolder = isFolder( xEnv );
616cdf0e10cSrcweir }
617cdf0e10cSrcweir catch ( uno::Exception const & )
618cdf0e10cSrcweir {
619cdf0e10cSrcweir return aCmdInfo;
620cdf0e10cSrcweir }
621cdf0e10cSrcweir
622cdf0e10cSrcweir sal_Bool bSupportsLocking = supportsExclusiveWriteLock( xEnv );
623cdf0e10cSrcweir
624cdf0e10cSrcweir sal_Int32 nPos = aCmdInfo.getLength();
625cdf0e10cSrcweir sal_Int32 nMoreCmds = ( bFolder ? 2 : 0 ) + ( bSupportsLocking ? 2 : 0 );
626cdf0e10cSrcweir if ( nMoreCmds )
627cdf0e10cSrcweir aCmdInfo.realloc( nPos + nMoreCmds );
628cdf0e10cSrcweir else
629cdf0e10cSrcweir return aCmdInfo;
630cdf0e10cSrcweir
631cdf0e10cSrcweir if ( bFolder )
632cdf0e10cSrcweir {
633cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
634cdf0e10cSrcweir // Optional standard commands
635cdf0e10cSrcweir ///////////////////////////////////////////////////////////////
636cdf0e10cSrcweir
637cdf0e10cSrcweir aCmdInfo[ nPos ] =
638cdf0e10cSrcweir ucb::CommandInfo(
639cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "transfer" ) ),
640cdf0e10cSrcweir -1,
641cdf0e10cSrcweir getCppuType( static_cast< ucb::TransferInfo * >( 0 ) ) );
642cdf0e10cSrcweir nPos++;
643cdf0e10cSrcweir aCmdInfo[ nPos ] =
644cdf0e10cSrcweir ucb::CommandInfo(
645cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
646cdf0e10cSrcweir "createNewContent" ) ),
647cdf0e10cSrcweir -1,
648cdf0e10cSrcweir getCppuType( static_cast< ucb::ContentInfo * >( 0 ) ) );
649cdf0e10cSrcweir nPos++;
650cdf0e10cSrcweir }
651cdf0e10cSrcweir else
652cdf0e10cSrcweir {
653cdf0e10cSrcweir // no document-only commands at the moment.
654cdf0e10cSrcweir }
655cdf0e10cSrcweir
656cdf0e10cSrcweir if ( bSupportsLocking )
657cdf0e10cSrcweir {
658cdf0e10cSrcweir aCmdInfo[ nPos ] =
659cdf0e10cSrcweir ucb::CommandInfo(
660cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "lock" ) ),
661cdf0e10cSrcweir -1,
662cdf0e10cSrcweir getCppuVoidType() );
663cdf0e10cSrcweir nPos++;
664cdf0e10cSrcweir aCmdInfo[ nPos ] =
665cdf0e10cSrcweir ucb::CommandInfo(
666cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "unlock" ) ),
667cdf0e10cSrcweir -1,
668cdf0e10cSrcweir getCppuVoidType() );
669cdf0e10cSrcweir nPos++;
670cdf0e10cSrcweir }
671cdf0e10cSrcweir return aCmdInfo;
672cdf0e10cSrcweir }
673