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