Files
odfstudio/scripting/source/singleprov/scriptprovider.cxx
T
Neil Roberts 6a4bf34e5a singleprov/ScriptFile: Implement XCopyableBrowseNode
Implements XCopyableBrowseNode on the ScriptFile class so that all
script providers based on the single-file provider can support copying.

Change-Id: I14aa057ac432ff80e4a4841fbe5c19be082aa099
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208161
Tested-by: Jenkins
Reviewed-by: Neil Roberts <nroberts@libreoffice.org>
2026-07-23 15:18:33 +02:00

272 lines
8.8 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <singleprov/scriptprovider.hxx>
#include <com/sun/star/script/provider/ScriptFrameworkErrorException.hpp>
#include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
#include <com/sun/star/script/provider/ScriptURIHelper.hpp>
#include <com/sun/star/ucb/SimpleFileAccess.hpp>
#include <vector>
#include <singleprov/singlescriptfactory.hxx>
#include "provcontext.hxx"
#include "scriptdir.hxx"
namespace singleprovider
{
ScriptProvider::ScriptProvider(const css::uno::Reference<css::uno::XComponentContext>& xContext,
const std::shared_ptr<SingleScriptFactory>& pSingleScriptFactory)
: m_pProviderContext(std::make_shared<ProviderContext>(xContext, pSingleScriptFactory))
{
}
void SAL_CALL ScriptProvider::initialize(const css::uno::Sequence<css::uno::Any>& aArguments)
{
if (aArguments.getLength() > 0)
{
OUString sLocation;
if (aArguments[0] >>= sLocation)
setLocation(sLocation);
}
}
void ScriptProvider::setLocation(const OUString& sLocation)
{
OUString sLanguageName = m_pProviderContext->m_pSingleScriptFactory->getLanguageName();
m_pProviderContext->m_xUriHelper = css::script::provider::ScriptURIHelper::create(
m_pProviderContext->m_xContext, sLanguageName, sLocation);
m_xRootBrowser
= css::uno::Reference<css::script::browse::XBrowseNode>(new ScriptDir(m_pProviderContext));
}
OUString SAL_CALL ScriptProvider::getName()
{
return m_pProviderContext->m_pSingleScriptFactory->getLanguageName();
}
css::uno::Sequence<css::uno::Reference<css::script::browse::XBrowseNode>>
SAL_CALL ScriptProvider::getChildNodes()
{
if (m_xRootBrowser.is())
return m_xRootBrowser->getChildNodes();
else
return css::uno::Sequence<css::uno::Reference<css::script::browse::XBrowseNode>>();
}
sal_Bool SAL_CALL ScriptProvider::hasChildNodes()
{
return m_xRootBrowser.is() && m_xRootBrowser->hasChildNodes();
}
sal_Int16 SAL_CALL ScriptProvider::getType()
{
return m_xRootBrowser.is() ? m_xRootBrowser->getType() : 0;
}
css::uno::Reference<css::script::provider::XScript>
SAL_CALL ScriptProvider::getScript(const OUString& sScriptUri)
{
OUString sStorageUri = m_pProviderContext->m_xUriHelper->getStorageURI(sScriptUri);
sal_Int32 nSlashPos = sStorageUri.lastIndexOf('/');
OUString sName = sStorageUri.copy(nSlashPos == -1 ? 0 : nSlashPos + 1);
try
{
std::vector<char> aSource;
constexpr sal_Int32 nBufSize = 1024;
css::uno::Sequence<sal_Int8> aBuf(nBufSize);
css::uno::Reference<css::io::XInputStream> xIn
= m_pProviderContext->m_xFileAccess->openFileRead(sStorageUri);
while (true)
{
sal_Int32 nBytesRead = xIn->readBytes(aBuf, aBuf.getLength());
const char* pBuf = reinterpret_cast<const char*>(aBuf.getConstArray());
aSource.insert(aSource.end(), pBuf, pBuf + nBytesRead);
if (nBytesRead < nBufSize)
break;
}
return m_pProviderContext->m_pSingleScriptFactory->getScript(
m_pProviderContext->m_xContext, sName,
std::string_view(aSource.begin(), aSource.end()));
}
catch (const css::uno::Exception& e)
{
throw css::script::provider::ScriptFrameworkErrorException(
e.Message, static_cast<css::uno::XWeak*>(this), sName,
m_pProviderContext->m_pSingleScriptFactory->getLanguageName(),
css::script::provider::ScriptFrameworkErrorType::UNKNOWN);
}
}
css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL ScriptProvider::getPropertySetInfo()
{
css::uno::Reference<css::beans::XPropertySetInfo> xPropertySetInfo;
css::uno::Reference<css::beans::XPropertySet> xPropertySet(m_xRootBrowser, css::uno::UNO_QUERY);
if (xPropertySet.is())
xPropertySetInfo = xPropertySet->getPropertySetInfo();
return xPropertySetInfo;
}
void SAL_CALL ScriptProvider::setPropertyValue(const OUString&, const css::uno::Any&) {}
css::uno::Any SAL_CALL ScriptProvider::getPropertyValue(const OUString& sPropertyName)
{
css::uno::Any xRet;
css::uno::Reference<css::beans::XPropertySet> xPropertySet(m_xRootBrowser, css::uno::UNO_QUERY);
if (xPropertySet.is())
xRet = xPropertySet->getPropertyValue(sPropertyName);
return xRet;
}
void SAL_CALL ScriptProvider::addPropertyChangeListener(
const OUString&, const css::uno::Reference<css::beans::XPropertyChangeListener>&)
{
}
void SAL_CALL ScriptProvider::removePropertyChangeListener(
const OUString&, const css::uno::Reference<css::beans::XPropertyChangeListener>&)
{
}
void SAL_CALL ScriptProvider::addVetoableChangeListener(
const OUString&, const css::uno::Reference<css::beans::XVetoableChangeListener>&)
{
}
void SAL_CALL ScriptProvider::removeVetoableChangeListener(
const OUString&, const css::uno::Reference<css::beans::XVetoableChangeListener>&)
{
}
sal_Bool SAL_CALL ScriptProvider::isCreatableNode()
{
css::uno::Reference<css::script::browse::XCreatableBrowseNode> xCreatable(m_xRootBrowser,
css::uno::UNO_QUERY);
if (xCreatable.is())
return xCreatable->isCreatableNode();
else
return false;
}
css::uno::Reference<css::script::browse::XBrowseNode>
SAL_CALL ScriptProvider::createNode(const OUString& sName)
{
css::uno::Reference<css::script::browse::XCreatableBrowseNode> xCreatable(m_xRootBrowser,
css::uno::UNO_QUERY);
if (xCreatable.is())
return xCreatable->createNode(sName);
else
return css::uno::Reference<css::script::browse::XBrowseNode>();
}
sal_Bool SAL_CALL ScriptProvider::isEditableNode()
{
css::uno::Reference<css::script::browse::XEditableBrowseNode> xEditable(m_xRootBrowser,
css::uno::UNO_QUERY);
if (xEditable.is())
return xEditable->isEditableNode();
else
return false;
}
sal_Bool SAL_CALL ScriptProvider::editNode()
{
css::uno::Reference<css::script::browse::XEditableBrowseNode> xEditable(m_xRootBrowser,
css::uno::UNO_QUERY);
if (xEditable.is())
return xEditable->editNode();
else
return false;
}
std::shared_ptr<SingleScriptFactory> ScriptProvider::getScriptFactory() const
{
return m_pProviderContext->m_pSingleScriptFactory;
}
std::optional<OUString> ScriptProvider::getDirectoryUri() const
{
if (const DirectoryNode* pDirectoryNode
= dynamic_cast<const DirectoryNode*>(m_xRootBrowser.get()))
return pDirectoryNode->getDirectoryUri();
else
return std::nullopt;
}
OUString SAL_CALL ScriptProvider::getImplementationName()
{
return getImplementationNameStatic(
m_pProviderContext->m_pSingleScriptFactory->getLanguageName());
}
sal_Bool SAL_CALL ScriptProvider::supportsService(OUString const& serviceName)
{
const css::uno::Sequence<OUString> names = getSupportedServiceNames();
const OUString* pNames = names.getConstArray();
for (sal_Int32 i = 0, count = names.getLength(); i < count; i++)
{
if (pNames[i] == serviceName)
return true;
}
return false;
}
css::uno::Sequence<OUString> SAL_CALL ScriptProvider::getSupportedServiceNames()
{
return getSupportedServiceNamesStatic(
m_pProviderContext->m_pSingleScriptFactory->getLanguageName());
}
SAL_DLLPUBLIC_EXPORT OUString
ScriptProvider::getImplementationNameStatic(std::u16string_view sLanguageName)
{
return u"com.sun.star.singleprov.ScriptProviderFor"_ustr + sLanguageName;
}
SAL_DLLPUBLIC_EXPORT css::uno::Sequence<OUString>
ScriptProvider::getSupportedServiceNamesStatic(std::u16string_view sLanguageName)
{
css::uno::Sequence<OUString> names(2);
OUString* pNames = names.getArray();
pNames[0] = u"com.sun.star.script.provider.ScriptProviderFor"_ustr + sLanguageName;
pNames[1] = "com.sun.star.script.provider.LanguageScriptProvider";
return names;
}
SAL_DLLPUBLIC_EXPORT css::uno::Reference<css::uno::XInterface>
ScriptProvider::create(const css::uno::Reference<css::uno::XComponentContext>& xContext,
const std::shared_ptr<SingleScriptFactory>& pSingleScriptFactory)
{
return static_cast<css::lang::XTypeProvider*>(
new ScriptProvider(xContext, pSingleScriptFactory));
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */