diff options
Diffstat (limited to 'basic/inc/basic/basmgr.hxx')
-rw-r--r-- | basic/inc/basic/basmgr.hxx | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/basic/inc/basic/basmgr.hxx b/basic/inc/basic/basmgr.hxx new file mode 100644 index 000000000000..6b3a024ec46f --- /dev/null +++ b/basic/inc/basic/basmgr.hxx @@ -0,0 +1,264 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +// +#ifndef _BASMGR_HXX +#define _BASMGR_HXX + +#include <tools/string.hxx> +#include <svl/brdcst.hxx> +#include <basic/sbstar.hxx> +#include <com/sun/star/script/XStorageBasedLibraryContainer.hpp> +#include <com/sun/star/script/XStarBasicAccess.hpp> + + +// Basic XML Import/Export +com::sun::star::uno::Reference< com::sun::star::script::XStarBasicAccess > + getStarBasicAccess( BasicManager* pMgr ); + + + +class SotStorage; + +#define BASERR_ID_STDLIBOPEN ERRCODE_BASMGR_STDLIBOPEN +#define BASERR_ID_STDLIBSAVE ERRCODE_BASMGR_STDLIBSAVE +#define BASERR_ID_LIBLOAD ERRCODE_BASMGR_LIBLOAD +#define BASERR_ID_LIBCREATE ERRCODE_BASMGR_LIBCREATE +#define BASERR_ID_LIBSAVE ERRCODE_BASMGR_LIBSAVE +#define BASERR_ID_LIBDEL ERRCODE_BASMGR_LIBDEL +#define BASERR_ID_MGROPEN ERRCODE_BASMGR_MGROPEN +#define BASERR_ID_MGRSAVE ERRCODE_BASMGR_MGRSAVE +#define BASERR_ID_REMOVELIB ERRCODE_BASMGR_REMOVELIB +#define BASERR_ID_UNLOADLIB ERRCODE_BASMGR_UNLOADLIB + +#define BASERR_REASON_OPENSTORAGE 0x0001 +#define BASERR_REASON_OPENLIBSTORAGE 0x0002 +#define BASERR_REASON_OPENMGRSTREAM 0x0004 +#define BASERR_REASON_OPENLIBSTREAM 0x0008 +#define BASERR_REASON_LIBNOTFOUND 0x0010 +#define BASERR_REASON_STORAGENOTFOUND 0x0020 +#define BASERR_REASON_BASICLOADERROR 0x0040 +#define BASERR_REASON_NOSTORAGENAME 0x0080 + +#define BASERR_REASON_STDLIB 0x0100 + +class BasicError +{ +private: + ULONG nErrorId; + USHORT nReason; + String aErrStr; + +public: + BasicError(); + BasicError( const BasicError& rErr ); + BasicError( ULONG nId, USHORT nR, const String& rErrStr ); + + ULONG GetErrorId() const { return nErrorId; } + USHORT GetReason() const { return nReason; } + String GetErrorStr() { return aErrStr; } + + void SetErrorId( ULONG n ) { nErrorId = n; } + void SetReason( USHORT n ) { nReason = n; } + void SetErrorStr( const String& rStr) { aErrStr = rStr; } +}; + + +// + +class BasicLibs; +class ErrorManager; +class BasicLibInfo; +class BasicErrorManager; +namespace basic { class BasicManagerCleaner; } + +// Library password handling for 5.0 documents +class OldBasicPassword +{ +public: + virtual void setLibraryPassword( const String& rLibraryName, const String& rPassword ) = 0; + virtual String getLibraryPassword( const String& rLibraryName ) = 0; + virtual void clearLibraryPassword( const String& rLibraryName ) = 0; + virtual sal_Bool hasLibraryPassword( const String& rLibraryName ) = 0; +}; + +struct LibraryContainerInfo +{ + ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > mxScriptCont; + ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > mxDialogCont; + OldBasicPassword* mpOldBasicPassword; + + LibraryContainerInfo() + :mpOldBasicPassword( NULL ) + { + } + + LibraryContainerInfo + ( + com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > xScriptCont, + com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > xDialogCont, + OldBasicPassword* pOldBasicPassword + ) + : mxScriptCont( xScriptCont ) + , mxDialogCont( xDialogCont ) + , mpOldBasicPassword( pOldBasicPassword ) + {} +}; + +struct BasicManagerImpl; + + +#define LIB_NOTFOUND 0xFFFF + +class BasicManager : public SfxBroadcaster +{ + friend class LibraryContainer_Impl; + friend class StarBasicAccess_Impl; + friend class BasMgrContainerListenerImpl; + friend class ::basic::BasicManagerCleaner; + +private: + BasicLibs* pLibs; + BasicErrorManager* pErrorMgr; + + String aName; + String maStorageName; + BOOL bBasMgrModified; + BOOL mbDocMgr; + + BasicManagerImpl* mpImpl; + + void Init(); + +protected: + BOOL ImpLoadLibary( BasicLibInfo* pLibInfo ) const; + BOOL ImpLoadLibary( BasicLibInfo* pLibInfo, SotStorage* pCurStorage, BOOL bInfosOnly = FALSE ) const; + void ImpCreateStdLib( StarBASIC* pParentFromStdLib ); + void ImpMgrNotLoaded( const String& rStorageName ); + BasicLibInfo* CreateLibInfo(); + void LoadBasicManager( SotStorage& rStorage, const String& rBaseURL, BOOL bLoadBasics = TRUE ); + void LoadOldBasicManager( SotStorage& rStorage ); + BOOL ImplLoadBasic( SvStream& rStrm, StarBASICRef& rOldBasic ) const; + BOOL ImplEncryptStream( SvStream& rStream ) const; + BasicLibInfo* FindLibInfo( StarBASIC* pBasic ) const; + void CheckModules( StarBASIC* pBasic, BOOL bReference ) const; + void SetFlagToAllLibs( short nFlag, BOOL bSet ) const; + BasicManager(); // This is used only to customize the paths for 'Save as'. + ~BasicManager(); + +public: + TYPEINFO(); + BasicManager( SotStorage& rStorage, const String& rBaseURL, StarBASIC* pParentFromStdLib = NULL, String* pLibPath = NULL, BOOL bDocMgr = FALSE ); + BasicManager( StarBASIC* pStdLib, String* pLibPath = NULL, BOOL bDocMgr = FALSE ); + + /** deletes the given BasicManager instance + + This method is necessary since normally, BasicManager instances are owned by the BasicManagerRepository, + and expected to be deleted by the repository only. However, there exists quite some legacy code, + which needs to explicitly delete a BasicManager itself. This code must not use the (protected) + destructor, but LegacyDeleteBasicManager. + */ + static void LegacyDeleteBasicManager( BasicManager*& _rpManager ); + + void SetStorageName( const String& rName ) { maStorageName = rName; } + String GetStorageName() const { return maStorageName; } + void SetName( const String& rName ) { aName = rName; } + String GetName() const { return aName; } + + + USHORT GetLibCount() const; + StarBASIC* GetLib( USHORT nLib ) const; + StarBASIC* GetLib( const String& rName ) const; + USHORT GetLibId( const String& rName ) const; + + String GetLibName( USHORT nLib ); + + /** announces the library containers which belong to this BasicManager + + The method will automatically add two global constants, BasicLibraries and DialogLibraries, + to the BasicManager. + */ + void SetLibraryContainerInfo( const LibraryContainerInfo& rInfo ); + + const ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer >& + GetDialogLibraryContainer() const; + const ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer >& + GetScriptLibraryContainer() const; + + BOOL LoadLib( USHORT nLib ); + BOOL RemoveLib( USHORT nLib, BOOL bDelBasicFromStorage ); + + // Modify-Flag will be reset only during save. + BOOL IsModified() const; + BOOL IsBasicModified() const; + + BOOL HasErrors(); + void ClearErrors(); + BasicError* GetFirstError(); + BasicError* GetNextError(); + + /** sets a global constant in the basic library, referring to some UNO object, to a new value. + + If a constant with this name already existed before, its value is changed, and the old constant is + returned. If it does not yet exist, it is newly created, and inserted into the basic library. + */ + ::com::sun::star::uno::Any + SetGlobalUNOConstant( const sal_Char* _pAsciiName, const ::com::sun::star::uno::Any& _rValue ); + + /** retrieves a global constant in the basic library, referring to some UNO object, returns true if a value is found ( value is in aOut ) false otherwise. */ + bool GetGlobalUNOConstant( const sal_Char* _pAsciiName, ::com::sun::star::uno::Any& aOut ); + /** determines whether there are password-protected modules whose size exceedes the + legacy module size + @param _out_rModuleNames + takes the names of modules whose size exceeds the legacy limit + */ + bool LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequence< rtl::OUString >& _out_rModuleNames ); + bool HasExeCode( const String& ); +private: + BOOL IsReference( USHORT nLib ); + + BOOL SetLibName( USHORT nLib, const String& rName ); + + StarBASIC* GetStdLib() const; + StarBASIC* AddLib( SotStorage& rStorage, const String& rLibName, BOOL bReference ); + BOOL RemoveLib( USHORT nLib ); + BOOL HasLib( const String& rName ) const; + + StarBASIC* CreateLibForLibContainer( const String& rLibName, + const com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer >& + xScriptCont ); + // For XML import/export: + StarBASIC* CreateLib( const String& rLibName ); + StarBASIC* CreateLib( const String& rLibName, const String& Password, + const String& LinkTargetURL ); +}; + +void SetAppBasicManager( BasicManager* pBasMgr ); + +#endif //_BASMGR_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |