30#include <osl/diagnose.h>
35#include <com/sun/star/beans/PropertyValue.hpp>
36#include <com/sun/star/configuration/theDefaultProvider.hpp>
37#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
38#include <com/sun/star/container/XNameContainer.hpp>
39#include <com/sun/star/util/XChangesBatch.hpp>
40#include <com/sun/star/util/XChangesNotifier.hpp>
41#include <com/sun/star/lang/XSingleServiceFactory.hpp>
69 public lang::XServiceInfo,
70 public lang::XTypeProvider,
71 public lang::XComponent,
72 public lang::XSingleServiceFactory,
73 public container::XHierarchicalNameAccess,
74 public container::XNameContainer,
75 public util::XChangesNotifier,
76 public util::XChangesBatch
80 uno::Reference< lang::XComponent >
m_xCfgC;
81 uno::Reference< lang::XSingleServiceFactory >
m_xCfgSSF;
82 uno::Reference< container::XHierarchicalNameAccess >
m_xCfgHNA;
83 uno::Reference< container::XNameContainer >
m_xCfgNC;
84 uno::Reference< container::XNameReplace >
m_xCfgNR;
85 uno::Reference< container::XNameAccess >
m_xCfgNA;
86 uno::Reference< container::XElementAccess >
m_xCfgEA;
87 uno::Reference< util::XChangesNotifier >
m_xCfgCN;
88 uno::Reference< util::XChangesBatch >
m_xCfgCB;
92 HierarchyDataAccess( uno::Reference<
93 uno::XInterface > xConfigAccess,
97 virtual css::uno::Any SAL_CALL
queryInterface(
const css::uno::Type & rType )
override;
98 virtual void SAL_CALL acquire()
100 virtual
void SAL_CALL release()
104 virtual OUString SAL_CALL getImplementationName() override;
105 virtual
sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
106 virtual css::
uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
109 virtual css::
uno::Sequence<
sal_Int8 > SAL_CALL getImplementationId() override;
110 virtual css::
uno::Sequence< css::
uno::
Type > SAL_CALL getTypes() override;
113 virtual
void SAL_CALL
115 virtual
void SAL_CALL
116 addEventListener( const
uno::Reference< lang::XEventListener > & xListener ) override;
117 virtual
void SAL_CALL
118 removeEventListener( const
uno::Reference<
119 lang::XEventListener > & aListener ) override;
123 createInstance() override;
125 createInstanceWithArguments( const
uno::Sequence<
uno::Any > & aArguments ) override;
128 virtual
uno::Any SAL_CALL
129 getByHierarchicalName( const OUString & aName ) override;
131 hasByHierarchicalName( const OUString & aName ) override;
134 virtual
void SAL_CALL
135 insertByName( const OUString & aName, const
uno::Any & aElement ) override;
136 virtual
void SAL_CALL
137 removeByName( const OUString & Name ) override;
140 virtual
void SAL_CALL
141 replaceByName( const OUString & aName, const
uno::Any & aElement ) override;
144 virtual
uno::Any SAL_CALL
145 getByName( const OUString & aName ) override;
146 virtual
uno::Sequence< OUString > SAL_CALL
147 getElementNames() override;
149 hasByName( const OUString & aName ) override;
153 getElementType() override;
155 hasElements() override;
158 virtual
void SAL_CALL
159 addChangesListener( const
uno::Reference<
160 util::XChangesListener > & aListener ) override;
161 virtual
void SAL_CALL
162 removeChangesListener( const
uno::Reference<
163 util::XChangesListener > & aListener ) override;
166 virtual
void SAL_CALL
167 commitChanges() override;
169 hasPendingChanges() override;
170 virtual
uno::Sequence< util::ElementChange > SAL_CALL
171 getPendingChanges() override;
174 css::
uno::Reference<T> ensureOrigInterface(css::
uno::Reference<T>& x);
188 uno::Reference<
uno::XComponentContext > xContext )
189: m_xContext(
std::move( xContext ))
195HierarchyDataSource::~HierarchyDataSource()
200OUString SAL_CALL HierarchyDataSource::getImplementationName() \
202 return "com.sun.star.comp.ucb.HierarchyDataSource";
204sal_Bool SAL_CALL HierarchyDataSource::supportsService(
const OUString& ServiceName )
208css::uno::Sequence< OUString > HierarchyDataSource::getSupportedServiceNames()
210 return {
"com.sun.star.ucb.DefaultHierarchyDataSource",
"com.sun.star.ucb.HierarchyDataSource" };
213extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
215 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
225void SAL_CALL HierarchyDataSource::dispose()
227 std::unique_lock aGuard(
m_aMutex );
229 if ( m_aDisposeEventListeners.getLength(aGuard) )
231 lang::EventObject aEvt;
232 aEvt.Source =
static_cast< lang::XComponent *
>( this );
233 m_aDisposeEventListeners.disposeAndClear( aGuard, aEvt );
239void SAL_CALL HierarchyDataSource::addEventListener(
240 const uno::Reference< lang::XEventListener > & Listener )
242 std::unique_lock aGuard(
m_aMutex );
244 m_aDisposeEventListeners.addInterface( aGuard, Listener );
249void SAL_CALL HierarchyDataSource::removeEventListener(
250 const uno::Reference< lang::XEventListener > & Listener )
252 std::unique_lock aGuard(
m_aMutex );
254 m_aDisposeEventListeners.removeInterface( aGuard, Listener );
262uno::Reference< uno::XInterface > SAL_CALL
263HierarchyDataSource::createInstance(
const OUString & aServiceSpecifier )
272 return createInstanceWithArguments( aServiceSpecifier,
aArguments,
false );
277uno::Reference< uno::XInterface > SAL_CALL
278HierarchyDataSource::createInstanceWithArguments(
279 const OUString & ServiceSpecifier,
280 const uno::Sequence< uno::Any > & Arguments )
282 return createInstanceWithArguments( ServiceSpecifier, Arguments,
true );
287uno::Sequence< OUString > SAL_CALL
288HierarchyDataSource::getAvailableServiceNames()
297uno::Reference< uno::XInterface >
298HierarchyDataSource::createInstanceWithArguments(
299 std::u16string_view ServiceSpecifier,
300 const uno::Sequence< uno::Any > & Arguments,
307 if ( !bReadOnly && !bReadWrite )
309 OSL_FAIL(
"HierarchyDataSource::createInstanceWithArguments - "
310 "Unsupported service specifier!" );
311 return uno::Reference< uno::XInterface >();
314 uno::Sequence< uno::Any > aNewArgs( Arguments );
315 auto aNewArgsRange = asNonConstRange(aNewArgs);
320 bool bHasNodePath =
false;
321 sal_Int32
nCount = Arguments.getLength();
322 for ( sal_Int32 n = 0;
n <
nCount; ++
n )
324 beans::PropertyValue aProp;
325 if ( Arguments[ n ] >>= aProp )
330 if ( aProp.Value >>= aPath )
335 OUString aConfigPath;
336 if ( !createConfigPath( aPath, aConfigPath ) )
338 OSL_FAIL(
"HierarchyDataSource::"
339 "createInstanceWithArguments - "
340 "Invalid node path!" );
341 return uno::Reference< uno::XInterface >();
344 aProp.Value <<= aConfigPath;
347 aNewArgsRange[
n ] <<= aProp;
353 OSL_FAIL(
"HierarchyDataSource::createInstanceWithArguments - "
354 "Invalid type for property 'nodepath'!" );
355 return uno::Reference< uno::XInterface >();
363 OSL_FAIL(
"HierarchyDataSource::createInstanceWithArguments - "
364 "No 'nodepath' property!" );
365 return uno::Reference< uno::XInterface >();
370 uno::Reference< lang::XMultiServiceFactory > xProv = getConfigProvider();
372 return uno::Reference< uno::XInterface >();
374 uno::Reference< uno::XInterface > xConfigAccess;
380 xConfigAccess = xProv->createInstanceWithArguments(
381 "com.sun.star.configuration.ConfigurationAccess",
387 xConfigAccess = xProv->createInstanceWithArguments(
388 "com.sun.star.configuration.ConfigurationUpdateAccess",
392 catch ( uno::Exception
const & )
394 OSL_FAIL(
"HierarchyDataSource::createInstanceWithArguments - "
395 "Cannot instantiate configuration access!" );
399 if ( !xConfigAccess.is() )
401 OSL_FAIL(
"HierarchyDataSource::createInstanceWithArguments - "
402 "Cannot instantiate configuration access!" );
403 return xConfigAccess;
406 return uno::Reference< uno::XInterface >(
408 new HierarchyDataAccess( xConfigAccess, bReadOnly ) ) );
412uno::Reference< lang::XMultiServiceFactory >
413HierarchyDataSource::getConfigProvider()
417 std::unique_lock aGuard(
m_aMutex );
424 catch ( uno::Exception
const & )
426 OSL_FAIL(
"HierarchyDataSource::getConfigProvider - "
427 "caught exception!" );
436bool HierarchyDataSource::createConfigPath(
437 std::u16string_view rInPath, OUString & rOutPath )
439 if ( !rInPath.empty() )
443 OSL_FAIL(
"HierarchyDataSource::createConfigPath - "
444 "Leading slash in node path!" );
450 OSL_FAIL(
"HierarchyDataSource::createConfigPath - "
451 "Trailing slash in node path!" );
469css::uno::Reference<T> HierarchyDataAccess::ensureOrigInterface(css::uno::Reference<T>& x)
473 std::scoped_lock aGuard(
m_aMutex );
480HierarchyDataAccess::HierarchyDataAccess( uno::Reference<
481 uno::XInterface > xConfigAccess,
489void SAL_CALL HierarchyDataAccess::acquire()
492 OWeakObject::acquire();
495void SAL_CALL HierarchyDataAccess::release()
498 OWeakObject::release();
506 static_cast< lang::XTypeProvider *
>(
this ),
507 static_cast< lang::XServiceInfo *
>(
this ),
508 static_cast< lang::XComponent *
>(
this ),
509 static_cast< container::XHierarchicalNameAccess *
>(
this ),
510 static_cast< container::XNameAccess *
>(
this ),
511 static_cast< container::XElementAccess *
>(
this ),
512 static_cast< util::XChangesNotifier *
>(
this ) );
518 static_cast< lang::XSingleServiceFactory *
>(
this ),
519 static_cast< container::XNameContainer *
>(
this ),
520 static_cast< container::XNameReplace *
>(
this ),
521 static_cast< util::XChangesBatch *
>(
this ) );
524 return aRet.
hasValue() ? aRet : OWeakObject::queryInterface( aType );
535uno::Sequence< uno::Type > SAL_CALL HierarchyDataAccess::getTypes()
547 return s_aReadOnlyTypes.getTypes();
561 return s_aReadWriteTypes.getTypes();
568OUString SAL_CALL HierarchyDataAccess::getImplementationName()
570 return "com.sun.star.comp.ucb.HierarchyDataAccess";
573sal_Bool SAL_CALL HierarchyDataAccess::supportsService(
const OUString& ServiceName )
578css::uno::Sequence< OUString > SAL_CALL HierarchyDataAccess::getSupportedServiceNames()
588void SAL_CALL HierarchyDataAccess::dispose()
590 uno::Reference< lang::XComponent > xOrig
591 = ensureOrigInterface(
m_xCfgC );
593 OSL_ENSURE( xOrig.is(),
594 "HierarchyDataAccess : Data source is not an XComponent!" );
600void SAL_CALL HierarchyDataAccess::addEventListener(
601 const uno::Reference< lang::XEventListener > & xListener )
603 uno::Reference< lang::XComponent > xOrig
604 = ensureOrigInterface(
m_xCfgC );
606 OSL_ENSURE( xOrig.is(),
607 "HierarchyDataAccess : Data source is not an XComponent!" );
608 xOrig->addEventListener( xListener );
613void SAL_CALL HierarchyDataAccess::removeEventListener(
614 const uno::Reference< lang::XEventListener > & aListener )
616 uno::Reference< lang::XComponent > xOrig
617 = ensureOrigInterface(
m_xCfgC );
619 OSL_ENSURE( xOrig.is(),
620 "HierarchyDataAccess : Data source is not an XComponent!" );
621 xOrig->removeEventListener( aListener );
629uno::Any SAL_CALL HierarchyDataAccess::getByHierarchicalName(
630 const OUString & aName )
632 uno::Reference< container::XHierarchicalNameAccess > xOrig
635 OSL_ENSURE( xOrig.is(),
636 "HierarchyDataAccess : "
637 "Data source is not an XHierarchicalNameAccess!" );
638 return xOrig->getByHierarchicalName( aName );
643sal_Bool SAL_CALL HierarchyDataAccess::hasByHierarchicalName(
644 const OUString & aName )
646 uno::Reference< container::XHierarchicalNameAccess > xOrig
649 OSL_ENSURE( xOrig.is(),
650 "HierarchyDataAccess : "
651 "Data source is not an XHierarchicalNameAccess!" );
652 return xOrig->hasByHierarchicalName( aName );
660uno::Any SAL_CALL HierarchyDataAccess::getByName(
const OUString & aName )
662 uno::Reference< container::XNameAccess > xOrig
665 OSL_ENSURE( xOrig.is(),
666 "HierarchyDataAccess : Data source is not an XNameAccess!" );
667 return xOrig->getByName( aName );
672uno::Sequence< OUString > SAL_CALL HierarchyDataAccess::getElementNames()
674 uno::Reference< container::XNameAccess > xOrig
677 OSL_ENSURE( xOrig.is(),
678 "HierarchyDataAccess : Data source is not an XNameAccess!" );
679 return xOrig->getElementNames();
684sal_Bool SAL_CALL HierarchyDataAccess::hasByName(
const OUString & aName )
686 uno::Reference< container::XNameAccess > xOrig
689 OSL_ENSURE( xOrig.is(),
690 "HierarchyDataAccess : Data source is not an XNameAccess!" );
691 return xOrig->hasByName( aName );
699uno::Type SAL_CALL HierarchyDataAccess::getElementType()
701 uno::Reference< container::XElementAccess > xOrig
704 OSL_ENSURE( xOrig.is(),
705 "HierarchyDataAccess : Data source is not an XElementAccess!" );
706 return xOrig->getElementType();
711sal_Bool SAL_CALL HierarchyDataAccess::hasElements()
713 uno::Reference< container::XElementAccess > xOrig
716 OSL_ENSURE( xOrig.is(),
717 "HierarchyDataAccess : Data source is not an XElementAccess!" );
718 return xOrig->hasElements();
726void SAL_CALL HierarchyDataAccess::addChangesListener(
727 const uno::Reference< util::XChangesListener > & aListener )
729 uno::Reference< util::XChangesNotifier > xOrig
732 OSL_ENSURE( xOrig.is(),
733 "HierarchyDataAccess : Data source is not an XChangesNotifier!" );
734 xOrig->addChangesListener( aListener );
739void SAL_CALL HierarchyDataAccess::removeChangesListener(
740 const uno::Reference< util::XChangesListener > & aListener )
742 uno::Reference< util::XChangesNotifier > xOrig
745 OSL_ENSURE( xOrig.is(),
746 "HierarchyDataAccess : Data source is not an XChangesNotifier!" );
747 xOrig->removeChangesListener( aListener );
755uno::Reference< uno::XInterface > SAL_CALL HierarchyDataAccess::createInstance()
757 uno::Reference< lang::XSingleServiceFactory > xOrig
760 OSL_ENSURE( xOrig.is(),
761 "HierarchyDataAccess : Data source is not an XSingleServiceFactory!" );
762 return xOrig->createInstance();
767uno::Reference< uno::XInterface > SAL_CALL
768HierarchyDataAccess::createInstanceWithArguments(
769 const uno::Sequence< uno::Any > & aArguments )
771 uno::Reference< lang::XSingleServiceFactory > xOrig
774 OSL_ENSURE( xOrig.is(),
775 "HierarchyDataAccess : Data source is not an XSingleServiceFactory!" );
776 return xOrig->createInstanceWithArguments( aArguments );
785HierarchyDataAccess::insertByName(
const OUString & aName,
788 uno::Reference< container::XNameContainer > xOrig
791 OSL_ENSURE( xOrig.is(),
792 "HierarchyDataAccess : Data source is not an XNameContainer!" );
793 xOrig->insertByName( aName, aElement );
799HierarchyDataAccess::removeByName(
const OUString & Name )
801 uno::Reference< container::XNameContainer > xOrig
804 OSL_ENSURE( xOrig.is(),
805 "HierarchyDataAccess : Data source is not an XNameContainer!" );
806 xOrig->removeByName( Name );
814void SAL_CALL HierarchyDataAccess::replaceByName(
const OUString & aName,
817 uno::Reference< container::XNameReplace > xOrig
820 OSL_ENSURE( xOrig.is(),
821 "HierarchyDataAccess : Data source is not an XNameReplace!" );
822 xOrig->replaceByName( aName, aElement );
830void SAL_CALL HierarchyDataAccess::commitChanges()
832 uno::Reference< util::XChangesBatch > xOrig
835 OSL_ENSURE( xOrig.is(),
836 "HierarchyDataAccess : Data source is not an XChangesBatch!" );
837 xOrig->commitChanges();
842sal_Bool SAL_CALL HierarchyDataAccess::hasPendingChanges()
844 uno::Reference< util::XChangesBatch > xOrig
847 OSL_ENSURE( xOrig.is(),
848 "HierarchyDataAccess : Data source is not an XChangesBatch!" );
849 return xOrig->hasPendingChanges();
854uno::Sequence< util::ElementChange > SAL_CALL
855HierarchyDataAccess::getPendingChanges()
857 uno::Reference< util::XChangesBatch > xOrig
860 OSL_ENSURE( xOrig.is(),
861 "HierarchyDataAccess : Data source is not an XChangesBatch!" );
862 return xOrig->getPendingChanges();
Reference< XComponentContext > m_xContext
uno::Reference< container::XNameContainer > m_xCfgNC
uno::Reference< lang::XComponent > m_xCfgC
uno::Reference< container::XNameAccess > m_xCfgNA
constexpr OUStringLiteral CFGPROPERTY_NODEPATH
uno::Reference< util::XChangesBatch > m_xCfgCB
XTYPEPROVIDER_COMMON_IMPL(HierarchyDataAccess)
uno::Reference< lang::XSingleServiceFactory > m_xCfgSSF
uno::Reference< container::XNameReplace > m_xCfgNR
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * ucb_HierarchyDataSource_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
constexpr OUStringLiteral READ_SERVICE_NAME
uno::Reference< uno::XInterface > m_xConfigAccess
constexpr OUStringLiteral CONFIG_DATA_ROOT_KEY
uno::Reference< util::XChangesNotifier > m_xCfgCN
uno::Reference< container::XHierarchicalNameAccess > m_xCfgHNA
uno::Reference< container::XElementAccess > m_xCfgEA
constexpr OUStringLiteral READWRITE_SERVICE_NAME
Sequence< PropertyValue > aArguments
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &rType, Interface1 *p1)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
constexpr OUStringLiteral READWRITE_SERVICE_NAME
constexpr OUStringLiteral READ_SERVICE_NAME
constexpr bool ends_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
Reference< XMultiServiceFactory > m_xConfigProvider