23#include <com/sun/star/frame/XModel.hpp>
24#include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
25#include <com/sun/star/script/provider/ScriptFrameworkErrorException.hpp>
26#include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
27#include <com/sun/star/document/XEmbeddedScripts.hpp>
28#include <com/sun/star/uri/UriReferenceFactory.hpp>
33#include <osl/file.hxx>
42#include <com/sun/star/util/theMacroExpander.hpp>
43#include <com/sun/star/script/XLibraryContainer2.hpp>
44#include <com/sun/star/uri/XUriReference.hpp>
45#include <com/sun/star/uri/XUriReferenceFactory.hpp>
46#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
66 :m_pAppBasicManager( nullptr )
67 ,m_pDocBasicManager( nullptr )
69 ,m_bIsAppScriptCtx( true )
84 bool bIsShared =
false;
86 Reference< script::XLibraryContainer2 > xLibContainer( rxLibContainer, UNO_QUERY );
87 if ( xLibContainer.is() && xLibContainer->hasByName( rLibName ) && xLibContainer->isLibraryLink( rLibName ) )
94 OUString aLinkURL( xLibContainer->getLibraryLinkURL( rLibName ) );
95 Reference< uri::XUriReference > xUriRef = xUriFac->parse( aLinkURL );
99 OUString aScheme = xUriRef->getScheme();
100 if ( aScheme.equalsIgnoreAsciiCase(
"file") )
104 else if ( aScheme.equalsIgnoreAsciiCase(
"vnd.sun.star.pkg") )
106 OUString aDecodedURL = xUriRef->getAuthority();
107 if ( aDecodedURL.startsWithIgnoreAsciiCase(
"vnd.sun.star.expand:", &aDecodedURL ) )
109 aDecodedURL = ::rtl::Uri::decode( aDecodedURL, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
110 Reference<util::XMacroExpander> xMacroExpander =
112 aFileURL = xMacroExpander->expandMacros( aDecodedURL );
118 if ( !aFileURL.isEmpty() )
120 osl::DirectoryItem aFileItem;
121 osl::FileStatus aFileStatus( osl_FileStatus_Mask_FileURL );
122 OSL_VERIFY( osl::DirectoryItem::get( aFileURL, aFileItem ) == osl::FileBase::E_None );
123 OSL_VERIFY( aFileItem.getFileStatus( aFileStatus ) == osl::FileBase::E_None );
124 OUString aCanonicalFileURL( aFileStatus.getFileURL() );
126 if( aCanonicalFileURL.indexOf(
"share/basic" ) != -1
127 || aCanonicalFileURL.indexOf(
"share/uno_packages" ) != -1 )
138 if (
auto pManager =
dynamic_cast<const BasicManager*
>(&rBC))
149 return "com.sun.star.comp.scripting.ScriptProviderForBasic";
160 "com.sun.star.script.provider.ScriptProviderForBasic",
161 "com.sun.star.script.provider.LanguageScriptProvider",
162 "com.sun.star.script.provider.ScriptProvider",
163 "com.sun.star.script.browse.BrowseNode"};
178 throw IllegalArgumentException(
179 "BasicProviderImpl::initialize: incorrect argument count.",
193 throw IllegalArgumentException(
194 "BasicProviderImpl::initialize: unable to determine the document model from the script invocation context.",
204 throw IllegalArgumentException(
205 "BasicProviderImpl::initialize: incorrect argument type " +
aArguments[0].getValueTypeName(),
219 Reference< XEmbeddedScripts > xDocumentScripts(
xModel, UNO_QUERY );
220 if ( xDocumentScripts.is() )
225 "BasicProviderImpl::initialize: invalid BasicManager, or invalid script container!" );
268 Reference< provider::XScript > xScript;
271 Reference< uri::XUriReference > uriRef = xFac->parse( scriptURI );
273 Reference < uri::XVndSunStarScriptUrl > sfUri( uriRef, UNO_QUERY );
275 if ( !uriRef.is() || !sfUri.is() )
277 throw provider::ScriptFrameworkErrorException(
278 "BasicProviderImpl::getScript: failed to parse URI: " + scriptURI,
279 Reference< XInterface >(),
281 provider::ScriptFrameworkErrorType::MALFORMED_URL );
285 OUString aDescription = sfUri->getName();
286 OUString aLocation = sfUri->getParameter(
"location" );
293 if ( aLocation ==
"document" )
297 else if ( aLocation ==
"application" )
301 OUString sProjectName;
303 sProjectName = pBasicMgr->
GetName();
306 if ( !sProjectName.isEmpty() && aDescription.match( sProjectName ) )
308 SAL_WARN(
"scripting",
"LibraryName " << sProjectName <<
" is part of the url " << aDescription );
309 aLibrary = sProjectName;
310 nIndex = sProjectName.getLength() + 1;
313 aLibrary = aDescription.getToken( 0,
'.',
nIndex );
316 aModule = aDescription.getToken( 0,
'.',
nIndex );
319 aMethod = aDescription.getToken( 0,
'.',
nIndex );
321 if ( !aLibrary.isEmpty() && !aModule.isEmpty() && !aMethod.isEmpty() && !aLocation.isEmpty() )
333 pBasic = pBasicMgr->
GetLib( aLibrary );
342 if ( pMethod && !pMethod->
IsHidden() )
356 throw provider::ScriptFrameworkErrorException(
357 "The following Basic script could not be found:\n"
358 "library: '" + aLibrary +
"'\n"
359 "module: '" + aModule +
"'\n"
360 "method: '" + aMethod +
"'\n"
361 "location: '" + aLocation +
"'\n",
362 Reference< XInterface >(),
364 provider::ScriptFrameworkErrorType::NO_SUCH_SCRIPT );
398 Sequence< Reference< browse::XBrowseNode > > aChildNodes;
400 if ( pBasicManager && xLibContainer.is() )
403 sal_Int32 nLibCount = aLibNames.getLength();
404 aChildNodes.realloc( nLibCount );
405 Reference< browse::XBrowseNode >* pChildNodes = aChildNodes.getArray();
406 sal_Int32 childrenFound = 0;
408 for (
const OUString& rLibName : aLibNames )
410 bool bCreate =
false;
423 pChildNodes[childrenFound++]
429 if ( childrenFound != nLibCount )
430 aChildNodes.realloc( childrenFound );
441 bool bReturn =
false;
451 if ( xLibContainer.is() )
452 bReturn = xLibContainer->hasElements();
460 return browse::BrowseNodeTypes::CONTAINER;
466 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
468 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
Reference< XComponentContext > m_xContext
SfxApplication * SfxGetpApp()
StarBASIC * GetLib(sal_uInt16 nLib) const
const OUString & GetName() const
bool LoadLib(sal_uInt16 nLib)
sal_uInt16 GetLibId(std::u16string_view rName) const
SbMethod * FindMethod(const OUString &, SbxClassType)
css::script::XLibraryContainer * GetBasicContainer()
static BasicManager * GetBasicManager()
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
SbModule * FindModule(std::u16string_view)
static BasicManager * getDocumentBasicManager(const css::uno::Reference< css::frame::XModel > &_rxDocumentModel)
bool isLibraryShared(const css::uno::Reference< css::script::XLibraryContainer > &rxLibContainer, const OUString &rLibName)
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
virtual OUString SAL_CALL getImplementationName() override
virtual OUString SAL_CALL getName() override
virtual css::uno::Sequence< css::uno::Reference< css::script::browse::XBrowseNode > > SAL_CALL getChildNodes() override
virtual sal_Int16 SAL_CALL getType() override
css::uno::Reference< css::script::XLibraryContainer > m_xLibContainerApp
OUString m_sScriptingContext
virtual css::uno::Reference< css::script::provider::XScript > SAL_CALL getScript(const OUString &scriptURI) override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
css::uno::Reference< css::script::XLibraryContainer > m_xLibContainerDoc
css::uno::Reference< css::document::XScriptInvocationContext > m_xInvocationContext
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
BasicProviderImpl(const css::uno::Reference< css::uno::XComponentContext > &xContext)
BasicManager * m_pDocBasicManager
css::uno::Reference< css::uno::XComponentContext > m_xContext
BasicManager * m_pAppBasicManager
virtual sal_Bool SAL_CALL hasChildNodes() override
virtual ~BasicProviderImpl() override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
Sequence< PropertyValue > aArguments
#define SAL_WARN(area, stream)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * scripting_BasicProviderImpl_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
Reference< XModel > xModel