1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_ucb.hxx"
26 
27 /**************************************************************************
28                                 TODO
29  **************************************************************************
30 
31  **************************************************************************
32 
33     Props/Commands:
34 
35                            root    folder  folder  link    link
36                                    (new)           (new)
37     ----------------------------------------------------------------
38     ContentType            x       x       x       x       x
39     IsDocument             x       x       x       x       x
40     IsFolder               x       x       x       x       x
41     Title                  x       x       x       x       x
42     TargetURL                                      x       x
43     CreatableContentsInfo  x       x       x       x       x
44 
45     getCommandInfo         x       x       x       x       x
46     getPropertySetInfo     x       x       x       x       x
47     getPropertyValues      x       x       x       x       x
48     setPropertyValues      x       x       x       x       x
49     createNewContent       x               x
50     insert                                 x               x
51     delete                         x               x
52     open                   x       x
53     transfer               x       x
54 
55  *************************************************************************/
56 
57 #include <com/sun/star/beans/Property.hpp>
58 #include <com/sun/star/beans/PropertyAttribute.hpp>
59 #include <com/sun/star/beans/PropertyValue.hpp>
60 #include <com/sun/star/ucb/CommandInfo.hpp>
61 #include <com/sun/star/ucb/OpenCommandArgument2.hpp>
62 #include <com/sun/star/ucb/TransferInfo.hpp>
63 #include <com/sun/star/uno/Sequence.hxx>
64 #include "hierarchycontent.hxx"
65 
66 using namespace com::sun::star;
67 using namespace hierarchy_ucp;
68 
69 //=========================================================================
70 //
71 // HierarchyContent implementation.
72 //
73 //=========================================================================
74 
75 #define MAKEPROPSEQUENCE( a ) \
76     uno::Sequence< beans::Property >( a, sizeof( a )  / sizeof( a[ 0 ] ) )
77 
78 #define MAKECMDSEQUENCE( a ) \
79     uno::Sequence< ucb::CommandInfo >( a, sizeof( a )  / sizeof( a[ 0 ] ) )
80 
81 //=========================================================================
82 //
83 // IMPORTENT: If any property data ( name / type / ... ) are changed, then
84 //            HierarchyContent::getPropertyValues(...) must be adapted too!
85 //
86 //=========================================================================
87 
88 // virtual
89 uno::Sequence< beans::Property > HierarchyContent::getProperties(
90             const uno::Reference< ucb::XCommandEnvironment > & /*xEnv*/ )
91 {
92     osl::Guard< osl::Mutex > aGuard( m_aMutex );
93 
94     if ( m_eKind == LINK )
95     {
96         //=================================================================
97         //
98         // Link: Supported properties
99         //
100         //=================================================================
101 
102         if ( isReadOnly() )
103         {
104             static beans::Property aLinkPropertyInfoTable[] =
105             {
106                 ///////////////////////////////////////////////////////////
107                 // Required properties
108                 ///////////////////////////////////////////////////////////
109                 beans::Property(
110                     rtl::OUString(
111                         RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
112                     -1,
113                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
114                     beans::PropertyAttribute::BOUND
115                         | beans::PropertyAttribute::READONLY
116                 ),
117                 beans::Property(
118                     rtl::OUString(
119                         RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
120                     -1,
121                     getCppuBooleanType(),
122                     beans::PropertyAttribute::BOUND
123                         | beans::PropertyAttribute::READONLY
124                 ),
125                 beans::Property(
126                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
127                     -1,
128                     getCppuBooleanType(),
129                     beans::PropertyAttribute::BOUND
130                         | beans::PropertyAttribute::READONLY
131                 ),
132                 beans::Property(
133                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
134                     -1,
135                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
136                     beans::PropertyAttribute::BOUND
137                         | beans::PropertyAttribute::READONLY
138                 ),
139                 ///////////////////////////////////////////////////////////
140                 // Optional standard properties
141                 ///////////////////////////////////////////////////////////
142                 beans::Property(
143                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" ) ),
144                     -1,
145                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
146                     beans::PropertyAttribute::BOUND
147                         | beans::PropertyAttribute::READONLY
148                 ),
149                 beans::Property(
150                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
151                         "CreatableContentsInfo" ) ),
152                     -1,
153                     getCppuType( static_cast<
154                         const uno::Sequence< ucb::ContentInfo > * >( 0 ) ),
155                     beans::PropertyAttribute::BOUND
156                         | beans::PropertyAttribute::READONLY )
157                 ///////////////////////////////////////////////////////////
158                 // New properties
159                 ///////////////////////////////////////////////////////////
160             };
161             return MAKEPROPSEQUENCE( aLinkPropertyInfoTable );
162         }
163         else
164         {
165             static beans::Property aLinkPropertyInfoTable[] =
166             {
167                 ///////////////////////////////////////////////////////////
168                 // Required properties
169                 ///////////////////////////////////////////////////////////
170                 beans::Property(
171                     rtl::OUString(
172                         RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
173                     -1,
174                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
175                     beans::PropertyAttribute::BOUND
176                         | beans::PropertyAttribute::READONLY
177                 ),
178                 beans::Property(
179                     rtl::OUString(
180                         RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
181                     -1,
182                     getCppuBooleanType(),
183                     beans::PropertyAttribute::BOUND
184                         | beans::PropertyAttribute::READONLY
185                 ),
186                 beans::Property(
187                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
188                     -1,
189                     getCppuBooleanType(),
190                     beans::PropertyAttribute::BOUND
191                         | beans::PropertyAttribute::READONLY
192                 ),
193                 beans::Property(
194                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
195                     -1,
196                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
197                     beans::PropertyAttribute::BOUND
198                 ),
199                 ///////////////////////////////////////////////////////////
200                 // Optional standard properties
201                 ///////////////////////////////////////////////////////////
202                 beans::Property(
203                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" ) ),
204                     -1,
205                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
206                     beans::PropertyAttribute::BOUND
207                 ),
208                 beans::Property(
209                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
210                         "CreatableContentsInfo" ) ),
211                     -1,
212                     getCppuType( static_cast<
213                         const uno::Sequence< ucb::ContentInfo > * >( 0 ) ),
214                     beans::PropertyAttribute::BOUND
215                         | beans::PropertyAttribute::READONLY )
216                 ///////////////////////////////////////////////////////////
217                 // New properties
218                 ///////////////////////////////////////////////////////////
219             };
220             return MAKEPROPSEQUENCE( aLinkPropertyInfoTable );
221         }
222     }
223     else if ( m_eKind == FOLDER )
224     {
225         //=================================================================
226         //
227         // Folder: Supported properties
228         //
229         //=================================================================
230 
231         if ( isReadOnly() )
232         {
233             static beans::Property aFolderPropertyInfoTable[] =
234             {
235                 ///////////////////////////////////////////////////////////
236                 // Required properties
237                 ///////////////////////////////////////////////////////////
238                 beans::Property(
239                     rtl::OUString(
240                         RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
241                     -1,
242                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
243                     beans::PropertyAttribute::BOUND
244                         | beans::PropertyAttribute::READONLY
245                 ),
246                 beans::Property(
247                     rtl::OUString(
248                         RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
249                     -1,
250                     getCppuBooleanType(),
251                     beans::PropertyAttribute::BOUND
252                         | beans::PropertyAttribute::READONLY
253                 ),
254                 beans::Property(
255                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
256                     -1,
257                     getCppuBooleanType(),
258                     beans::PropertyAttribute::BOUND
259                         | beans::PropertyAttribute::READONLY
260                 ),
261                 beans::Property(
262                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
263                     -1,
264                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
265                     beans::PropertyAttribute::BOUND
266                         | beans::PropertyAttribute::READONLY
267                 ),
268                 ///////////////////////////////////////////////////////////
269                 // Optional standard properties
270                 ///////////////////////////////////////////////////////////
271                 beans::Property(
272                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
273                         "CreatableContentsInfo" ) ),
274                     -1,
275                     getCppuType( static_cast<
276                         const uno::Sequence< ucb::ContentInfo > * >( 0 ) ),
277                     beans::PropertyAttribute::BOUND
278                         | beans::PropertyAttribute::READONLY )
279                 ///////////////////////////////////////////////////////////
280                 // New properties
281                 ///////////////////////////////////////////////////////////
282             };
283             return MAKEPROPSEQUENCE( aFolderPropertyInfoTable );
284         }
285         else
286         {
287             static beans::Property aFolderPropertyInfoTable[] =
288             {
289                 ///////////////////////////////////////////////////////////
290                 // Required properties
291                 ///////////////////////////////////////////////////////////
292                 beans::Property(
293                     rtl::OUString(
294                         RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
295                     -1,
296                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
297                     beans::PropertyAttribute::BOUND
298                         | beans::PropertyAttribute::READONLY
299                 ),
300                 beans::Property(
301                     rtl::OUString(
302                         RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
303                     -1,
304                     getCppuBooleanType(),
305                     beans::PropertyAttribute::BOUND
306                         | beans::PropertyAttribute::READONLY
307                 ),
308                 beans::Property(
309                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
310                     -1,
311                     getCppuBooleanType(),
312                     beans::PropertyAttribute::BOUND
313                         | beans::PropertyAttribute::READONLY
314                 ),
315                 beans::Property(
316                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
317                     -1,
318                     getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
319                     beans::PropertyAttribute::BOUND
320                 ),
321                 ///////////////////////////////////////////////////////////
322                 // Optional standard properties
323                 ///////////////////////////////////////////////////////////
324                 beans::Property(
325                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
326                         "CreatableContentsInfo" ) ),
327                     -1,
328                     getCppuType( static_cast<
329                         const uno::Sequence< ucb::ContentInfo > * >( 0 ) ),
330                     beans::PropertyAttribute::BOUND
331                         | beans::PropertyAttribute::READONLY )
332                 ///////////////////////////////////////////////////////////
333                 // New properties
334                 ///////////////////////////////////////////////////////////
335             };
336             return MAKEPROPSEQUENCE( aFolderPropertyInfoTable );
337         }
338     }
339     else
340     {
341         //=================================================================
342         //
343         // Root Folder: Supported properties
344         //
345         //=================================================================
346 
347         // Currently no difference between reonly /read-write
348         // -> all props ar read-only
349 
350         static beans::Property aRootFolderPropertyInfoTable[] =
351         {
352             ///////////////////////////////////////////////////////////////
353             // Required properties
354             ///////////////////////////////////////////////////////////////
355             beans::Property(
356                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
357                 -1,
358                 getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
359                 beans::PropertyAttribute::BOUND
360                     | beans::PropertyAttribute::READONLY
361             ),
362             beans::Property(
363                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
364                 -1,
365                 getCppuBooleanType(),
366                 beans::PropertyAttribute::BOUND
367                     | beans::PropertyAttribute::READONLY
368             ),
369             beans::Property(
370                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
371                 -1,
372                 getCppuBooleanType(),
373                 beans::PropertyAttribute::BOUND
374                     | beans::PropertyAttribute::READONLY
375             ),
376             beans::Property(
377                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
378                 -1,
379                 getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
380                 beans::PropertyAttribute::BOUND
381                     | beans::PropertyAttribute::READONLY
382             ),
383             ///////////////////////////////////////////////////////////////
384             // Optional standard properties
385             ///////////////////////////////////////////////////////////////
386             beans::Property(
387                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
388                         "CreatableContentsInfo" ) ),
389                     -1,
390                     getCppuType( static_cast<
391                         const uno::Sequence< ucb::ContentInfo > * >( 0 ) ),
392                     beans::PropertyAttribute::BOUND
393                         | beans::PropertyAttribute::READONLY )
394             ///////////////////////////////////////////////////////////////
395             // New properties
396             ///////////////////////////////////////////////////////////////
397         };
398         return MAKEPROPSEQUENCE( aRootFolderPropertyInfoTable );
399     }
400 }
401 
402 //=========================================================================
403 // virtual
404 uno::Sequence< ucb::CommandInfo > HierarchyContent::getCommands(
405             const uno::Reference< ucb::XCommandEnvironment > & /*xEnv*/ )
406 {
407     osl::Guard< osl::Mutex > aGuard( m_aMutex );
408 
409     if ( m_eKind == LINK )
410     {
411         //=================================================================
412         //
413         // Link: Supported commands
414         //
415         //=================================================================
416 
417         if ( isReadOnly() )
418         {
419             static const ucb::CommandInfo aLinkCommandInfoTable[] =
420             {
421                 ///////////////////////////////////////////////////////////
422                 // Required commands
423                 ///////////////////////////////////////////////////////////
424                 ucb::CommandInfo(
425                     rtl::OUString(
426                         RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
427                     -1,
428                     getCppuVoidType()
429                 ),
430                 ucb::CommandInfo(
431                     rtl::OUString(
432                         RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
433                     -1,
434                     getCppuVoidType()
435                 ),
436                 ucb::CommandInfo(
437                     rtl::OUString(
438                         RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
439                     -1,
440                     getCppuType(
441                         static_cast< uno::Sequence< beans::Property > * >( 0 ) )
442                 ),
443                 ucb::CommandInfo(
444                     rtl::OUString(
445                         RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
446                     -1,
447                     getCppuType(
448                         static_cast<
449                             uno::Sequence< beans::PropertyValue > * >( 0 ) )
450                 )
451                 ///////////////////////////////////////////////////////////
452                 // Optional standard commands
453                 ///////////////////////////////////////////////////////////
454 
455                 ///////////////////////////////////////////////////////////
456                 // New commands
457                 ///////////////////////////////////////////////////////////
458             };
459             return MAKECMDSEQUENCE( aLinkCommandInfoTable );
460         }
461         else
462         {
463             static const ucb::CommandInfo aLinkCommandInfoTable[] =
464             {
465                 ///////////////////////////////////////////////////////////
466                 // Required commands
467                 ///////////////////////////////////////////////////////////
468                 ucb::CommandInfo(
469                     rtl::OUString(
470                         RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
471                     -1,
472                     getCppuVoidType()
473                 ),
474                 ucb::CommandInfo(
475                     rtl::OUString(
476                         RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
477                     -1,
478                     getCppuVoidType()
479                 ),
480                 ucb::CommandInfo(
481                     rtl::OUString(
482                         RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
483                     -1,
484                     getCppuType(
485                         static_cast< uno::Sequence< beans::Property > * >( 0 ) )
486                 ),
487                 ucb::CommandInfo(
488                     rtl::OUString(
489                         RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
490                     -1,
491                     getCppuType(
492                         static_cast<
493                             uno::Sequence< beans::PropertyValue > * >( 0 ) )
494                 ),
495                 ///////////////////////////////////////////////////////////
496                 // Optional standard commands
497                 ///////////////////////////////////////////////////////////
498                 ucb::CommandInfo(
499                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "delete" ) ),
500                     -1,
501                     getCppuBooleanType()
502                 ),
503                 ucb::CommandInfo(
504                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "insert" ) ),
505                     -1,
506                     getCppuVoidType()
507                 )
508                 ///////////////////////////////////////////////////////////
509                 // New commands
510                 ///////////////////////////////////////////////////////////
511             };
512             return MAKECMDSEQUENCE( aLinkCommandInfoTable );
513         }
514     }
515     else if ( m_eKind == FOLDER )
516     {
517         //=================================================================
518         //
519         // Folder: Supported commands
520         //
521         //=================================================================
522 
523         if ( isReadOnly() )
524         {
525             static const ucb::CommandInfo aFolderCommandInfoTable[] =
526             {
527                 ///////////////////////////////////////////////////////////
528                 // Required commands
529                 ///////////////////////////////////////////////////////////
530                 ucb::CommandInfo(
531                     rtl::OUString(
532                         RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
533                     -1,
534                     getCppuVoidType()
535                 ),
536                 ucb::CommandInfo(
537                     rtl::OUString(
538                         RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
539                     -1,
540                     getCppuVoidType()
541                 ),
542                 ucb::CommandInfo(
543                     rtl::OUString(
544                         RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
545                     -1,
546                     getCppuType(
547                         static_cast< uno::Sequence< beans::Property > * >( 0 ) )
548                 ),
549                 ucb::CommandInfo(
550                     rtl::OUString(
551                         RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
552                     -1,
553                     getCppuType(
554                         static_cast<
555                             uno::Sequence< beans::PropertyValue > * >( 0 ) )
556                 ),
557                 ///////////////////////////////////////////////////////////
558                 // Optional standard commands
559                 ///////////////////////////////////////////////////////////
560                 ucb::CommandInfo(
561                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "open" ) ),
562                     -1,
563                     getCppuType(
564                         static_cast< ucb::OpenCommandArgument2 * >( 0 ) )
565                 )
566                 ///////////////////////////////////////////////////////////
567                 // New commands
568                 ///////////////////////////////////////////////////////////
569             };
570             return MAKECMDSEQUENCE( aFolderCommandInfoTable );
571         }
572         else
573         {
574             static const ucb::CommandInfo aFolderCommandInfoTable[] =
575             {
576                 ///////////////////////////////////////////////////////////
577                 // Required commands
578                 ///////////////////////////////////////////////////////////
579                 ucb::CommandInfo(
580                     rtl::OUString(
581                         RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
582                     -1,
583                     getCppuVoidType()
584                 ),
585                 ucb::CommandInfo(
586                     rtl::OUString(
587                         RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
588                     -1,
589                     getCppuVoidType()
590                 ),
591                 ucb::CommandInfo(
592                     rtl::OUString(
593                         RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
594                     -1,
595                     getCppuType(
596                         static_cast< uno::Sequence< beans::Property > * >( 0 ) )
597                 ),
598                 ucb::CommandInfo(
599                     rtl::OUString(
600                         RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
601                     -1,
602                     getCppuType(
603                         static_cast<
604                             uno::Sequence< beans::PropertyValue > * >( 0 ) )
605                 ),
606                 ///////////////////////////////////////////////////////////
607                 // Optional standard commands
608                 ///////////////////////////////////////////////////////////
609                 ucb::CommandInfo(
610                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "delete" ) ),
611                     -1,
612                     getCppuBooleanType()
613                 ),
614                 ucb::CommandInfo(
615                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "insert" ) ),
616                     -1,
617                     getCppuVoidType()
618                 ),
619                 ucb::CommandInfo(
620                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "open" ) ),
621                     -1,
622                     getCppuType(
623                         static_cast< ucb::OpenCommandArgument2 * >( 0 ) )
624                 ),
625                 ucb::CommandInfo(
626                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "transfer" ) ),
627                     -1,
628                     getCppuType( static_cast< ucb::TransferInfo * >( 0 ) )
629                 ),
630                 ucb::CommandInfo(
631                     rtl::OUString(
632                         RTL_CONSTASCII_USTRINGPARAM( "createNewContent" ) ),
633                     -1,
634                     getCppuType( static_cast< ucb::ContentInfo * >( 0 ) )
635                 )
636                 ///////////////////////////////////////////////////////////
637                 // New commands
638                 ///////////////////////////////////////////////////////////
639             };
640             return MAKECMDSEQUENCE( aFolderCommandInfoTable );
641         }
642     }
643     else
644     {
645         //=================================================================
646         //
647         // Root Folder: Supported commands
648         //
649         //=================================================================
650 
651         if ( isReadOnly() )
652         {
653             static const ucb::CommandInfo aRootFolderCommandInfoTable[] =
654             {
655                 ///////////////////////////////////////////////////////////
656                 // Required commands
657                 ///////////////////////////////////////////////////////////
658                 ucb::CommandInfo(
659                     rtl::OUString(
660                         RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
661                     -1,
662                     getCppuVoidType()
663                 ),
664                 ucb::CommandInfo(
665                     rtl::OUString(
666                         RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
667                     -1,
668                     getCppuVoidType()
669                 ),
670                 ucb::CommandInfo(
671                     rtl::OUString(
672                         RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
673                     -1,
674                     getCppuType(
675                         static_cast< uno::Sequence< beans::Property > * >( 0 ) )
676                 ),
677                 ucb::CommandInfo(
678                     rtl::OUString(
679                         RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
680                     -1,
681                     getCppuType(
682                         static_cast<
683                             uno::Sequence< beans::PropertyValue > * >( 0 ) )
684                 ),
685                 ///////////////////////////////////////////////////////////
686                 // Optional standard commands
687                 ///////////////////////////////////////////////////////////
688                 ucb::CommandInfo(
689                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "open" ) ),
690                     -1,
691                     getCppuType(
692                         static_cast< ucb::OpenCommandArgument2 * >( 0 ) )
693                 )
694                 ///////////////////////////////////////////////////////////
695                 // New commands
696                 ///////////////////////////////////////////////////////////
697             };
698             return MAKECMDSEQUENCE( aRootFolderCommandInfoTable );
699         }
700         else
701         {
702             static const ucb::CommandInfo aRootFolderCommandInfoTable[] =
703             {
704                 ///////////////////////////////////////////////////////////
705                 // Required commands
706                 ///////////////////////////////////////////////////////////
707                 ucb::CommandInfo(
708                     rtl::OUString(
709                         RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
710                     -1,
711                     getCppuVoidType()
712                 ),
713                 ucb::CommandInfo(
714                     rtl::OUString(
715                         RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
716                     -1,
717                     getCppuVoidType()
718                 ),
719                 ucb::CommandInfo(
720                     rtl::OUString(
721                         RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
722                     -1,
723                     getCppuType(
724                         static_cast< uno::Sequence< beans::Property > * >( 0 ) )
725                 ),
726                 ucb::CommandInfo(
727                     rtl::OUString(
728                         RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
729                     -1,
730                     getCppuType(
731                         static_cast<
732                             uno::Sequence< beans::PropertyValue > * >( 0 ) )
733                 ),
734                 ///////////////////////////////////////////////////////////
735                 // Optional standard commands
736                 ///////////////////////////////////////////////////////////
737                 ucb::CommandInfo(
738                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "open" ) ),
739                     -1,
740                     getCppuType(
741                         static_cast< ucb::OpenCommandArgument2 * >( 0 ) )
742                 ),
743                 ucb::CommandInfo(
744                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "transfer" ) ),
745                     -1,
746                     getCppuType( static_cast< ucb::TransferInfo * >( 0 ) )
747                 ),
748                 ucb::CommandInfo(
749                     rtl::OUString(
750                         RTL_CONSTASCII_USTRINGPARAM( "createNewContent" ) ),
751                     -1,
752                     getCppuType( static_cast< ucb::ContentInfo * >( 0 ) )
753                 )
754                 ///////////////////////////////////////////////////////////
755                 // New commands
756                 ///////////////////////////////////////////////////////////
757             };
758             return MAKECMDSEQUENCE( aRootFolderCommandInfoTable );
759         }
760     }
761 }
762