31#include <osl/diagnose.h>
33#include <rtl/ustrbuf.hxx>
36#include <com/sun/star/lang/IllegalArgumentException.hpp>
37#include <com/sun/star/ucb/DuplicateProviderException.hpp>
38#include <com/sun/star/ucb/GlobalTransferCommandArgument2.hpp>
39#include <com/sun/star/ucb/UnsupportedCommandException.hpp>
40#include <com/sun/star/ucb/XCommandInfo.hpp>
41#include <com/sun/star/ucb/XContentProviderSupplier.hpp>
42#include <com/sun/star/configuration/theDefaultProvider.hpp>
43#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
44#include <com/sun/star/container/XNameAccess.hpp>
45#include <com/sun/star/uno/Any.hxx>
65bool fillPlaceholders(OUString
const & rInput,
66 uno::Sequence< uno::Any >
const & rReplacements,
78 && p[0] ==
'a' && p[1] ==
'm' && p[2] ==
'p'
81 aBuffer.append(pCopy, p - 1 - pCopy);
86 else if (pEnd - p >= 3
87 && p[0] ==
'l' && p[1] ==
't' && p[2] ==
';')
89 aBuffer.append(pCopy, p - 1 - pCopy);
94 else if (pEnd - p >= 3
95 && p[0] ==
'g' && p[1] ==
't' && p[2] ==
';')
97 aBuffer.append(pCopy, p - 1 - pCopy);
106 while (q != pEnd && *q !=
'>')
110 OUString aKey(p, q - p);
113 for (sal_Int32 i = 2;
i + 1 < rReplacements.getLength();
116 OUString aReplaceKey;
117 if ((rReplacements[i] >>= aReplaceKey)
118 && aReplaceKey == aKey
119 && (rReplacements[i + 1] >>= aValue))
127 aBuffer.append(pCopy, p - 1 - pCopy);
133 aBuffer.append(pCopy, pEnd - pCopy);
134 *pOutput =
aBuffer.makeStringAndClear();
138void makeAndAppendXMLName(
139 OUStringBuffer & rBuffer, std::u16string_view rIn )
141 size_t nCount = rIn.size();
142 for (
size_t n = 0;
n <
nCount; ++
n )
148 rBuffer.append(
"&" );
152 rBuffer.append(
""" );
156 rBuffer.append(
"'" );
160 rBuffer.append(
"<" );
164 rBuffer.append(
">" );
174bool createContentProviderData(
175 std::u16string_view rProvider,
176 const uno::Reference< container::XHierarchicalNameAccess >& rxHierNameAccess,
184 if ( !( rxHierNameAccess->getByHierarchicalName(
185 OUString::Concat(rProvider) +
"/ServiceName" ) >>= aValue ) )
187 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
188 "Error getting item value!" );
191 catch (
const container::NoSuchElementException&)
200 if ( !( rxHierNameAccess->getByHierarchicalName(
201 OUString::Concat(rProvider) +
"/URLTemplate" ) >>= aValue ) )
203 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
204 "Error getting item value!" );
211 if ( !( rxHierNameAccess->getByHierarchicalName(
212 OUString::Concat(rProvider) +
"/Arguments" ) >>= aValue ) )
214 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
215 "Error getting item value!" );
234 "UniversalContentBroker ctor: No service manager" );
253 aEvt.Source =
static_cast< XComponent*
>(
this);
288 return "com.sun.star.comp.ucb.UniversalContentBroker";
296 return {
"com.sun.star.ucb.UniversalContentBroker" };
300extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
302 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
324 throw IllegalArgumentException(
325 "UCB reinitialized with different arguments",
350 const OUString& Scheme,
360 catch (
const IllegalArgumentException&)
374 catch (
const IllegalArgumentException&)
381 if (!ReplaceExisting)
382 throw DuplicateProviderException();
385 xPrevious = rList.front().getProvider();
396 const OUString& Scheme )
405 catch (
const IllegalArgumentException&)
414 auto aListIt = std::find_if(rList.begin(), rList.end(),
416 if (aListIt != rList.end())
417 rList.erase(aListIt);
426css::uno::Sequence< ContentProviderInfo > SAL_CALL
434 ContentProviderInfo* pInfo =
aSeq.getArray();
441 pInfo->ContentProvider = it->getValue().front().getProvider();
442 pInfo->Scheme = it->getRegexp();
488 OUString aURI1( Id1->getContentIdentifier() );
489 OUString aURI2( Id2->getContentIdentifier() );
499 if ( xProv1.is() && ( xProv1 == xProv2 ) )
500 return xProv1->compareContentIds( Id1, Id2 );
502 return aURI1.compareTo( aURI2 );
512 const OUString& ContentId )
529 xIdentifier = xFac->createContentIdentifier( ContentId );
532 if ( !xIdentifier.is() )
554 const Command& aCommand,
579 GlobalTransferCommandArgument2 aTransferArg;
580 if ( !(
aCommand.Argument >>= aTransferArg ) )
582 GlobalTransferCommandArgument aArg;
583 if ( !(
aCommand.Argument >>= aArg ) )
586 Any( IllegalArgumentException(
587 "Wrong argument type!",
595 aTransferArg.Operation = aArg.Operation;
596 aTransferArg.SourceURL = aArg.SourceURL;
597 aTransferArg.TargetURL = aArg.TargetURL;
598 aTransferArg.NewTitle = aArg.NewTitle;
599 aTransferArg.NameClash = aArg.NameClash;
606 ucb::CheckinArgument aCheckinArg;
607 if ( !(
aCommand.Argument >>= aCheckinArg ) )
610 Any( IllegalArgumentException(
611 "Wrong argument type!",
626 Any( UnsupportedCommandException(
660 if ( !Event.Changes.hasElements() )
663 uno::Reference< container::XHierarchicalNameAccess > xHierNameAccess;
664 Event.Base >>= xHierNameAccess;
666 OSL_ASSERT( xHierNameAccess.is() );
669 for (
const util::ElementChange& rElem : Event.Changes )
672 rElem.Accessor >>= aKey;
684 if (createContentProviderData(aKey, xHierNameAccess, aInfo))
686 aData.push_back(aInfo);
702 osl::Guard< osl::Mutex > aGuard(
m_aMutex );
714 const OUString& Identifier,
720 return pList ? bResolved ? pList->front().getResolvedProvider()
721 : pList->front().getProvider()
732 OSL_FAIL(
"UniversalContentBroker::configureUcb(): Bad arguments");
739 SAL_WARN(
"ucb",
"No configuration");
749 for (
const auto& rContentProviderData : rData)
751 OUString aProviderArguments;
752 if (fillPlaceholders(rContentProviderData.Arguments,
754 &aProviderArguments))
758 rContentProviderData.ServiceName,
760 rContentProviderData.URLTemplate);
764 OSL_FAIL(
"UniversalContentBroker::prepareAndRegister(): Bad argument placeholders");
770 std::u16string_view rKey1,
771 std::u16string_view rKey2,
774 if ( !
m_xContext.is() || rKey1.empty() || rKey2.empty() )
776 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - Invalid argument!" );
782 uno::Reference< lang::XMultiServiceFactory > xConfigProv =
783 configuration::theDefaultProvider::get(
m_xContext );
785 OUStringBuffer aFullPath(128);
787 "/org.openoffice.ucb.Configuration/ContentProviders"
789 makeAndAppendXMLName( aFullPath, rKey1 );
790 aFullPath.append(
"']/SecondaryKeys/['" );
791 makeAndAppendXMLName( aFullPath, rKey2 );
792 aFullPath.append(
"']/ProviderData" );
796 {
"nodepath",
uno::Any(aFullPath.makeStringAndClear())}
799 uno::Reference< uno::XInterface > xInterface(
800 xConfigProv->createInstanceWithArguments(
801 "com.sun.star.configuration.ConfigurationAccess",
806 m_xNotifier.set( xInterface, uno::UNO_QUERY_THROW );
811 uno::Reference< container::XNameAccess > xNameAccess(
812 xInterface, uno::UNO_QUERY_THROW );
814 const uno::Sequence< OUString > aElems = xNameAccess->getElementNames();
816 if ( aElems.hasElements() )
818 uno::Reference< container::XHierarchicalNameAccess >
819 xHierNameAccess( xInterface, uno::UNO_QUERY_THROW );
822 for (
const auto& rElem : aElems )
830 OUStringBuffer aElemBuffer;
831 aElemBuffer.append(
"['" );
832 makeAndAppendXMLName( aElemBuffer, rElem );
833 aElemBuffer.append(
"']" );
836 createContentProviderData(
837 aElemBuffer, xHierNameAccess,
840 rListToFill.push_back( aInfo );
842 catch (
const container::NoSuchElementException&)
845 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
846 "caught NoSuchElementException!" );
851 catch (
const uno::RuntimeException&)
856 catch (
const uno::Exception&)
877 if ( xSupplier.is() )
Reference< XComponentContext > m_xContext
css::uno::Reference< css::ucb::XContentProvider > const & resolveProvider() const
css::uno::Reference< css::ucb::XContentProvider > m_xResolvedProvider
css::uno::Reference< css::ucb::XContentProvider > m_xProvider
virtual void SAL_CALL deregisterContentProvider(const css::uno::Reference< css::ucb::XContentProvider > &Provider, const OUString &Scheme) override
virtual void SAL_CALL removeEventListener(const css::uno::Reference< css::lang::XEventListener > &Listener) override
UniversalContentBroker(const css::uno::Reference< css::uno::XComponentContext > &xContext)
virtual ~UniversalContentBroker() override
virtual void SAL_CALL addEventListener(const css::uno::Reference< css::lang::XEventListener > &Listener) override
static css::uno::Reference< css::ucb::XCommandInfo > getCommandInfo()
css::uno::Reference< css::util::XChangesNotifier > m_xNotifier
css::uno::Reference< css::uno::XComponentContext > m_xContext
virtual void SAL_CALL releaseCommandIdentifier(sal_Int32 aCommandId) override
virtual OUString SAL_CALL getImplementationName() override
void globalTransfer(const css::ucb::GlobalTransferCommandArgument2 &rArg, const css::uno::Reference< css::ucb::XCommandEnvironment > &xEnv)
virtual sal_Int32 SAL_CALL createCommandIdentifier() override
virtual css::uno::Reference< css::ucb::XContentProvider > SAL_CALL registerContentProvider(const css::uno::Reference< css::ucb::XContentProvider > &Provider, const OUString &Scheme, sal_Bool ReplaceExisting) override
ProviderMap_Impl m_aProviders
virtual void SAL_CALL abort(sal_Int32 CommandId) override
virtual void SAL_CALL dispose() override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL changesOccurred(const css::util::ChangesEvent &Event) override
std::unique_ptr< comphelper::OInterfaceContainerHelper3< css::lang::XEventListener > > m_pDisposeEventListeners
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
bool getContentProviderData(std::u16string_view rKey1, std::u16string_view rKey2, ucbhelper::ContentProviderDataList &rListToFill)
void prepareAndRegister(const ucbhelper::ContentProviderDataList &rData)
virtual css::uno::Reference< css::ucb::XContent > SAL_CALL queryContent(const css::uno::Reference< css::ucb::XContentIdentifier > &Identifier) override
virtual css::uno::Sequence< css::ucb::ContentProviderInfo > SAL_CALL queryContentProviders() override
css::uno::Any checkIn(const css::ucb::CheckinArgument &rArg, const css::uno::Reference< css::ucb::XCommandEnvironment > &xEnv)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual sal_Int32 SAL_CALL compareContentIds(const css::uno::Reference< css::ucb::XContentIdentifier > &Id1, const css::uno::Reference< css::ucb::XContentIdentifier > &Id2) override
virtual css::uno::Reference< css::ucb::XContentIdentifier > SAL_CALL createContentIdentifier(const OUString &ContentId) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual css::uno::Any SAL_CALL execute(const css::ucb::Command &aCommand, sal_Int32 CommandId, const css::uno::Reference< css::ucb::XCommandEnvironment > &Environment) override
css::uno::Sequence< css::uno::Any > m_aArguments
virtual css::uno::Reference< css::ucb::XContentProvider > SAL_CALL queryContentProvider(const OUString &Identifier) override
Val const * map(OUString const &rString) const
void add(OUString const &rKey, Val const &rValue)
iterator find(OUString const &rKey)
void erase(iterator const &rPos)
#define TOOLS_WARN_EXCEPTION(area, stream)
Sequence< PropertyValue > aArguments
Sequence< sal_Int8 > aSeq
#define SAL_WARN(area, stream)
constexpr OUStringLiteral aData
css::uno::Sequence< css::uno::Any > InitAnyPropertySequence(::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
void cancelCommandExecution(const uno::Any &rException, const uno::Reference< ucb::XCommandEnvironment > &xEnv)
UCBHELPER_DLLPUBLIC bool registerAtUcb(css::uno::Reference< css::ucb::XContentProviderManager > const &rManager, css::uno::Reference< css::uno::XComponentContext > const &rxContext, OUString const &rName, OUString const &rArguments, OUString const &rTemplate)
std::vector< ContentProviderData > ContentProviderDataList
std::deque< ProviderListEntry_Impl > ProviderList_Impl
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * ucb_UniversalContentBroker_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
constexpr OUStringLiteral GLOBALTRANSFER_NAME
constexpr OUStringLiteral CHECKIN_NAME
#define GLOBALTRANSFER_HANDLE
constexpr OUStringLiteral GETCOMMANDINFO_NAME
#define GETCOMMANDINFO_HANDLE
std::unique_ptr< char[]> aBuffer