27#include <com/sun/star/document/XStorageBasedDocument.hpp>
28#include <com/sun/star/document/XEmbeddedScripts.hpp>
29#include <com/sun/star/frame/Desktop.hpp>
51 using ::com::sun::star::uno::Reference;
52 using ::com::sun::star::uno::XComponentContext;
53 using ::com::sun::star::frame::XModel;
54 using ::com::sun::star::frame::Desktop;
55 using ::com::sun::star::uno::XInterface;
56 using ::com::sun::star::uno::UNO_QUERY;
57 using ::com::sun::star::embed::XStorage;
58 using ::com::sun::star::script::XPersistentLibraryContainer;
59 using ::com::sun::star::uno::UNO_QUERY_THROW;
60 using ::com::sun::star::uno::Exception;
61 using ::com::sun::star::document::XStorageBasedDocument;
62 using ::com::sun::star::document::XEmbeddedScripts;
64 typedef std::map< Reference< XInterface >, std::unique_ptr<BasicManager> >
BasicManagerStore;
101 BasicManagerStore::iterator
125 BasicManagerStore::iterator location,
183 virtual void _disposing(
const css::lang::EventObject& _rSource )
override;
212 std::unique_lock aGuard(
aMutex);
232 if (loc->second !=
nullptr)
233 return loc->second.get();
235 return loc->second.get();
244 if (pAppManager ==
nullptr)
260 GetSbData()->pAppBasMgr = std::move(_pBasicManager);
268 OSL_PRECOND(
getApplicationBasicManager() ==
nullptr,
"ImplRepository::impl_createApplicationBasicManager: there already is one!");
273 if ( aAppBasicDir.isEmpty() )
287 OUString aFileName( aAppBasic.
getName() );
290 OString(
"Invalid URL: \"" +
298 pBasicCont->setBasicManager( pBasicManager );
318 return pBasicManager;
338 OSL_FAIL(
"ImplRepository::revokeCreationListener: listener is not registered!" );
347 creationListener->onBasicManagerCreated( _rxDocumentModel, _rManager );
357 DBG_ASSERT( pAppBasic !=
nullptr,
"impl_getApplicationBasic: unable to determine the default application's Basic library!" );
364 DBG_ASSERT( _rxDocumentModel.is(),
"ImplRepository::impl_getLocationForModel: invalid model!" );
366 return m_aStore.try_emplace(xNormalized).first;
372 DBG_ASSERT( _rxDocumentModel.is(),
"ImplRepository::impl_getLocationForModel: invalid model!" );
379 OSL_PRECOND( _rxBasicLibraries.is() && _rxDialogLibraries.is(),
380 "ImplRepository::impl_initDocLibraryContainers_nothrow: illegal library containers, this will crash!" );
385 static constexpr OUStringLiteral aStdLibName(
u"Standard" );
386 if ( !_rxBasicLibraries->hasByName( aStdLibName ) )
388 _rxBasicLibraries->createLibrary( aStdLibName );
391 if ( !_rxDialogLibraries->hasByName( aStdLibName ) )
393 _rxDialogLibraries->createLibrary( aStdLibName );
404 auto & _out_rpBasicManager = location->second;
408 _out_rpBasicManager =
nullptr;
429 ::comphelper::DocumentInfo::getDocumentTitle( _rxDocumentModel ) );
434 _out_rpBasicManager.reset(
new BasicManager( *xDummyStor,
u"" ,
436 &aAppBasicDir,
true ));
437 if ( !_out_rpBasicManager->GetErrors().empty() )
440 std::vector<BasicError>& aErrors = _out_rpBasicManager->GetErrors();
441 for(
const auto& rError : aErrors)
447 _out_rpBasicManager.reset();
456 if ( !xStorage.is() )
461 _out_rpBasicManager.reset(
new BasicManager( pBasic,
nullptr,
true ));
466 OSL_ENSURE( aInfo.
mpOldBasicPassword,
"ImplRepository::impl_createManagerForModel: wrong BasicLibraries implementation!" );
467 _out_rpBasicManager->SetLibraryContainerInfo( aInfo );
473 _out_rpBasicManager->GetLib(0)->SetParent( pAppBasic );
476 _out_rpBasicManager->SetGlobalUNOConstant(
"ThisComponent", css::uno::Any( _rxDocumentModel ) );
482 OSL_ENSURE( _rxDocumentModel.is(),
"ImplRepository::impl_createManagerForModel: the document must be an XComponent!" );
499 xBasicLibs->setModified(
false );
500 xDialogLibs->setModified(
false );
506 _out_rStorage.clear();
510 _out_rStorage.set( xStorDoc->getDocumentStorage() );
524 _out_rxBasicLibraries.clear();
525 _out_rxDialogLibraries.clear();
529 _out_rxBasicLibraries.set( xScripts->getBasicLibraries(), UNO_QUERY_THROW );
530 _out_rxDialogLibraries.set( xScripts->getDialogLibraries(), UNO_QUERY_THROW );
536 return _out_rxBasicLibraries.is() && _out_rxDialogLibraries.is();
542 OSL_PRECOND( _pos !=
m_aStore.end(),
"ImplRepository::impl_removeFromRepository: invalid position!" );
544 std::unique_ptr<BasicManager> pManager = std::move(_pos->second);
564 BasicManagerStore::iterator it = std::find_if(
m_aStore.begin(),
m_aStore.end(),
565 [&xNormalizedSource](BasicManagerStore::reference rEntry) {
566 return rEntry.first.get() == xNormalizedSource.get(); });
573 OSL_FAIL(
"ImplRepository::_disposing: where does this come from?" );
579 if ( _rHint.
GetId() != SfxHintId::Dying )
584 OSL_ENSURE( pManager,
"ImplRepository::Notify: where does this come from?" );
586 BasicManagerStore::iterator it = std::find_if(
m_aStore.begin(),
m_aStore.end(),
587 [&pManager](BasicManagerStore::reference rEntry) { return rEntry.second.get() == pManager; });
593 OSL_FAIL(
"ImplRepository::Notify: nobody should tamper with the managers, except ourself!" );
SbxAppData & GetSbxData_Impl()
static OUString GetAppName()
StarBASIC * GetLib(sal_uInt16 nLib) const
void SetLibraryContainerInfo(const LibraryContainerInfo &rInfo)
announces the library containers which belong to this BasicManager
void SetGlobalUNOConstant(const OUString &rName, const css::uno::Any &_rValue, css::uno::Any *pOldValue=nullptr)
sets a global constant in the basic library, referring to some UNO object, to a new value.
void SetStorageName(const OUString &rName)
static DialogMask HandleError(ErrCode nId, weld::Window *pParent=nullptr, DialogMask nMask=DialogMask::MAX)
OUString getName(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool insertName(std::u16string_view rTheName, bool bAppendFinalSlash=false, sal_Int32 nIndex=LAST_SEGMENT, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
OUString PathToFileName() const
INetProtocol GetProtocol() const
void SetFlag(SbxFlagBits n)
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
void SetBasicPath(const OUString &rPath)
const OUString & GetBasicPath() const
specifies a callback for instances which are interested in BasicManagers created by the BasicManagerR...
static void resetApplicationBasicManager()
resets the application-wide BasicManager to <NULL>
static BasicManager * getApplicationBasicManager()
returns the application-wide BasicManager
static void registerCreationListener(BasicManagerCreationListener &_rListener)
registers a BasicManagerCreationListener instance which is notified whenever the repository creates a...
static void revokeCreationListener(BasicManagerCreationListener &_rListener)
revokes a BasicManagerCreationListener instance which has previously been registered to be notified a...
static BasicManager * getDocumentBasicManager(const css::uno::Reference< css::frame::XModel > &_rxDocumentModel)
returns the BasicManager belonging to the given document
static BasicManager * getApplicationBasicManager()
BasicManager * getOrCreateApplicationBasicManager()
bool impl_createManagerForModel(BasicManagerStore::iterator location, const Reference< XModel > &_rxDocumentModel)
creates a new BasicManager instance for the given model
static void setApplicationBasicManager(std::unique_ptr< BasicManager > _pBasicManager)
static bool impl_getDocumentStorage_nothrow(const Reference< XModel > &_rxDocument, Reference< XStorage > &_out_rStorage)
retrieves the current storage of a given document
virtual void Notify(SfxBroadcaster &_rBC, const SfxHint &_rHint) override
void registerCreationListener(BasicManagerCreationListener &_rListener)
BasicManager * getDocumentBasicManager(const Reference< XModel > &_rxDocumentModel)
static void impl_initDocLibraryContainers_nothrow(const Reference< XPersistentLibraryContainer > &_rxBasicLibraries, const Reference< XPersistentLibraryContainer > &_rxDialogLibraries)
initializes the given library containers, which belong to a document
static bool impl_getDocumentLibraryContainers_nothrow(const Reference< XModel > &_rxDocument, Reference< XPersistentLibraryContainer > &_out_rxBasicLibraries, Reference< XPersistentLibraryContainer > &_out_rxDialogLibraries)
retrieves the containers for Basic and Dialog libraries for a given document
void revokeCreationListener(BasicManagerCreationListener &_rListener)
static ImplRepository & Instance()
CreationListeners m_aCreationListeners
BasicManager * impl_createApplicationBasicManager()
creates the application-wide BasicManager
virtual void _disposing(const css::lang::EventObject &_rSource) override
BasicManagerStore m_aStore
void impl_removeFromRepository(const BasicManagerStore::iterator &_pos)
removes the Model/BasicManager pair given by iterator from our store
StarBASIC * impl_getDefaultAppBasicLibrary()
BasicManagerStore::iterator impl_getLocationForModel(const Reference< XModel > &_rxDocumentModel)
retrieves the location at which the BasicManager for the given model is stored.
void impl_notifyCreationListeners(const Reference< XModel > &_rxDocumentModel, BasicManager &_rManager)
notifies all listeners which expressed interest in the creation of BasicManager instances.
bool impl_hasLocationForModel(const Reference< XModel > &_rxDocumentModel) const
tests if there is a location set at which the BasicManager for the given model is stored.
void startComponentListening(const css::uno::Reference< css::lang::XComponent > &_rxComp)
void stopComponentListening(const css::uno::Reference< css::lang::XComponent > &_rxComp)
#define DBG_ASSERT(sCon, aError)
#define DBG_UNHANDLED_EXCEPTION(...)
std::map< Reference< XInterface >, std::unique_ptr< BasicManager > > BasicManagerStore
std::vector< BasicManagerCreationListener * > CreationListeners
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
#define ERRCTX_SFX_LOADBASIC
basic::SfxScriptLibraryContainer * mpOldBasicPassword
tools::SvRef< SvRefBase > mrImplRepository
Reference< XModel > xModel