Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <rtl/uri.hxx>
21 : #include <rtl/ustrbuf.hxx>
22 : #include <osl/file.hxx>
23 :
24 : #include "osl/diagnose.h"
25 : #include <com/sun/star/ucb/OpenMode.hpp>
26 : #include <com/sun/star/beans/PropertyAttribute.hpp>
27 : #include <com/sun/star/ucb/XProgressHandler.hpp>
28 : #include <com/sun/star/task/XInteractionHandler.hpp>
29 : #include <com/sun/star/io/XActiveDataStreamer.hpp>
30 : #include <com/sun/star/io/XOutputStream.hpp>
31 : #include <com/sun/star/ucb/NumberedSortingInfo.hpp>
32 : #include <com/sun/star/io/XActiveDataSink.hpp>
33 : #include <com/sun/star/beans/PropertyChangeEvent.hpp>
34 : #include <com/sun/star/beans/PropertySetInfoChange.hpp>
35 : #include <com/sun/star/ucb/ContentAction.hpp>
36 : #include <com/sun/star/ucb/NameClash.hpp>
37 : #include <cppuhelper/supportsservice.hxx>
38 : #include "filglob.hxx"
39 : #include "filid.hxx"
40 : #include "filrow.hxx"
41 : #include "bc.hxx"
42 : #include "prov.hxx"
43 : #include "filerror.hxx"
44 : #include "filinsreq.hxx"
45 :
46 : using namespace fileaccess;
47 : using namespace com::sun::star;
48 : using namespace com::sun::star::uno;
49 : using namespace com::sun::star::ucb;
50 :
51 : #if OSL_DEBUG_LEVEL > 0
52 : #define THROW_WHERE SAL_WHERE
53 : #else
54 : #define THROW_WHERE ""
55 : #endif
56 :
57 : // PropertyListeners
58 :
59 :
60 : typedef cppu::OMultiTypeInterfaceContainerHelperVar< OUString,OUStringHash >
61 : PropertyListeners_impl;
62 :
63 0 : class fileaccess::PropertyListeners
64 : : public PropertyListeners_impl
65 : {
66 : public:
67 0 : PropertyListeners( ::osl::Mutex& aMutex )
68 0 : : PropertyListeners_impl( aMutex )
69 : {
70 0 : }
71 : };
72 :
73 :
74 : /****************************************************************************************/
75 : /* */
76 : /* BaseContent */
77 : /* */
78 : /****************************************************************************************/
79 :
80 :
81 : // Private Constructor for just inserted Contents
82 :
83 0 : BaseContent::BaseContent( shell* pMyShell,
84 : const OUString& parentName,
85 : sal_Bool bFolder )
86 : : m_pMyShell( pMyShell ),
87 : m_xContentIdentifier( 0 ),
88 : m_aUncPath( parentName ),
89 : m_bFolder( bFolder ),
90 : m_nState( JustInserted ),
91 : m_pDisposeEventListeners( 0 ),
92 : m_pContentEventListeners( 0 ),
93 : m_pPropertySetInfoChangeListeners( 0 ),
94 0 : m_pPropertyListener( 0 )
95 : {
96 0 : m_pMyShell->m_pProvider->acquire();
97 : // No registering, since we have no name
98 0 : }
99 :
100 :
101 :
102 : // Constructor for full featured Contents
103 :
104 0 : BaseContent::BaseContent( shell* pMyShell,
105 : const Reference< XContentIdentifier >& xContentIdentifier,
106 : const OUString& aUncPath )
107 : : m_pMyShell( pMyShell ),
108 : m_xContentIdentifier( xContentIdentifier ),
109 : m_aUncPath( aUncPath ),
110 : m_bFolder( false ),
111 : m_nState( FullFeatured ),
112 : m_pDisposeEventListeners( 0 ),
113 : m_pContentEventListeners( 0 ),
114 : m_pPropertySetInfoChangeListeners( 0 ),
115 0 : m_pPropertyListener( 0 )
116 : {
117 0 : m_pMyShell->m_pProvider->acquire();
118 0 : m_pMyShell->registerNotifier( m_aUncPath,this );
119 0 : m_pMyShell->insertDefaultProperties( m_aUncPath );
120 0 : }
121 :
122 :
123 0 : BaseContent::~BaseContent( )
124 : {
125 0 : if( ( m_nState & FullFeatured ) || ( m_nState & Deleted ) )
126 : {
127 0 : m_pMyShell->deregisterNotifier( m_aUncPath,this );
128 : }
129 0 : m_pMyShell->m_pProvider->release();
130 :
131 0 : delete m_pDisposeEventListeners;
132 0 : delete m_pContentEventListeners;
133 0 : delete m_pPropertyListener;
134 0 : delete m_pPropertySetInfoChangeListeners;
135 0 : }
136 :
137 :
138 :
139 : // XInterface
140 :
141 :
142 : void SAL_CALL
143 0 : BaseContent::acquire( void )
144 : throw()
145 : {
146 0 : OWeakObject::acquire();
147 0 : }
148 :
149 :
150 : void SAL_CALL
151 0 : BaseContent::release( void )
152 : throw()
153 : {
154 0 : OWeakObject::release();
155 0 : }
156 :
157 :
158 : Any SAL_CALL
159 0 : BaseContent::queryInterface( const Type& rType )
160 : throw( RuntimeException, std::exception )
161 : {
162 : Any aRet = cppu::queryInterface( rType,
163 : (static_cast< lang::XComponent* >(this)),
164 : (static_cast< lang::XTypeProvider* >(this)),
165 : (static_cast< lang::XServiceInfo* >(this)),
166 : (static_cast< XCommandProcessor* >(this)),
167 : (static_cast< container::XChild* >(this)),
168 : (static_cast< beans::XPropertiesChangeNotifier* >(this)),
169 : (static_cast< beans::XPropertyContainer* >(this)),
170 : (static_cast< XContentCreator* >(this)),
171 : (static_cast< beans::XPropertySetInfoChangeNotifier* >(this)),
172 0 : (static_cast< XContent* >(this)) );
173 0 : return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
174 : }
175 :
176 :
177 :
178 :
179 :
180 : // XComponent
181 :
182 :
183 : void SAL_CALL
184 0 : BaseContent::addEventListener( const Reference< lang::XEventListener >& Listener )
185 : throw( RuntimeException, std::exception )
186 : {
187 0 : osl::MutexGuard aGuard( m_aMutex );
188 :
189 0 : if ( ! m_pDisposeEventListeners )
190 : m_pDisposeEventListeners =
191 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
192 :
193 0 : m_pDisposeEventListeners->addInterface( Listener );
194 0 : }
195 :
196 :
197 : void SAL_CALL
198 0 : BaseContent::removeEventListener( const Reference< lang::XEventListener >& Listener )
199 : throw( RuntimeException, std::exception )
200 : {
201 0 : osl::MutexGuard aGuard( m_aMutex );
202 :
203 0 : if ( m_pDisposeEventListeners )
204 0 : m_pDisposeEventListeners->removeInterface( Listener );
205 0 : }
206 :
207 :
208 : void SAL_CALL
209 0 : BaseContent::dispose()
210 : throw( RuntimeException, std::exception )
211 : {
212 0 : lang::EventObject aEvt;
213 : cppu::OInterfaceContainerHelper* pDisposeEventListeners;
214 : cppu::OInterfaceContainerHelper* pContentEventListeners;
215 : cppu::OInterfaceContainerHelper* pPropertySetInfoChangeListeners;
216 : PropertyListeners* pPropertyListener;
217 :
218 : {
219 0 : osl::MutexGuard aGuard( m_aMutex );
220 0 : aEvt.Source = static_cast< XContent* >( this );
221 :
222 :
223 : pDisposeEventListeners =
224 0 : m_pDisposeEventListeners, m_pDisposeEventListeners = 0;
225 :
226 : pContentEventListeners =
227 0 : m_pContentEventListeners, m_pContentEventListeners = 0;
228 :
229 : pPropertySetInfoChangeListeners =
230 : m_pPropertySetInfoChangeListeners,
231 0 : m_pPropertySetInfoChangeListeners = 0;
232 :
233 : pPropertyListener =
234 0 : m_pPropertyListener, m_pPropertyListener = 0;
235 : }
236 :
237 0 : if ( pDisposeEventListeners && pDisposeEventListeners->getLength() )
238 0 : pDisposeEventListeners->disposeAndClear( aEvt );
239 :
240 0 : if ( pContentEventListeners && pContentEventListeners->getLength() )
241 0 : pContentEventListeners->disposeAndClear( aEvt );
242 :
243 0 : if( pPropertyListener )
244 0 : pPropertyListener->disposeAndClear( aEvt );
245 :
246 0 : if( pPropertySetInfoChangeListeners )
247 0 : pPropertySetInfoChangeListeners->disposeAndClear( aEvt );
248 :
249 0 : delete pDisposeEventListeners;
250 0 : delete pContentEventListeners;
251 0 : delete pPropertyListener;
252 0 : delete pPropertySetInfoChangeListeners;
253 0 : }
254 :
255 : // XServiceInfo
256 : OUString SAL_CALL
257 0 : BaseContent::getImplementationName()
258 : throw( RuntimeException, std::exception)
259 : {
260 0 : return OUString("com.sun.star.comp.ucb.FileContent");
261 : }
262 :
263 : sal_Bool SAL_CALL
264 0 : BaseContent::supportsService( const OUString& ServiceName )
265 : throw( RuntimeException, std::exception)
266 : {
267 0 : return cppu::supportsService( this, ServiceName );
268 : }
269 :
270 : Sequence< OUString > SAL_CALL
271 0 : BaseContent::getSupportedServiceNames()
272 : throw( RuntimeException, std::exception )
273 : {
274 0 : Sequence< OUString > ret( 1 );
275 0 : ret[0] = "com.sun.star.ucb.FileContent";
276 0 : return ret;
277 : }
278 :
279 : // XTypeProvider
280 0 : XTYPEPROVIDER_IMPL_10( BaseContent,
281 : lang::XComponent,
282 : lang::XTypeProvider,
283 : lang::XServiceInfo,
284 : XCommandProcessor,
285 : XContentCreator,
286 : XContent,
287 : container::XChild,
288 : beans::XPropertiesChangeNotifier,
289 : beans::XPropertyContainer,
290 : beans::XPropertySetInfoChangeNotifier )
291 :
292 :
293 :
294 : // XCommandProcessor
295 :
296 :
297 : sal_Int32 SAL_CALL
298 0 : BaseContent::createCommandIdentifier( void )
299 : throw( RuntimeException, std::exception )
300 : {
301 0 : return m_pMyShell->getCommandId();
302 : }
303 :
304 :
305 : void SAL_CALL
306 0 : BaseContent::abort( sal_Int32 CommandId )
307 : throw( RuntimeException, std::exception )
308 : {
309 0 : m_pMyShell->abort( CommandId );
310 0 : }
311 :
312 :
313 : Any SAL_CALL
314 0 : BaseContent::execute( const Command& aCommand,
315 : sal_Int32 CommandId,
316 : const Reference< XCommandEnvironment >& Environment )
317 : throw( Exception,
318 : CommandAbortedException,
319 : RuntimeException, std::exception )
320 : {
321 0 : if( ! CommandId )
322 : // A Command with commandid zero cannot be aborted
323 0 : CommandId = createCommandIdentifier();
324 :
325 : m_pMyShell->startTask( CommandId,
326 0 : Environment );
327 :
328 0 : Any aAny;
329 :
330 0 : if (aCommand.Name == "getPropertySetInfo") // No exceptions
331 : {
332 0 : aAny <<= getPropertySetInfo( CommandId );
333 : }
334 0 : else if (aCommand.Name == "getCommandInfo") // no exceptions
335 : {
336 0 : aAny <<= getCommandInfo();
337 : }
338 0 : else if ( aCommand.Name == "setPropertyValues" )
339 : {
340 0 : Sequence< beans::PropertyValue > sPropertyValues;
341 :
342 0 : if( ! ( aCommand.Argument >>= sPropertyValues ) )
343 : m_pMyShell->installError( CommandId,
344 0 : TASKHANDLING_WRONG_SETPROPERTYVALUES_ARGUMENT );
345 : else
346 0 : aAny <<= setPropertyValues( CommandId,sPropertyValues ); // calls endTask by itself
347 : }
348 0 : else if ( aCommand.Name == "getPropertyValues" )
349 : {
350 0 : Sequence< beans::Property > ListOfRequestedProperties;
351 :
352 0 : if( ! ( aCommand.Argument >>= ListOfRequestedProperties ) )
353 : m_pMyShell->installError( CommandId,
354 0 : TASKHANDLING_WRONG_GETPROPERTYVALUES_ARGUMENT );
355 : else
356 0 : aAny <<= getPropertyValues( CommandId,
357 0 : ListOfRequestedProperties );
358 : }
359 0 : else if ( aCommand.Name == "open" )
360 : {
361 0 : OpenCommandArgument2 aOpenArgument;
362 0 : if( ! ( aCommand.Argument >>= aOpenArgument ) )
363 : m_pMyShell->installError( CommandId,
364 0 : TASKHANDLING_WRONG_OPEN_ARGUMENT );
365 : else
366 : {
367 0 : Reference< XDynamicResultSet > result = open( CommandId,aOpenArgument );
368 0 : if( result.is() )
369 0 : aAny <<= result;
370 0 : }
371 : }
372 0 : else if ( aCommand.Name == "delete" )
373 : {
374 0 : if( ! aCommand.Argument.has< sal_Bool >() )
375 : m_pMyShell->installError( CommandId,
376 0 : TASKHANDLING_WRONG_DELETE_ARGUMENT );
377 : else
378 0 : deleteContent( CommandId );
379 : }
380 0 : else if ( aCommand.Name == "transfer" )
381 : {
382 0 : TransferInfo aTransferInfo;
383 0 : if( ! ( aCommand.Argument >>= aTransferInfo ) )
384 : m_pMyShell->installError( CommandId,
385 0 : TASKHANDLING_WRONG_TRANSFER_ARGUMENT );
386 : else
387 0 : transfer( CommandId, aTransferInfo );
388 : }
389 0 : else if ( aCommand.Name == "insert" )
390 : {
391 0 : InsertCommandArgument aInsertArgument;
392 0 : if( ! ( aCommand.Argument >>= aInsertArgument ) )
393 : m_pMyShell->installError( CommandId,
394 0 : TASKHANDLING_WRONG_INSERT_ARGUMENT );
395 : else
396 0 : insert( CommandId,aInsertArgument );
397 : }
398 0 : else if ( aCommand.Name == "getCasePreservingURL" )
399 : {
400 0 : Sequence< beans::Property > seq(1);
401 0 : seq[0] = beans::Property(
402 : OUString("CasePreservingURL"),
403 : -1,
404 0 : getCppuType( static_cast< sal_Bool* >(0) ),
405 0 : 0 );
406 0 : Reference< sdbc::XRow > xRow = getPropertyValues( CommandId,seq );
407 0 : OUString CasePreservingURL = xRow->getString(1);
408 0 : if(!xRow->wasNull())
409 0 : aAny <<= CasePreservingURL;
410 : }
411 0 : else if ( aCommand.Name == "createNewContent" )
412 : {
413 0 : ucb::ContentInfo aArg;
414 0 : if ( !( aCommand.Argument >>= aArg ) )
415 : m_pMyShell->installError( CommandId,
416 0 : TASKHANDLING_WRONG_CREATENEWCONTENT_ARGUMENT );
417 : else
418 0 : aAny <<= createNewContent( aArg );
419 : }
420 : else
421 : m_pMyShell->installError( CommandId,
422 0 : TASKHANDLER_UNSUPPORTED_COMMAND );
423 :
424 :
425 : // This is the only function allowed to throw an exception
426 0 : endTask( CommandId );
427 :
428 0 : return aAny;
429 : }
430 :
431 :
432 :
433 : void SAL_CALL
434 0 : BaseContent::addPropertiesChangeListener(
435 : const Sequence< OUString >& PropertyNames,
436 : const Reference< beans::XPropertiesChangeListener >& Listener )
437 : throw( RuntimeException, std::exception )
438 : {
439 0 : if( ! Listener.is() )
440 0 : return;
441 :
442 0 : osl::MutexGuard aGuard( m_aMutex );
443 :
444 0 : if( ! m_pPropertyListener )
445 0 : m_pPropertyListener = new PropertyListeners( m_aEventListenerMutex );
446 :
447 :
448 0 : if( PropertyNames.getLength() == 0 )
449 0 : m_pPropertyListener->addInterface( OUString(),Listener );
450 : else
451 : {
452 0 : Reference< beans::XPropertySetInfo > xProp = m_pMyShell->info_p( m_aUncPath );
453 0 : for( sal_Int32 i = 0; i < PropertyNames.getLength(); ++i )
454 0 : if( xProp->hasPropertyByName( PropertyNames[i] ) )
455 0 : m_pPropertyListener->addInterface( PropertyNames[i],Listener );
456 0 : }
457 : }
458 :
459 :
460 : void SAL_CALL
461 0 : BaseContent::removePropertiesChangeListener( const Sequence< OUString >& PropertyNames,
462 : const Reference< beans::XPropertiesChangeListener >& Listener )
463 : throw( RuntimeException, std::exception )
464 : {
465 0 : if( ! Listener.is() )
466 0 : return;
467 :
468 0 : osl::MutexGuard aGuard( m_aMutex );
469 :
470 0 : if( ! m_pPropertyListener )
471 0 : return;
472 :
473 0 : for( sal_Int32 i = 0; i < PropertyNames.getLength(); ++i )
474 0 : m_pPropertyListener->removeInterface( PropertyNames[i],Listener );
475 :
476 0 : m_pPropertyListener->removeInterface( OUString(), Listener );
477 : }
478 :
479 :
480 :
481 : // XContent
482 :
483 :
484 : Reference< ucb::XContentIdentifier > SAL_CALL
485 0 : BaseContent::getIdentifier()
486 : throw( RuntimeException, std::exception )
487 : {
488 0 : return m_xContentIdentifier;
489 : }
490 :
491 :
492 : OUString SAL_CALL
493 0 : BaseContent::getContentType()
494 : throw( RuntimeException, std::exception )
495 : {
496 0 : if( !( m_nState & Deleted ) )
497 : {
498 0 : if( m_nState & JustInserted )
499 : {
500 0 : if ( m_bFolder )
501 0 : return m_pMyShell->FolderContentType;
502 : else
503 0 : return m_pMyShell->FileContentType;
504 : }
505 : else
506 : {
507 : try
508 : {
509 : // Who am I ?
510 0 : Sequence< beans::Property > seq(1);
511 0 : seq[0] = beans::Property( OUString("IsDocument"),
512 : -1,
513 0 : getCppuType( static_cast< sal_Bool* >(0) ),
514 0 : 0 );
515 0 : Reference< sdbc::XRow > xRow = getPropertyValues( -1,seq );
516 0 : sal_Bool IsDocument = xRow->getBoolean( 1 );
517 :
518 0 : if ( !xRow->wasNull() )
519 : {
520 0 : if ( IsDocument )
521 0 : return m_pMyShell->FileContentType;
522 : else
523 0 : return m_pMyShell->FolderContentType;
524 : }
525 : else
526 : {
527 : OSL_FAIL( "BaseContent::getContentType - Property value was null!" );
528 0 : }
529 : }
530 0 : catch (const sdbc::SQLException&)
531 : {
532 : OSL_FAIL( "BaseContent::getContentType - Caught SQLException!" );
533 : }
534 : }
535 : }
536 :
537 0 : return OUString();
538 : }
539 :
540 :
541 :
542 : void SAL_CALL
543 0 : BaseContent::addContentEventListener(
544 : const Reference< XContentEventListener >& Listener )
545 : throw( RuntimeException, std::exception )
546 : {
547 0 : osl::MutexGuard aGuard( m_aMutex );
548 :
549 0 : if ( ! m_pContentEventListeners )
550 : m_pContentEventListeners =
551 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
552 :
553 :
554 0 : m_pContentEventListeners->addInterface( Listener );
555 0 : }
556 :
557 :
558 : void SAL_CALL
559 0 : BaseContent::removeContentEventListener(
560 : const Reference< XContentEventListener >& Listener )
561 : throw( RuntimeException, std::exception )
562 : {
563 0 : osl::MutexGuard aGuard( m_aMutex );
564 :
565 0 : if ( m_pContentEventListeners )
566 0 : m_pContentEventListeners->removeInterface( Listener );
567 0 : }
568 :
569 :
570 :
571 :
572 : // XPropertyContainer
573 :
574 :
575 :
576 : void SAL_CALL
577 0 : BaseContent::addProperty(
578 : const OUString& Name,
579 : sal_Int16 Attributes,
580 : const Any& DefaultValue )
581 : throw( beans::PropertyExistException,
582 : beans::IllegalTypeException,
583 : lang::IllegalArgumentException,
584 : RuntimeException, std::exception)
585 : {
586 0 : if( ( m_nState & JustInserted ) || ( m_nState & Deleted ) || Name.isEmpty() )
587 : {
588 0 : throw lang::IllegalArgumentException( OUString(THROW_WHERE), uno::Reference< uno::XInterface >(), 0 );
589 : }
590 :
591 0 : m_pMyShell->associate( m_aUncPath,Name,DefaultValue,Attributes );
592 0 : }
593 :
594 :
595 : void SAL_CALL
596 0 : BaseContent::removeProperty(
597 : const OUString& Name )
598 : throw( beans::UnknownPropertyException,
599 : beans::NotRemoveableException,
600 : RuntimeException, std::exception)
601 : {
602 :
603 0 : if( m_nState & Deleted )
604 0 : throw beans::UnknownPropertyException( OUString(THROW_WHERE), uno::Reference< uno::XInterface >() );
605 :
606 0 : m_pMyShell->deassociate( m_aUncPath, Name );
607 0 : }
608 :
609 :
610 : // XContentCreator
611 :
612 :
613 : Sequence< ContentInfo > SAL_CALL
614 0 : BaseContent::queryCreatableContentsInfo(
615 : void )
616 : throw( RuntimeException, std::exception )
617 : {
618 0 : return m_pMyShell->queryCreatableContentsInfo();
619 : }
620 :
621 :
622 : Reference< XContent > SAL_CALL
623 0 : BaseContent::createNewContent(
624 : const ContentInfo& Info )
625 : throw( RuntimeException, std::exception )
626 : {
627 : // Check type.
628 0 : if ( Info.Type.isEmpty() )
629 0 : return Reference< XContent >();
630 :
631 : sal_Bool bFolder
632 0 : = ( Info.Type.compareTo( m_pMyShell->FolderContentType ) == 0 );
633 0 : if ( !bFolder )
634 : {
635 0 : if ( Info.Type.compareTo( m_pMyShell->FileContentType ) != 0 )
636 : {
637 : // Neither folder nor file to create!
638 0 : return Reference< XContent >();
639 : }
640 : }
641 :
642 : // Who am I ?
643 0 : sal_Bool IsDocument = false;
644 :
645 : try
646 : {
647 0 : Sequence< beans::Property > seq(1);
648 0 : seq[0] = beans::Property( OUString("IsDocument"),
649 : -1,
650 0 : getCppuType( static_cast< sal_Bool* >(0) ),
651 0 : 0 );
652 0 : Reference< sdbc::XRow > xRow = getPropertyValues( -1,seq );
653 0 : IsDocument = xRow->getBoolean( 1 );
654 :
655 0 : if ( xRow->wasNull() )
656 : {
657 0 : IsDocument = false;
658 : // OSL_FAIL( // "BaseContent::createNewContent - Property value was null!" );
659 : // return Reference< XContent >();
660 0 : }
661 : }
662 0 : catch (const sdbc::SQLException&)
663 : {
664 : OSL_FAIL( "BaseContent::createNewContent - Caught SQLException!" );
665 0 : return Reference< XContent >();
666 : }
667 :
668 0 : OUString dstUncPath;
669 :
670 0 : if( IsDocument )
671 : {
672 : // KSO: Why is a document a XContentCreator? This is quite unusual.
673 0 : dstUncPath = getParentName( m_aUncPath );
674 : }
675 : else
676 0 : dstUncPath = m_aUncPath;
677 :
678 0 : BaseContent* p = new BaseContent( m_pMyShell, dstUncPath, bFolder );
679 0 : return Reference< XContent >( p );
680 : }
681 :
682 :
683 :
684 : // XPropertySetInfoChangeNotifier
685 :
686 :
687 :
688 : void SAL_CALL
689 0 : BaseContent::addPropertySetInfoChangeListener(
690 : const Reference< beans::XPropertySetInfoChangeListener >& Listener )
691 : throw( RuntimeException, std::exception )
692 : {
693 0 : osl::MutexGuard aGuard( m_aMutex );
694 0 : if( ! m_pPropertySetInfoChangeListeners )
695 0 : m_pPropertySetInfoChangeListeners = new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
696 :
697 0 : m_pPropertySetInfoChangeListeners->addInterface( Listener );
698 0 : }
699 :
700 :
701 : void SAL_CALL
702 0 : BaseContent::removePropertySetInfoChangeListener(
703 : const Reference< beans::XPropertySetInfoChangeListener >& Listener )
704 : throw( RuntimeException, std::exception )
705 : {
706 0 : osl::MutexGuard aGuard( m_aMutex );
707 :
708 0 : if( m_pPropertySetInfoChangeListeners )
709 0 : m_pPropertySetInfoChangeListeners->removeInterface( Listener );
710 0 : }
711 :
712 :
713 :
714 : // XChild
715 :
716 :
717 : Reference< XInterface > SAL_CALL
718 0 : BaseContent::getParent(
719 : void )
720 : throw( RuntimeException, std::exception )
721 : {
722 0 : OUString ParentUnq = getParentName( m_aUncPath );
723 0 : OUString ParentUrl;
724 :
725 :
726 0 : sal_Bool err = m_pMyShell->getUrlFromUnq( ParentUnq, ParentUrl );
727 0 : if( err )
728 0 : return Reference< XInterface >( 0 );
729 :
730 0 : FileContentIdentifier* p = new FileContentIdentifier( m_pMyShell,ParentUnq );
731 0 : Reference< XContentIdentifier > Identifier( p );
732 :
733 : try
734 : {
735 0 : return m_pMyShell->m_pProvider->queryContent( Identifier );
736 : }
737 0 : catch (const IllegalIdentifierException&)
738 : {
739 0 : return Reference< XInterface >();
740 0 : }
741 : }
742 :
743 :
744 : void SAL_CALL
745 0 : BaseContent::setParent(
746 : const Reference< XInterface >& )
747 : throw( lang::NoSupportException,
748 : RuntimeException, std::exception)
749 : {
750 0 : throw lang::NoSupportException( OUString(THROW_WHERE), uno::Reference< uno::XInterface >() );
751 : }
752 :
753 :
754 :
755 : // Private Methods
756 :
757 :
758 :
759 : Reference< XCommandInfo > SAL_CALL
760 0 : BaseContent::getCommandInfo()
761 : throw( RuntimeException )
762 : {
763 0 : if( m_nState & Deleted )
764 0 : return Reference< XCommandInfo >();
765 :
766 0 : return m_pMyShell->info_c();
767 : }
768 :
769 :
770 : Reference< beans::XPropertySetInfo > SAL_CALL
771 0 : BaseContent::getPropertySetInfo(
772 : sal_Int32 )
773 : throw( RuntimeException )
774 : {
775 0 : if( m_nState & Deleted )
776 0 : return Reference< beans::XPropertySetInfo >();
777 :
778 0 : return m_pMyShell->info_p( m_aUncPath );
779 : }
780 :
781 :
782 :
783 :
784 : Reference< sdbc::XRow > SAL_CALL
785 0 : BaseContent::getPropertyValues(
786 : sal_Int32 nMyCommandIdentifier,
787 : const Sequence< beans::Property >& PropertySet )
788 : throw( RuntimeException )
789 : {
790 0 : sal_Int32 nProps = PropertySet.getLength();
791 0 : if ( !nProps )
792 0 : return Reference< sdbc::XRow >();
793 :
794 0 : if( m_nState & Deleted )
795 : {
796 0 : Sequence< Any > aValues( nProps );
797 0 : return Reference< sdbc::XRow >( new XRow_impl( m_pMyShell, aValues ) );
798 : }
799 :
800 0 : if( m_nState & JustInserted )
801 : {
802 0 : Sequence< Any > aValues( nProps );
803 0 : Any* pValues = aValues.getArray();
804 :
805 0 : const beans::Property* pProps = PropertySet.getConstArray();
806 :
807 0 : for ( sal_Int32 n = 0; n < nProps; ++n )
808 : {
809 0 : const beans::Property& rProp = pProps[ n ];
810 0 : Any& rValue = pValues[ n ];
811 :
812 0 : if ( rProp.Name == "ContentType" )
813 : {
814 0 : rValue <<= m_bFolder ? m_pMyShell->FolderContentType
815 0 : : m_pMyShell->FileContentType;
816 : }
817 0 : else if ( rProp.Name == "IsFolder" )
818 : {
819 0 : rValue <<= m_bFolder;
820 : }
821 0 : else if ( rProp.Name == "IsDocument" )
822 : {
823 0 : rValue <<= sal_Bool( !m_bFolder );
824 : }
825 : }
826 :
827 : return Reference< sdbc::XRow >(
828 0 : new XRow_impl( m_pMyShell, aValues ) );
829 : }
830 :
831 : return m_pMyShell->getv( nMyCommandIdentifier,
832 : m_aUncPath,
833 0 : PropertySet );
834 : }
835 :
836 :
837 : Sequence< Any > SAL_CALL
838 0 : BaseContent::setPropertyValues(
839 : sal_Int32 nMyCommandIdentifier,
840 : const Sequence< beans::PropertyValue >& Values )
841 : throw()
842 : {
843 0 : if( m_nState & Deleted )
844 : { // To do
845 0 : return Sequence< Any >( Values.getLength() );
846 : }
847 :
848 0 : const OUString Title("Title");
849 :
850 : // Special handling for files which have to be inserted
851 0 : if( m_nState & JustInserted )
852 : {
853 0 : for( sal_Int32 i = 0; i < Values.getLength(); ++i )
854 : {
855 0 : if( Values[i].Name == Title )
856 : {
857 0 : OUString NewTitle;
858 0 : if( Values[i].Value >>= NewTitle )
859 : {
860 0 : if ( m_nState & NameForInsertionSet )
861 : {
862 : // User wants to set another Title before "insert".
863 : // m_aUncPath contains previous own URI.
864 :
865 0 : sal_Int32 nLastSlash = m_aUncPath.lastIndexOf( '/' );
866 0 : bool bTrailingSlash = false;
867 0 : if ( nLastSlash == m_aUncPath.getLength() - 1 )
868 : {
869 0 : bTrailingSlash = true;
870 : nLastSlash
871 0 : = m_aUncPath.lastIndexOf( '/', nLastSlash );
872 : }
873 :
874 : OSL_ENSURE( nLastSlash != -1,
875 : "BaseContent::setPropertyValues: "
876 : "Invalid URL!" );
877 :
878 : OUStringBuffer aBuf(
879 0 : m_aUncPath.copy( 0, nLastSlash + 1 ) );
880 :
881 0 : if ( !NewTitle.isEmpty() )
882 : {
883 0 : aBuf.append( NewTitle );
884 0 : if ( bTrailingSlash )
885 0 : aBuf.append( '/' );
886 : }
887 : else
888 : {
889 0 : m_nState &= ~NameForInsertionSet;
890 : }
891 :
892 0 : m_aUncPath = aBuf.makeStringAndClear();
893 : }
894 : else
895 : {
896 0 : if ( !NewTitle.isEmpty() )
897 : {
898 : // Initial Title before "insert".
899 : // m_aUncPath contains parent's URI.
900 :
901 0 : if( !m_aUncPath.endsWith( "/" ) )
902 0 : m_aUncPath += "/";
903 :
904 0 : m_aUncPath += rtl::Uri::encode( NewTitle,
905 : rtl_UriCharClassPchar,
906 : rtl_UriEncodeIgnoreEscapes,
907 0 : RTL_TEXTENCODING_UTF8 );
908 0 : m_nState |= NameForInsertionSet;
909 : }
910 : }
911 0 : }
912 : }
913 : }
914 :
915 0 : return Sequence< Any >( Values.getLength() );
916 : }
917 : else
918 : {
919 : Sequence< Any > ret = m_pMyShell->setv( m_aUncPath, // Does not handle Title
920 0 : Values );
921 :
922 : // Special handling Title: Setting Title is equivalent to a renaming of the underlying file
923 0 : for( sal_Int32 i = 0; i < Values.getLength(); ++i )
924 : {
925 0 : if( Values[i].Name != Title )
926 0 : continue; // handled by setv
927 :
928 0 : OUString NewTitle;
929 0 : if( !( Values[i].Value >>= NewTitle ) )
930 : {
931 0 : ret[i] <<= beans::IllegalTypeException( OUString(THROW_WHERE), uno::Reference< uno::XInterface >() );
932 0 : break;
933 : }
934 0 : else if( NewTitle.isEmpty() )
935 : {
936 0 : ret[i] <<= lang::IllegalArgumentException( OUString(THROW_WHERE), uno::Reference< uno::XInterface >(), 0 );
937 0 : break;
938 : }
939 :
940 :
941 0 : OUString aDstName = getParentName( m_aUncPath );
942 0 : if( !aDstName.endsWith("/") )
943 0 : aDstName += "/";
944 :
945 0 : aDstName += rtl::Uri::encode( NewTitle,
946 : rtl_UriCharClassPchar,
947 : rtl_UriEncodeIgnoreEscapes,
948 0 : RTL_TEXTENCODING_UTF8 );
949 :
950 : m_pMyShell->move( nMyCommandIdentifier, // move notifies the children also;
951 : m_aUncPath,
952 : aDstName,
953 0 : NameClash::KEEP );
954 :
955 : try
956 : {
957 0 : endTask( nMyCommandIdentifier );
958 : }
959 0 : catch(const Exception& e)
960 : {
961 0 : ret[i] <<= e;
962 : }
963 :
964 : // NameChanges come back trough a ContentEvent
965 0 : break; // only handling Title
966 0 : } // end for
967 :
968 0 : return ret;
969 0 : }
970 : }
971 :
972 :
973 :
974 : Reference< XDynamicResultSet > SAL_CALL
975 0 : BaseContent::open(
976 : sal_Int32 nMyCommandIdentifier,
977 : const OpenCommandArgument2& aCommandArgument )
978 : throw()
979 : {
980 0 : Reference< XDynamicResultSet > retValue( 0 );
981 :
982 0 : if( ( m_nState & Deleted ) )
983 : {
984 : m_pMyShell->installError( nMyCommandIdentifier,
985 0 : TASKHANDLING_DELETED_STATE_IN_OPEN_COMMAND );
986 : }
987 0 : else if( m_nState & JustInserted )
988 : {
989 : m_pMyShell->installError( nMyCommandIdentifier,
990 0 : TASKHANDLING_INSERTED_STATE_IN_OPEN_COMMAND );
991 : }
992 : else
993 : {
994 0 : if( aCommandArgument.Mode == OpenMode::DOCUMENT ||
995 0 : aCommandArgument.Mode == OpenMode::DOCUMENT_SHARE_DENY_NONE )
996 :
997 : {
998 0 : Reference< io::XOutputStream > outputStream( aCommandArgument.Sink,UNO_QUERY );
999 0 : if( outputStream.is() )
1000 : {
1001 : m_pMyShell->page( nMyCommandIdentifier,
1002 : m_aUncPath,
1003 0 : outputStream );
1004 : }
1005 :
1006 0 : sal_Bool bLock = ( aCommandArgument.Mode != OpenMode::DOCUMENT_SHARE_DENY_NONE );
1007 :
1008 0 : Reference< io::XActiveDataSink > activeDataSink( aCommandArgument.Sink,UNO_QUERY );
1009 0 : if( activeDataSink.is() )
1010 : {
1011 0 : activeDataSink->setInputStream( m_pMyShell->open( nMyCommandIdentifier,
1012 : m_aUncPath,
1013 0 : bLock ) );
1014 : }
1015 :
1016 0 : Reference< io::XActiveDataStreamer > activeDataStreamer( aCommandArgument.Sink,UNO_QUERY );
1017 0 : if( activeDataStreamer.is() )
1018 : {
1019 0 : activeDataStreamer->setStream( m_pMyShell->open_rw( nMyCommandIdentifier,
1020 : m_aUncPath,
1021 0 : bLock ) );
1022 0 : }
1023 : }
1024 0 : else if ( aCommandArgument.Mode == OpenMode::ALL ||
1025 0 : aCommandArgument.Mode == OpenMode::FOLDERS ||
1026 0 : aCommandArgument.Mode == OpenMode::DOCUMENTS )
1027 : {
1028 0 : retValue = m_pMyShell->ls( nMyCommandIdentifier,
1029 : m_aUncPath,
1030 : aCommandArgument.Mode,
1031 : aCommandArgument.Properties,
1032 0 : aCommandArgument.SortingInfo );
1033 : }
1034 : // else if( aCommandArgument.Mode ==
1035 : // OpenMode::DOCUMENT_SHARE_DENY_NONE ||
1036 : // aCommandArgument.Mode ==
1037 : // OpenMode::DOCUMENT_SHARE_DENY_WRITE )
1038 : // m_pMyShell->installError( nMyCommandIdentifier,
1039 : // TASKHANDLING_UNSUPPORTED_OPEN_MODE,
1040 : // aCommandArgument.Mode);
1041 : else
1042 : m_pMyShell->installError( nMyCommandIdentifier,
1043 : TASKHANDLING_UNSUPPORTED_OPEN_MODE,
1044 0 : aCommandArgument.Mode);
1045 : }
1046 :
1047 0 : return retValue;
1048 : }
1049 :
1050 :
1051 :
1052 : void SAL_CALL
1053 0 : BaseContent::deleteContent( sal_Int32 nMyCommandIdentifier )
1054 : throw()
1055 : {
1056 0 : if( m_nState & Deleted )
1057 0 : return;
1058 :
1059 0 : if( m_pMyShell->remove( nMyCommandIdentifier,m_aUncPath ) )
1060 : {
1061 0 : osl::MutexGuard aGuard( m_aMutex );
1062 0 : m_nState |= Deleted;
1063 : }
1064 : }
1065 :
1066 :
1067 :
1068 : void SAL_CALL
1069 0 : BaseContent::transfer( sal_Int32 nMyCommandIdentifier,
1070 : const TransferInfo& aTransferInfo )
1071 : throw()
1072 : {
1073 0 : if( m_nState & Deleted )
1074 0 : return;
1075 :
1076 0 : if( !aTransferInfo.SourceURL.startsWith( "file:" ) )
1077 : {
1078 : m_pMyShell->installError( nMyCommandIdentifier,
1079 0 : TASKHANDLING_TRANSFER_INVALIDSCHEME );
1080 0 : return;
1081 : }
1082 :
1083 0 : OUString srcUnc;
1084 0 : if( m_pMyShell->getUnqFromUrl( aTransferInfo.SourceURL,srcUnc ) )
1085 : {
1086 : m_pMyShell->installError( nMyCommandIdentifier,
1087 0 : TASKHANDLING_TRANSFER_INVALIDURL );
1088 0 : return;
1089 : }
1090 :
1091 0 : OUString srcUncPath = srcUnc;
1092 :
1093 : // Determine the new title !
1094 0 : OUString NewTitle;
1095 0 : if( !aTransferInfo.NewTitle.isEmpty() )
1096 0 : NewTitle = rtl::Uri::encode( aTransferInfo.NewTitle,
1097 : rtl_UriCharClassPchar,
1098 : rtl_UriEncodeIgnoreEscapes,
1099 0 : RTL_TEXTENCODING_UTF8 );
1100 : else
1101 0 : NewTitle = srcUncPath.copy( 1 + srcUncPath.lastIndexOf( '/' ) );
1102 :
1103 : // Is destination a document or a folder ?
1104 0 : Sequence< beans::Property > seq(1);
1105 0 : seq[0] = beans::Property( OUString("IsDocument"),
1106 : -1,
1107 0 : getCppuType( static_cast< sal_Bool* >(0) ),
1108 0 : 0 );
1109 0 : Reference< sdbc::XRow > xRow = getPropertyValues( nMyCommandIdentifier,seq );
1110 0 : sal_Bool IsDocument = xRow->getBoolean( 1 );
1111 0 : if( xRow->wasNull() )
1112 : { // Destination file type could not be determined
1113 : m_pMyShell->installError( nMyCommandIdentifier,
1114 0 : TASKHANDLING_TRANSFER_DESTFILETYPE );
1115 0 : return;
1116 : }
1117 :
1118 0 : OUString dstUncPath;
1119 0 : if( IsDocument )
1120 : { // as sibling
1121 0 : sal_Int32 lastSlash = m_aUncPath.lastIndexOf( '/' );
1122 0 : dstUncPath = m_aUncPath.copy(0,lastSlash );
1123 : }
1124 : else
1125 : // as child
1126 0 : dstUncPath = m_aUncPath;
1127 :
1128 0 : dstUncPath += ( OUString("/") + NewTitle );
1129 :
1130 0 : sal_Int32 NameClash = aTransferInfo.NameClash;
1131 :
1132 0 : if( aTransferInfo.MoveData )
1133 0 : m_pMyShell->move( nMyCommandIdentifier,srcUncPath,dstUncPath,NameClash );
1134 : else
1135 0 : m_pMyShell->copy( nMyCommandIdentifier,srcUncPath,dstUncPath,NameClash );
1136 : }
1137 :
1138 :
1139 :
1140 :
1141 0 : void SAL_CALL BaseContent::insert( sal_Int32 nMyCommandIdentifier,
1142 : const InsertCommandArgument& aInsertArgument )
1143 : throw()
1144 : {
1145 0 : if( m_nState & FullFeatured )
1146 : {
1147 : m_pMyShell->write( nMyCommandIdentifier,
1148 : m_aUncPath,
1149 : aInsertArgument.ReplaceExisting,
1150 0 : aInsertArgument.Data );
1151 0 : return;
1152 : }
1153 :
1154 0 : if( ! ( m_nState & JustInserted ) )
1155 : {
1156 : m_pMyShell->installError( nMyCommandIdentifier,
1157 0 : TASKHANDLING_NOFRESHINSERT_IN_INSERT_COMMAND );
1158 0 : return;
1159 : }
1160 :
1161 : // Inserts the content, which has the flag m_bIsFresh
1162 :
1163 0 : if( ! (m_nState & NameForInsertionSet) )
1164 : {
1165 : m_pMyShell->installError( nMyCommandIdentifier,
1166 0 : TASKHANDLING_NONAMESET_INSERT_COMMAND );
1167 0 : return;
1168 : }
1169 :
1170 : // Inserting a document or a file?
1171 0 : sal_Bool bDocument = false;
1172 :
1173 0 : Sequence< beans::Property > seq(1);
1174 0 : seq[0] = beans::Property( OUString("IsDocument"),
1175 : -1,
1176 0 : getCppuType( static_cast< sal_Bool* >(0) ),
1177 0 : 0 );
1178 :
1179 0 : Reference< sdbc::XRow > xRow = getPropertyValues( -1,seq );
1180 :
1181 0 : bool contentTypeSet = true; // is set to false, if contentType not set
1182 : try
1183 : {
1184 0 : bDocument = xRow->getBoolean( 1 );
1185 0 : if( xRow->wasNull() )
1186 0 : contentTypeSet = false;
1187 :
1188 : }
1189 0 : catch (const sdbc::SQLException&)
1190 : {
1191 : OSL_FAIL( "BaseContent::insert - Caught SQLException!" );
1192 0 : contentTypeSet = false;
1193 : }
1194 :
1195 0 : if( ! contentTypeSet )
1196 : {
1197 : m_pMyShell->installError( nMyCommandIdentifier,
1198 0 : TASKHANDLING_NOCONTENTTYPE_INSERT_COMMAND );
1199 0 : return;
1200 : }
1201 :
1202 :
1203 0 : sal_Bool success = false;
1204 0 : if( bDocument )
1205 : success = m_pMyShell->mkfil( nMyCommandIdentifier,
1206 : m_aUncPath,
1207 : aInsertArgument.ReplaceExisting,
1208 0 : aInsertArgument.Data );
1209 : else
1210 : {
1211 0 : while( ! success )
1212 : {
1213 : success = m_pMyShell->mkdir( nMyCommandIdentifier,
1214 : m_aUncPath,
1215 0 : aInsertArgument.ReplaceExisting );
1216 0 : if( success )
1217 0 : break;
1218 :
1219 : XInteractionRequestImpl *aRequestImpl =
1220 : new XInteractionRequestImpl(
1221 : rtl::Uri::decode(
1222 : getTitle(m_aUncPath),
1223 : rtl_UriDecodeWithCharset,
1224 : RTL_TEXTENCODING_UTF8),
1225 : (cppu::OWeakObject*)this,
1226 0 : m_pMyShell,nMyCommandIdentifier);
1227 0 : uno::Reference< task::XInteractionRequest > aReq( aRequestImpl );
1228 :
1229 0 : m_pMyShell->handleTask( nMyCommandIdentifier,aReq );
1230 0 : if( aRequestImpl->aborted() ||
1231 0 : aRequestImpl->newName().isEmpty() )
1232 : // means aborting
1233 0 : break;
1234 :
1235 : // determine new uncpath
1236 0 : m_pMyShell->clearError( nMyCommandIdentifier );
1237 0 : m_aUncPath = getParentName( m_aUncPath );
1238 0 : if( !m_aUncPath.endsWith( "/" ) )
1239 0 : m_aUncPath += "/";
1240 :
1241 0 : m_aUncPath += rtl::Uri::encode( aRequestImpl->newName(),
1242 : rtl_UriCharClassPchar,
1243 : rtl_UriEncodeIgnoreEscapes,
1244 0 : RTL_TEXTENCODING_UTF8 );
1245 0 : }
1246 : }
1247 :
1248 0 : if ( ! success )
1249 0 : return;
1250 :
1251 0 : FileContentIdentifier* p = new FileContentIdentifier( m_pMyShell,m_aUncPath );
1252 0 : m_xContentIdentifier = Reference< XContentIdentifier >( p );
1253 :
1254 0 : m_pMyShell->registerNotifier( m_aUncPath,this );
1255 0 : m_pMyShell->insertDefaultProperties( m_aUncPath );
1256 :
1257 0 : osl::MutexGuard aGuard( m_aMutex );
1258 0 : m_nState = FullFeatured;
1259 : }
1260 :
1261 :
1262 :
1263 0 : void SAL_CALL BaseContent::endTask( sal_Int32 CommandId )
1264 : {
1265 : // This is the only function allowed to throw an exception
1266 0 : m_pMyShell->endTask( CommandId,m_aUncPath,this );
1267 0 : }
1268 :
1269 :
1270 :
1271 : ContentEventNotifier*
1272 0 : BaseContent::cDEL( void )
1273 : {
1274 0 : osl::MutexGuard aGuard( m_aMutex );
1275 :
1276 0 : m_nState |= Deleted;
1277 :
1278 : ContentEventNotifier* p;
1279 0 : if( m_pContentEventListeners )
1280 : p = new ContentEventNotifier( m_pMyShell,
1281 : this,
1282 : m_xContentIdentifier,
1283 0 : m_pContentEventListeners->getElements() );
1284 : else
1285 0 : p = 0;
1286 :
1287 0 : return p;
1288 : }
1289 :
1290 :
1291 : ContentEventNotifier*
1292 0 : BaseContent::cEXC( const OUString& aNewName )
1293 : {
1294 0 : osl::MutexGuard aGuard( m_aMutex );
1295 :
1296 0 : Reference< XContentIdentifier > xOldRef = m_xContentIdentifier;
1297 0 : m_aUncPath = aNewName;
1298 0 : FileContentIdentifier* pp = new FileContentIdentifier( m_pMyShell,aNewName );
1299 0 : m_xContentIdentifier = Reference< XContentIdentifier >( pp );
1300 :
1301 0 : ContentEventNotifier* p = 0;
1302 0 : if( m_pContentEventListeners )
1303 : p = new ContentEventNotifier( m_pMyShell,
1304 : this,
1305 : m_xContentIdentifier,
1306 : xOldRef,
1307 0 : m_pContentEventListeners->getElements() );
1308 :
1309 0 : return p;
1310 : }
1311 :
1312 :
1313 : ContentEventNotifier*
1314 0 : BaseContent::cCEL( void )
1315 : {
1316 0 : osl::MutexGuard aGuard( m_aMutex );
1317 0 : ContentEventNotifier* p = 0;
1318 0 : if( m_pContentEventListeners )
1319 : p = new ContentEventNotifier( m_pMyShell,
1320 : this,
1321 : m_xContentIdentifier,
1322 0 : m_pContentEventListeners->getElements() );
1323 :
1324 0 : return p;
1325 : }
1326 :
1327 : PropertySetInfoChangeNotifier*
1328 0 : BaseContent::cPSL( void )
1329 : {
1330 0 : osl::MutexGuard aGuard( m_aMutex );
1331 0 : PropertySetInfoChangeNotifier* p = 0;
1332 0 : if( m_pPropertySetInfoChangeListeners )
1333 : p = new PropertySetInfoChangeNotifier( this,
1334 : m_xContentIdentifier,
1335 0 : m_pPropertySetInfoChangeListeners->getElements() );
1336 :
1337 0 : return p;
1338 : }
1339 :
1340 :
1341 :
1342 : PropertyChangeNotifier*
1343 0 : BaseContent::cPCL( void )
1344 : {
1345 0 : osl::MutexGuard aGuard( m_aMutex );
1346 :
1347 0 : if (!m_pPropertyListener)
1348 0 : return NULL;
1349 :
1350 0 : Sequence< OUString > seqNames = m_pPropertyListener->getContainedTypes();
1351 :
1352 0 : PropertyChangeNotifier* p = 0;
1353 :
1354 0 : sal_Int32 length = seqNames.getLength();
1355 :
1356 0 : if( length )
1357 : {
1358 0 : ListenerMap* listener = new ListenerMap();
1359 0 : for( sal_Int32 i = 0; i < length; ++i )
1360 : {
1361 0 : cppu::OInterfaceContainerHelper* pContainer = m_pPropertyListener->getContainer(seqNames[i]);
1362 0 : if (!pContainer)
1363 0 : continue;
1364 0 : (*listener)[seqNames[i]] = pContainer->getElements();
1365 : }
1366 :
1367 : p = new PropertyChangeNotifier( this,
1368 : m_xContentIdentifier,
1369 0 : listener );
1370 : }
1371 :
1372 0 : return p;
1373 : }
1374 :
1375 :
1376 0 : OUString BaseContent::getKey( void )
1377 : {
1378 0 : return m_aUncPath;
1379 : }
1380 :
1381 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|