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