1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 // 24 #ifndef _BASMGR_HXX 25 #define _BASMGR_HXX 26 27 #include <tools/string.hxx> 28 #include <svl/brdcst.hxx> 29 #include "basic/basicdllapi.h" 30 #include <basic/sbstar.hxx> 31 #include <com/sun/star/script/XStorageBasedLibraryContainer.hpp> 32 #include <com/sun/star/script/XStarBasicAccess.hpp> 33 34 35 // Basic XML Import/Export 36 BASIC_DLLPUBLIC com::sun::star::uno::Reference< com::sun::star::script::XStarBasicAccess > 37 getStarBasicAccess( BasicManager* pMgr ); 38 39 40 41 class SotStorage; 42 43 #define BASERR_ID_STDLIBOPEN ERRCODE_BASMGR_STDLIBOPEN 44 #define BASERR_ID_STDLIBSAVE ERRCODE_BASMGR_STDLIBSAVE 45 #define BASERR_ID_LIBLOAD ERRCODE_BASMGR_LIBLOAD 46 #define BASERR_ID_LIBCREATE ERRCODE_BASMGR_LIBCREATE 47 #define BASERR_ID_LIBSAVE ERRCODE_BASMGR_LIBSAVE 48 #define BASERR_ID_LIBDEL ERRCODE_BASMGR_LIBDEL 49 #define BASERR_ID_MGROPEN ERRCODE_BASMGR_MGROPEN 50 #define BASERR_ID_MGRSAVE ERRCODE_BASMGR_MGRSAVE 51 #define BASERR_ID_REMOVELIB ERRCODE_BASMGR_REMOVELIB 52 #define BASERR_ID_UNLOADLIB ERRCODE_BASMGR_UNLOADLIB 53 54 #define BASERR_REASON_OPENSTORAGE 0x0001 55 #define BASERR_REASON_OPENLIBSTORAGE 0x0002 56 #define BASERR_REASON_OPENMGRSTREAM 0x0004 57 #define BASERR_REASON_OPENLIBSTREAM 0x0008 58 #define BASERR_REASON_LIBNOTFOUND 0x0010 59 #define BASERR_REASON_STORAGENOTFOUND 0x0020 60 #define BASERR_REASON_BASICLOADERROR 0x0040 61 #define BASERR_REASON_NOSTORAGENAME 0x0080 62 63 #define BASERR_REASON_STDLIB 0x0100 64 65 class BASIC_DLLPUBLIC BasicError 66 { 67 private: 68 sal_uIntPtr nErrorId; 69 sal_uInt16 nReason; 70 String aErrStr; 71 72 public: 73 BasicError(); 74 BasicError( const BasicError& rErr ); 75 BasicError( sal_uIntPtr nId, sal_uInt16 nR, const String& rErrStr ); 76 GetErrorId() const77 sal_uIntPtr GetErrorId() const { return nErrorId; } GetReason() const78 sal_uInt16 GetReason() const { return nReason; } GetErrorStr()79 String GetErrorStr() { return aErrStr; } 80 SetErrorId(sal_uIntPtr n)81 void SetErrorId( sal_uIntPtr n ) { nErrorId = n; } SetReason(sal_uInt16 n)82 void SetReason( sal_uInt16 n ) { nReason = n; } SetErrorStr(const String & rStr)83 void SetErrorStr( const String& rStr) { aErrStr = rStr; } 84 }; 85 86 87 // 88 89 class BasicLibs; 90 class ErrorManager; 91 class BasicLibInfo; 92 class BasicErrorManager; 93 namespace basic { class BasicManagerCleaner; } 94 95 // Library password handling for 5.0 documents 96 class BASIC_DLLPUBLIC OldBasicPassword 97 { 98 public: 99 virtual void setLibraryPassword( const String& rLibraryName, const String& rPassword ) = 0; 100 virtual String getLibraryPassword( const String& rLibraryName ) = 0; 101 virtual void clearLibraryPassword( const String& rLibraryName ) = 0; 102 virtual sal_Bool hasLibraryPassword( const String& rLibraryName ) = 0; 103 }; 104 105 struct LibraryContainerInfo 106 { 107 ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > mxScriptCont; 108 ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > mxDialogCont; 109 OldBasicPassword* mpOldBasicPassword; 110 LibraryContainerInfoLibraryContainerInfo111 LibraryContainerInfo() 112 :mpOldBasicPassword( NULL ) 113 { 114 } 115 LibraryContainerInfoLibraryContainerInfo116 LibraryContainerInfo 117 ( 118 com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > xScriptCont, 119 com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer > xDialogCont, 120 OldBasicPassword* pOldBasicPassword 121 ) 122 : mxScriptCont( xScriptCont ) 123 , mxDialogCont( xDialogCont ) 124 , mpOldBasicPassword( pOldBasicPassword ) 125 {} 126 }; 127 128 struct BasicManagerImpl; 129 130 131 #define LIB_NOTFOUND 0xFFFF 132 133 class BASIC_DLLPUBLIC BasicManager : public SfxBroadcaster 134 { 135 friend class LibraryContainer_Impl; 136 friend class StarBasicAccess_Impl; 137 friend class BasMgrContainerListenerImpl; 138 friend class ::basic::BasicManagerCleaner; 139 140 private: 141 BasicLibs* pLibs; 142 BasicErrorManager* pErrorMgr; 143 144 String aName; 145 String maStorageName; 146 sal_Bool bBasMgrModified; 147 sal_Bool mbDocMgr; 148 149 BasicManagerImpl* mpImpl; 150 151 void Init(); 152 153 protected: 154 sal_Bool ImpLoadLibary( BasicLibInfo* pLibInfo ) const; 155 sal_Bool ImpLoadLibary( BasicLibInfo* pLibInfo, SotStorage* pCurStorage, sal_Bool bInfosOnly = sal_False ) const; 156 void ImpCreateStdLib( StarBASIC* pParentFromStdLib ); 157 void ImpMgrNotLoaded( const String& rStorageName ); 158 BasicLibInfo* CreateLibInfo(); 159 void LoadBasicManager( SotStorage& rStorage, const String& rBaseURL, sal_Bool bLoadBasics = sal_True ); 160 void LoadOldBasicManager( SotStorage& rStorage ); 161 sal_Bool ImplLoadBasic( SvStream& rStrm, StarBASICRef& rOldBasic ) const; 162 sal_Bool ImplEncryptStream( SvStream& rStream ) const; 163 BasicLibInfo* FindLibInfo( StarBASIC* pBasic ) const; 164 void CheckModules( StarBASIC* pBasic, sal_Bool bReference ) const; 165 void SetFlagToAllLibs( short nFlag, sal_Bool bSet ) const; 166 BasicManager(); // Nur zum anpassen von Pfaden bei 'Speichern unter'. 167 ~BasicManager(); 168 169 public: 170 TYPEINFO(); 171 BasicManager( SotStorage& rStorage, const String& rBaseURL, StarBASIC* pParentFromStdLib = NULL, String* pLibPath = NULL, sal_Bool bDocMgr = sal_False ); 172 BasicManager( StarBASIC* pStdLib, String* pLibPath = NULL, sal_Bool bDocMgr = sal_False ); 173 174 /** deletes the given BasicManager instance 175 176 This method is necessary since normally, BasicManager instances are owned by the BasicManagerRepository, 177 and expected to be deleted by the repository only. However, there exists quite some legacy code, 178 which needs to explicitly delete a BasicManager itself. This code must not use the (protected) 179 destructor, but LegacyDeleteBasicManager. 180 */ 181 static void LegacyDeleteBasicManager( BasicManager*& _rpManager ); 182 SetStorageName(const String & rName)183 void SetStorageName( const String& rName ) { maStorageName = rName; } GetStorageName() const184 String GetStorageName() const { return maStorageName; } SetName(const String & rName)185 void SetName( const String& rName ) { aName = rName; } GetName() const186 String GetName() const { return aName; } 187 188 189 sal_uInt16 GetLibCount() const; 190 StarBASIC* GetLib( sal_uInt16 nLib ) const; 191 StarBASIC* GetLib( const String& rName ) const; 192 sal_uInt16 GetLibId( const String& rName ) const; 193 194 String GetLibName( sal_uInt16 nLib ); 195 196 /** announces the library containers which belong to this BasicManager 197 198 The method will automatically add two global constants, BasicLibraries and DialogLibraries, 199 to the BasicManager. 200 */ 201 void SetLibraryContainerInfo( const LibraryContainerInfo& rInfo ); 202 203 const ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer >& 204 GetDialogLibraryContainer() const; 205 const ::com::sun::star::uno::Reference< com::sun::star::script::XPersistentLibraryContainer >& 206 GetScriptLibraryContainer() const; 207 208 sal_Bool LoadLib( sal_uInt16 nLib ); 209 sal_Bool RemoveLib( sal_uInt16 nLib, sal_Bool bDelBasicFromStorage ); 210 211 // Modify-Flag wird nur beim Speichern zurueckgesetzt. 212 sal_Bool IsModified() const; 213 sal_Bool IsBasicModified() const; 214 215 sal_Bool HasErrors(); 216 void ClearErrors(); 217 BasicError* GetFirstError(); 218 BasicError* GetNextError(); 219 220 /** sets a global constant in the basic library, referring to some UNO object, to a new value. 221 222 If a constant with this name already existed before, its value is changed, and the old constant is 223 returned. If it does not yet exist, it is newly created, and inserted into the basic library. 224 */ 225 ::com::sun::star::uno::Any 226 SetGlobalUNOConstant( const sal_Char* _pAsciiName, const ::com::sun::star::uno::Any& _rValue ); 227 228 /** 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. */ 229 bool GetGlobalUNOConstant( const sal_Char* _pAsciiName, ::com::sun::star::uno::Any& aOut ); 230 /** determines whether there are password-protected modules whose size exceedes the 231 legacy module size 232 @param _out_rModuleNames 233 takes the names of modules whose size exceeds the legacy limit 234 */ 235 bool LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequence< rtl::OUString >& _out_rModuleNames ); 236 237 /// determines whether the Basic Manager has a given macro, given by fully qualified name 238 bool HasMacro( String const& i_fullyQualifiedName ) const; 239 /// executes a given macro 240 ErrCode ExecuteMacro( String const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue ); 241 /// executes a given macro 242 ErrCode ExecuteMacro( String const& i_fullyQualifiedName, String const& i_commaSeparatedArgs, SbxValue* i_retValue ); 243 244 private: 245 sal_Bool IsReference( sal_uInt16 nLib ); 246 247 sal_Bool SetLibName( sal_uInt16 nLib, const String& rName ); 248 249 StarBASIC* GetStdLib() const; 250 StarBASIC* AddLib( SotStorage& rStorage, const String& rLibName, sal_Bool bReference ); 251 sal_Bool RemoveLib( sal_uInt16 nLib ); 252 sal_Bool HasLib( const String& rName ) const; 253 254 StarBASIC* CreateLibForLibContainer( const String& rLibName, 255 const com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer >& 256 xScriptCont ); 257 // For XML import/export: 258 StarBASIC* CreateLib( const String& rLibName ); 259 StarBASIC* CreateLib( const String& rLibName, const String& Password, 260 const String& LinkTargetURL ); 261 }; 262 263 BASIC_DLLPUBLIC void SetAppBasicManager( BasicManager* pBasMgr ); 264 265 #endif //_BASMGR_HXX 266