blob: e689c5c0e1197371e2d5e7d25c9278a8d52d47db [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
//
#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:
sal_uIntPtr nErrorId;
sal_uInt16 nReason;
String aErrStr;
public:
BasicError();
BasicError( const BasicError& rErr );
BasicError( sal_uIntPtr nId, sal_uInt16 nR, const String& rErrStr );
sal_uIntPtr GetErrorId() const { return nErrorId; }
sal_uInt16 GetReason() const { return nReason; }
String GetErrorStr() { return aErrStr; }
void SetErrorId( sal_uIntPtr n ) { nErrorId = n; }
void SetReason( sal_uInt16 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;
sal_Bool bBasMgrModified;
sal_Bool mbDocMgr;
BasicManagerImpl* mpImpl;
void Init();
protected:
sal_Bool ImpLoadLibary( BasicLibInfo* pLibInfo ) const;
sal_Bool ImpLoadLibary( BasicLibInfo* pLibInfo, SotStorage* pCurStorage, sal_Bool bInfosOnly = sal_False ) const;
void ImpCreateStdLib( StarBASIC* pParentFromStdLib );
void ImpMgrNotLoaded( const String& rStorageName );
BasicLibInfo* CreateLibInfo();
void LoadBasicManager( SotStorage& rStorage, const String& rBaseURL, sal_Bool bLoadBasics = sal_True );
void LoadOldBasicManager( SotStorage& rStorage );
sal_Bool ImplLoadBasic( SvStream& rStrm, StarBASICRef& rOldBasic ) const;
sal_Bool ImplEncryptStream( SvStream& rStream ) const;
BasicLibInfo* FindLibInfo( StarBASIC* pBasic ) const;
void CheckModules( StarBASIC* pBasic, sal_Bool bReference ) const;
void SetFlagToAllLibs( short nFlag, sal_Bool bSet ) const;
BasicManager(); // Nur zum anpassen von Pfaden bei 'Speichern unter'.
~BasicManager();
public:
TYPEINFO();
BasicManager( SotStorage& rStorage, const String& rBaseURL, StarBASIC* pParentFromStdLib = NULL, String* pLibPath = NULL, sal_Bool bDocMgr = sal_False );
BasicManager( StarBASIC* pStdLib, String* pLibPath = NULL, sal_Bool bDocMgr = sal_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; }
sal_uInt16 GetLibCount() const;
StarBASIC* GetLib( sal_uInt16 nLib ) const;
StarBASIC* GetLib( const String& rName ) const;
sal_uInt16 GetLibId( const String& rName ) const;
String GetLibName( sal_uInt16 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;
sal_Bool LoadLib( sal_uInt16 nLib );
sal_Bool RemoveLib( sal_uInt16 nLib, sal_Bool bDelBasicFromStorage );
// Modify-Flag wird nur beim Speichern zurueckgesetzt.
sal_Bool IsModified() const;
sal_Bool IsBasicModified() const;
sal_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 );
/// determines whether the Basic Manager has a given macro, given by fully qualified name
bool HasMacro( String const& i_fullyQualifiedName ) const;
/// executes a given macro
ErrCode ExecuteMacro( String const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue );
/// executes a given macro
ErrCode ExecuteMacro( String const& i_fullyQualifiedName, String const& i_commaSeparatedArgs, SbxValue* i_retValue );
private:
sal_Bool IsReference( sal_uInt16 nLib );
sal_Bool SetLibName( sal_uInt16 nLib, const String& rName );
StarBASIC* GetStdLib() const;
StarBASIC* AddLib( SotStorage& rStorage, const String& rLibName, sal_Bool bReference );
sal_Bool RemoveLib( sal_uInt16 nLib );
sal_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