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