/************************************************************** * * 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 #include #include #include #include #include #include #include "osl/diagnose.h" #ifndef _UCBHELPER_PROVCONF_HXX_ #include #endif #include 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); } }