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(OUString::Concat(std::u16string_view(pCopy, p - 1 - pCopy)) +
"&");
85 else if (pEnd - p >= 3
86 && p[0] ==
'l' && p[1] ==
't' && p[2] ==
';')
88 aBuffer.append(OUString::Concat(std::u16string_view(pCopy, p - 1 - pCopy)) +
"<");
92 else if (pEnd - p >= 3
93 && p[0] ==
'g' && p[1] ==
't' && p[2] ==
';')
95 aBuffer.append(OUString::Concat(std::u16string_view(pCopy, p - 1 - pCopy)) +
">");
103 while (q != pEnd && *q !=
'>')
107 OUString aKey(p, q - p);
110 for (sal_Int32 i = 2;
i + 1 < rReplacements.getLength();
113 OUString aReplaceKey;
114 if ((rReplacements[i] >>= aReplaceKey)
115 && aReplaceKey == aKey
116 && (rReplacements[i + 1] >>= aValue))
124 aBuffer.append(std::u16string_view(pCopy, p - 1 - pCopy) + aValue);
129 aBuffer.append(pCopy, pEnd - pCopy);
130 *pOutput =
aBuffer.makeStringAndClear();
134void makeAndAppendXMLName(
135 OUStringBuffer & rBuffer, std::u16string_view rIn )
137 size_t nCount = rIn.size();
138 for (
size_t n = 0;
n <
nCount; ++
n )
144 rBuffer.append(
"&" );
148 rBuffer.append(
""" );
152 rBuffer.append(
"'" );
156 rBuffer.append(
"<" );
160 rBuffer.append(
">" );
170bool createContentProviderData(
171 std::u16string_view rProvider,
172 const uno::Reference< container::XHierarchicalNameAccess >& rxHierNameAccess,
180 if ( !( rxHierNameAccess->getByHierarchicalName(
181 OUString::Concat(rProvider) +
"/ServiceName" ) >>= aValue ) )
183 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
184 "Error getting item value!" );
187 catch (
const container::NoSuchElementException&)
196 if ( !( rxHierNameAccess->getByHierarchicalName(
197 OUString::Concat(rProvider) +
"/URLTemplate" ) >>= aValue ) )
199 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
200 "Error getting item value!" );
207 if ( !( rxHierNameAccess->getByHierarchicalName(
208 OUString::Concat(rProvider) +
"/Arguments" ) >>= aValue ) )
210 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
211 "Error getting item value!" );
230 "UniversalContentBroker ctor: No service manager" );
249 aEvt.Source =
static_cast< XComponent*
>(
this);
284 return "com.sun.star.comp.ucb.UniversalContentBroker";
292 return {
"com.sun.star.ucb.UniversalContentBroker" };
296extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
298 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
320 throw IllegalArgumentException(
321 "UCB reinitialized with different arguments",
346 const OUString& Scheme,
356 catch (
const IllegalArgumentException&)
370 catch (
const IllegalArgumentException&)
377 if (!ReplaceExisting)
378 throw DuplicateProviderException();
381 xPrevious = rList.front().getProvider();
392 const OUString& Scheme )
401 catch (
const IllegalArgumentException&)
410 auto aListIt = std::find_if(rList.begin(), rList.end(),
412 if (aListIt != rList.end())
413 rList.erase(aListIt);
422css::uno::Sequence< ContentProviderInfo > SAL_CALL
430 ContentProviderInfo* pInfo =
aSeq.getArray();
437 pInfo->ContentProvider = it->getValue().front().getProvider();
438 pInfo->Scheme = it->getRegexp();
484 OUString aURI1( Id1->getContentIdentifier() );
485 OUString aURI2( Id2->getContentIdentifier() );
495 if ( xProv1.is() && ( xProv1 == xProv2 ) )
496 return xProv1->compareContentIds( Id1, Id2 );
498 return aURI1.compareTo( aURI2 );
508 const OUString& ContentId )
525 xIdentifier = xFac->createContentIdentifier( ContentId );
528 if ( !xIdentifier.is() )
550 const Command& aCommand,
575 GlobalTransferCommandArgument2 aTransferArg;
576 if ( !(
aCommand.Argument >>= aTransferArg ) )
578 GlobalTransferCommandArgument aArg;
579 if ( !(
aCommand.Argument >>= aArg ) )
582 Any( IllegalArgumentException(
583 "Wrong argument type!",
591 aTransferArg.Operation = aArg.Operation;
592 aTransferArg.SourceURL = aArg.SourceURL;
593 aTransferArg.TargetURL = aArg.TargetURL;
594 aTransferArg.NewTitle = aArg.NewTitle;
595 aTransferArg.NameClash = aArg.NameClash;
602 ucb::CheckinArgument aCheckinArg;
603 if ( !(
aCommand.Argument >>= aCheckinArg ) )
606 Any( IllegalArgumentException(
607 "Wrong argument type!",
622 Any( UnsupportedCommandException(
656 if ( !Event.Changes.hasElements() )
659 uno::Reference< container::XHierarchicalNameAccess > xHierNameAccess;
660 Event.Base >>= xHierNameAccess;
662 OSL_ASSERT( xHierNameAccess.is() );
665 for (
const util::ElementChange& rElem : Event.Changes )
668 rElem.Accessor >>= aKey;
680 if (createContentProviderData(aKey, xHierNameAccess, aInfo))
682 aData.push_back(aInfo);
698 osl::Guard< osl::Mutex > aGuard(
m_aMutex );
710 const OUString& Identifier,
716 return pList ? bResolved ? pList->front().getResolvedProvider()
717 : pList->front().getProvider()
728 OSL_FAIL(
"UniversalContentBroker::configureUcb(): Bad arguments");
735 SAL_WARN(
"ucb",
"No configuration");
745 for (
const auto& rContentProviderData : rData)
747 OUString aProviderArguments;
748 if (fillPlaceholders(rContentProviderData.Arguments,
750 &aProviderArguments))
754 rContentProviderData.ServiceName,
756 rContentProviderData.URLTemplate);
760 OSL_FAIL(
"UniversalContentBroker::prepareAndRegister(): Bad argument placeholders");
766 std::u16string_view rKey1,
767 std::u16string_view rKey2,
770 if ( !
m_xContext.is() || rKey1.empty() || rKey2.empty() )
772 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - Invalid argument!" );
778 uno::Reference< lang::XMultiServiceFactory > xConfigProv =
779 configuration::theDefaultProvider::get(
m_xContext );
781 OUStringBuffer aFullPath(128);
783 "/org.openoffice.ucb.Configuration/ContentProviders"
785 makeAndAppendXMLName( aFullPath, rKey1 );
786 aFullPath.append(
"']/SecondaryKeys/['" );
787 makeAndAppendXMLName( aFullPath, rKey2 );
788 aFullPath.append(
"']/ProviderData" );
792 {
"nodepath",
uno::Any(aFullPath.makeStringAndClear())}
795 uno::Reference< uno::XInterface > xInterface(
796 xConfigProv->createInstanceWithArguments(
797 "com.sun.star.configuration.ConfigurationAccess",
802 m_xNotifier.set( xInterface, uno::UNO_QUERY_THROW );
807 uno::Reference< container::XNameAccess > xNameAccess(
808 xInterface, uno::UNO_QUERY_THROW );
810 const uno::Sequence< OUString > aElems = xNameAccess->getElementNames();
812 if ( aElems.hasElements() )
814 uno::Reference< container::XHierarchicalNameAccess >
815 xHierNameAccess( xInterface, uno::UNO_QUERY_THROW );
818 for (
const auto& rElem : aElems )
826 OUStringBuffer aElemBuffer(
"['" );
827 makeAndAppendXMLName( aElemBuffer, rElem );
828 aElemBuffer.append(
"']" );
831 createContentProviderData(
832 aElemBuffer, xHierNameAccess,
835 rListToFill.push_back( aInfo );
837 catch (
const container::NoSuchElementException&)
840 OSL_FAIL(
"UniversalContentBroker::getContentProviderData - "
841 "caught NoSuchElementException!" );
846 catch (
const uno::RuntimeException&)
851 catch (
const uno::Exception&)
872 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