xref: /aoo42x/main/basic/source/uno/scriptcont.cxx (revision 0848378b)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_basic.hxx"
26 #include "scriptcont.hxx"
27 #include "sbmodule.hxx"
28 #include <com/sun/star/container/XNameContainer.hpp>
29 #include <com/sun/star/xml/sax/XParser.hpp>
30 #include <com/sun/star/xml/sax/InputSource.hpp>
31 #include <com/sun/star/io/XOutputStream.hpp>
32 #include <com/sun/star/io/XInputStream.hpp>
33 #include <com/sun/star/io/XActiveDataSource.hpp>
34 #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
35 #include <com/sun/star/embed/ElementModes.hpp>
36 #include <com/sun/star/embed/XEncryptionProtectedSource.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 #include <com/sun/star/embed/XTransactedObject.hpp>
39 #include <com/sun/star/task/ErrorCodeIOException.hpp>
40 #include <com/sun/star/script/ModuleType.hpp>
41 #include <comphelper/processfactory.hxx>
42 #ifndef _COMPHELPER_STORAGEHELPER_HXX_
43 #include <comphelper/storagehelper.hxx>
44 #endif
45 #include <unotools/streamwrap.hxx>
46 #include <unotools/ucbstreamhelper.hxx>
47 #include <osl/mutex.hxx>
48 #include <rtl/digest.h>
49 #include <rtl/strbuf.hxx>
50 
51 // For password functionality
52 #include <tools/urlobj.hxx>
53 
54 
55 #include <unotools/pathoptions.hxx>
56 #include <svtools/sfxecode.hxx>
57 #include <svtools/ehdl.hxx>
58 #include <basic/basmgr.hxx>
59 #include <basic/sbmod.hxx>
60 #include <basic/basicmanagerrepository.hxx>
61 #include "basic/modsizeexceeded.hxx"
62 #include <xmlscript/xmlmod_imexp.hxx>
63 #include <cppuhelper/factory.hxx>
64 #include <com/sun/star/util/VetoException.hpp>
65 
66 namespace basic
67 {
68 
69 using namespace com::sun::star::document;
70 using namespace com::sun::star::container;
71 using namespace com::sun::star::io;
72 using namespace com::sun::star::uno;
73 using namespace com::sun::star::ucb;
74 using namespace com::sun::star::lang;
75 using namespace com::sun::star::script;
76 using namespace com::sun::star::xml::sax;
77 using namespace com::sun::star;
78 using namespace cppu;
79 using namespace osl;
80 
81 using ::rtl::OUString;
82 
83 //============================================================================
84 // Implementation class SfxScriptLibraryContainer
85 
getInfoFileName() const86 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getInfoFileName() const { return "script"; }
getOldInfoFileName() const87 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getOldInfoFileName() const { return "script"; }
getLibElementFileExtension() const88 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getLibElementFileExtension() const { return "xba"; }
getLibrariesDir() const89 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getLibrariesDir() const { return "Basic"; }
90 
91 // OldBasicPassword interface
setLibraryPassword(const String & rLibraryName,const String & rPassword)92 void SfxScriptLibraryContainer::setLibraryPassword
93     ( const String& rLibraryName, const String& rPassword )
94 {
95     try
96     {
97         SfxLibrary* pImplLib = getImplLib( rLibraryName );
98         if( rPassword.Len() )
99         {
100 	        pImplLib->mbDoc50Password = sal_True;
101             pImplLib->mbPasswordProtected = sal_True;
102             pImplLib->maPassword = rPassword;
103         }
104     }
105     catch( NoSuchElementException& ) {}
106 }
107 
getLibraryPassword(const String & rLibraryName)108 String SfxScriptLibraryContainer::getLibraryPassword( const String& rLibraryName )
109 {
110     SfxLibrary* pImplLib = getImplLib( rLibraryName );
111     String aPassword;
112     if( pImplLib->mbPasswordVerified )
113         aPassword = pImplLib->maPassword;
114     return aPassword;
115 }
116 
clearLibraryPassword(const String & rLibraryName)117 void SfxScriptLibraryContainer::clearLibraryPassword( const String& rLibraryName )
118 {
119     try
120     {
121         SfxLibrary* pImplLib = getImplLib( rLibraryName );
122 	    pImplLib->mbDoc50Password = sal_False;
123         pImplLib->mbPasswordProtected = sal_False;
124         pImplLib->maPassword = OUString();
125     }
126     catch( NoSuchElementException& ) {}
127 }
128 
hasLibraryPassword(const String & rLibraryName)129 sal_Bool SfxScriptLibraryContainer::hasLibraryPassword( const String& rLibraryName )
130 {
131     SfxLibrary* pImplLib = getImplLib( rLibraryName );
132     return pImplLib->mbPasswordProtected;
133 }
134 
135 
136 // Ctor for service
SfxScriptLibraryContainer(void)137 SfxScriptLibraryContainer::SfxScriptLibraryContainer( void )
138     :maScriptLanguage( RTL_CONSTASCII_USTRINGPARAM( "StarBasic" ) )
139 {
140     // all initialisation has to be done
141     // by calling XInitialization::initialize
142 }
143 
SfxScriptLibraryContainer(const uno::Reference<embed::XStorage> & xStorage)144 SfxScriptLibraryContainer::SfxScriptLibraryContainer( const uno::Reference< embed::XStorage >& xStorage )
145     :maScriptLanguage( RTL_CONSTASCII_USTRINGPARAM( "StarBasic" ) )
146 {
147     init( OUString(), xStorage );
148 }
149 
150 // Methods to get library instances of the correct type
implCreateLibrary(const OUString & aName)151 SfxLibrary* SfxScriptLibraryContainer::implCreateLibrary( const OUString& aName )
152 {
153 	(void)aName;	// Only needed for SfxDialogLibrary
154 	SfxLibrary* pRet = new SfxScriptLibrary( maModifiable, mxMSF, mxSFI );
155 	return pRet;
156 }
157 
implCreateLibraryLink(const OUString & aName,const OUString & aLibInfoFileURL,const OUString & StorageURL,sal_Bool ReadOnly)158 SfxLibrary* SfxScriptLibraryContainer::implCreateLibraryLink
159 	( const OUString& aName, const OUString& aLibInfoFileURL,
160 	  const OUString& StorageURL, sal_Bool ReadOnly )
161 {
162 	(void)aName;	// Only needed for SfxDialogLibrary
163 	SfxLibrary* pRet =
164 		new SfxScriptLibrary
165             ( maModifiable, mxMSF, mxSFI, aLibInfoFileURL, StorageURL, ReadOnly );
166 	return pRet;
167 }
168 
createEmptyLibraryElement(void)169 Any SAL_CALL SfxScriptLibraryContainer::createEmptyLibraryElement( void )
170 {
171 	OUString aMod;
172 	Any aRetAny;
173 	aRetAny <<= aMod;
174 	return aRetAny;
175 }
176 
isLibraryElementValid(Any aElement) const177 bool SAL_CALL SfxScriptLibraryContainer::isLibraryElementValid( Any aElement ) const
178 {
179     return SfxScriptLibrary::containsValidModule( aElement );
180 }
181 
writeLibraryElement(const Reference<XNameContainer> & xLib,const OUString & aElementName,const Reference<XOutputStream> & xOutput)182 void SAL_CALL SfxScriptLibraryContainer::writeLibraryElement
183 (
184 	const Reference < XNameContainer >& xLib,
185 	const OUString& aElementName,
186 	const Reference< XOutputStream >& xOutput
187 )
188 	throw(Exception)
189 {
190 	// Create sax writer
191 	Reference< XExtendedDocumentHandler > xHandler(
192 		mxMSF->createInstance(
193 			OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Writer") ) ), UNO_QUERY );
194 	if( !xHandler.is() )
195 	{
196 		OSL_ENSURE( 0, "### couln't create sax-writer component\n" );
197 		return;
198 	}
199 
200 	Reference< XTruncate > xTruncate( xOutput, UNO_QUERY );
201 	OSL_ENSURE( xTruncate.is(), "Currently only the streams that can be truncated are expected!" );
202 	if ( xTruncate.is() )
203 		xTruncate->truncate();
204 
205 	Reference< XActiveDataSource > xSource( xHandler, UNO_QUERY );
206 	xSource->setOutputStream( xOutput );
207 
208 	xmlscript::ModuleDescriptor aMod;
209 	aMod.aName = aElementName;
210 	aMod.aLanguage = maScriptLanguage;
211 	Any aElement = xLib->getByName( aElementName );
212     aElement >>= aMod.aCode;
213 
214 	Reference< script::vba::XVBAModuleInfo > xModInfo( xLib, UNO_QUERY );
215 	if( xModInfo.is() && xModInfo->hasModuleInfo( aElementName ) )
216 	{
217 		script::ModuleInfo aModInfo = xModInfo->getModuleInfo( aElementName );
218 		switch( aModInfo.ModuleType )
219 		{
220 		case ModuleType::NORMAL:
221 			aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("normal") );
222 			break;
223 		case ModuleType::CLASS:
224 			aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("class") );
225 			break;
226 		case ModuleType::FORM:
227 			aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("form") );
228 			break;
229 		case ModuleType::DOCUMENT:
230 			aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("document") );
231 			break;
232 		case ModuleType::UNKNOWN:
233 			// nothing
234 			break;
235 		}
236 	}
237 
238 	xmlscript::exportScriptModule( xHandler, aMod );
239 }
240 
241 
importLibraryElement(const Reference<XNameContainer> & xLib,const OUString & aElementName,const OUString & aFile,const uno::Reference<io::XInputStream> & xInStream)242 Any SAL_CALL SfxScriptLibraryContainer::importLibraryElement
243 	( const Reference < XNameContainer >& xLib,
244 	  const OUString& aElementName, const OUString& aFile,
245 	  const uno::Reference< io::XInputStream >& xInStream )
246 {
247 	Any aRetAny;
248 
249 	Reference< XParser > xParser( mxMSF->createInstance(
250 		OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Parser") ) ), UNO_QUERY );
251 	if( !xParser.is() )
252 	{
253 		OSL_ENSURE( 0, "### couln't create sax parser component\n" );
254 		return aRetAny;
255 	}
256 
257 
258 	// Read from storage?
259 	sal_Bool bStorage = xInStream.is();
260 	Reference< XInputStream > xInput;
261 
262 	if( bStorage )
263 	{
264 		xInput = xInStream;
265 	}
266 	else
267 	{
268 		try
269 		{
270 			xInput = mxSFI->openFileRead( aFile );
271 		}
272 		catch( Exception& )
273 		//catch( Exception& e )
274 		{
275             // TODO:
276 			//throw WrappedTargetException( e );
277 		}
278 	}
279 
280 	if( !xInput.is() )
281 		return aRetAny;
282 
283 	InputSource source;
284 	source.aInputStream = xInput;
285 	source.sSystemId 	= aFile;
286 
287 	// start parsing
288 	xmlscript::ModuleDescriptor aMod;
289 
290     try
291     {
292     	xParser->setDocumentHandler( ::xmlscript::importScriptModule( aMod ) );
293 	    xParser->parseStream( source );
294     }
295     catch( Exception& )
296     {
297 		SfxErrorContext aEc( ERRCTX_SFX_LOADBASIC, aFile );
298         sal_uIntPtr nErrorCode = ERRCODE_IO_GENERAL;
299         ErrorHandler::HandleError( nErrorCode );
300     }
301 
302 	aRetAny <<= aMod.aCode;
303 
304     // TODO: Check language
305 	// aMod.aLanguage
306 	// aMod.aName ignored
307 	if( !aMod.aModuleType.isEmpty() )
308 	{
309         /*  If in VBA compatibility mode, force creation of the VBA Globals
310             object. Each application will create an instance of its own
311             implementation and store it in its Basic manager. Implementations
312             will do all necessary additional initialization, such as
313             registering the global "This***Doc" UNO constant, starting the
314             document events processor etc.
315          */
316         if( getVBACompatibilityMode() ) try
317         {
318             Reference< frame::XModel > xModel( mxOwnerDocument );   // weak-ref -> ref
319             Reference< XMultiServiceFactory > xFactory( xModel, UNO_QUERY_THROW );
320             xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAGlobals" ) ) );
321         }
322         catch( Exception& )
323         {
324         }
325 
326 		script::ModuleInfo aModInfo;
327 		aModInfo.ModuleType = ModuleType::UNKNOWN;
328         if( aMod.aModuleType.equalsAsciiL(
329 					RTL_CONSTASCII_STRINGPARAM("normal") ))
330 		{
331             aModInfo.ModuleType = ModuleType::NORMAL;
332 		}
333 		else if( aMod.aModuleType.equalsAsciiL(
334 					RTL_CONSTASCII_STRINGPARAM("class") ))
335 		{
336             aModInfo.ModuleType = ModuleType::CLASS;
337 		}
338 		else if( aMod.aModuleType.equalsAsciiL(
339 					RTL_CONSTASCII_STRINGPARAM("form") ))
340 		{
341             aModInfo.ModuleType = ModuleType::FORM;
342 			aModInfo.ModuleObject = mxOwnerDocument;
343 		}
344 		else if( aMod.aModuleType.equalsAsciiL(
345 					RTL_CONSTASCII_STRINGPARAM("document") ))
346 		{
347             aModInfo.ModuleType = ModuleType::DOCUMENT;
348 
349             // #163691# use the same codename access instance for all document modules
350             if( !mxCodeNameAccess.is() ) try
351             {
352                 Reference<frame::XModel > xModel( mxOwnerDocument );
353                 Reference< XMultiServiceFactory> xSF( xModel, UNO_QUERY_THROW );
354                 mxCodeNameAccess.set( xSF->createInstance( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAObjectModuleObjectProvider" ) ) ), UNO_QUERY );
355             }
356             catch( Exception& ) {}
357 
358 			if( mxCodeNameAccess.is() )
359 			{
360 				try
361 				{
362 					aModInfo.ModuleObject.set( mxCodeNameAccess->getByName( aElementName), uno::UNO_QUERY );
363 				}
364 				catch(uno::Exception&)
365 				{
366 					OSL_TRACE("Failed to get documument object for %s", rtl::OUStringToOString( aElementName, RTL_TEXTENCODING_UTF8 ).getStr() );
367 				}
368 			}
369 		}
370 
371 		Reference< script::vba::XVBAModuleInfo > xVBAModuleInfo( xLib, UNO_QUERY );
372 		if( xVBAModuleInfo.is() )
373 		{
374 			if( xVBAModuleInfo->hasModuleInfo( aElementName ) )
375 				xVBAModuleInfo->removeModuleInfo( aElementName );
376 			xVBAModuleInfo->insertModuleInfo( aElementName, aModInfo );
377 		}
378 	}
379 
380 	return aRetAny;
381 }
382 
createInstanceImpl(void)383 SfxLibraryContainer* SfxScriptLibraryContainer::createInstanceImpl( void )
384 {
385     return new SfxScriptLibraryContainer();
386 }
387 
importFromOldStorage(const::rtl::OUString & aFile)388 void SAL_CALL SfxScriptLibraryContainer::importFromOldStorage( const ::rtl::OUString& aFile )
389 {
390     // TODO: move loading from old storage to binary filters?
391     SotStorageRef xStorage = new SotStorage( sal_False, aFile );
392     if( xStorage.Is() && xStorage->GetError() == ERRCODE_NONE )
393     {
394         // We need a BasicManager to avoid problems
395         // StarBASIC* pBas = new StarBASIC();
396         BasicManager* pBasicManager = new BasicManager( *(SotStorage*)xStorage, aFile );
397 
398         // Set info
399         LibraryContainerInfo aInfo( this, NULL, static_cast< OldBasicPassword* >( this ) );
400         pBasicManager->SetLibraryContainerInfo( aInfo );
401 
402         // Now the libraries should be copied to this SfxScriptLibraryContainer
403         BasicManager::LegacyDeleteBasicManager( pBasicManager );
404     }
405 }
406 
407 
408 // Storing with password encryption
409 
410 // Methods XLibraryContainerPassword
isLibraryPasswordProtected(const OUString & Name)411 sal_Bool SAL_CALL SfxScriptLibraryContainer::isLibraryPasswordProtected( const OUString& Name )
412     throw (NoSuchElementException, RuntimeException)
413 {
414     LibraryContainerMethodGuard aGuard( *this );
415     SfxLibrary* pImplLib = getImplLib( Name );
416 	sal_Bool bRet = pImplLib->mbPasswordProtected;
417 	return bRet;
418 }
419 
isLibraryPasswordVerified(const OUString & Name)420 sal_Bool SAL_CALL SfxScriptLibraryContainer::isLibraryPasswordVerified( const OUString& Name )
421     throw (IllegalArgumentException, NoSuchElementException, RuntimeException)
422 {
423     LibraryContainerMethodGuard aGuard( *this );
424     SfxLibrary* pImplLib = getImplLib( Name );
425 	if( !pImplLib->mbPasswordProtected )
426 		throw IllegalArgumentException();
427 	sal_Bool bRet = pImplLib->mbPasswordVerified;
428 	return bRet;
429 }
430 
verifyLibraryPassword(const OUString & Name,const OUString & Password)431 sal_Bool SAL_CALL SfxScriptLibraryContainer::verifyLibraryPassword
432     ( const OUString& Name, const OUString& Password )
433         throw (IllegalArgumentException, NoSuchElementException, RuntimeException)
434 {
435     LibraryContainerMethodGuard aGuard( *this );
436     SfxLibrary* pImplLib = getImplLib( Name );
437 	if( !pImplLib->mbPasswordProtected || pImplLib->mbPasswordVerified )
438 		throw IllegalArgumentException();
439 
440     // Test password
441     sal_Bool bSuccess = sal_False;
442     if( pImplLib->mbDoc50Password )
443     {
444         bSuccess = ( Password == pImplLib->maPassword );
445         if( bSuccess )
446             pImplLib->mbPasswordVerified = sal_True;
447     }
448     else
449     {
450         pImplLib->maPassword = Password;
451         bSuccess = implLoadPasswordLibrary( pImplLib, Name, sal_True );
452         if( bSuccess )
453         {
454             // The library gets modified by verifiying the password, because other-
455             // wise for saving the storage would be copied and that doesn't work
456             // with mtg's storages when the password is verified
457             pImplLib->implSetModified( sal_True );
458             pImplLib->mbPasswordVerified = sal_True;
459 
460             // Reload library to get source
461             if( pImplLib->mbLoaded )
462                 implLoadPasswordLibrary( pImplLib, Name );
463         }
464     }
465 	return bSuccess;
466 }
467 
changeLibraryPassword(const OUString & Name,const OUString & OldPassword,const OUString & NewPassword)468 void SAL_CALL SfxScriptLibraryContainer::changeLibraryPassword( const OUString& Name,
469     const OUString& OldPassword, const OUString& NewPassword )
470         throw (IllegalArgumentException, NoSuchElementException, RuntimeException)
471 {
472     LibraryContainerMethodGuard aGuard( *this );
473     SfxLibrary* pImplLib = getImplLib( Name );
474     if( OldPassword == NewPassword )
475         return;
476 
477     sal_Bool bOldPassword = !OldPassword.isEmpty();
478     sal_Bool bNewPassword = !NewPassword.isEmpty();
479 	sal_Bool bStorage = mxStorage.is() && !pImplLib->mbLink;
480 
481     if( pImplLib->mbReadOnly || (bOldPassword && !pImplLib->mbPasswordProtected) )
482 		throw IllegalArgumentException();
483 
484     // Library must be loaded
485 	loadLibrary( Name );
486 
487     sal_Bool bKillCryptedFiles = sal_False;
488     sal_Bool bKillUncryptedFiles = sal_False;
489 
490     // Remove or change password?
491     if( bOldPassword )
492     {
493         if( isLibraryPasswordVerified( Name ) )
494         {
495             if( pImplLib->maPassword != OldPassword )
496        		    throw IllegalArgumentException();
497         }
498         else
499         {
500             if( !verifyLibraryPassword( Name, OldPassword ) )
501        		    throw IllegalArgumentException();
502 
503             // Reload library to get source
504             // Should be done in verifyLibraryPassword loadLibrary( Name );
505         }
506 
507         if( !bNewPassword )
508         {
509             pImplLib->mbPasswordProtected = sal_False;
510             pImplLib->mbPasswordVerified = sal_False;
511             pImplLib->maPassword = OUString();
512 
513             maModifiable.setModified( sal_True );
514             pImplLib->implSetModified( sal_True );
515 
516             if( !bStorage && !pImplLib->mbDoc50Password )
517             {
518                 // Store application basic uncrypted
519 				uno::Reference< embed::XStorage > xStorage;
520                 storeLibraries_Impl( xStorage, sal_False );
521                 bKillCryptedFiles = sal_True;
522             }
523         }
524     }
525 
526     // Set new password?
527     if( bNewPassword )
528     {
529         pImplLib->mbPasswordProtected = sal_True;
530         pImplLib->mbPasswordVerified = sal_True;
531         pImplLib->maPassword = NewPassword;
532 
533         maModifiable.setModified( sal_True );
534         pImplLib->implSetModified( sal_True );
535 
536         if( !bStorage && !pImplLib->mbDoc50Password )
537         {
538             // Store applictaion basic crypted
539 			uno::Reference< embed::XStorage > xStorage;
540             storeLibraries_Impl( xStorage, sal_False );
541             bKillUncryptedFiles = sal_True;
542         }
543     }
544 
545     if( bKillCryptedFiles || bKillUncryptedFiles )
546     {
547 	    Sequence< OUString > aElementNames = pImplLib->getElementNames();
548 	    sal_Int32 nNameCount = aElementNames.getLength();
549 	    const OUString* pNames = aElementNames.getConstArray();
550         OUString aLibDirPath = createAppLibraryFolder( pImplLib, Name );
551 		try
552 		{
553 			for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
554 			{
555 				OUString aElementName = pNames[ i ];
556 
557 				INetURLObject aElementInetObj( aLibDirPath );
558 				aElementInetObj.insertName( aElementName, sal_False,
559 					INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL );
560                 if( bKillUncryptedFiles )
561 				    aElementInetObj.setExtension( maLibElementFileExtension );
562                 else
563 				    aElementInetObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM("pba") ) );
564 				String aElementPath( aElementInetObj.GetMainURL( INetURLObject::NO_DECODE ) );
565 
566 				if( mxSFI->exists( aElementPath ) )
567 					mxSFI->kill( aElementPath );
568 			}
569 		}
570         catch( Exception& ) {}
571     }
572 }
573 
574 
setStreamKey(uno::Reference<io::XStream> xStream,const::rtl::OUString & aPass)575 void setStreamKey( uno::Reference< io::XStream > xStream, const ::rtl::OUString& aPass )
576 {
577 	uno::Reference< embed::XEncryptionProtectedSource > xEncrStream( xStream, uno::UNO_QUERY );
578 	if ( xEncrStream.is() )
579 		xEncrStream->setEncryptionPassword( aPass );
580 }
581 
582 
583 // Impl methods
implStorePasswordLibrary(SfxLibrary * pLib,const::rtl::OUString & aName,const uno::Reference<embed::XStorage> & xStorage,const::com::sun::star::uno::Reference<::com::sun::star::task::XInteractionHandler> & xHandler)584 sal_Bool SfxScriptLibraryContainer::implStorePasswordLibrary( SfxLibrary* pLib,
585     const ::rtl::OUString& aName, const uno::Reference< embed::XStorage >& xStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler )
586 {
587 	OUString aDummyLocation;
588 	Reference< XSimpleFileAccess > xDummySFA;
589 	return implStorePasswordLibrary( pLib, aName, xStorage, aDummyLocation, xDummySFA, xHandler );
590 }
591 
implStorePasswordLibrary(SfxLibrary * pLib,const::rtl::OUString & aName,const::com::sun::star::uno::Reference<::com::sun::star::embed::XStorage> & xStorage,const::rtl::OUString & aTargetURL,const Reference<XSimpleFileAccess> xToUseSFI,const::com::sun::star::uno::Reference<::com::sun::star::task::XInteractionHandler> & xHandler)592 sal_Bool SfxScriptLibraryContainer::implStorePasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& aName,
593         				const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage,
594 						const ::rtl::OUString& aTargetURL, const Reference< XSimpleFileAccess > xToUseSFI, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler )
595 {
596     bool bExport = aTargetURL.getLength();
597 
598     BasicManager* pBasicMgr = getBasicManager();
599     OSL_ENSURE( pBasicMgr, "SfxScriptLibraryContainer::implStorePasswordLibrary: cannot do this without a BasicManager!" );
600     if ( !pBasicMgr )
601         return sal_False;
602 
603     // Only need to handle the export case here,
604     // save/saveas etc are handled in sfxbasemodel::storeSelf &
605     // sfxbasemodel::impl_store
606     uno::Sequence<rtl::OUString> aNames;
607     if ( bExport && pBasicMgr->LegacyPsswdBinaryLimitExceeded(aNames) )
608     {
609         if ( xHandler.is() )
610         {
611             ModuleSizeExceeded* pReq =  new ModuleSizeExceeded( aNames );
612             uno::Reference< task::XInteractionRequest > xReq( pReq );
613             xHandler->handle( xReq );
614             if ( pReq->isAbort() )
615                 throw util::VetoException();
616         }
617     }
618 
619     StarBASIC* pBasicLib = pBasicMgr->GetLib( aName );
620     if( !pBasicLib )
621 	    return sal_False;
622 
623 	Sequence< OUString > aElementNames = pLib->getElementNames();
624 	sal_Int32 nNameCount = aElementNames.getLength();
625 	const OUString* pNames = aElementNames.getConstArray();
626 
627 	sal_Bool bLink = pLib->mbLink;
628 	sal_Bool bStorage = xStorage.is() && !bLink;
629 	if( bStorage )
630 	{
631 		for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
632 		{
633 			OUString aElementName = pNames[ i ];
634 
635             // Write binary image stream
636 	        SbModule* pMod = pBasicLib->FindModule( aElementName );
637 	        if( pMod )
638             {
639 		        //OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") );
640 	            OUString aCodeStreamName = aElementName;
641 		        aCodeStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".bin") );
642 
643 				try {
644                 	uno::Reference< io::XStream > xCodeStream = xStorage->openStreamElement(
645 										aCodeStreamName,
646 										embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
647 
648 					if ( !xCodeStream.is() )
649 						throw uno::RuntimeException();
650 
651                     SvMemoryStream aMemStream;
652                     /*sal_Bool bStore = */pMod->StoreBinaryData( aMemStream );
653 
654                     sal_Int32 nSize = (sal_Int32)aMemStream.Tell();
655                     Sequence< sal_Int8 > aBinSeq( nSize );
656                     sal_Int8* pData = aBinSeq.getArray();
657 	                ::rtl_copyMemory( pData, aMemStream.GetData(), nSize );
658 
659                    	Reference< XOutputStream > xOut = xCodeStream->getOutputStream();
660 					if ( !xOut.is() )
661 						throw io::IOException(); // access denied because the stream is readonly
662 
663                    	xOut->writeBytes( aBinSeq );
664     				xOut->closeOutput();
665 				}
666 				catch( uno::Exception& )
667 				{
668                     // TODO: handle error
669 				}
670 		    }
671 
672         	if( pLib->mbPasswordVerified || pLib->mbDoc50Password )
673             {
674 			    /*Any aElement = pLib->getByName( aElementName );*/
675 			    if( !isLibraryElementValid( pLib->getByName( aElementName ) ) )
676                 {
677                 #if OSL_DEBUG_LEVEL > 0
678                     ::rtl::OStringBuffer aMessage;
679                     aMessage.append( "invalid library element '" );
680                     aMessage.append( ::rtl::OUStringToOString( aElementName, osl_getThreadTextEncoding() ) );
681                     aMessage.append( "'." );
682 			        OSL_ENSURE( false, aMessage.makeStringAndClear().getStr() );
683                 #endif
684                     continue;
685                 }
686 
687                 OUString aSourceStreamName = aElementName;
688 	            aSourceStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".xml") );
689 
690 				try {
691 					uno::Reference< io::XStream > xSourceStream = xStorage->openStreamElement(
692 																aSourceStreamName,
693 																embed::ElementModes::READWRITE );
694 					uno::Reference< beans::XPropertySet > xProps( xSourceStream, uno::UNO_QUERY );
695 					if ( !xProps.is() )
696 						throw uno::RuntimeException();
697 
698 				    String aPropName( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("MediaType") ) );
699 				    OUString aMime( RTL_CONSTASCII_USTRINGPARAM("text/xml") );
700 				    xProps->setPropertyValue( aPropName, uno::makeAny( aMime ) );
701 
702                     // Set encryption key
703                     setStreamKey( xSourceStream, pLib->maPassword );
704 
705 				    Reference< XOutputStream > xOutput = xSourceStream->getOutputStream();
706 					Reference< XNameContainer > xLib( pLib );
707 				    writeLibraryElement( xLib, aElementName, xOutput );
708 					// writeLibraryElement should have the stream already closed
709 				    // xOutput->closeOutput();
710 			    }
711 				catch( uno::Exception& )
712 				{
713 					OSL_ENSURE( sal_False, "Problem on storing of password library!\n" );
714                     // TODO: error handling
715 				}
716             }
717             else    // !mbPasswordVerified
718             {
719                 // TODO
720                 // What to do if not verified?! In any case it's already loaded here
721             }
722 		}
723 
724 	}
725     // Application libraries have only to be saved if the password
726     // is verified because otherwise they can't be modified
727 	else if( pLib->mbPasswordVerified || bExport )
728 	{
729 		try
730 		{
731 			Reference< XSimpleFileAccess > xSFI = mxSFI;
732 			if( xToUseSFI.is() )
733 				xSFI = xToUseSFI;
734 
735             OUString aLibDirPath;
736 			if( bExport )
737 			{
738 				INetURLObject aInetObj( aTargetURL );
739 				aInetObj.insertName( aName, sal_True, INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL );
740 				aLibDirPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
741 
742 				if( !xSFI->isFolder( aLibDirPath ) )
743 					xSFI->createFolder( aLibDirPath );
744 			}
745 			else
746 			{
747 	            aLibDirPath = createAppLibraryFolder( pLib, aName );
748 			}
749 
750 			for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
751 			{
752 				OUString aElementName = pNames[ i ];
753 
754 				INetURLObject aElementInetObj( aLibDirPath );
755 				aElementInetObj.insertName( aElementName, sal_False,
756 					INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL );
757 				aElementInetObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM("pba") ) );
758 				String aElementPath = aElementInetObj.GetMainURL( INetURLObject::NO_DECODE );
759 
760 				/*Any aElement = pLib->getByName( aElementName );*/
761 				if( !isLibraryElementValid( pLib->getByName( aElementName ) ) )
762                 {
763                 #if OSL_DEBUG_LEVEL > 0
764                     ::rtl::OStringBuffer aMessage;
765                     aMessage.append( "invalid library element '" );
766                     aMessage.append( ::rtl::OUStringToOString( aElementName, osl_getThreadTextEncoding() ) );
767                     aMessage.append( "'." );
768 			        OSL_ENSURE( false, aMessage.makeStringAndClear().getStr() );
769                 #endif
770                     continue;
771                 }
772 
773                 try
774                 {
775 					uno::Reference< embed::XStorage > xElementRootStorage =
776 															::comphelper::OStorageHelper::GetStorageFromURL(
777 																	aElementPath,
778 																	embed::ElementModes::READWRITE );
779 					if ( !xElementRootStorage.is() )
780 						throw uno::RuntimeException();
781 
782                 	// Write binary image stream
783                 	SbModule* pMod = pBasicLib->FindModule( aElementName );
784                 	if( pMod )
785                 	{
786 	                	OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") );
787 
788             	    	uno::Reference< io::XStream > xCodeStream = xElementRootStorage->openStreamElement(
789 											aCodeStreamName,
790 											embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
791 
792                         SvMemoryStream aMemStream;
793                         /*sal_Bool bStore = */pMod->StoreBinaryData( aMemStream );
794 
795                         sal_Int32 nSize = (sal_Int32)aMemStream.Tell();
796                         Sequence< sal_Int8 > aBinSeq( nSize );
797                         sal_Int8* pData = aBinSeq.getArray();
798                         ::rtl_copyMemory( pData, aMemStream.GetData(), nSize );
799 
800                 	    Reference< XOutputStream > xOut = xCodeStream->getOutputStream();
801 						if ( xOut.is() )
802 						{
803                         	xOut->writeBytes( aBinSeq );
804 					    	xOut->closeOutput();
805 						}
806                     }
807 
808                 	// Write encrypted source stream
809 	            	OUString aSourceStreamName( RTL_CONSTASCII_USTRINGPARAM("source.xml") );
810 
811             		uno::Reference< io::XStream > xSourceStream;
812 					try
813 					{
814 						xSourceStream = xElementRootStorage->openStreamElement(
815 							aSourceStreamName,
816 							embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
817 
818 						// #87671 Allow encryption
819 						uno::Reference< embed::XEncryptionProtectedSource > xEncr( xSourceStream, uno::UNO_QUERY );
820 						OSL_ENSURE( xEncr.is(),
821 									"StorageStream opened for writing must implement XEncryptionProtectedSource!\n" );
822 						if ( !xEncr.is() )
823 							throw uno::RuntimeException();
824 						xEncr->setEncryptionPassword( pLib->maPassword );
825 					}
826 					catch( ::com::sun::star::packages::WrongPasswordException& )
827 					{
828 						xSourceStream = xElementRootStorage->openEncryptedStreamElement(
829 							aSourceStreamName,
830 							embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE,
831 							pLib->maPassword );
832 					}
833 
834 					uno::Reference< beans::XPropertySet > xProps( xSourceStream, uno::UNO_QUERY );
835 					if ( !xProps.is() )
836 						throw uno::RuntimeException();
837 		            String aPropName( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("MediaType") ) );
838 		            OUString aMime( RTL_CONSTASCII_USTRINGPARAM("text/xml") );
839 		            xProps->setPropertyValue( aPropName, uno::makeAny( aMime ) );
840 
841                 	Reference< XOutputStream > xOut = xSourceStream->getOutputStream();
842 					Reference< XNameContainer > xLib( pLib );
843 					writeLibraryElement( xLib, aElementName, xOut );
844 					// i50568: sax writer already closes stream
845 					// xOut->closeOutput();
846 
847 					uno::Reference< embed::XTransactedObject > xTransact( xElementRootStorage, uno::UNO_QUERY );
848                     OSL_ENSURE( xTransact.is(), "The storage must implement XTransactedObject!\n" );
849 					if ( !xTransact.is() )
850 						throw uno::RuntimeException();
851 
852 					xTransact->commit();
853 	            }
854 				catch( uno::Exception& )
855 				{
856                     // TODO: handle error
857 				}
858 
859                 // Storage Dtor commits too, that makes problems
860                 // xElementRootStorage->Commit();
861 			}
862 		}
863 		catch( Exception& )
864 		{
865 			//throw e;
866 		}
867 	}
868     return sal_True;
869 }
870 
implLoadPasswordLibrary(SfxLibrary * pLib,const OUString & Name,sal_Bool bVerifyPasswordOnly)871 sal_Bool SfxScriptLibraryContainer::implLoadPasswordLibrary
872     ( SfxLibrary* pLib, const OUString& Name, sal_Bool bVerifyPasswordOnly )
873         throw(WrappedTargetException, RuntimeException)
874 {
875 	sal_Bool bRet = sal_True;
876 
877 	sal_Bool bLink = pLib->mbLink;
878 	sal_Bool bStorage = mxStorage.is() && !bLink;
879 
880     // Already loaded? Then only verifiedPassword can change something
881 	SfxScriptLibrary* pScriptLib = static_cast< SfxScriptLibrary* >( pLib );
882     if( pScriptLib->mbLoaded )
883     {
884         if( pScriptLib->mbLoadedBinary && !bVerifyPasswordOnly &&
885             (pScriptLib->mbLoadedSource || !pLib->mbPasswordVerified) )
886                 return sal_False;
887     }
888 
889     StarBASIC* pBasicLib = NULL;
890     sal_Bool bLoadBinary = sal_False;
891     if( !pScriptLib->mbLoadedBinary && !bVerifyPasswordOnly && !pLib->mbPasswordVerified )
892     {
893         BasicManager* pBasicMgr = getBasicManager();
894         OSL_ENSURE( pBasicMgr, "SfxScriptLibraryContainer::implLoadPasswordLibrary: cannot do this without a BasicManager!" );
895         sal_Bool bLoaded = pScriptLib->mbLoaded;
896         pScriptLib->mbLoaded = sal_True;        // Necessary to get lib
897         pBasicLib = pBasicMgr ? pBasicMgr->GetLib( Name ) : NULL;
898         pScriptLib->mbLoaded = bLoaded;    // Restore flag
899         if( !pBasicLib )
900 	        return sal_False;
901 
902         bLoadBinary = sal_True;
903         pScriptLib->mbLoadedBinary = sal_True;
904     }
905 
906     sal_Bool bLoadSource = sal_False;
907     if( !pScriptLib->mbLoadedSource && pLib->mbPasswordVerified && !bVerifyPasswordOnly )
908     {
909         bLoadSource = sal_True;
910         pScriptLib->mbLoadedSource = sal_True;
911     }
912 
913 	Sequence< OUString > aElementNames = pLib->getElementNames();
914 	sal_Int32 nNameCount = aElementNames.getLength();
915 	const OUString* pNames = aElementNames.getConstArray();
916 
917 	if( bStorage )
918     {
919 		uno::Reference< embed::XStorage > xLibrariesStor;
920 		uno::Reference< embed::XStorage > xLibraryStor;
921 		if( bStorage )
922 		{
923 			try {
924 				xLibrariesStor = mxStorage->openStorageElement( maLibrariesDir, embed::ElementModes::READ );
925 				if ( !xLibrariesStor.is() )
926 					throw uno::RuntimeException();
927 
928 				xLibraryStor = xLibrariesStor->openStorageElement( Name, embed::ElementModes::READ );
929 				if ( !xLibraryStor.is() )
930 					throw uno::RuntimeException();
931 			}
932 			catch( uno::Exception& )
933 			{
934 				OSL_ENSURE( 0, "### couln't open sub storage for library\n" );
935 				return sal_False;
936 			}
937 		}
938 
939 		for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
940 		{
941 			OUString aElementName = pNames[ i ];
942 
943             // Load binary
944             if( bLoadBinary )
945             {
946 	            SbModule* pMod = pBasicLib->FindModule( aElementName );
947                 if( !pMod )
948                 {
949 			        pMod = pBasicLib->MakeModule( aElementName, String() );
950 			        pBasicLib->SetModified( sal_False );
951                 }
952 
953 		        //OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") );
954 	            OUString aCodeStreamName= aElementName;
955 		        aCodeStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".bin") );
956 
957 				try {
958                 	uno::Reference< io::XStream > xCodeStream = xLibraryStor->openStreamElement(
959 																						aCodeStreamName,
960 																						embed::ElementModes::READ );
961 					if ( !xCodeStream.is() )
962 						throw uno::RuntimeException();
963 
964 					SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xCodeStream );
965 					if ( !pStream || pStream->GetError() )
966 					{
967 						sal_Int32 nError = pStream ? pStream->GetError() : ERRCODE_IO_GENERAL;
968 						delete pStream;
969 						throw task::ErrorCodeIOException( ::rtl::OUString(), uno::Reference< uno::XInterface >(), nError );
970 					}
971 
972                     /*sal_Bool bRet = */pMod->LoadBinaryData( *pStream );
973                     // TODO: Check return value
974 
975 					delete pStream;
976                 }
977 				catch( uno::Exception& )
978 				{
979                     // TODO: error handling
980 				}
981             }
982 
983             // Load source
984             if( bLoadSource || bVerifyPasswordOnly )
985             {
986                 // Access encrypted source stream
987 	            OUString aSourceStreamName = aElementName;
988 		        aSourceStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".xml") );
989 
990 				try {
991 					uno::Reference< io::XStream > xSourceStream = xLibraryStor->openEncryptedStreamElement(
992 																	aSourceStreamName,
993 																	embed::ElementModes::READ,
994 																	pLib->maPassword );
995 					if ( !xSourceStream.is() )
996 						throw uno::RuntimeException();
997 
998 					// if this point is reached then the password is correct
999 					if ( !bVerifyPasswordOnly )
1000                     {
1001 						uno::Reference< io::XInputStream > xInStream = xSourceStream->getInputStream();
1002 						if ( !xInStream.is() )
1003 							throw io::IOException(); // read access denied, seems to be impossible
1004 
1005 						Reference< XNameContainer > xLib( pLib );
1006 			            Any aAny = importLibraryElement( xLib,
1007 										aElementName, aSourceStreamName,
1008 									   	xInStream );
1009 			            if( pLib->hasByName( aElementName ) )
1010                         {
1011                             if( aAny.hasValue() )
1012 				                pLib->maNameContainer.replaceByName( aElementName, aAny );
1013                         }
1014 			            else
1015                         {
1016 				            pLib->maNameContainer.insertByName( aElementName, aAny );
1017                         }
1018                     }
1019                 }
1020 				catch( uno::Exception& )
1021 				{
1022 					bRet = sal_False;
1023 				}
1024             }
1025 		}
1026     }
1027     else
1028     {
1029 		try
1030 		{
1031             OUString aLibDirPath = createAppLibraryFolder( pLib, Name );
1032 
1033 			for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
1034 			{
1035 				OUString aElementName = pNames[ i ];
1036 
1037 				INetURLObject aElementInetObj( aLibDirPath );
1038 				aElementInetObj.insertName( aElementName, sal_False,
1039 					INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL );
1040 				aElementInetObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM("pba") ) );
1041 				String aElementPath = aElementInetObj.GetMainURL( INetURLObject::NO_DECODE );
1042 
1043 				uno::Reference< embed::XStorage > xElementRootStorage;
1044 				try {
1045 					xElementRootStorage = ::comphelper::OStorageHelper::GetStorageFromURL(
1046 																	aElementPath,
1047 																	embed::ElementModes::READ );
1048 				} catch( uno::Exception& )
1049 				{
1050                     // TODO: error handling
1051 				}
1052 
1053 				if ( xElementRootStorage.is() )
1054 				{
1055                     // Load binary
1056                     if( bLoadBinary )
1057                     {
1058 	                    SbModule* pMod = pBasicLib->FindModule( aElementName );
1059                         if( !pMod )
1060                         {
1061 			                pMod = pBasicLib->MakeModule( aElementName, String() );
1062 			                pBasicLib->SetModified( sal_False );
1063                         }
1064 
1065 						try {
1066 		                	OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") );
1067 							uno::Reference< io::XStream > xCodeStream = xElementRootStorage->openStreamElement(
1068 																		aCodeStreamName,
1069 																		embed::ElementModes::READ );
1070 
1071 							SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xCodeStream );
1072 							if ( !pStream || pStream->GetError() )
1073 							{
1074 								sal_Int32 nError = pStream ? pStream->GetError() : ERRCODE_IO_GENERAL;
1075 								delete pStream;
1076 								throw task::ErrorCodeIOException( ::rtl::OUString(),
1077 																	uno::Reference< uno::XInterface >(),
1078 																	nError );
1079 							}
1080 
1081                             /*sal_Bool bRet = */pMod->LoadBinaryData( *pStream );
1082                             // TODO: Check return value
1083 
1084 							delete pStream;
1085                         }
1086 						catch( uno::Exception& )
1087 						{
1088                             // TODO: error handling
1089 						}
1090                     }
1091 
1092                     // Load source
1093                     if( bLoadSource || bVerifyPasswordOnly )
1094                     {
1095                         // Access encrypted source stream
1096 		                OUString aSourceStreamName( RTL_CONSTASCII_USTRINGPARAM("source.xml") );
1097 						try {
1098 							uno::Reference< io::XStream > xSourceStream = xElementRootStorage->openEncryptedStreamElement(
1099 																	aSourceStreamName,
1100 																	embed::ElementModes::READ,
1101 																	pLib->maPassword );
1102 							if ( !xSourceStream.is() )
1103 								throw uno::RuntimeException();
1104 
1105 							if ( !bVerifyPasswordOnly )
1106                             {
1107 								uno::Reference< io::XInputStream > xInStream = xSourceStream->getInputStream();
1108 								if ( !xInStream.is() )
1109 									throw io::IOException(); // read access denied, seems to be impossible
1110 
1111 								Reference< XNameContainer > xLib( pLib );
1112 			                    Any aAny = importLibraryElement( xLib,
1113 												aElementName,
1114 												aSourceStreamName,
1115 												xInStream );
1116 			                    if( pLib->hasByName( aElementName ) )
1117                                 {
1118                                     if( aAny.hasValue() )
1119 				                        pLib->maNameContainer.replaceByName( aElementName, aAny );
1120                                 }
1121 			                    else
1122                                 {
1123 				                    pLib->maNameContainer.insertByName( aElementName, aAny );
1124                                 }
1125                             }
1126                         }
1127 						catch ( uno::Exception& )
1128 						{
1129 							bRet = sal_False;
1130 						}
1131                     }
1132                 }
1133 			}
1134 
1135 		}
1136 		catch( Exception& )
1137 		{
1138             // TODO
1139 			//throw e;
1140 		}
1141     }
1142 
1143 //REMOVE	    // If the password is verified the library must remain modified, because
1144 //REMOVE	    // otherwise for saving the storage would be copied and that doesn't work
1145 //REMOVE	    // with mtg's storages when the password is verified
1146 //REMOVE	    if( !pLib->mbPasswordVerified )
1147 //REMOVE	        pLib->mbModified = sal_False;
1148     return bRet;
1149 }
1150 
1151 
onNewRootStorage()1152 void SfxScriptLibraryContainer::onNewRootStorage()
1153 {
1154 }
1155 
1156 //============================================================================
1157 // Service
createRegistryInfo_SfxScriptLibraryContainer()1158 void createRegistryInfo_SfxScriptLibraryContainer()
1159 {
1160     static OAutoRegistration< SfxScriptLibraryContainer > aAutoRegistration;
1161 }
1162 
getImplementationName()1163 ::rtl::OUString SAL_CALL SfxScriptLibraryContainer::getImplementationName( ) throw (RuntimeException)
1164 {
1165     return getImplementationName_static();
1166 }
1167 
getSupportedServiceNames()1168 Sequence< ::rtl::OUString > SAL_CALL SfxScriptLibraryContainer::getSupportedServiceNames( ) throw (RuntimeException)
1169 {
1170     return getSupportedServiceNames_static();
1171 }
1172 
getSupportedServiceNames_static()1173 Sequence< OUString > SfxScriptLibraryContainer::getSupportedServiceNames_static()
1174 {
1175     Sequence< OUString > aServiceNames( 2 );
1176     aServiceNames[0] = OUString::createFromAscii( "com.sun.star.script.DocumentScriptLibraryContainer" );
1177     // plus, for compatibility:
1178     aServiceNames[1] = OUString::createFromAscii( "com.sun.star.script.ScriptLibraryContainer" );
1179     return aServiceNames;
1180 }
1181 
getImplementationName_static()1182 OUString SfxScriptLibraryContainer::getImplementationName_static()
1183 {
1184     static OUString aImplName;
1185     static sal_Bool bNeedsInit = sal_True;
1186 
1187 	MutexGuard aGuard( Mutex::getGlobalMutex() );
1188     if( bNeedsInit )
1189     {
1190         aImplName = OUString::createFromAscii( "com.sun.star.comp.sfx2.ScriptLibraryContainer" );
1191         bNeedsInit = sal_False;
1192     }
1193     return aImplName;
1194 }
1195 
Create(const Reference<XComponentContext> &)1196 Reference< XInterface > SAL_CALL SfxScriptLibraryContainer::Create
1197     ( const Reference< XComponentContext >& )
1198         throw( Exception )
1199 {
1200     Reference< XInterface > xRet =
1201         static_cast< XInterface* >( static_cast< OWeakObject* >(new SfxScriptLibraryContainer()) );
1202     return xRet;
1203 }
1204 
1205 //============================================================================
1206 // Implementation class SfxScriptLibrary
1207 
1208 // Ctor
SfxScriptLibrary(ModifiableHelper & _rModifiable,const Reference<XMultiServiceFactory> & xMSF,const Reference<XSimpleFileAccess> & xSFI)1209 SfxScriptLibrary::SfxScriptLibrary( ModifiableHelper& _rModifiable,
1210                                     const Reference< XMultiServiceFactory >& xMSF,
1211                                     const Reference< XSimpleFileAccess >& xSFI )
1212 	: SfxLibrary( _rModifiable, getCppuType( (const OUString *)0 ), xMSF, xSFI )
1213     , mbLoadedSource( sal_False )
1214     , mbLoadedBinary( sal_False )
1215 {
1216 }
1217 
SfxScriptLibrary(ModifiableHelper & _rModifiable,const Reference<XMultiServiceFactory> & xMSF,const Reference<XSimpleFileAccess> & xSFI,const OUString & aLibInfoFileURL,const OUString & aStorageURL,sal_Bool ReadOnly)1218 SfxScriptLibrary::SfxScriptLibrary( ModifiableHelper& _rModifiable,
1219                                     const Reference< XMultiServiceFactory >& xMSF,
1220                                     const Reference< XSimpleFileAccess >& xSFI,
1221                                     const OUString& aLibInfoFileURL,
1222                                     const OUString& aStorageURL,
1223                                     sal_Bool ReadOnly )
1224 	: SfxLibrary( _rModifiable, getCppuType( (const OUString *)0 ), xMSF, xSFI,
1225 						aLibInfoFileURL, aStorageURL, ReadOnly)
1226     , mbLoadedSource( sal_False )
1227     , mbLoadedBinary( sal_False )
1228 {
1229 }
1230 
1231 // Provide modify state including resources
isModified(void)1232 sal_Bool SfxScriptLibrary::isModified( void )
1233 {
1234 	return implIsModified();	// No resources
1235 }
1236 
storeResources(void)1237 void SfxScriptLibrary::storeResources( void )
1238 {
1239 	// No resources
1240 }
1241 
storeResourcesToURL(const::rtl::OUString & URL,const Reference<task::XInteractionHandler> & Handler)1242 void SfxScriptLibrary::storeResourcesToURL( const ::rtl::OUString& URL,
1243 	const Reference< task::XInteractionHandler >& Handler )
1244 {
1245 	(void)URL;
1246 	(void)Handler;
1247 }
1248 
storeResourcesAsURL(const::rtl::OUString & URL,const::rtl::OUString & NewName)1249 void SfxScriptLibrary::storeResourcesAsURL
1250 	( const ::rtl::OUString& URL, const ::rtl::OUString& NewName )
1251 {
1252 	(void)URL;
1253 	(void)NewName;
1254 }
1255 
storeResourcesToStorage(const::com::sun::star::uno::Reference<::com::sun::star::embed::XStorage> & xStorage)1256 void SfxScriptLibrary::storeResourcesToStorage( const ::com::sun::star::uno::Reference
1257 	< ::com::sun::star::embed::XStorage >& xStorage )
1258 {
1259 	// No resources
1260 	(void)xStorage;
1261 }
1262 
containsValidModule(const Any & aElement)1263 bool SfxScriptLibrary::containsValidModule( const Any& aElement )
1264 {
1265 	OUString sModuleText;
1266     aElement >>= sModuleText;
1267 	return ( !sModuleText.isEmpty() );
1268 }
1269 
isLibraryElementValid(::com::sun::star::uno::Any aElement) const1270 bool SAL_CALL SfxScriptLibrary::isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const
1271 {
1272     return SfxScriptLibrary::containsValidModule( aElement );
1273 }
1274 
1275 IMPLEMENT_FORWARD_XINTERFACE2( SfxScriptLibrary, SfxLibrary, SfxScriptLibrary_BASE );
1276 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SfxScriptLibrary, SfxLibrary, SfxScriptLibrary_BASE );
1277 
1278 script::ModuleInfo SAL_CALL
getModuleInfo(const::rtl::OUString & ModuleName)1279 SfxScriptLibrary::getModuleInfo( const ::rtl::OUString& ModuleName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException)
1280 {
1281     if ( !hasModuleInfo( ModuleName ) )
1282         throw NoSuchElementException();
1283     return mModuleInfos[ ModuleName ];
1284 }
1285 
1286 sal_Bool SAL_CALL
hasModuleInfo(const::rtl::OUString & ModuleName)1287 SfxScriptLibrary::hasModuleInfo( const ::rtl::OUString& ModuleName ) throw (RuntimeException)
1288 {
1289     sal_Bool bRes = sal_False;
1290     ModuleInfoMap::iterator it = mModuleInfos.find( ModuleName );
1291 
1292     if ( it != mModuleInfos.end() )
1293         bRes = sal_True;
1294 
1295     return bRes;
1296 }
1297 
insertModuleInfo(const::rtl::OUString & ModuleName,const script::ModuleInfo & ModuleInfo)1298 void SAL_CALL SfxScriptLibrary::insertModuleInfo( const ::rtl::OUString& ModuleName, const script::ModuleInfo& ModuleInfo ) throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException)
1299 {
1300     if ( hasModuleInfo( ModuleName ) )
1301         throw ElementExistException();
1302     mModuleInfos[ ModuleName ] = ModuleInfo;
1303 }
1304 
removeModuleInfo(const::rtl::OUString & ModuleName)1305 void SAL_CALL SfxScriptLibrary::removeModuleInfo( const ::rtl::OUString& ModuleName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException)
1306 {
1307         // #FIXME add NoSuchElementException to the spec
1308     if ( !hasModuleInfo( ModuleName ) )
1309         throw NoSuchElementException();
1310     mModuleInfos.erase( mModuleInfos.find( ModuleName ) );
1311 }
1312 
1313 
1314 //============================================================================
1315 
1316 }   // namespace basic
1317