blob: 687ac045441bff60ae73c07bb5fd2cf6274652a0 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_ucbhelper.hxx"
#include <ucbhelper/configureucb.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/ucb/XContentProvider.hpp>
#include <com/sun/star/ucb/XContentProviderManager.hpp>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/RuntimeException.hpp>
#include <rtl/ustrbuf.hxx>
#include "osl/diagnose.h"
#ifndef _UCBHELPER_PROVCONF_HXX_
#include <provconf.hxx>
#endif
#include <registerucb.hxx>
using namespace com::sun::star;
namespace {
bool fillPlaceholders(rtl::OUString const & rInput,
uno::Sequence< uno::Any > const & rReplacements,
rtl::OUString * pOutput)
{
sal_Unicode const * p = rInput.getStr();
sal_Unicode const * pEnd = p + rInput.getLength();
sal_Unicode const * pCopy = p;
rtl::OUStringBuffer aBuffer;
while (p != pEnd)
switch (*p++)
{
case '&':
if (pEnd - p >= 4
&& p[0] == 'a' && p[1] == 'm' && p[2] == 'p'
&& p[3] == ';')
{
aBuffer.append(pCopy, p - 1 - pCopy);
aBuffer.append(sal_Unicode('&'));
p += 4;
pCopy = p;
}
else if (pEnd - p >= 3
&& p[0] == 'l' && p[1] == 't' && p[2] == ';')
{
aBuffer.append(pCopy, p - 1 - pCopy);
aBuffer.append(sal_Unicode('<'));
p += 3;
pCopy = p;
}
else if (pEnd - p >= 3
&& p[0] == 'g' && p[1] == 't' && p[2] == ';')
{
aBuffer.append(pCopy, p - 1 - pCopy);
aBuffer.append(sal_Unicode('>'));
p += 3;
pCopy = p;
}
break;
case '<':
sal_Unicode const * q = p;
while (q != pEnd && *q != '>')
++q;
if (q == pEnd)
break;
rtl::OUString aKey(p, q - p);
rtl::OUString aValue;
bool bFound = false;
for (sal_Int32 i = 2; i + 1 < rReplacements.getLength();
i += 2)
{
rtl::OUString aReplaceKey;
if ((rReplacements[i] >>= aReplaceKey)
&& aReplaceKey == aKey
&& (rReplacements[i + 1] >>= aValue))
{
bFound = true;
break;
}
}
if (!bFound)
return false;
aBuffer.append(pCopy, p - 1 - pCopy);
aBuffer.append(aValue);
p = q + 1;
pCopy = p;
break;
}
aBuffer.append(pCopy, pEnd - pCopy);
*pOutput = aBuffer.makeStringAndClear();
return true;
}
}
namespace ucbhelper {
//============================================================================
//
// configureUcb
//
//============================================================================
bool
configureUcb(
uno::Reference< ucb::XContentProviderManager > const & rManager,
uno::Reference< lang::XMultiServiceFactory > const & rServiceFactory,
ContentProviderDataList const & rData,
ContentProviderRegistrationInfoList * pInfos)
throw (uno::RuntimeException)
{
ContentProviderDataList::const_iterator aEnd(rData.end());
for (ContentProviderDataList::const_iterator aIt(rData.begin());
aIt != aEnd; ++aIt)
{
ContentProviderRegistrationInfo aInfo;
bool bSuccess = registerAtUcb(rManager,
rServiceFactory,
aIt->ServiceName,
aIt->Arguments,
aIt->URLTemplate,
&aInfo);
if (bSuccess && pInfos)
pInfos->push_back(aInfo);
}
return true;
}
//============================================================================
//
// configureUcb
//
//============================================================================
bool
configureUcb(
uno::Reference< ucb::XContentProviderManager > const & rManager,
uno::Reference< lang::XMultiServiceFactory > const & rServiceFactory,
uno::Sequence< uno::Any > const & rArguments,
std::vector< ContentProviderRegistrationInfo > * pInfos)
throw (uno::RuntimeException)
{
rtl::OUString aKey1;
rtl::OUString aKey2;
if (rArguments.getLength() < 2
|| !(rArguments[0] >>= aKey1) || !(rArguments[1] >>= aKey2))
{
OSL_ENSURE(false, "ucb::configureUcb(): Bad arguments");
return false;
}
ContentProviderDataList aData;
if (!getContentProviderData(rServiceFactory, aKey1, aKey2, aData))
{
OSL_ENSURE(false, "ucb::configureUcb(): No configuration");
return false;
}
ContentProviderDataList::const_iterator aEnd(aData.end());
for (ContentProviderDataList::const_iterator aIt(aData.begin());
aIt != aEnd; ++aIt)
{
rtl::OUString aProviderArguments;
if (fillPlaceholders(aIt->Arguments,
rArguments,
&aProviderArguments))
{
ContentProviderRegistrationInfo aInfo;
bool bSuccess = registerAtUcb(rManager,
rServiceFactory,
aIt->ServiceName,
aProviderArguments,
aIt->URLTemplate,
&aInfo);
OSL_ENSURE(bSuccess, "ucb::configureUcb(): Bad content provider");
if (bSuccess && pInfos)
pInfos->push_back(aInfo);
}
else
OSL_ENSURE(false,
"ucb::configureUcb(): Bad argument placeholders");
}
return true;
}
}
//============================================================================
//
// unconfigureUcb
//
//============================================================================
namespace ucbhelper {
void
unconfigureUcb(
uno::Reference< ucb::XContentProviderManager > const & rManager,
std::vector< ContentProviderRegistrationInfo > const & rInfos)
throw (uno::RuntimeException)
{
std::vector< ContentProviderRegistrationInfo >::const_iterator
aEnd(rInfos.end());
for (std::vector< ContentProviderRegistrationInfo >::const_iterator
aIt(rInfos.begin());
aIt != aEnd; ++aIt)
deregisterFromUcb(rManager, *aIt);
}
}