LCOV - code coverage report
Current view: top level - basic/source/uno - namecont.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 861 1639 52.5 %
Date: 2014-11-03 Functions: 79 121 65.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <config_features.h>
      21             : #include <config_folders.h>
      22             : 
      23             : #include <com/sun/star/container/XNameContainer.hpp>
      24             : #include <com/sun/star/container/XContainer.hpp>
      25             : #include <com/sun/star/embed/ElementModes.hpp>
      26             : #include <com/sun/star/embed/XTransactedObject.hpp>
      27             : #include <com/sun/star/lang/XServiceInfo.hpp>
      28             : #include <com/sun/star/ucb/ContentCreationException.hpp>
      29             : #include <vcl/svapp.hxx>
      30             : #include <osl/mutex.hxx>
      31             : #include <tools/errinf.hxx>
      32             : #include <rtl/ustring.hxx>
      33             : #include <rtl/uri.hxx>
      34             : #include <rtl/strbuf.hxx>
      35             : #include <comphelper/processfactory.hxx>
      36             : #include <comphelper/anytostring.hxx>
      37             : 
      38             : #include "namecont.hxx"
      39             : #include <basic/basicmanagerrepository.hxx>
      40             : #include <tools/diagnose_ex.h>
      41             : #include <tools/urlobj.hxx>
      42             : #include <unotools/streamwrap.hxx>
      43             : #include <unotools/pathoptions.hxx>
      44             : #include <svtools/sfxecode.hxx>
      45             : #include <svtools/ehdl.hxx>
      46             : #include <basic/basmgr.hxx>
      47             : #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
      48             : #include <com/sun/star/xml/sax/Parser.hpp>
      49             : #include <com/sun/star/xml/sax/InputSource.hpp>
      50             : #include <com/sun/star/io/XOutputStream.hpp>
      51             : #include <com/sun/star/xml/sax/Writer.hpp>
      52             : #include <com/sun/star/io/XInputStream.hpp>
      53             : #include <com/sun/star/io/XActiveDataSource.hpp>
      54             : #include <com/sun/star/beans/XPropertySet.hpp>
      55             : #include <com/sun/star/uno/DeploymentException.hpp>
      56             : #include <com/sun/star/lang/DisposedException.hpp>
      57             : #include <com/sun/star/script/LibraryNotLoadedException.hpp>
      58             : #include <com/sun/star/script/vba/VBAScriptEventId.hpp>
      59             : #include <com/sun/star/ucb/SimpleFileAccess.hpp>
      60             : #include <com/sun/star/util/PathSubstitution.hpp>
      61             : #include <com/sun/star/util/theMacroExpander.hpp>
      62             : #include <com/sun/star/deployment/ExtensionManager.hpp>
      63             : #include <comphelper/storagehelper.hxx>
      64             : #include <cppuhelper/exc_hlp.hxx>
      65             : #include <cppuhelper/supportsservice.hxx>
      66             : #include <basic/sbmod.hxx>
      67             : #include <boost/scoped_ptr.hpp>
      68             : 
      69             : namespace basic
      70             : {
      71             : 
      72             : using namespace com::sun::star::document;
      73             : using namespace com::sun::star::container;
      74             : using namespace com::sun::star::uno;
      75             : using namespace com::sun::star::lang;
      76             : using namespace com::sun::star::io;
      77             : using namespace com::sun::star::ucb;
      78             : using namespace com::sun::star::script;
      79             : using namespace com::sun::star::beans;
      80             : using namespace com::sun::star::xml::sax;
      81             : using namespace com::sun::star::util;
      82             : using namespace com::sun::star::task;
      83             : using namespace com::sun::star::embed;
      84             : using namespace com::sun::star::frame;
      85             : using namespace com::sun::star::deployment;
      86             : using namespace com::sun::star;
      87             : using namespace cppu;
      88             : using namespace osl;
      89             : 
      90             : using com::sun::star::uno::Reference;
      91             : 
      92             : using ::rtl::Uri;
      93             : 
      94             : // #i34411: Flag for error handling during migration
      95             : static bool GbMigrationSuppressErrors = false;
      96             : 
      97             : 
      98             : // Implementation class NameContainer
      99             : 
     100             : // Methods XElementAccess
     101           0 : Type NameContainer::getElementType()
     102             :     throw(RuntimeException, std::exception)
     103             : {
     104           0 :     return mType;
     105             : }
     106             : 
     107       18426 : sal_Bool NameContainer::hasElements()
     108             :     throw(RuntimeException, std::exception)
     109             : {
     110       18426 :     bool bRet = (mnElementCount > 0);
     111       18426 :     return bRet;
     112             : }
     113             : 
     114             : // Methods XNameAccess
     115       39310 : Any NameContainer::getByName( const OUString& aName )
     116             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
     117             : {
     118       39310 :     NameContainerNameMap::iterator aIt = mHashMap.find( aName );
     119       39310 :     if( aIt == mHashMap.end() )
     120             :     {
     121           0 :         throw NoSuchElementException();
     122             :     }
     123       39310 :     sal_Int32 iHashResult = (*aIt).second;
     124       39310 :     Any aRetAny = mValues.getConstArray()[ iHashResult ];
     125       39310 :     return aRetAny;
     126             : }
     127             : 
     128       31526 : Sequence< OUString > NameContainer::getElementNames()
     129             :     throw(RuntimeException, std::exception)
     130             : {
     131       31526 :     return mNames;
     132             : }
     133             : 
     134       21478 : sal_Bool NameContainer::hasByName( const OUString& aName )
     135             :     throw(RuntimeException, std::exception)
     136             : {
     137       21478 :     NameContainerNameMap::iterator aIt = mHashMap.find( aName );
     138       21478 :     bool bRet = ( aIt != mHashMap.end() );
     139       21478 :     return bRet;
     140             : }
     141             : 
     142             : 
     143             : // Methods XNameReplace
     144          84 : void NameContainer::replaceByName( const OUString& aName, const Any& aElement )
     145             :     throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
     146             : {
     147          84 :     Type aAnyType = aElement.getValueType();
     148          84 :     if( mType != aAnyType )
     149             :     {
     150           0 :         throw IllegalArgumentException();
     151             :     }
     152          84 :     NameContainerNameMap::iterator aIt = mHashMap.find( aName );
     153          84 :     if( aIt == mHashMap.end() )
     154             :     {
     155           0 :         throw NoSuchElementException();
     156             :     }
     157          84 :     sal_Int32 iHashResult = (*aIt).second;
     158         168 :     Any aOldElement = mValues.getConstArray()[ iHashResult ];
     159          84 :     mValues.getArray()[ iHashResult ] = aElement;
     160             : 
     161             : 
     162             :     // Fire event
     163          84 :     if( maContainerListeners.getLength() > 0 )
     164             :     {
     165           0 :         ContainerEvent aEvent;
     166           0 :         aEvent.Source = mpxEventSource;
     167           0 :         aEvent.Accessor <<= aName;
     168           0 :         aEvent.Element = aElement;
     169           0 :         aEvent.ReplacedElement = aOldElement;
     170           0 :         maContainerListeners.notifyEach( &XContainerListener::elementReplaced, aEvent );
     171             :     }
     172             : 
     173             :     /*  After the container event has been fired (one listener will update the
     174             :         core Basic manager), fire change event. Listeners can rely that the
     175             :         Basic source code of the core Basic manager is up-to-date. */
     176          84 :     if( maChangesListeners.getLength() > 0 )
     177             :     {
     178           0 :         ChangesEvent aEvent;
     179           0 :         aEvent.Source = mpxEventSource;
     180           0 :         aEvent.Base <<= aEvent.Source;
     181           0 :         aEvent.Changes.realloc( 1 );
     182           0 :         aEvent.Changes[ 0 ].Accessor <<= aName;
     183           0 :         aEvent.Changes[ 0 ].Element <<= aElement;
     184           0 :         aEvent.Changes[ 0 ].ReplacedElement = aOldElement;
     185           0 :         maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent );
     186          84 :     }
     187          84 : }
     188             : 
     189       26144 : void NameContainer::insertCheck(const OUString& aName, const Any& aElement)
     190             :     throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException, std::exception)
     191             : {
     192       26144 :     NameContainerNameMap::iterator aIt = mHashMap.find(aName);
     193       26144 :     if( aIt != mHashMap.end() )
     194             :     {
     195           0 :         throw ElementExistException();
     196             :     }
     197       26144 :     insertNoCheck(aName, aElement);
     198       26144 : }
     199             : 
     200       26144 : void NameContainer::insertNoCheck(const OUString& aName, const Any& aElement)
     201             :     throw(IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
     202             : {
     203       26144 :     Type aAnyType = aElement.getValueType();
     204       26144 :     if( mType != aAnyType )
     205             :     {
     206           0 :         throw IllegalArgumentException();
     207             :     }
     208             : 
     209       26144 :     sal_Int32 nCount = mNames.getLength();
     210       26144 :     mNames.realloc( nCount + 1 );
     211       26144 :     mValues.realloc( nCount + 1 );
     212       26144 :     mNames.getArray()[ nCount ] = aName;
     213       26144 :     mValues.getArray()[ nCount ] = aElement;
     214             : 
     215       26144 :     mHashMap[ aName ] = nCount;
     216       26144 :     mnElementCount++;
     217             : 
     218             :     // Fire event
     219       26144 :     if( maContainerListeners.getLength() > 0 )
     220             :     {
     221        4002 :         ContainerEvent aEvent;
     222        4002 :         aEvent.Source = mpxEventSource;
     223        4002 :         aEvent.Accessor <<= aName;
     224        4002 :         aEvent.Element = aElement;
     225        4002 :         maContainerListeners.notifyEach( &XContainerListener::elementInserted, aEvent );
     226             :     }
     227             : 
     228             :     /*  After the container event has been fired (one listener will update the
     229             :         core Basic manager), fire change event. Listeners can rely that the
     230             :         Basic source code of the core Basic manager is up-to-date. */
     231       26144 :     if( maChangesListeners.getLength() > 0 )
     232             :     {
     233           0 :         ChangesEvent aEvent;
     234           0 :         aEvent.Source = mpxEventSource;
     235           0 :         aEvent.Base <<= aEvent.Source;
     236           0 :         aEvent.Changes.realloc( 1 );
     237           0 :         aEvent.Changes[ 0 ].Accessor <<= aName;
     238           0 :         aEvent.Changes[ 0 ].Element <<= aElement;
     239           0 :         maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent );
     240       26144 :     }
     241       26144 : }
     242             : 
     243             : // Methods XNameContainer
     244       26144 : void NameContainer::insertByName( const OUString& aName, const Any& aElement )
     245             :     throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException, std::exception)
     246             : {
     247       26144 :     insertCheck(aName, aElement);
     248       26144 : }
     249             : 
     250           8 : void NameContainer::removeByName( const OUString& aName )
     251             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
     252             : {
     253           8 :     NameContainerNameMap::iterator aIt = mHashMap.find( aName );
     254           8 :     if( aIt == mHashMap.end() )
     255             :     {
     256           0 :         OUString sMessage = "\"" + aName + "\" not found";
     257           0 :         throw NoSuchElementException(sMessage);
     258             :     }
     259             : 
     260           8 :     sal_Int32 iHashResult = (*aIt).second;
     261           8 :     Any aOldElement = mValues.getConstArray()[ iHashResult ];
     262           8 :     mHashMap.erase( aIt );
     263           8 :     sal_Int32 iLast = mNames.getLength() - 1;
     264           8 :     if( iLast != iHashResult )
     265             :     {
     266           0 :         OUString* pNames = mNames.getArray();
     267           0 :         Any* pValues = mValues.getArray();
     268           0 :         pNames[ iHashResult ] = pNames[ iLast ];
     269           0 :         pValues[ iHashResult ] = pValues[ iLast ];
     270           0 :         mHashMap[ pNames[ iHashResult ] ] = iHashResult;
     271             :     }
     272           8 :     mNames.realloc( iLast );
     273           8 :     mValues.realloc( iLast );
     274           8 :     mnElementCount--;
     275             : 
     276             :     // Fire event
     277           8 :     if( maContainerListeners.getLength() > 0 )
     278             :     {
     279           0 :         ContainerEvent aEvent;
     280           0 :         aEvent.Source = mpxEventSource;
     281           0 :         aEvent.Accessor <<= aName;
     282           0 :         aEvent.Element = aOldElement;
     283           0 :         maContainerListeners.notifyEach( &XContainerListener::elementRemoved, aEvent );
     284             :     }
     285             : 
     286             :     /*  After the container event has been fired (one listener will update the
     287             :         core Basic manager), fire change event. Listeners can rely that the
     288             :         Basic source code of the core Basic manager is up-to-date. */
     289           8 :     if( maChangesListeners.getLength() > 0 )
     290             :     {
     291           0 :         ChangesEvent aEvent;
     292           0 :         aEvent.Source = mpxEventSource;
     293           0 :         aEvent.Base <<= aEvent.Source;
     294           0 :         aEvent.Changes.realloc( 1 );
     295           0 :         aEvent.Changes[ 0 ].Accessor <<= aName;
     296             :         // aEvent.Changes[ 0 ].Element remains empty (meaning "replaced with nothing")
     297           0 :         aEvent.Changes[ 0 ].ReplacedElement = aOldElement;
     298           0 :         maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent );
     299           8 :     }
     300           8 : }
     301             : 
     302             : 
     303             : // Methods XContainer
     304        9064 : void SAL_CALL NameContainer::addContainerListener( const Reference< XContainerListener >& xListener )
     305             :     throw (RuntimeException, std::exception)
     306             : {
     307        9064 :     if( !xListener.is() )
     308             :     {
     309             :         throw RuntimeException("addContainerListener called with null xListener",
     310           0 :                                static_cast< cppu::OWeakObject * >(this));
     311             :     }
     312        9064 :     maContainerListeners.addInterface( Reference<XInterface>(xListener, UNO_QUERY) );
     313        9064 : }
     314             : 
     315           0 : void SAL_CALL NameContainer::removeContainerListener( const Reference< XContainerListener >& xListener )
     316             :     throw (RuntimeException, std::exception)
     317             : {
     318           0 :     if( !xListener.is() )
     319             :     {
     320           0 :         throw RuntimeException();
     321             :     }
     322           0 :     maContainerListeners.removeInterface( Reference<XInterface>(xListener, UNO_QUERY) );
     323           0 : }
     324             : 
     325             : // Methods XChangesNotifier
     326          52 : void SAL_CALL NameContainer::addChangesListener( const Reference< XChangesListener >& xListener )
     327             :     throw (RuntimeException, std::exception)
     328             : {
     329          52 :     if( !xListener.is() )
     330             :     {
     331           0 :         throw RuntimeException();
     332             :     }
     333          52 :     maChangesListeners.addInterface( Reference<XInterface>(xListener, UNO_QUERY) );
     334          52 : }
     335             : 
     336           0 : void SAL_CALL NameContainer::removeChangesListener( const Reference< XChangesListener >& xListener )
     337             :     throw (RuntimeException, std::exception)
     338             : {
     339           0 :     if( !xListener.is() )
     340             :     {
     341           0 :         throw RuntimeException();
     342             :     }
     343           0 :     maChangesListeners.removeInterface( Reference<XInterface>(xListener, UNO_QUERY) );
     344           0 : }
     345             : 
     346             : 
     347             : // ModifiableHelper
     348             : 
     349       21028 : void ModifiableHelper::setModified( bool _bModified )
     350             : {
     351       21028 :     if ( _bModified == mbModified )
     352             :     {
     353       21158 :         return;
     354             :     }
     355       20898 :     mbModified = _bModified;
     356             : 
     357       20898 :     if ( m_aModifyListeners.getLength() == 0 )
     358             :     {
     359       20898 :         return;
     360             :     }
     361           0 :     EventObject aModifyEvent( m_rEventSource );
     362           0 :     m_aModifyListeners.notifyEach( &XModifyListener::modified, aModifyEvent );
     363             : }
     364             : 
     365             : 
     366             : 
     367       10750 : VBAScriptListenerContainer::VBAScriptListenerContainer( ::osl::Mutex& rMutex ) :
     368       10750 :     VBAScriptListenerContainer_BASE( rMutex )
     369             : {
     370       10750 : }
     371             : 
     372           0 : bool VBAScriptListenerContainer::implTypedNotify( const Reference< vba::XVBAScriptListener >& rxListener, const vba::VBAScriptEvent& rEvent )
     373             :     throw (Exception)
     374             : {
     375           0 :     rxListener->notifyVBAScriptEvent( rEvent );
     376           0 :     return true;    // notify all other listeners too
     377             : }
     378             : 
     379             : // Ctor
     380       10750 : SfxLibraryContainer::SfxLibraryContainer( void )
     381             :     : SfxLibraryContainer_BASE( maMutex )
     382             : 
     383             :     , maVBAScriptListeners( maMutex )
     384             :     , mnRunningVBAScripts( 0 )
     385             :     , mbVBACompat( false )
     386             :     , maModifiable( *this, maMutex )
     387       10750 :     , maNameContainer( cppu::UnoType<XNameAccess>::get())
     388             :     , mbOldInfoFormat( false )
     389             :     , mbOasis2OOoFormat( false )
     390             :     , mpBasMgr( NULL )
     391             :     , mbOwnBasMgr( false )
     392       21500 :     , meInitMode(DEFAULT)
     393             : {
     394       10750 :     mxContext = comphelper::getProcessComponentContext();
     395             : 
     396       10750 :     mxSFI = ucb::SimpleFileAccess::create( mxContext );
     397             : 
     398       10750 :     mxStringSubstitution = util::PathSubstitution::create( mxContext );
     399       10750 : }
     400             : 
     401       21086 : SfxLibraryContainer::~SfxLibraryContainer()
     402             : {
     403       10543 :     if( mbOwnBasMgr )
     404             :     {
     405           0 :         BasicManager::LegacyDeleteBasicManager( mpBasMgr );
     406             :     }
     407       10543 : }
     408             : 
     409      109256 : void SfxLibraryContainer::checkDisposed() const
     410             : {
     411      109256 :     if ( isDisposed() )
     412             :     {
     413             :         throw DisposedException( OUString(),
     414           0 :                                  *const_cast< SfxLibraryContainer* >( this ) );
     415             :     }
     416      109256 : }
     417             : 
     418      109256 : void SfxLibraryContainer::enterMethod()
     419             : {
     420      109256 :     Application::GetSolarMutex().acquire();
     421      109256 :     checkDisposed();
     422      109256 : }
     423             : 
     424      109256 : void SfxLibraryContainer::leaveMethod()
     425             : {
     426      109256 :     Application::GetSolarMutex().release();
     427      109256 : }
     428             : 
     429         122 : BasicManager* SfxLibraryContainer::getBasicManager()
     430             : {
     431             :     try
     432             :     {
     433         122 :         if ( mpBasMgr )
     434             :         {
     435          60 :             return mpBasMgr;
     436             :         }
     437          62 :         Reference< XModel > xDocument( mxOwnerDocument.get(), UNO_QUERY );
     438             :         SAL_WARN_IF(
     439             :             !xDocument.is(), "basic",
     440             :             ("SfxLibraryContainer::getBasicManager: cannot obtain a BasicManager"
     441             :              " without document!"));
     442          62 :         if ( xDocument.is() )
     443             :         {
     444          62 :             mpBasMgr = BasicManagerRepository::getDocumentBasicManager( xDocument );
     445          62 :         }
     446             :     }
     447           0 :     catch (const css::ucb::ContentCreationException& e)
     448             :     {
     449             :         SAL_WARN( "basic", "SfxLibraryContainer::getBasicManager : Caught exception: " << e.Message );
     450             :     }
     451          62 :     return mpBasMgr;
     452             : }
     453             : 
     454             : // Methods XStorageBasedLibraryContainer
     455           0 : Reference< XStorage > SAL_CALL SfxLibraryContainer::getRootStorage() throw (RuntimeException, std::exception)
     456             : {
     457           0 :     LibraryContainerMethodGuard aGuard( *this );
     458           0 :     return mxStorage;
     459             : }
     460             : 
     461        4600 : void SAL_CALL SfxLibraryContainer::setRootStorage( const Reference< XStorage >& _rxRootStorage )
     462             :     throw (IllegalArgumentException, RuntimeException, std::exception)
     463             : {
     464        4600 :     LibraryContainerMethodGuard aGuard( *this );
     465        4600 :     if ( !_rxRootStorage.is() )
     466             :     {
     467           0 :         throw IllegalArgumentException();
     468             :     }
     469        4600 :     mxStorage = _rxRootStorage;
     470        4600 :     onNewRootStorage();
     471        4600 : }
     472             : 
     473        2436 : void SAL_CALL SfxLibraryContainer::storeLibrariesToStorage( const Reference< XStorage >& _rxRootStorage )
     474             :     throw (IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
     475             : {
     476        2436 :     LibraryContainerMethodGuard aGuard( *this );
     477        2436 :     if ( !_rxRootStorage.is() )
     478             :     {
     479           0 :         throw IllegalArgumentException();
     480             :     }
     481             :     try
     482             :     {
     483        2436 :         storeLibraries_Impl( _rxRootStorage, true );
     484             :     }
     485           0 :     catch( const Exception& )
     486             :     {
     487             :         throw WrappedTargetException( OUString(),
     488           0 :                                       *this, ::cppu::getCaughtException() );
     489        2436 :     }
     490        2436 : }
     491             : 
     492             : 
     493             : // Methods XModifiable
     494           0 : sal_Bool SfxLibraryContainer::isModified()
     495             :     throw (RuntimeException, std::exception)
     496             : {
     497           0 :     LibraryContainerMethodGuard aGuard( *this );
     498           0 :     if ( maModifiable.isModified() )
     499             :     {
     500           0 :         return sal_True;
     501             :     }
     502             :     // the library container is not modified, go through the libraries and check whether they are modified
     503           0 :     Sequence< OUString > aNames = maNameContainer.getElementNames();
     504           0 :     const OUString* pNames = aNames.getConstArray();
     505           0 :     sal_Int32 nNameCount = aNames.getLength();
     506             : 
     507           0 :     for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
     508             :     {
     509           0 :         OUString aName = pNames[ i ];
     510             :         try
     511             :         {
     512           0 :             SfxLibrary* pImplLib = getImplLib( aName );
     513           0 :             if( pImplLib->isModified() )
     514             :             {
     515           0 :                 if ( aName == "Standard" )
     516             :                 {
     517             :                     // this is a workaround that has to be implemented because
     518             :                     // empty standard library should stay marked as modified
     519             :                     // but should not be treated as modified while it is empty
     520           0 :                     if ( pImplLib->hasElements() )
     521           0 :                         return sal_True;
     522             :                 }
     523             :                 else
     524             :                 {
     525           0 :                     return sal_True;
     526             :                 }
     527             :             }
     528             :         }
     529           0 :         catch(const css::container::NoSuchElementException&)
     530             :         {
     531             :         }
     532           0 :     }
     533             : 
     534           0 :     return sal_False;
     535             : }
     536             : 
     537        7284 : void SAL_CALL SfxLibraryContainer::setModified( sal_Bool _bModified )
     538             :     throw (PropertyVetoException, RuntimeException, std::exception)
     539             : {
     540        7284 :     LibraryContainerMethodGuard aGuard( *this );
     541        7284 :     maModifiable.setModified( _bModified );
     542        7284 : }
     543             : 
     544           0 : void SAL_CALL SfxLibraryContainer::addModifyListener( const Reference< XModifyListener >& _rxListener )
     545             :     throw (RuntimeException, std::exception)
     546             : {
     547           0 :     LibraryContainerMethodGuard aGuard( *this );
     548           0 :     maModifiable.addModifyListener( _rxListener );
     549           0 : }
     550             : 
     551           0 : void SAL_CALL SfxLibraryContainer::removeModifyListener( const Reference< XModifyListener >& _rxListener )
     552             :     throw (RuntimeException, std::exception)
     553             : {
     554           0 :     LibraryContainerMethodGuard aGuard( *this );
     555           0 :     maModifiable.removeModifyListener( _rxListener );
     556           0 : }
     557             : 
     558             : // Methods XPersistentLibraryContainer
     559           0 : Any SAL_CALL SfxLibraryContainer::getRootLocation() throw (RuntimeException, std::exception)
     560             : {
     561           0 :     LibraryContainerMethodGuard aGuard( *this );
     562           0 :     return makeAny( getRootStorage() );
     563             : }
     564             : 
     565           0 : OUString SAL_CALL SfxLibraryContainer::getContainerLocationName() throw (RuntimeException, std::exception)
     566             : {
     567           0 :     LibraryContainerMethodGuard aGuard( *this );
     568           0 :     return maLibrariesDir;
     569             : }
     570             : 
     571         128 : void SAL_CALL SfxLibraryContainer::storeLibraries(  )
     572             :     throw (WrappedTargetException, RuntimeException, std::exception)
     573             : {
     574         128 :     LibraryContainerMethodGuard aGuard( *this );
     575             :     try
     576             :     {
     577         128 :         storeLibraries_Impl( mxStorage, mxStorage.is()  );
     578             :         // we need to store *all* libraries if and only if we are based on a storage:
     579             :         // in this case, storeLibraries_Impl will remove the source storage, after loading
     580             :         // all libraries, so we need to force them to be stored, again
     581             :     }
     582           0 :     catch( const Exception& )
     583             :     {
     584           0 :         throw WrappedTargetException( OUString(), *this, ::cppu::getCaughtException() );
     585         128 :     }
     586         128 : }
     587             : 
     588           0 : static void checkAndCopyFileImpl( const INetURLObject& rSourceFolderInetObj,
     589             :                                   const INetURLObject& rTargetFolderInetObj,
     590             :                                   const OUString& rCheckFileName,
     591             :                                   const OUString& rCheckExtension,
     592             :                                   Reference< XSimpleFileAccess3 > xSFI )
     593             : {
     594           0 :     INetURLObject aTargetFolderInetObj( rTargetFolderInetObj );
     595             :     aTargetFolderInetObj.insertName( rCheckFileName, true, INetURLObject::LAST_SEGMENT,
     596           0 :                                      true, INetURLObject::ENCODE_ALL );
     597           0 :     aTargetFolderInetObj.setExtension( rCheckExtension );
     598           0 :     OUString aTargetFile = aTargetFolderInetObj.GetMainURL( INetURLObject::NO_DECODE );
     599           0 :     if( !xSFI->exists( aTargetFile ) )
     600             :     {
     601           0 :         INetURLObject aSourceFolderInetObj( rSourceFolderInetObj );
     602             :         aSourceFolderInetObj.insertName( rCheckFileName, true, INetURLObject::LAST_SEGMENT,
     603           0 :                                          true, INetURLObject::ENCODE_ALL );
     604           0 :         aSourceFolderInetObj.setExtension( rCheckExtension );
     605           0 :         OUString aSourceFile = aSourceFolderInetObj.GetMainURL( INetURLObject::NO_DECODE );
     606           0 :         xSFI->copy( aSourceFile, aTargetFile );
     607           0 :     }
     608           0 : }
     609             : 
     610        7594 : static void createVariableURL( OUString& rStr, const OUString& rLibName,
     611             :                                const OUString& rInfoFileName, bool bUser )
     612             : {
     613        7594 :     if( bUser )
     614             :     {
     615        7594 :         rStr = "$(USER)/basic/";
     616             :     }
     617             :     else
     618             :     {
     619           0 :         rStr = "$(INST)/" LIBO_SHARE_FOLDER "/basic/";
     620             :     }
     621        7594 :     rStr += rLibName;
     622        7594 :     rStr += "/";
     623        7594 :     rStr += rInfoFileName;
     624        7594 :     rStr += ".xlb/";
     625        7594 : }
     626             : 
     627       10526 : void SfxLibraryContainer::init( const OUString& rInitialDocumentURL, const uno::Reference< embed::XStorage >& rxInitialStorage )
     628             : {
     629             :     // this might be called from within the ctor, and the impl_init might (indirectly) create
     630             :     // an UNO reference to ourself.
     631             :     // Ensure that we're not destroyed while we're in here
     632       10526 :     osl_atomic_increment( &m_refCount );
     633       10526 :     init_Impl( rInitialDocumentURL, rxInitialStorage );
     634       10524 :     osl_atomic_decrement( &m_refCount );
     635       10524 : }
     636             : 
     637       10526 : void SfxLibraryContainer::init_Impl( const OUString& rInitialDocumentURL,
     638             :                                      const uno::Reference< embed::XStorage >& rxInitialStorage )
     639             : {
     640       10526 :     uno::Reference< embed::XStorage > xStorage = rxInitialStorage;
     641             : 
     642       10526 :     maInitialDocumentURL = rInitialDocumentURL;
     643       10526 :     maInfoFileName = OUString::createFromAscii( getInfoFileName() );
     644       10526 :     maOldInfoFileName = OUString::createFromAscii( getOldInfoFileName() );
     645       10526 :     maLibElementFileExtension = OUString::createFromAscii( getLibElementFileExtension() );
     646       10526 :     maLibrariesDir = OUString::createFromAscii( getLibrariesDir() );
     647             : 
     648       10526 :     meInitMode = DEFAULT;
     649       21052 :     INetURLObject aInitUrlInetObj( maInitialDocumentURL );
     650       21052 :     OUString aInitFileName = aInitUrlInetObj.GetMainURL( INetURLObject::NO_DECODE );
     651       10526 :     if( !aInitFileName.isEmpty() )
     652             :     {
     653             :         // We need a BasicManager to avoid problems
     654           0 :         StarBASIC* pBas = new StarBASIC();
     655           0 :         mpBasMgr = new BasicManager( pBas );
     656           0 :         mbOwnBasMgr = true;
     657             : 
     658           0 :         OUString aExtension = aInitUrlInetObj.getExtension();
     659           0 :         if( aExtension == "xlc" )
     660             :         {
     661           0 :             meInitMode = CONTAINER_INIT_FILE;
     662           0 :             INetURLObject aLibPathInetObj( aInitUrlInetObj );
     663           0 :             aLibPathInetObj.removeSegment();
     664           0 :             maLibraryPath = aLibPathInetObj.GetMainURL( INetURLObject::NO_DECODE );
     665             :         }
     666           0 :         else if( aExtension == "xlb" )
     667             :         {
     668           0 :             meInitMode = LIBRARY_INIT_FILE;
     669           0 :             uno::Reference< embed::XStorage > xDummyStor;
     670           0 :             ::xmlscript::LibDescriptor aLibDesc;
     671           0 :             implLoadLibraryIndexFile( NULL, aLibDesc, xDummyStor, aInitFileName );
     672           0 :             return;
     673             :         }
     674             :         else
     675             :         {
     676             :             // Decide between old and new document
     677           0 :             bool bOldStorage = SotStorage::IsOLEStorage( aInitFileName );
     678           0 :             if ( bOldStorage )
     679             :             {
     680           0 :                 meInitMode = OLD_BASIC_STORAGE;
     681           0 :                 importFromOldStorage( aInitFileName );
     682           0 :                 return;
     683             :             }
     684             :             else
     685             :             {
     686           0 :                 meInitMode = OFFICE_DOCUMENT;
     687             :                 try
     688             :                 {
     689           0 :                     xStorage = ::comphelper::OStorageHelper::GetStorageFromURL( aInitFileName, embed::ElementModes::READ );
     690             :                 }
     691           0 :                 catch (const uno::Exception& )
     692             :                 {
     693             :                     // TODO: error handling
     694             :                 }
     695             :             }
     696           0 :         }
     697             :     }
     698             :     else
     699             :     {
     700             :         // Default paths
     701       10526 :         maLibraryPath = SvtPathOptions().GetBasicPath();
     702             :     }
     703             : 
     704       21050 :     Reference< XParser > xParser = xml::sax::Parser::create(mxContext);
     705             : 
     706       21048 :     uno::Reference< io::XInputStream > xInput;
     707             : 
     708       10524 :     mxStorage = xStorage;
     709       10524 :     bool bStorage = mxStorage.is();
     710             : 
     711             : 
     712             :     // #110009: Scope to force the StorageRefs to be destructed and
     713             :     // so the streams to be closed before the preload operation
     714             :     {
     715             : 
     716       10524 :     uno::Reference< embed::XStorage > xLibrariesStor;
     717       21048 :     OUString aFileName;
     718             : 
     719       10524 :     int nPassCount = 1;
     720       10524 :     if( !bStorage && meInitMode == DEFAULT )
     721             :     {
     722         332 :         nPassCount = 2;
     723             :     }
     724       21380 :     for( int nPass = 0 ; nPass < nPassCount ; nPass++ )
     725             :     {
     726       10856 :         if( bStorage )
     727             :         {
     728             :             SAL_WARN_IF(
     729             :                 meInitMode != DEFAULT && meInitMode != OFFICE_DOCUMENT, "basic",
     730             :                 "Wrong InitMode for document");
     731             :             try
     732             :             {
     733       10192 :                 uno::Reference< io::XStream > xStream;
     734       10192 :                 xLibrariesStor = xStorage->openStorageElement( maLibrariesDir, embed::ElementModes::READ );
     735             : 
     736          26 :                 if ( xLibrariesStor.is() )
     737             :                 {
     738          26 :                     aFileName = maInfoFileName;
     739          26 :                     aFileName += "-lc.xml";
     740             : 
     741             :                     try
     742             :                     {
     743          26 :                         xStream = xLibrariesStor->openStreamElement( aFileName, embed::ElementModes::READ );
     744             :                     }
     745           0 :                     catch(const uno::Exception& )
     746             :                     {}
     747             : 
     748          26 :                     if( !xStream.is() )
     749             :                     {
     750           0 :                         mbOldInfoFormat = true;
     751             : 
     752             :                         // Check old version
     753           0 :                         aFileName = maOldInfoFileName;
     754           0 :                         aFileName += ".xml";
     755             : 
     756             :                         try
     757             :                         {
     758           0 :                             xStream = xLibrariesStor->openStreamElement( aFileName, embed::ElementModes::READ );
     759             :                         }
     760           0 :                         catch(const uno::Exception& )
     761             :                         {}
     762             : 
     763           0 :                         if( !xStream.is() )
     764             :                         {
     765             :                             // Check for EA2 document version with wrong extensions
     766           0 :                             aFileName = maOldInfoFileName;
     767           0 :                             aFileName += ".xli";
     768           0 :                             xStream = xLibrariesStor->openStreamElement( aFileName, embed::ElementModes::READ );
     769             :                         }
     770             :                     }
     771             :                 }
     772             : 
     773          26 :                 if ( xStream.is() )
     774             :                 {
     775          26 :                     xInput = xStream->getInputStream();
     776       10192 :                 }
     777             :             }
     778       10166 :             catch(const uno::Exception& )
     779             :             {
     780             :                 // TODO: error handling?
     781             :             }
     782             :         }
     783             :         else
     784             :         {
     785         664 :             boost::scoped_ptr<INetURLObject> pLibInfoInetObj;
     786         664 :             if( meInitMode == CONTAINER_INIT_FILE )
     787             :             {
     788           0 :                 aFileName = aInitFileName;
     789             :             }
     790             :             else
     791             :             {
     792         664 :                 if( nPass == 1 )
     793             :                 {
     794         332 :                     pLibInfoInetObj.reset(new INetURLObject( maLibraryPath.getToken(0, (sal_Unicode)';') ));
     795             :                 }
     796             :                 else
     797             :                 {
     798         332 :                     pLibInfoInetObj.reset(new INetURLObject( maLibraryPath.getToken(1, (sal_Unicode)';') ));
     799             :                 }
     800         664 :                 pLibInfoInetObj->insertName( maInfoFileName, false, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
     801         664 :                 pLibInfoInetObj->setExtension( OUString("xlc") );
     802         664 :                 aFileName = pLibInfoInetObj->GetMainURL( INetURLObject::NO_DECODE );
     803             :             }
     804             : 
     805             :             try
     806             :             {
     807         664 :                 xInput = mxSFI->openFileRead( aFileName );
     808             :             }
     809         220 :             catch(const Exception& )
     810             :             {
     811             :                 // Silently tolerate empty or missing files
     812         220 :                 xInput.clear();
     813             :             }
     814             : 
     815             :             // Old variant?
     816         664 :             if( !xInput.is() && nPass == 0 )
     817             :             {
     818         220 :                 INetURLObject aLibInfoInetObj( maLibraryPath.getToken(1, (sal_Unicode)';') );
     819         220 :                 aLibInfoInetObj.insertName( maOldInfoFileName, false, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
     820         220 :                 aLibInfoInetObj.setExtension( OUString( "xli") );
     821         220 :                 aFileName = aLibInfoInetObj.GetMainURL( INetURLObject::NO_DECODE );
     822             : 
     823             :                 try
     824             :                 {
     825         220 :                     xInput = mxSFI->openFileRead( aFileName );
     826           0 :                     mbOldInfoFormat = true;
     827             :                 }
     828         220 :                 catch(const Exception& )
     829             :                 {
     830         220 :                     xInput.clear();
     831         220 :                 }
     832         664 :             }
     833             :         }
     834             : 
     835       10856 :         if( xInput.is() )
     836             :         {
     837         470 :             InputSource source;
     838         470 :             source.aInputStream = xInput;
     839         470 :             source.sSystemId    = aFileName;
     840             : 
     841             :             // start parsing
     842         940 :             boost::scoped_ptr< ::xmlscript::LibDescriptorArray> pLibArray(new ::xmlscript::LibDescriptorArray());
     843             : 
     844             :             try
     845             :             {
     846         470 :                 xParser->setDocumentHandler( ::xmlscript::importLibraryContainer( pLibArray.get() ) );
     847         470 :                 xParser->parseStream( source );
     848             :             }
     849           0 :             catch ( const xml::sax::SAXException& e )
     850             :             {
     851             :                 SAL_WARN("basic", e.Message);
     852           0 :                 return;
     853             :             }
     854           0 :             catch ( const io::IOException& e )
     855             :             {
     856             :                 SAL_WARN("basic", e.Message);
     857           0 :                 return;
     858             :             }
     859             : 
     860         470 :             sal_Int32 nLibCount = pLibArray->mnLibCount;
     861        3602 :             for( sal_Int32 i = 0 ; i < nLibCount ; i++ )
     862             :             {
     863        3132 :                 ::xmlscript::LibDescriptor& rLib = pLibArray->mpLibs[i];
     864             : 
     865             :                 // Check storage URL
     866        3132 :                 OUString aStorageURL = rLib.aStorageURL;
     867        3132 :                 if( !bStorage && aStorageURL.isEmpty() && nPass == 0 )
     868             :                 {
     869         112 :                     OUString aLibraryPath;
     870         112 :                     if( meInitMode == CONTAINER_INIT_FILE )
     871             :                     {
     872           0 :                         aLibraryPath = maLibraryPath;
     873             :                     }
     874             :                     else
     875             :                     {
     876         112 :                         aLibraryPath = maLibraryPath.getToken(1, (sal_Unicode)';');
     877             :                     }
     878         224 :                     INetURLObject aInetObj( aLibraryPath );
     879             : 
     880             :                     aInetObj.insertName( rLib.aName, true, INetURLObject::LAST_SEGMENT,
     881         112 :                                          true, INetURLObject::ENCODE_ALL );
     882         224 :                     OUString aLibDirPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
     883         112 :                     if( mxSFI->isFolder( aLibDirPath ) )
     884             :                     {
     885         112 :                         createVariableURL( rLib.aStorageURL, rLib.aName, maInfoFileName, true );
     886         112 :                         maModifiable.setModified( true );
     887             :                     }
     888           0 :                     else if( rLib.bLink )
     889             :                     {
     890             :                         // Check "share" path
     891           0 :                         INetURLObject aShareInetObj( maLibraryPath.getToken(0, (sal_Unicode)';') );
     892             :                         aShareInetObj.insertName( rLib.aName, true, INetURLObject::LAST_SEGMENT,
     893           0 :                                                   true, INetURLObject::ENCODE_ALL );
     894           0 :                         OUString aShareLibDirPath = aShareInetObj.GetMainURL( INetURLObject::NO_DECODE );
     895           0 :                         if( mxSFI->isFolder( aShareLibDirPath ) )
     896             :                         {
     897           0 :                             createVariableURL( rLib.aStorageURL, rLib.aName, maInfoFileName, false );
     898           0 :                             maModifiable.setModified( true );
     899             :                         }
     900             :                         else
     901             :                         {
     902             :                             // #i25537: Ignore lib if library folder does not really exist
     903           0 :                             continue;
     904           0 :                         }
     905         112 :                     }
     906             :                 }
     907             : 
     908        6264 :                 OUString aLibName = rLib.aName;
     909             : 
     910             :                 // If the same library name is used by the shared and the
     911             :                 // user lib container index files the user file wins
     912        3132 :                 if( nPass == 1 && hasByName( aLibName ) )
     913             :                 {
     914           0 :                     continue;
     915             :                 }
     916             :                 SfxLibrary* pImplLib;
     917        3132 :                 if( rLib.bLink )
     918             :                 {
     919             :                     Reference< XNameAccess > xLib =
     920        2988 :                         createLibraryLink( aLibName, rLib.aStorageURL, rLib.bReadOnly );
     921        2988 :                     pImplLib = static_cast< SfxLibrary* >( xLib.get() );
     922             :                 }
     923             :                 else
     924             :                 {
     925         144 :                     Reference< XNameContainer > xLib = createLibrary( aLibName );
     926         144 :                     pImplLib = static_cast< SfxLibrary* >( xLib.get() );
     927         144 :                     pImplLib->mbLoaded = false;
     928         144 :                     pImplLib->mbReadOnly = rLib.bReadOnly;
     929         144 :                     if( !bStorage )
     930             :                     {
     931             :                         checkStorageURL( rLib.aStorageURL, pImplLib->maLibInfoFileURL,
     932         112 :                                          pImplLib->maStorageURL, pImplLib->maUnexpandedStorageURL );
     933         144 :                     }
     934             :                 }
     935        3132 :                 maModifiable.setModified( false );
     936             : 
     937             :                 // Read library info files
     938        3132 :                 if( !mbOldInfoFormat )
     939             :                 {
     940        3132 :                     uno::Reference< embed::XStorage > xLibraryStor;
     941        3132 :                     if( !pImplLib->mbInitialised && bStorage )
     942             :                     {
     943             :                         try
     944             :                         {
     945          96 :                             xLibraryStor = xLibrariesStor->openStorageElement( rLib.aName,
     946          64 :                                                                                 embed::ElementModes::READ );
     947             :                         }
     948           0 :                         catch(const uno::Exception& )
     949             :                         {
     950             :                             #if OSL_DEBUG_LEVEL > 0
     951             :                             Any aError( ::cppu::getCaughtException() );
     952             :                             SAL_WARN(
     953             :                                 "basic",
     954             :                                 "couldn't open sub storage for library \""
     955             :                                     << rLib.aName << "\". Exception: "
     956             :                                     << comphelper::anyToString(aError));
     957             :                             #endif
     958             :                         }
     959             :                     }
     960             : 
     961             :                     // Link is already initialised in createLibraryLink()
     962        3132 :                     if( !pImplLib->mbInitialised && (!bStorage || xLibraryStor.is()) )
     963             :                     {
     964         144 :                         OUString aIndexFileName;
     965         144 :                         bool bLoaded = implLoadLibraryIndexFile( pImplLib, rLib, xLibraryStor, aIndexFileName );
     966             :                         SAL_WARN_IF(
     967             :                             bLoaded && aLibName != rLib.aName, "basic",
     968             :                             ("Different library names in library container and"
     969             :                              " library info files!"));
     970         144 :                         if( GbMigrationSuppressErrors && !bLoaded )
     971             :                         {
     972           0 :                             removeLibrary( aLibName );
     973         144 :                         }
     974        3132 :                     }
     975             :                 }
     976           0 :                 else if( !bStorage )
     977             :                 {
     978             :                     // Write new index file immediately because otherwise
     979             :                     // the library elements will be lost when storing into
     980             :                     // the new info format
     981           0 :                     uno::Reference< embed::XStorage > xTmpStorage;
     982           0 :                     implStoreLibraryIndexFile( pImplLib, rLib, xTmpStorage );
     983             :                 }
     984             : 
     985        3132 :                 implImportLibDescriptor( pImplLib, rLib );
     986             : 
     987        3132 :                 if( nPass == 1 )
     988             :                 {
     989        2988 :                     pImplLib->mbSharedIndexFile = true;
     990        2988 :                     pImplLib->mbReadOnly = true;
     991             :                 }
     992        3132 :             }
     993             : 
     994             :             // Keep flag for documents to force writing the new index files
     995         470 :             if( !bStorage )
     996             :             {
     997         444 :                 mbOldInfoFormat = false;
     998         470 :             }
     999             :         }
    1000       10524 :     }
    1001             : 
    1002             :     // #110009: END Scope to force the StorageRefs to be destructed
    1003             :     }
    1004             : 
    1005       10524 :     if( !bStorage && meInitMode == DEFAULT )
    1006             :     {
    1007             :         try
    1008             :         {
    1009         332 :             implScanExtensions();
    1010             :         }
    1011          28 :         catch(const uno::Exception& )
    1012             :         {
    1013             :             // TODO: error handling?
    1014             :             SAL_WARN("basic", "Cannot access extensions!");
    1015             :         }
    1016             :     }
    1017             : 
    1018             :     // Preload?
    1019             :     {
    1020       10524 :         Sequence< OUString > aNames = maNameContainer.getElementNames();
    1021       10524 :         const OUString* pNames = aNames.getConstArray();
    1022       10524 :         sal_Int32 nNameCount = aNames.getLength();
    1023       13656 :         for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
    1024             :         {
    1025        3132 :             OUString aName = pNames[ i ];
    1026        3132 :             SfxLibrary* pImplLib = getImplLib( aName );
    1027        3132 :             if( pImplLib->mbPreload )
    1028             :             {
    1029           0 :                 loadLibrary( aName );
    1030             :             }
    1031       13656 :         }
    1032             :     }
    1033             : 
    1034       10524 :     if( meInitMode == DEFAULT )
    1035             :     {
    1036       10524 :         INetURLObject aUserBasicInetObj( maLibraryPath.getToken(1, (sal_Unicode)';') );
    1037       21048 :         OUString aStandardStr("Standard");
    1038             : 
    1039       21048 :         INetURLObject aPrevUserBasicInetObj_1( aUserBasicInetObj );
    1040       10524 :         aPrevUserBasicInetObj_1.removeSegment();
    1041       21048 :         INetURLObject aPrevUserBasicInetObj_2 = aPrevUserBasicInetObj_1;
    1042       10524 :         aPrevUserBasicInetObj_1.Append( "__basic_80" );
    1043       10524 :         aPrevUserBasicInetObj_2.Append( "__basic_80_2" );
    1044             : 
    1045             :         // #i93163
    1046       10524 :         bool bCleanUp = false;
    1047             :         try
    1048             :         {
    1049       10524 :             INetURLObject aPrevUserBasicInetObj = aPrevUserBasicInetObj_1;
    1050       21048 :             OUString aPrevFolder = aPrevUserBasicInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1051       10524 :             if( mxSFI->isFolder( aPrevFolder ) )
    1052             :             {
    1053             :                 // Check if Standard folder exists and is complete
    1054           0 :                 INetURLObject aUserBasicStandardInetObj( aUserBasicInetObj );
    1055             :                 aUserBasicStandardInetObj.insertName( aStandardStr, true, INetURLObject::LAST_SEGMENT,
    1056           0 :                                                       true, INetURLObject::ENCODE_ALL );
    1057           0 :                 INetURLObject aPrevUserBasicStandardInetObj( aPrevUserBasicInetObj );
    1058             :                 aPrevUserBasicStandardInetObj.insertName( aStandardStr, true, INetURLObject::LAST_SEGMENT,
    1059           0 :                                                         true, INetURLObject::ENCODE_ALL );
    1060           0 :                 OUString aPrevStandardFolder = aPrevUserBasicStandardInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1061           0 :                 if( mxSFI->isFolder( aPrevStandardFolder ) )
    1062             :                 {
    1063           0 :                     OUString aXlbExtension( "xlb" );
    1064           0 :                     OUString aCheckFileName;
    1065             : 
    1066             :                     // Check if script.xlb exists
    1067           0 :                     aCheckFileName = "script";
    1068             :                     checkAndCopyFileImpl( aUserBasicStandardInetObj,
    1069             :                                           aPrevUserBasicStandardInetObj,
    1070           0 :                                           aCheckFileName, aXlbExtension, mxSFI );
    1071             : 
    1072             :                     // Check if dialog.xlb exists
    1073           0 :                     aCheckFileName = "dialog";
    1074             :                     checkAndCopyFileImpl( aUserBasicStandardInetObj,
    1075             :                                           aPrevUserBasicStandardInetObj,
    1076           0 :                                           aCheckFileName, aXlbExtension, mxSFI );
    1077             : 
    1078             :                     // Check if module1.xba exists
    1079           0 :                     OUString aXbaExtension("xba");
    1080           0 :                     aCheckFileName = "Module1";
    1081             :                     checkAndCopyFileImpl( aUserBasicStandardInetObj,
    1082             :                                           aPrevUserBasicStandardInetObj,
    1083           0 :                                           aCheckFileName, aXbaExtension, mxSFI );
    1084             :                 }
    1085             :                 else
    1086             :                 {
    1087           0 :                     OUString aStandardFolder = aUserBasicStandardInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1088           0 :                     mxSFI->copy( aStandardFolder, aPrevStandardFolder );
    1089             :                 }
    1090             : 
    1091           0 :                 OUString aPrevCopyToFolder = aPrevUserBasicInetObj_2.GetMainURL( INetURLObject::NO_DECODE );
    1092           0 :                 mxSFI->copy( aPrevFolder, aPrevCopyToFolder );
    1093             :             }
    1094             :             else
    1095             :             {
    1096       10524 :                 aPrevUserBasicInetObj = aPrevUserBasicInetObj_2;
    1097       10524 :                 aPrevFolder = aPrevUserBasicInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1098             :             }
    1099       10524 :             if( mxSFI->isFolder( aPrevFolder ) )
    1100             :             {
    1101           0 :                 SfxLibraryContainer* pPrevCont = createInstanceImpl();
    1102           0 :                 Reference< XInterface > xRef = static_cast< XInterface* >( static_cast< OWeakObject* >(pPrevCont) );
    1103             : 
    1104             :                 // Rename previous basic folder to make storage URLs correct during initialisation
    1105           0 :                 OUString aFolderUserBasic = aUserBasicInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1106           0 :                 INetURLObject aUserBasicTmpInetObj( aUserBasicInetObj );
    1107           0 :                 aUserBasicTmpInetObj.removeSegment();
    1108           0 :                 aUserBasicTmpInetObj.Append( "__basic_tmp" );
    1109           0 :                 OUString aFolderTmp = aUserBasicTmpInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1110             : 
    1111           0 :                 mxSFI->move( aFolderUserBasic, aFolderTmp );
    1112             :                 try
    1113             :                 {
    1114           0 :                     mxSFI->move( aPrevFolder, aFolderUserBasic );
    1115             :                 }
    1116           0 :                 catch(const Exception& )
    1117             :                 {
    1118             :                     // Move back user/basic folder
    1119             :                     try
    1120             :                     {
    1121           0 :                            mxSFI->kill( aFolderUserBasic );
    1122             :                     }
    1123           0 :                     catch(const Exception& )
    1124             :                     {}
    1125           0 :                     mxSFI->move( aFolderTmp, aFolderUserBasic );
    1126           0 :                     throw;
    1127             :                 }
    1128             : 
    1129           0 :                 INetURLObject aPrevUserBasicLibInfoInetObj( aUserBasicInetObj );
    1130             :                 aPrevUserBasicLibInfoInetObj.insertName( maInfoFileName, false, INetURLObject::LAST_SEGMENT,
    1131           0 :                                                     true, INetURLObject::ENCODE_ALL );
    1132           0 :                 aPrevUserBasicLibInfoInetObj.setExtension( OUString("xlc"));
    1133           0 :                 OUString aLibInfoFileName = aPrevUserBasicLibInfoInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1134           0 :                 Sequence<Any> aInitSeq( 1 );
    1135           0 :                 aInitSeq.getArray()[0] <<= aLibInfoFileName;
    1136           0 :                 GbMigrationSuppressErrors = true;
    1137           0 :                 pPrevCont->initialize( aInitSeq );
    1138           0 :                 GbMigrationSuppressErrors = false;
    1139             : 
    1140             :                 // Rename folders back
    1141           0 :                 mxSFI->move( aFolderUserBasic, aPrevFolder );
    1142           0 :                 mxSFI->move( aFolderTmp, aFolderUserBasic );
    1143             : 
    1144           0 :                 OUString aUserSearchStr("vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE");
    1145           0 :                 OUString aSharedSearchStr("vnd.sun.star.expand:$UNO_SHARED_PACKAGES_CACHE");
    1146           0 :                 OUString aBundledSearchStr("vnd.sun.star.expand:$BUNDLED_EXTENSIONS");
    1147           0 :                 OUString aInstSearchStr("$(INST)");
    1148             : 
    1149           0 :                 Sequence< OUString > aNames = pPrevCont->getElementNames();
    1150           0 :                 const OUString* pNames = aNames.getConstArray();
    1151           0 :                 sal_Int32 nNameCount = aNames.getLength();
    1152             : 
    1153           0 :                 for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
    1154             :                 {
    1155           0 :                     OUString aLibName = pNames[ i ];
    1156           0 :                     if( hasByName( aLibName ) )
    1157             :                     {
    1158           0 :                         if( aLibName == aStandardStr )
    1159             :                         {
    1160           0 :                             SfxLibrary* pImplLib = getImplLib( aStandardStr );
    1161           0 :                             OUString aStandardFolder = pImplLib->maStorageURL;
    1162           0 :                             mxSFI->kill( aStandardFolder );
    1163             :                         }
    1164             :                         else
    1165             :                         {
    1166           0 :                             continue;
    1167             :                         }
    1168             :                     }
    1169             : 
    1170           0 :                     SfxLibrary* pImplLib = pPrevCont->getImplLib( aLibName );
    1171           0 :                     if( pImplLib->mbLink )
    1172             :                     {
    1173           0 :                         OUString aStorageURL = pImplLib->maUnexpandedStorageURL;
    1174           0 :                         bool bCreateLink = true;
    1175           0 :                         if( aStorageURL.indexOf( aUserSearchStr   ) != -1 ||
    1176           0 :                             aStorageURL.indexOf( aSharedSearchStr ) != -1 ||
    1177           0 :                             aStorageURL.indexOf( aBundledSearchStr ) != -1 ||
    1178           0 :                             aStorageURL.indexOf( aInstSearchStr   ) != -1 )
    1179             :                         {
    1180           0 :                             bCreateLink = false;
    1181             :                         }
    1182           0 :                         if( bCreateLink )
    1183             :                         {
    1184           0 :                             createLibraryLink( aLibName, pImplLib->maStorageURL, pImplLib->mbReadOnly );
    1185           0 :                         }
    1186             :                     }
    1187             :                     else
    1188             :                     {
    1189             :                         // Move folder if not already done
    1190           0 :                         INetURLObject aUserBasicLibFolderInetObj( aUserBasicInetObj );
    1191           0 :                         aUserBasicLibFolderInetObj.Append( aLibName );
    1192           0 :                         OUString aLibFolder = aUserBasicLibFolderInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1193             : 
    1194           0 :                         INetURLObject aPrevUserBasicLibFolderInetObj( aPrevUserBasicInetObj );
    1195           0 :                         aPrevUserBasicLibFolderInetObj.Append( aLibName );
    1196           0 :                         OUString aPrevLibFolder = aPrevUserBasicLibFolderInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1197             : 
    1198           0 :                         if( mxSFI->isFolder( aPrevLibFolder ) && !mxSFI->isFolder( aLibFolder ) )
    1199             :                         {
    1200           0 :                             mxSFI->move( aPrevLibFolder, aLibFolder );
    1201             :                         }
    1202             : 
    1203           0 :                         if( aLibName == aStandardStr )
    1204             :                         {
    1205           0 :                             maNameContainer.removeByName( aLibName );
    1206             :                         }
    1207             : 
    1208             :                         // Create library
    1209           0 :                         Reference< XNameContainer > xLib = createLibrary( aLibName );
    1210           0 :                            SfxLibrary* pNewLib = static_cast< SfxLibrary* >( xLib.get() );
    1211           0 :                         pNewLib->mbLoaded = false;
    1212           0 :                         pNewLib->implSetModified( false );
    1213             :                         checkStorageURL( aLibFolder, pNewLib->maLibInfoFileURL,
    1214           0 :                                          pNewLib->maStorageURL, pNewLib->maUnexpandedStorageURL );
    1215             : 
    1216           0 :                         uno::Reference< embed::XStorage > xDummyStor;
    1217           0 :                         ::xmlscript::LibDescriptor aLibDesc;
    1218           0 :                         implLoadLibraryIndexFile( pNewLib, aLibDesc, xDummyStor, pNewLib->maLibInfoFileURL );
    1219           0 :                         implImportLibDescriptor( pNewLib, aLibDesc );
    1220             :                     }
    1221           0 :                 }
    1222           0 :                 mxSFI->kill( aPrevFolder );
    1223       10524 :             }
    1224             :         }
    1225           0 :         catch(const Exception& e)
    1226             :         {
    1227           0 :             bCleanUp = true;
    1228             :             SAL_WARN("basic", "Upgrade of Basic installation failed somehow: " << e.Message);
    1229             :         }
    1230             : 
    1231             :         // #i93163
    1232       10524 :         if( bCleanUp )
    1233             :         {
    1234           0 :             INetURLObject aPrevUserBasicInetObj_Err( aUserBasicInetObj );
    1235           0 :             aPrevUserBasicInetObj_Err.removeSegment();
    1236           0 :             aPrevUserBasicInetObj_Err.Append( "__basic_80_err" );
    1237           0 :             OUString aPrevFolder_Err = aPrevUserBasicInetObj_Err.GetMainURL( INetURLObject::NO_DECODE );
    1238             : 
    1239           0 :             bool bSaved = false;
    1240             :             try
    1241             :             {
    1242           0 :                 OUString aPrevFolder_1 = aPrevUserBasicInetObj_1.GetMainURL( INetURLObject::NO_DECODE );
    1243           0 :                 if( mxSFI->isFolder( aPrevFolder_1 ) )
    1244             :                 {
    1245           0 :                     mxSFI->move( aPrevFolder_1, aPrevFolder_Err );
    1246           0 :                     bSaved = true;
    1247           0 :                 }
    1248             :             }
    1249           0 :             catch(const Exception& )
    1250             :             {}
    1251             :             try
    1252             :             {
    1253           0 :                 OUString aPrevFolder_2 = aPrevUserBasicInetObj_2.GetMainURL( INetURLObject::NO_DECODE );
    1254           0 :                 if( !bSaved && mxSFI->isFolder( aPrevFolder_2 ) )
    1255             :                 {
    1256           0 :                     mxSFI->move( aPrevFolder_2, aPrevFolder_Err );
    1257             :                 }
    1258             :                 else
    1259             :                 {
    1260           0 :                     mxSFI->kill( aPrevFolder_2 );
    1261           0 :                 }
    1262             :             }
    1263           0 :             catch(const Exception& )
    1264           0 :             {}
    1265       10524 :         }
    1266       10526 :     }
    1267             : }
    1268             : 
    1269         332 : void SfxLibraryContainer::implScanExtensions( void )
    1270             : {
    1271             : #if HAVE_FEATURE_EXTENSIONS
    1272         332 :     ScriptExtensionIterator aScriptIt;
    1273         664 :     OUString aLibURL;
    1274             : 
    1275         332 :     bool bPureDialogLib = false;
    1276         664 :     while ( !(aLibURL = aScriptIt.nextBasicOrDialogLibrary( bPureDialogLib )).isEmpty())
    1277             :     {
    1278           0 :         if( bPureDialogLib && maInfoFileName == "script" )
    1279             :         {
    1280           0 :             continue;
    1281             :         }
    1282             :         // Extract lib name
    1283           0 :         sal_Int32 nLen = aLibURL.getLength();
    1284           0 :         sal_Int32 indexLastSlash = aLibURL.lastIndexOf( '/' );
    1285           0 :         sal_Int32 nReduceCopy = 0;
    1286           0 :         if( indexLastSlash == nLen - 1 )
    1287             :         {
    1288           0 :             nReduceCopy = 1;
    1289           0 :             indexLastSlash = aLibURL.lastIndexOf( '/', nLen - 1 );
    1290             :         }
    1291             : 
    1292           0 :         OUString aLibName = aLibURL.copy( indexLastSlash + 1, nLen - indexLastSlash - nReduceCopy - 1 );
    1293             : 
    1294             :         // If a library of the same exists the existing library wins
    1295           0 :         if( hasByName( aLibName ) )
    1296             :         {
    1297           0 :             continue;
    1298             :         }
    1299             :         // Add index file to URL
    1300           0 :         OUString aIndexFileURL = aLibURL;
    1301           0 :         if( nReduceCopy == 0 )
    1302             :         {
    1303           0 :             aIndexFileURL += "/";
    1304             :         }
    1305           0 :         aIndexFileURL += maInfoFileName + ".xlb";
    1306             : 
    1307             :         // Create link
    1308           0 :         const bool bReadOnly = false;
    1309           0 :         Reference< XNameAccess > xLib = createLibraryLink( aLibName, aIndexFileURL, bReadOnly );
    1310         332 :     }
    1311             : #endif
    1312         304 : }
    1313             : 
    1314             : // Handle maLibInfoFileURL and maStorageURL correctly
    1315        3100 : void SfxLibraryContainer::checkStorageURL( const OUString& aSourceURL,
    1316             :                                            OUString& aLibInfoFileURL, OUString& aStorageURL,
    1317             :                                            OUString& aUnexpandedStorageURL )
    1318             : {
    1319        3100 :     OUString aExpandedSourceURL = expand_url( aSourceURL );
    1320        3100 :     if( aExpandedSourceURL != aSourceURL )
    1321             :     {
    1322        3100 :         aUnexpandedStorageURL = aSourceURL;
    1323             :     }
    1324        6200 :     INetURLObject aInetObj( aExpandedSourceURL );
    1325        6200 :     OUString aExtension = aInetObj.getExtension();
    1326        3100 :     if( aExtension == "xlb" )
    1327             :     {
    1328             :         // URL to xlb file
    1329        3100 :         aLibInfoFileURL = aExpandedSourceURL;
    1330        3100 :         aInetObj.removeSegment();
    1331        3100 :         aStorageURL = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1332             :     }
    1333             :     else
    1334             :     {
    1335             :         // URL to library folder
    1336           0 :         aStorageURL = aExpandedSourceURL;
    1337           0 :         aInetObj.insertName( maInfoFileName, false, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    1338           0 :         aInetObj.setExtension( OUString("xlb") );
    1339           0 :         aLibInfoFileURL = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1340        3100 :     }
    1341        3100 : }
    1342             : 
    1343       23018 : SfxLibrary* SfxLibraryContainer::getImplLib( const OUString& rLibraryName )
    1344             : {
    1345       23018 :     Any aLibAny = maNameContainer.getByName( rLibraryName ) ;
    1346       46036 :     Reference< XNameAccess > xNameAccess;
    1347       23018 :     aLibAny >>= xNameAccess;
    1348       23018 :     SfxLibrary* pImplLib = static_cast< SfxLibrary* >( xNameAccess.get() );
    1349       46036 :     return pImplLib;
    1350             : }
    1351             : 
    1352             : 
    1353             : // Storing with password encryption
    1354             : 
    1355             : // Empty implementation, avoids unneccesary implementation in dlgcont.cxx
    1356           0 : bool SfxLibraryContainer::implStorePasswordLibrary( SfxLibrary*,
    1357             :                                                     const OUString&,
    1358             :                                                     const uno::Reference< embed::XStorage >&,
    1359             :                                                     const uno::Reference< task::XInteractionHandler >&  )
    1360             : {
    1361           0 :     return false;
    1362             : }
    1363             : 
    1364           0 : bool SfxLibraryContainer::implStorePasswordLibrary(
    1365             :     SfxLibrary* /*pLib*/,
    1366             :     const OUString& /*aName*/,
    1367             :     const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& /*xStorage*/,
    1368             :     const OUString& /*aTargetURL*/,
    1369             :     const Reference< XSimpleFileAccess3 > /*xToUseSFI*/,
    1370             :     const uno::Reference< task::XInteractionHandler >&  )
    1371             : {
    1372           0 :     return false;
    1373             : }
    1374             : 
    1375           0 : bool SfxLibraryContainer::implLoadPasswordLibrary(
    1376             :     SfxLibrary* /*pLib*/,
    1377             :     const OUString& /*Name*/,
    1378             :     bool /*bVerifyPasswordOnly*/ )
    1379             : throw(WrappedTargetException, RuntimeException)
    1380             : {
    1381           0 :     return true;
    1382             : }
    1383             : 
    1384             : 
    1385             : 
    1386             : #define EXPAND_PROTOCOL "vnd.sun.star.expand"
    1387             : 
    1388        3100 : OUString SfxLibraryContainer::createAppLibraryFolder( SfxLibrary* pLib, const OUString& aName )
    1389             : {
    1390        3100 :     OUString aLibDirPath = pLib->maStorageURL;
    1391        3100 :     if( aLibDirPath.isEmpty() )
    1392             :     {
    1393           0 :         INetURLObject aInetObj( maLibraryPath.getToken(1, (sal_Unicode)';') );
    1394           0 :         aInetObj.insertName( aName, true, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    1395             :         checkStorageURL( aInetObj.GetMainURL( INetURLObject::NO_DECODE ), pLib->maLibInfoFileURL,
    1396           0 :                          pLib->maStorageURL, pLib->maUnexpandedStorageURL );
    1397           0 :         aLibDirPath = pLib->maStorageURL;
    1398             :     }
    1399             : 
    1400        3100 :     if( !mxSFI->isFolder( aLibDirPath ) )
    1401             :     {
    1402             :         try
    1403             :         {
    1404           0 :             mxSFI->createFolder( aLibDirPath );
    1405             :         }
    1406           0 :         catch(const Exception& )
    1407             :         {}
    1408             :     }
    1409             : 
    1410        3100 :     return aLibDirPath;
    1411             : }
    1412             : 
    1413             : // Storing
    1414           4 : void SfxLibraryContainer::implStoreLibrary( SfxLibrary* pLib,
    1415             :                                             const OUString& aName,
    1416             :                                             const uno::Reference< embed::XStorage >& xStorage )
    1417             : {
    1418           4 :     OUString aDummyLocation;
    1419           8 :     Reference< XSimpleFileAccess3 > xDummySFA;
    1420           8 :     Reference< XInteractionHandler > xDummyHandler;
    1421           8 :     implStoreLibrary( pLib, aName, xStorage, aDummyLocation, xDummySFA, xDummyHandler );
    1422           4 : }
    1423             : 
    1424             : // New variant for library export
    1425           4 : void SfxLibraryContainer::implStoreLibrary( SfxLibrary* pLib,
    1426             :                                             const OUString& aName,
    1427             :                                             const uno::Reference< embed::XStorage >& xStorage,
    1428             :                                             const OUString& aTargetURL,
    1429             :                                             Reference< XSimpleFileAccess3 > xToUseSFI,
    1430             :                                             const Reference< XInteractionHandler >& xHandler )
    1431             : {
    1432           4 :     bool bLink = pLib->mbLink;
    1433           4 :     bool bStorage = xStorage.is() && !bLink;
    1434             : 
    1435           4 :     Sequence< OUString > aElementNames = pLib->getElementNames();
    1436           4 :     sal_Int32 nNameCount = aElementNames.getLength();
    1437           4 :     const OUString* pNames = aElementNames.getConstArray();
    1438             : 
    1439           4 :     if( bStorage )
    1440             :     {
    1441           6 :         for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
    1442             :         {
    1443           2 :             OUString aElementName = pNames[ i ];
    1444           4 :             OUString aStreamName = aElementName;
    1445           2 :             aStreamName += ".xml";
    1446             : 
    1447           2 :             if( !isLibraryElementValid( pLib->getByName( aElementName ) ) )
    1448             :             {
    1449             :                 SAL_WARN(
    1450             :                     "basic",
    1451             :                     "invalid library element \"" << aElementName << '"');
    1452           0 :                 continue;
    1453             :             }
    1454             :             try
    1455             :             {
    1456           2 :                 uno::Reference< io::XStream > xElementStream = xStorage->openStreamElement(
    1457             :                                                                     aStreamName,
    1458           2 :                                                                     embed::ElementModes::READWRITE );
    1459             :                 //    throw uno::RuntimeException(); // TODO: method must either return the stream or throw an exception
    1460             : 
    1461           4 :                 OUString aMime( "text/xml" );
    1462             : 
    1463           4 :                 uno::Reference< beans::XPropertySet > xProps( xElementStream, uno::UNO_QUERY );
    1464             :                 SAL_WARN_IF(
    1465             :                     !xProps.is(), "basic",
    1466             :                     "The StorageStream must implement XPropertySet interface!");
    1467             :                 //if ( !xProps.is() ) //TODO
    1468             : 
    1469           2 :                 if ( xProps.is() )
    1470             :                 {
    1471           2 :                     xProps->setPropertyValue("MediaType", uno::makeAny( aMime ) );
    1472             : 
    1473             :                     // #87671 Allow encryption
    1474           2 :                     xProps->setPropertyValue("UseCommonStoragePasswordEncryption", uno::makeAny( sal_True ) );
    1475             : 
    1476           2 :                     Reference< XOutputStream > xOutput = xElementStream->getOutputStream();
    1477           4 :                     Reference< XNameContainer > xLib( pLib );
    1478           4 :                     writeLibraryElement( xLib, aElementName, xOutput );
    1479           2 :                 }
    1480             :             }
    1481           0 :             catch(const uno::Exception& )
    1482             :             {
    1483             :                 SAL_WARN("basic", "Problem during storing of library!");
    1484             :                 // TODO: error handling?
    1485             :             }
    1486           2 :         }
    1487           4 :         pLib->storeResourcesToStorage( xStorage );
    1488             :     }
    1489             :     else
    1490             :     {
    1491             :         // Export?
    1492           0 :         bool bExport = !aTargetURL.isEmpty();
    1493             :         try
    1494             :         {
    1495           0 :             Reference< XSimpleFileAccess3 > xSFI = mxSFI;
    1496           0 :             if( xToUseSFI.is() )
    1497             :             {
    1498           0 :                 xSFI = xToUseSFI;
    1499             :             }
    1500           0 :             OUString aLibDirPath;
    1501           0 :             if( bExport )
    1502             :             {
    1503           0 :                 INetURLObject aInetObj( aTargetURL );
    1504           0 :                 aInetObj.insertName( aName, true, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    1505           0 :                 aLibDirPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1506             : 
    1507           0 :                 if( !xSFI->isFolder( aLibDirPath ) )
    1508             :                 {
    1509           0 :                     xSFI->createFolder( aLibDirPath );
    1510             :                 }
    1511           0 :                 pLib->storeResourcesToURL( aLibDirPath, xHandler );
    1512             :             }
    1513             :             else
    1514             :             {
    1515           0 :                 aLibDirPath = createAppLibraryFolder( pLib, aName );
    1516           0 :                 pLib->storeResources();
    1517             :             }
    1518             : 
    1519           0 :             for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
    1520             :             {
    1521           0 :                 OUString aElementName = pNames[ i ];
    1522             : 
    1523           0 :                 INetURLObject aElementInetObj( aLibDirPath );
    1524             :                 aElementInetObj.insertName( aElementName, false,
    1525             :                                             INetURLObject::LAST_SEGMENT, true,
    1526           0 :                                             INetURLObject::ENCODE_ALL );
    1527           0 :                 aElementInetObj.setExtension( maLibElementFileExtension );
    1528           0 :                 OUString aElementPath( aElementInetObj.GetMainURL( INetURLObject::NO_DECODE ) );
    1529             : 
    1530           0 :                 if( !isLibraryElementValid( pLib->getByName( aElementName ) ) )
    1531             :                 {
    1532             :                     SAL_WARN(
    1533             :                         "basic",
    1534             :                         "invalid library element \"" << aElementName << '"');
    1535           0 :                     continue;
    1536             :                 }
    1537             : 
    1538             :                 // TODO: Check modified
    1539             :                 try
    1540             :                 {
    1541           0 :                     if( xSFI->exists( aElementPath ) )
    1542             :                     {
    1543           0 :                         xSFI->kill( aElementPath );
    1544             :                     }
    1545           0 :                     Reference< XOutputStream > xOutput = xSFI->openFileWrite( aElementPath );
    1546           0 :                     Reference< XNameContainer > xLib( pLib );
    1547           0 :                     writeLibraryElement( xLib, aElementName, xOutput );
    1548           0 :                     xOutput->closeOutput();
    1549             :                 }
    1550           0 :                 catch(const Exception& )
    1551             :                 {
    1552           0 :                     if( bExport )
    1553             :                     {
    1554           0 :                         throw;
    1555             :                     }
    1556           0 :                     SfxErrorContext aEc( ERRCTX_SFX_SAVEDOC, aElementPath );
    1557           0 :                     ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
    1558             :                 }
    1559           0 :             }
    1560             :         }
    1561           0 :         catch(const Exception& )
    1562             :         {
    1563           0 :             if( bExport )
    1564             :             {
    1565           0 :                 throw;
    1566             :             }
    1567             :         }
    1568           4 :     }
    1569           4 : }
    1570             : 
    1571           4 : void SfxLibraryContainer::implStoreLibraryIndexFile( SfxLibrary* pLib,
    1572             :                                                      const ::xmlscript::LibDescriptor& rLib,
    1573             :                                                      const uno::Reference< embed::XStorage >& xStorage )
    1574             : {
    1575           4 :     OUString aDummyLocation;
    1576           8 :     Reference< XSimpleFileAccess3 > xDummySFA;
    1577           8 :     implStoreLibraryIndexFile( pLib, rLib, xStorage, aDummyLocation, xDummySFA );
    1578           4 : }
    1579             : 
    1580             : // New variant for library export
    1581           4 : void SfxLibraryContainer::implStoreLibraryIndexFile( SfxLibrary* pLib,
    1582             :                                                      const ::xmlscript::LibDescriptor& rLib,
    1583             :                                                      const uno::Reference< embed::XStorage >& xStorage,
    1584             :                                                      const OUString& aTargetURL,
    1585             :                                                      Reference< XSimpleFileAccess3 > xToUseSFI )
    1586             : {
    1587             :     // Create sax writer
    1588           4 :     Reference< XWriter > xWriter = xml::sax::Writer::create(mxContext);
    1589             : 
    1590           4 :     bool bLink = pLib->mbLink;
    1591           4 :     bool bStorage = xStorage.is() && !bLink;
    1592             : 
    1593             :     // Write info file
    1594           8 :     uno::Reference< io::XOutputStream > xOut;
    1595           8 :     uno::Reference< io::XStream > xInfoStream;
    1596           4 :     if( bStorage )
    1597             :     {
    1598           4 :         OUString aStreamName( maInfoFileName );
    1599           4 :         aStreamName += "-lb.xml";
    1600             : 
    1601             :         try
    1602             :         {
    1603           4 :             xInfoStream = xStorage->openStreamElement( aStreamName, embed::ElementModes::READWRITE );
    1604             :             SAL_WARN_IF(!xInfoStream.is(), "basic", "No stream!");
    1605           4 :             uno::Reference< beans::XPropertySet > xProps( xInfoStream, uno::UNO_QUERY );
    1606             :             //    throw uno::RuntimeException(); // TODO
    1607             : 
    1608           4 :             if ( xProps.is() )
    1609             :             {
    1610           4 :                 OUString aMime("text/xml");
    1611           4 :                 xProps->setPropertyValue("MediaType", uno::makeAny( aMime ) );
    1612             : 
    1613             :                 // #87671 Allow encryption
    1614           4 :                 xProps->setPropertyValue("UseCommonStoragePasswordEncryption", uno::makeAny( sal_True ) );
    1615             : 
    1616           4 :                 xOut = xInfoStream->getOutputStream();
    1617           4 :             }
    1618             :         }
    1619           0 :         catch(const uno::Exception& )
    1620             :         {
    1621             :             SAL_WARN("basic", "Problem during storing of library index file!");
    1622             :             // TODO: error handling?
    1623           4 :         }
    1624             :     }
    1625             :     else
    1626             :     {
    1627             :         // Export?
    1628           0 :         bool bExport = !aTargetURL.isEmpty();
    1629           0 :         Reference< XSimpleFileAccess3 > xSFI = mxSFI;
    1630           0 :         if( xToUseSFI.is() )
    1631             :         {
    1632           0 :             xSFI = xToUseSFI;
    1633             :         }
    1634           0 :         OUString aLibInfoPath;
    1635           0 :         if( bExport )
    1636             :         {
    1637           0 :             INetURLObject aInetObj( aTargetURL );
    1638           0 :             aInetObj.insertName( rLib.aName, true, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    1639           0 :             OUString aLibDirPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1640           0 :             if( !xSFI->isFolder( aLibDirPath ) )
    1641             :             {
    1642           0 :                 xSFI->createFolder( aLibDirPath );
    1643             :             }
    1644           0 :             aInetObj.insertName( maInfoFileName, false, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    1645           0 :             aInetObj.setExtension( OUString( "xlb" ) );
    1646           0 :             aLibInfoPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
    1647             :         }
    1648             :         else
    1649             :         {
    1650           0 :             createAppLibraryFolder( pLib, rLib.aName );
    1651           0 :             aLibInfoPath = pLib->maLibInfoFileURL;
    1652             :         }
    1653             : 
    1654             :         try
    1655             :         {
    1656           0 :             if( xSFI->exists( aLibInfoPath ) )
    1657             :             {
    1658           0 :                 xSFI->kill( aLibInfoPath );
    1659             :             }
    1660           0 :             xOut = xSFI->openFileWrite( aLibInfoPath );
    1661             :         }
    1662           0 :         catch(const Exception& )
    1663             :         {
    1664           0 :             if( bExport )
    1665             :             {
    1666           0 :                 throw;
    1667             :             }
    1668           0 :             SfxErrorContext aEc( ERRCTX_SFX_SAVEDOC, aLibInfoPath );
    1669           0 :             ErrorHandler::HandleError(  ERRCODE_IO_GENERAL );
    1670           0 :         }
    1671             :     }
    1672           4 :     if( !xOut.is() )
    1673             :     {
    1674             :         SAL_WARN("basic", "couldn't open output stream");
    1675           4 :         return;
    1676             :     }
    1677           4 :     xWriter->setOutputStream( xOut );
    1678           8 :     xmlscript::exportLibrary( xWriter, rLib );
    1679             : }
    1680             : 
    1681             : 
    1682        3132 : bool SfxLibraryContainer::implLoadLibraryIndexFile(  SfxLibrary* pLib,
    1683             :                                                      ::xmlscript::LibDescriptor& rLib,
    1684             :                                                      const uno::Reference< embed::XStorage >& xStorage,
    1685             :                                                      const OUString& aIndexFileName )
    1686             : {
    1687        3132 :     Reference< XParser > xParser = xml::sax::Parser::create(mxContext);
    1688             : 
    1689        3132 :     bool bLink = false;
    1690        3132 :     bool bStorage = false;
    1691        3132 :     if( pLib )
    1692             :     {
    1693        3132 :         bLink = pLib->mbLink;
    1694        3132 :         bStorage = xStorage.is() && !bLink;
    1695             :     }
    1696             : 
    1697             :     // Read info file
    1698        6264 :     uno::Reference< io::XInputStream > xInput;
    1699        6264 :     OUString aLibInfoPath;
    1700        3132 :     if( bStorage )
    1701             :     {
    1702          32 :         aLibInfoPath = maInfoFileName;
    1703          32 :         aLibInfoPath += "-lb.xml";
    1704             : 
    1705             :         try
    1706             :         {
    1707             :             uno::Reference< io::XStream > xInfoStream =
    1708          32 :                 xStorage->openStreamElement( aLibInfoPath, embed::ElementModes::READ );
    1709          32 :             xInput = xInfoStream->getInputStream();
    1710             :         }
    1711           0 :         catch(const uno::Exception& )
    1712             :         {}
    1713             :     }
    1714             :     else
    1715             :     {
    1716             :         // Create Input stream
    1717             :         //String aLibInfoPath; // attention: THIS PROBLEM MUST BE REVIEWED BY SCRIPTING OWNER!!!
    1718             : 
    1719        3100 :         if( pLib )
    1720             :         {
    1721        3100 :             createAppLibraryFolder( pLib, rLib.aName );
    1722        3100 :             aLibInfoPath = pLib->maLibInfoFileURL;
    1723             :         }
    1724             :         else
    1725             :         {
    1726           0 :             aLibInfoPath = aIndexFileName;
    1727             :         }
    1728             :         try
    1729             :         {
    1730        3100 :             xInput = mxSFI->openFileRead( aLibInfoPath );
    1731             :         }
    1732           0 :         catch(const Exception& )
    1733             :         {
    1734           0 :             xInput.clear();
    1735           0 :             if( !GbMigrationSuppressErrors )
    1736             :             {
    1737           0 :                 SfxErrorContext aEc( ERRCTX_SFX_LOADBASIC, aLibInfoPath );
    1738           0 :                 ErrorHandler::HandleError(  ERRCODE_IO_GENERAL );
    1739             :             }
    1740             :         }
    1741             :     }
    1742        3132 :     if( !xInput.is() )
    1743             :     {
    1744           0 :         return false;
    1745             :     }
    1746             : 
    1747        6264 :     InputSource source;
    1748        3132 :     source.aInputStream = xInput;
    1749        3132 :     source.sSystemId    = aLibInfoPath;
    1750             : 
    1751             :     // start parsing
    1752             :     try
    1753             :     {
    1754        3132 :         xParser->setDocumentHandler( ::xmlscript::importLibrary( rLib ) );
    1755        3132 :         xParser->parseStream( source );
    1756             :     }
    1757           0 :     catch(const Exception& )
    1758             :     {
    1759             :         SAL_WARN("basic", "Parsing error");
    1760           0 :         SfxErrorContext aEc( ERRCTX_SFX_LOADBASIC, aLibInfoPath );
    1761           0 :         ErrorHandler::HandleError(  ERRCODE_IO_GENERAL );
    1762           0 :         return false;
    1763             :     }
    1764             : 
    1765        3132 :     if( !pLib )
    1766             :     {
    1767           0 :         Reference< XNameContainer > xLib = createLibrary( rLib.aName );
    1768           0 :         pLib = static_cast< SfxLibrary* >( xLib.get() );
    1769           0 :         pLib->mbLoaded = false;
    1770           0 :         rLib.aStorageURL = aIndexFileName;
    1771             :         checkStorageURL( rLib.aStorageURL, pLib->maLibInfoFileURL, pLib->maStorageURL,
    1772           0 :                          pLib->maUnexpandedStorageURL );
    1773             : 
    1774           0 :         implImportLibDescriptor( pLib, rLib );
    1775             :     }
    1776             : 
    1777        6264 :     return true;
    1778             : }
    1779             : 
    1780        6120 : void SfxLibraryContainer::implImportLibDescriptor( SfxLibrary* pLib,
    1781             :                                                    ::xmlscript::LibDescriptor& rLib )
    1782             : {
    1783        6120 :     if( !pLib->mbInitialised )
    1784             :     {
    1785        3132 :         sal_Int32 nElementCount = rLib.aElementNames.getLength();
    1786        3132 :         const OUString* pElementNames = rLib.aElementNames.getConstArray();
    1787        3132 :         Any aDummyElement = createEmptyLibraryElement();
    1788       18492 :         for( sal_Int32 i = 0 ; i < nElementCount ; i++ )
    1789             :         {
    1790       15360 :             pLib->maNameContainer.insertByName( pElementNames[i], aDummyElement );
    1791             :         }
    1792        3132 :         pLib->mbPasswordProtected = rLib.bPasswordProtected;
    1793        3132 :         pLib->mbReadOnly = rLib.bReadOnly;
    1794        3132 :         pLib->mbPreload  = rLib.bPreload;
    1795        3132 :         pLib->implSetModified( false );
    1796        3132 :         pLib->mbInitialised = true;
    1797             :     }
    1798        6120 : }
    1799             : 
    1800             : 
    1801             : // Methods of new XLibraryStorage interface?
    1802        2564 : void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XStorage >& i_rStorage,
    1803             :                                                bool bComplete )
    1804             : {
    1805        2564 :     const Sequence< OUString > aNames = maNameContainer.getElementNames();
    1806        2564 :     const sal_Int32 nNameCount = aNames.getLength();
    1807        2564 :     const OUString* pName = aNames.getConstArray();
    1808        2564 :     const OUString* pNamesEnd = aNames.getConstArray() + nNameCount;
    1809             : 
    1810             :     // Don't count libs from shared index file
    1811        2564 :     sal_Int32 nLibsToSave = nNameCount;
    1812        6264 :     for( ; pName != pNamesEnd; ++pName )
    1813             :     {
    1814        3700 :         SfxLibrary* pImplLib = getImplLib( *pName );
    1815        3700 :         if( pImplLib->mbSharedIndexFile || pImplLib->mbExtension )
    1816             :         {
    1817        1152 :             nLibsToSave--;
    1818             :         }
    1819             :     }
    1820             :     // Write to storage?
    1821        2564 :     bool bStorage = i_rStorage.is();
    1822        2572 :     uno::Reference< embed::XStorage > xSourceLibrariesStor;
    1823        2572 :     uno::Reference< embed::XStorage > xTargetLibrariesStor;
    1824        2572 :     OUString sTempTargetStorName;
    1825        2564 :     const bool bInplaceStorage = bStorage && ( i_rStorage == mxStorage );
    1826             : 
    1827        2564 :     if( nLibsToSave == 0 )
    1828             :     {
    1829          20 :         if ( bInplaceStorage && mxStorage->hasByName(maLibrariesDir) )
    1830             :         {
    1831           4 :             mxStorage->removeElement(maLibrariesDir);
    1832             :         }
    1833          20 :         return;
    1834             :     }
    1835             : 
    1836        2544 :     if ( bStorage )
    1837             :     {
    1838             :         // Don't write if only empty standard lib exists
    1839        2432 :         if ( ( nLibsToSave == 1 ) && ( aNames[0] == "Standard" ) )
    1840             :         {
    1841        2428 :             Any aLibAny = maNameContainer.getByName( aNames[0] );
    1842        2432 :             Reference< XNameAccess > xNameAccess;
    1843        2428 :             aLibAny >>= xNameAccess;
    1844        2428 :             if ( ! xNameAccess->hasElements() )
    1845             :             {
    1846        2424 :                 if ( bInplaceStorage && mxStorage->hasByName(maLibrariesDir) )
    1847             :                 {
    1848           4 :                     mxStorage->removeElement(maLibrariesDir);
    1849             :                 }
    1850        2424 :                 return;
    1851           4 :             }
    1852             :         }
    1853             : 
    1854             :         // create the empty target storage
    1855             :         try
    1856             :         {
    1857           8 :             OUString sTargetLibrariesStoreName;
    1858           8 :             if ( bInplaceStorage )
    1859             :             {
    1860             :                 // create a temporary target storage
    1861           4 :                 const OUStringBuffer aTempTargetNameBase = maLibrariesDir + OUString( "_temp_" );
    1862           4 :                 sal_Int32 index = 0;
    1863             :                 do
    1864             :                 {
    1865           4 :                     OUStringBuffer aTempTargetName( aTempTargetNameBase );
    1866           4 :                     aTempTargetName.append( index++ );
    1867             : 
    1868           4 :                     sTargetLibrariesStoreName = aTempTargetName.makeStringAndClear();
    1869           4 :                     if ( !i_rStorage->hasByName( sTargetLibrariesStoreName ) )
    1870             :                     {
    1871           4 :                         break;
    1872           0 :                     }
    1873             :                 }
    1874             :                 while ( true );
    1875           4 :                 sTempTargetStorName = sTargetLibrariesStoreName;
    1876             :             }
    1877             :             else
    1878             :             {
    1879           4 :                 sTargetLibrariesStoreName = maLibrariesDir;
    1880           4 :                 if ( i_rStorage->hasByName( sTargetLibrariesStoreName ) )
    1881             :                 {
    1882           0 :                     i_rStorage->removeElement( sTargetLibrariesStoreName );
    1883             :                 }
    1884             :             }
    1885             : 
    1886           8 :             xTargetLibrariesStor.set( i_rStorage->openStorageElement( sTargetLibrariesStoreName, embed::ElementModes::READWRITE ), UNO_QUERY_THROW );
    1887             :         }
    1888           0 :         catch( const uno::Exception& )
    1889             :         {
    1890             :             DBG_UNHANDLED_EXCEPTION();
    1891           0 :             return;
    1892             :         }
    1893             : 
    1894             :         // open the source storage which might be used to copy yet-unmodified libraries
    1895             :         try
    1896             :         {
    1897           8 :             if ( mxStorage->hasByName( maLibrariesDir ) || bInplaceStorage )
    1898             :             {
    1899          24 :                 xSourceLibrariesStor = mxStorage->openStorageElement( maLibrariesDir,
    1900          16 :                                                    bInplaceStorage ? embed::ElementModes::READWRITE : embed::ElementModes::READ );
    1901             :             }
    1902             :         }
    1903           0 :         catch( const uno::Exception& )
    1904             :         {
    1905             :             DBG_UNHANDLED_EXCEPTION();
    1906           0 :             return;
    1907             :         }
    1908             :     }
    1909             : 
    1910         120 :     int iArray = 0;
    1911         120 :     pName = aNames.getConstArray();
    1912         128 :     ::xmlscript::LibDescriptor aLibDescriptorForExtensionLibs;
    1913         128 :     boost::scoped_ptr< ::xmlscript::LibDescriptorArray > pLibArray(new ::xmlscript::LibDescriptorArray(nLibsToSave));
    1914        1252 :     for( ; pName != pNamesEnd; ++pName )
    1915             :     {
    1916        1132 :         SfxLibrary* pImplLib = getImplLib( *pName );
    1917        1132 :         if( pImplLib->mbSharedIndexFile )
    1918             :         {
    1919        1008 :             continue;
    1920             :         }
    1921         124 :         const bool bExtensionLib = pImplLib->mbExtension;
    1922             :         ::xmlscript::LibDescriptor& rLib = bExtensionLib ?
    1923         124 :               aLibDescriptorForExtensionLibs : pLibArray->mpLibs[iArray];
    1924         124 :         if( !bExtensionLib )
    1925             :         {
    1926         124 :             iArray++;
    1927             :         }
    1928         124 :         rLib.aName = *pName;
    1929             : 
    1930         124 :         rLib.bLink = pImplLib->mbLink;
    1931         124 :         if( !bStorage || pImplLib->mbLink )
    1932             :         {
    1933         112 :             rLib.aStorageURL = ( pImplLib->maUnexpandedStorageURL.getLength() ) ?
    1934         112 :                 pImplLib->maUnexpandedStorageURL : pImplLib->maLibInfoFileURL;
    1935             :         }
    1936         124 :         rLib.bReadOnly = pImplLib->mbReadOnly;
    1937         124 :         rLib.bPreload = pImplLib->mbPreload;
    1938         124 :         rLib.bPasswordProtected = pImplLib->mbPasswordProtected;
    1939         124 :         rLib.aElementNames = pImplLib->getElementNames();
    1940             : 
    1941         124 :         if( pImplLib->implIsModified() || bComplete )
    1942             :         {
    1943             : // Testing pImplLib->implIsModified() is not reliable,
    1944             : // IMHO the value of pImplLib->implIsModified() should
    1945             : // reflect whether the library ( in-memory ) model
    1946             : // is in sync with the library container's own storage. Currently
    1947             : // whenever the library model is written to *any* storage
    1948             : // pImplLib->implSetModified( sal_False ) is called
    1949             : // The way the code works, especially the way that sfx uses
    1950             : // temp storage when saving ( and later sets the root storage of the
    1951             : // library container ) and similar madness in dbaccess means some surgery
    1952             : // is required to make it possible to successfully use this optimisation
    1953             : // It would be possible to do the implSetModified() call below only
    1954             : // conditionally, but that would require an additional boolean to be
    1955             : // passed in via the XStorageBasedDocument::storeLibrariesToStorage()...
    1956             : // fdo#68983: If there's a password and the password is not known, only
    1957             : // copying the storage works!
    1958             :             // Can we simply copy the storage?
    1959          44 :             if (!mbOldInfoFormat && !pImplLib->isLoadedStorable() &&
    1960          28 :                 !mbOasis2OOoFormat && xSourceLibrariesStor.is())
    1961             :             {
    1962             :                 try
    1963             :                 {
    1964           8 :                     xSourceLibrariesStor->copyElementTo( rLib.aName, xTargetLibrariesStor, rLib.aName );
    1965             :                 }
    1966           0 :                 catch( const uno::Exception& )
    1967             :                 {
    1968             :                     DBG_UNHANDLED_EXCEPTION();
    1969             :                     // TODO: error handling?
    1970             :                 }
    1971             :             }
    1972             :             else
    1973             :             {
    1974           4 :                 uno::Reference< embed::XStorage > xLibraryStor;
    1975           4 :                 if( bStorage )
    1976             :                 {
    1977             :                     try
    1978             :                     {
    1979          12 :                         xLibraryStor = xTargetLibrariesStor->openStorageElement(
    1980             :                                                                         rLib.aName,
    1981           8 :                                                                         embed::ElementModes::READWRITE );
    1982             :                     }
    1983           0 :                     catch(const uno::Exception& )
    1984             :                     {
    1985             :                         #if OSL_DEBUG_LEVEL > 0
    1986             :                         Any aError( ::cppu::getCaughtException() );
    1987             :                         SAL_WARN(
    1988             :                             "basic",
    1989             :                             "couldn't create sub storage for library \""
    1990             :                                 << rLib.aName << "\". Exception: "
    1991             :                                 << comphelper::anyToString(aError));
    1992             :                         #endif
    1993           0 :                         throw;
    1994             :                     }
    1995             :                 }
    1996             : 
    1997             :                 // Maybe lib is not loaded?!
    1998           4 :                 if( bComplete )
    1999             :                 {
    2000           4 :                     loadLibrary( rLib.aName );
    2001             :                 }
    2002           4 :                 if( pImplLib->mbPasswordProtected )
    2003             :                 {
    2004           0 :                     implStorePasswordLibrary( pImplLib, rLib.aName, xLibraryStor, uno::Reference< task::XInteractionHandler >() );
    2005             :                     // TODO: Check return value
    2006             :                 }
    2007             :                 else
    2008             :                 {
    2009           4 :                     implStoreLibrary( pImplLib, rLib.aName, xLibraryStor );
    2010             :                 }
    2011           4 :                 implStoreLibraryIndexFile( pImplLib, rLib, xLibraryStor );
    2012           4 :                 if( bStorage )
    2013             :                 {
    2014             :                     try
    2015             :                     {
    2016           4 :                         uno::Reference< embed::XTransactedObject > xTransact( xLibraryStor, uno::UNO_QUERY_THROW );
    2017           4 :                         xTransact->commit();
    2018             :                     }
    2019           0 :                     catch(const uno::Exception& )
    2020             :                     {
    2021             :                         DBG_UNHANDLED_EXCEPTION();
    2022             :                         // TODO: error handling
    2023           0 :                         throw;
    2024             :                     }
    2025           4 :                 }
    2026             :             }
    2027          12 :             maModifiable.setModified( true );
    2028          12 :             pImplLib->implSetModified( false );
    2029             :         }
    2030             : 
    2031             :         // For container info ReadOnly refers to mbReadOnlyLink
    2032         124 :         rLib.bReadOnly = pImplLib->mbReadOnlyLink;
    2033             :     }
    2034             : 
    2035             :     // if we did an in-place save into a storage (i.e. a save into the storage we were already based on),
    2036             :     // then we need to clean up the temporary storage we used for this
    2037         120 :     if ( bInplaceStorage && !sTempTargetStorName.isEmpty() )
    2038             :     {
    2039             :         SAL_WARN_IF(
    2040             :             !xSourceLibrariesStor.is(), "basic",
    2041             :             ("SfxLibrariesContainer::storeLibraries_impl: unexpected: we should"
    2042             :              " have a source storage here!"));
    2043             :         try
    2044             :         {
    2045             :             // for this, we first remove everything from the source storage, then copy the complete content
    2046             :             // from the temporary target storage. From then on, what used to be the "source storage" becomes
    2047             :             // the "targt storage" for all subsequent operations.
    2048             : 
    2049             :             // (We cannot simply remove the storage, denoted by maLibrariesDir, from i_rStorage - there might be
    2050             :             // open references to it.)
    2051             : 
    2052           4 :             if ( xSourceLibrariesStor.is() )
    2053             :             {
    2054             :                 // remove
    2055           4 :                 const Sequence< OUString > aRemoveNames( xSourceLibrariesStor->getElementNames() );
    2056          24 :                 for ( const OUString* pRemoveName = aRemoveNames.getConstArray();
    2057          12 :                       pRemoveName != aRemoveNames.getConstArray() + aRemoveNames.getLength();
    2058             :                       ++pRemoveName
    2059             :                     )
    2060             :                 {
    2061           8 :                     xSourceLibrariesStor->removeElement( *pRemoveName );
    2062             :                 }
    2063             : 
    2064             :                 // copy
    2065           8 :                 const Sequence< OUString > aCopyNames( xTargetLibrariesStor->getElementNames() );
    2066          16 :                 for ( const OUString* pCopyName = aCopyNames.getConstArray();
    2067           8 :                       pCopyName != aCopyNames.getConstArray() + aCopyNames.getLength();
    2068             :                       ++pCopyName
    2069             :                     )
    2070             :                 {
    2071           4 :                     xTargetLibrariesStor->copyElementTo( *pCopyName, xSourceLibrariesStor, *pCopyName );
    2072           4 :                 }
    2073             :             }
    2074             : 
    2075             :             // close and remove temp target
    2076           4 :             xTargetLibrariesStor->dispose();
    2077           4 :             i_rStorage->removeElement( sTempTargetStorName );
    2078           4 :             xTargetLibrariesStor.clear();
    2079           4 :             sTempTargetStorName = "";
    2080             : 
    2081             :             // adjust target
    2082           4 :             xTargetLibrariesStor = xSourceLibrariesStor;
    2083           4 :             xSourceLibrariesStor.clear();
    2084             :         }
    2085           0 :         catch( const Exception& )
    2086             :         {
    2087             :             DBG_UNHANDLED_EXCEPTION();
    2088           0 :             throw;
    2089             :         }
    2090             :     }
    2091             : 
    2092         120 :     if( !mbOldInfoFormat && !maModifiable.isModified() )
    2093             :     {
    2094         112 :         return;
    2095             :     }
    2096           8 :     maModifiable.setModified( false );
    2097           8 :     mbOldInfoFormat = false;
    2098             : 
    2099             :     // Write library container info
    2100             :     // Create sax writer
    2101          16 :     Reference< XWriter > xWriter = xml::sax::Writer::create(mxContext);
    2102             : 
    2103             :     // Write info file
    2104          16 :     uno::Reference< io::XOutputStream > xOut;
    2105          16 :     uno::Reference< io::XStream > xInfoStream;
    2106           8 :     if( bStorage )
    2107             :     {
    2108           8 :         OUString aStreamName( maInfoFileName );
    2109           8 :         aStreamName += "-lc.xml";
    2110             : 
    2111             :         try
    2112             :         {
    2113           8 :             xInfoStream = xTargetLibrariesStor->openStreamElement( aStreamName, embed::ElementModes::READWRITE );
    2114           8 :             uno::Reference< beans::XPropertySet > xProps( xInfoStream, uno::UNO_QUERY );
    2115             :             SAL_WARN_IF(
    2116             :                 !xProps.is(), "basic",
    2117             :                 "The stream must implement XPropertySet!");
    2118           8 :             if ( !xProps.is() )
    2119             :             {
    2120           0 :                 throw uno::RuntimeException();
    2121             :             }
    2122          16 :             OUString aMime( "text/xml" );
    2123           8 :             xProps->setPropertyValue("MediaType", uno::makeAny( aMime ) );
    2124             : 
    2125             :             // #87671 Allow encryption
    2126           8 :             xProps->setPropertyValue("UseCommonStoragePasswordEncryption", uno::makeAny( sal_True ) );
    2127             : 
    2128          16 :             xOut = xInfoStream->getOutputStream();
    2129             :         }
    2130           0 :         catch(const uno::Exception& )
    2131             :         {
    2132           0 :             ErrorHandler::HandleError(  ERRCODE_IO_GENERAL );
    2133           8 :         }
    2134             :     }
    2135             :     else
    2136             :     {
    2137             :         // Create Output stream
    2138           0 :         INetURLObject aLibInfoInetObj( maLibraryPath.getToken(1, (sal_Unicode)';') );
    2139           0 :         aLibInfoInetObj.insertName( maInfoFileName, false, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    2140           0 :         aLibInfoInetObj.setExtension( OUString("xlc") );
    2141           0 :         OUString aLibInfoPath( aLibInfoInetObj.GetMainURL( INetURLObject::NO_DECODE ) );
    2142             : 
    2143             :         try
    2144             :         {
    2145           0 :             if( mxSFI->exists( aLibInfoPath ) )
    2146             :             {
    2147           0 :                 mxSFI->kill( aLibInfoPath );
    2148             :             }
    2149           0 :             xOut = mxSFI->openFileWrite( aLibInfoPath );
    2150             :         }
    2151           0 :         catch(const Exception& )
    2152             :         {
    2153           0 :             xOut.clear();
    2154           0 :             SfxErrorContext aEc( ERRCTX_SFX_SAVEDOC, aLibInfoPath );
    2155           0 :             ErrorHandler::HandleError(  ERRCODE_IO_GENERAL );
    2156           0 :         }
    2157             : 
    2158             :     }
    2159           8 :     if( !xOut.is() )
    2160             :     {
    2161             :         SAL_WARN("basic", "couldn't open output stream");
    2162           0 :         return;
    2163             :     }
    2164             : 
    2165           8 :     xWriter->setOutputStream( xOut );
    2166             : 
    2167             :     try
    2168             :     {
    2169           8 :         xmlscript::exportLibraryContainer( xWriter, pLibArray.get() );
    2170           8 :         if ( bStorage )
    2171             :         {
    2172           8 :             uno::Reference< embed::XTransactedObject > xTransact( xTargetLibrariesStor, uno::UNO_QUERY );
    2173             :             SAL_WARN_IF(
    2174             :                 !xTransact.is(), "basic",
    2175             :                 "The storage must implement XTransactedObject!");
    2176           8 :             if ( !xTransact.is() )
    2177             :             {
    2178           0 :                 throw uno::RuntimeException();
    2179             :             }
    2180           8 :             xTransact->commit();
    2181             :         }
    2182             :     }
    2183           0 :     catch(const uno::Exception& )
    2184             :     {
    2185             :         SAL_WARN("basic", "Problem during storing of libraries!");
    2186           0 :         ErrorHandler::HandleError(  ERRCODE_IO_GENERAL );
    2187           8 :     }
    2188             : }
    2189             : 
    2190             : 
    2191             : // Methods XElementAccess
    2192           0 : Type SAL_CALL SfxLibraryContainer::getElementType()
    2193             :     throw(RuntimeException, std::exception)
    2194             : {
    2195           0 :     LibraryContainerMethodGuard aGuard( *this );
    2196           0 :     return maNameContainer.getElementType();
    2197             : }
    2198             : 
    2199        9940 : sal_Bool SfxLibraryContainer::hasElements()
    2200             :     throw(RuntimeException, std::exception)
    2201             : {
    2202        9940 :     LibraryContainerMethodGuard aGuard( *this );
    2203        9940 :     bool bRet = maNameContainer.hasElements();
    2204        9940 :     return bRet;
    2205             : }
    2206             : 
    2207             : // Methods XNameAccess
    2208       12480 : Any SfxLibraryContainer::getByName( const OUString& aName )
    2209             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
    2210             : {
    2211       12480 :     LibraryContainerMethodGuard aGuard( *this );
    2212       12480 :     Any aRetAny = maNameContainer.getByName( aName ) ;
    2213       12480 :     return aRetAny;
    2214             : }
    2215             : 
    2216       10934 : Sequence< OUString > SfxLibraryContainer::getElementNames()
    2217             :     throw(RuntimeException, std::exception)
    2218             : {
    2219       10934 :     LibraryContainerMethodGuard aGuard( *this );
    2220       10934 :     return maNameContainer.getElementNames();
    2221             : }
    2222             : 
    2223       21382 : sal_Bool SfxLibraryContainer::hasByName( const OUString& aName )
    2224             :     throw(RuntimeException, std::exception)
    2225             : {
    2226       21382 :     LibraryContainerMethodGuard aGuard( *this );
    2227       21382 :     return maNameContainer.hasByName( aName ) ;
    2228             : }
    2229             : 
    2230             : // Methods XLibraryContainer
    2231        7482 : Reference< XNameContainer > SAL_CALL SfxLibraryContainer::createLibrary( const OUString& Name )
    2232             :     throw(IllegalArgumentException, ElementExistException, RuntimeException, std::exception)
    2233             : {
    2234        7482 :     LibraryContainerMethodGuard aGuard( *this );
    2235        7482 :     SfxLibrary* pNewLib = implCreateLibrary( Name );
    2236        7482 :     pNewLib->maLibElementFileExtension = maLibElementFileExtension;
    2237             : 
    2238        7482 :     createVariableURL( pNewLib->maUnexpandedStorageURL, Name, maInfoFileName, true );
    2239             : 
    2240       14964 :     Reference< XNameAccess > xNameAccess = static_cast< XNameAccess* >( pNewLib );
    2241       14964 :     Any aElement;
    2242        7482 :     aElement <<= xNameAccess;
    2243        7482 :     maNameContainer.insertByName( Name, aElement );
    2244        7482 :     maModifiable.setModified( true );
    2245        7482 :     Reference< XNameContainer > xRet( xNameAccess, UNO_QUERY );
    2246       14964 :     return xRet;
    2247             : }
    2248             : 
    2249        2988 : Reference< XNameAccess > SAL_CALL SfxLibraryContainer::createLibraryLink
    2250             :     ( const OUString& Name, const OUString& StorageURL, sal_Bool ReadOnly )
    2251             :     throw(IllegalArgumentException, ElementExistException, RuntimeException, std::exception)
    2252             : {
    2253        2988 :     LibraryContainerMethodGuard aGuard( *this );
    2254             :     // TODO: Check other reasons to force ReadOnly status
    2255             :     //if( !ReadOnly )
    2256             :     //{
    2257             :     //}
    2258             : 
    2259        5976 :     OUString aLibInfoFileURL;
    2260        5976 :     OUString aLibDirURL;
    2261        5976 :     OUString aUnexpandedStorageURL;
    2262        2988 :     checkStorageURL( StorageURL, aLibInfoFileURL, aLibDirURL, aUnexpandedStorageURL );
    2263             : 
    2264             : 
    2265        2988 :     SfxLibrary* pNewLib = implCreateLibraryLink( Name, aLibInfoFileURL, aLibDirURL, ReadOnly );
    2266        2988 :     pNewLib->maLibElementFileExtension = maLibElementFileExtension;
    2267        2988 :     pNewLib->maUnexpandedStorageURL = aUnexpandedStorageURL;
    2268        2988 :     pNewLib->maOriginalStorageURL = StorageURL;
    2269             : 
    2270        5976 :     OUString aInitFileName;
    2271        5976 :     uno::Reference< embed::XStorage > xDummyStor;
    2272        5976 :     ::xmlscript::LibDescriptor aLibDesc;
    2273        2988 :     implLoadLibraryIndexFile( pNewLib, aLibDesc, xDummyStor, aInitFileName );
    2274        2988 :     implImportLibDescriptor( pNewLib, aLibDesc );
    2275             : 
    2276        2988 :     Reference< XNameAccess > xRet = static_cast< XNameAccess* >( pNewLib );
    2277        5976 :     Any aElement;
    2278        2988 :     aElement <<= xRet;
    2279        2988 :     maNameContainer.insertByName( Name, aElement );
    2280        2988 :     maModifiable.setModified( true );
    2281             : 
    2282        5976 :     OUString aUserSearchStr("vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE");
    2283        5976 :     OUString aSharedSearchStr("vnd.sun.star.expand:$UNO_SHARED_PACKAGES_CACHE");
    2284        5976 :     OUString aBundledSearchStr("vnd.sun.star.expand:$BUNDLED_EXTENSIONS");
    2285        2988 :     if( StorageURL.indexOf( aUserSearchStr ) != -1 )
    2286             :     {
    2287           0 :         pNewLib->mbExtension = true;
    2288             :     }
    2289        2988 :     else if( StorageURL.indexOf( aSharedSearchStr ) != -1 || StorageURL.indexOf( aBundledSearchStr ) != -1 )
    2290             :     {
    2291           0 :         pNewLib->mbExtension = true;
    2292           0 :         pNewLib->mbReadOnly = true;
    2293             :     }
    2294             : 
    2295        5976 :     return xRet;
    2296             : }
    2297             : 
    2298           4 : void SAL_CALL SfxLibraryContainer::removeLibrary( const OUString& Name )
    2299             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
    2300             : {
    2301           4 :     LibraryContainerMethodGuard aGuard( *this );
    2302             :     // Get and hold library before removing
    2303           4 :     Any aLibAny = maNameContainer.getByName( Name ) ;
    2304           4 :     Reference< XNameAccess > xNameAccess;
    2305           4 :     aLibAny >>= xNameAccess;
    2306           4 :     SfxLibrary* pImplLib = static_cast< SfxLibrary* >( xNameAccess.get() );
    2307           4 :     if( pImplLib->mbReadOnly && !pImplLib->mbLink )
    2308             :     {
    2309           0 :         throw IllegalArgumentException();
    2310             :     }
    2311             :     // Remove from container
    2312           4 :     maNameContainer.removeByName( Name );
    2313           4 :     maModifiable.setModified( true );
    2314             : 
    2315             :     // Delete library files, but not for linked libraries
    2316           4 :     if( !pImplLib->mbLink )
    2317             :     {
    2318           4 :         if( mxStorage.is() )
    2319             :         {
    2320           8 :             return;
    2321             :         }
    2322           0 :         if( xNameAccess->hasElements() )
    2323             :         {
    2324           0 :             Sequence< OUString > aNames = pImplLib->getElementNames();
    2325           0 :             sal_Int32 nNameCount = aNames.getLength();
    2326           0 :             const OUString* pNames = aNames.getConstArray();
    2327           0 :             for( sal_Int32 i = 0 ; i < nNameCount ; ++i, ++pNames )
    2328             :             {
    2329           0 :                 pImplLib->removeElementWithoutChecks( *pNames, SfxLibrary::LibraryContainerAccess() );
    2330           0 :             }
    2331             :         }
    2332             : 
    2333             :         // Delete index file
    2334           0 :         createAppLibraryFolder( pImplLib, Name );
    2335           0 :         OUString aLibInfoPath = pImplLib->maLibInfoFileURL;
    2336             :         try
    2337             :         {
    2338           0 :             if( mxSFI->exists( aLibInfoPath ) )
    2339             :             {
    2340           0 :                 mxSFI->kill( aLibInfoPath );
    2341             :             }
    2342             :         }
    2343           0 :         catch(const Exception& ) {}
    2344             : 
    2345             :         // Delete folder if empty
    2346           0 :         INetURLObject aInetObj( maLibraryPath.getToken(1, (sal_Unicode)';') );
    2347             :         aInetObj.insertName( Name, true, INetURLObject::LAST_SEGMENT,
    2348           0 :                              true, INetURLObject::ENCODE_ALL );
    2349           0 :         OUString aLibDirPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
    2350             : 
    2351             :         try
    2352             :         {
    2353           0 :             if( mxSFI->isFolder( aLibDirPath ) )
    2354             :             {
    2355           0 :                 Sequence< OUString > aContentSeq = mxSFI->getFolderContents( aLibDirPath, true );
    2356           0 :                 sal_Int32 nCount = aContentSeq.getLength();
    2357           0 :                 if( !nCount )
    2358             :                 {
    2359           0 :                     mxSFI->kill( aLibDirPath );
    2360           0 :                 }
    2361             :             }
    2362             :         }
    2363           0 :         catch(const Exception& )
    2364             :         {
    2365           0 :         }
    2366           0 :     }
    2367             : }
    2368             : 
    2369       12682 : sal_Bool SAL_CALL SfxLibraryContainer::isLibraryLoaded( const OUString& Name )
    2370             :     throw(NoSuchElementException, RuntimeException, std::exception)
    2371             : {
    2372       12682 :     LibraryContainerMethodGuard aGuard( *this );
    2373       12682 :     SfxLibrary* pImplLib = getImplLib( Name );
    2374       12682 :     bool bRet = pImplLib->mbLoaded;
    2375       12682 :     return bRet;
    2376             : }
    2377             : 
    2378             : 
    2379        1298 : void SAL_CALL SfxLibraryContainer::loadLibrary( const OUString& Name )
    2380             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
    2381             : {
    2382        1298 :     LibraryContainerMethodGuard aGuard( *this );
    2383        2594 :     Any aLibAny = maNameContainer.getByName( Name ) ;
    2384        2594 :     Reference< XNameAccess > xNameAccess;
    2385        1298 :     aLibAny >>= xNameAccess;
    2386        1298 :     SfxLibrary* pImplLib = static_cast< SfxLibrary* >( xNameAccess.get() );
    2387             : 
    2388        1298 :     bool bLoaded = pImplLib->mbLoaded;
    2389        1298 :     pImplLib->mbLoaded = true;
    2390        1298 :     if( !bLoaded && xNameAccess->hasElements() )
    2391             :     {
    2392          76 :         if( pImplLib->mbPasswordProtected )
    2393             :         {
    2394           2 :             implLoadPasswordLibrary( pImplLib, Name );
    2395        1300 :             return;
    2396             :         }
    2397             : 
    2398          74 :         bool bLink = pImplLib->mbLink;
    2399          74 :         bool bStorage = mxStorage.is() && !bLink;
    2400             : 
    2401          74 :         uno::Reference< embed::XStorage > xLibrariesStor;
    2402         148 :         uno::Reference< embed::XStorage > xLibraryStor;
    2403          74 :         if( bStorage )
    2404             :         {
    2405             :             try
    2406             :             {
    2407          18 :                 xLibrariesStor = mxStorage->openStorageElement( maLibrariesDir, embed::ElementModes::READ );
    2408             :                 SAL_WARN_IF(
    2409             :                     !xLibrariesStor.is(), "basic",
    2410             :                     ("The method must either throw exception or return a"
    2411             :                      " storage!"));
    2412          18 :                 if ( !xLibrariesStor.is() )
    2413             :                 {
    2414           0 :                     throw uno::RuntimeException();
    2415             :                 }
    2416             : 
    2417          18 :                 xLibraryStor = xLibrariesStor->openStorageElement( Name, embed::ElementModes::READ );
    2418             :                 SAL_WARN_IF(
    2419             :                     !xLibraryStor.is(), "basic",
    2420             :                     ("The method must either throw exception or return a"
    2421             :                      " storage!"));
    2422          18 :                 if ( !xLibrariesStor.is() )
    2423             :                 {
    2424           0 :                     throw uno::RuntimeException();
    2425             :                 }
    2426             :             }
    2427           0 :             catch(const uno::Exception& )
    2428             :             {
    2429             :             #if OSL_DEBUG_LEVEL > 0
    2430             :                 Any aError( ::cppu::getCaughtException() );
    2431             :                 SAL_WARN(
    2432             :                     "basic",
    2433             :                     "couldn't open sub storage for library \"" << Name
    2434             :                         << "\". Exception: "
    2435             :                         << comphelper::anyToString(aError));
    2436             :             #endif
    2437           0 :                 throw;
    2438             :             }
    2439             :         }
    2440             : 
    2441         148 :         Sequence< OUString > aNames = pImplLib->getElementNames();
    2442          74 :         sal_Int32 nNameCount = aNames.getLength();
    2443          74 :         const OUString* pNames = aNames.getConstArray();
    2444         156 :         for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
    2445             :         {
    2446          82 :             OUString aElementName = pNames[ i ];
    2447             : 
    2448         164 :             OUString aFile;
    2449         164 :             uno::Reference< io::XInputStream > xInStream;
    2450             : 
    2451          82 :             if( bStorage )
    2452             :             {
    2453          26 :                 uno::Reference< io::XStream > xElementStream;
    2454             : 
    2455          26 :                 aFile = aElementName;
    2456          26 :                 aFile += ".xml";
    2457             : 
    2458             :                 try
    2459             :                 {
    2460          26 :                     xElementStream = xLibraryStor->openStreamElement( aFile, embed::ElementModes::READ );
    2461             :                 }
    2462           0 :                 catch(const uno::Exception& )
    2463             :                 {}
    2464             : 
    2465          26 :                 if( !xElementStream.is() )
    2466             :                 {
    2467             :                     // Check for EA2 document version with wrong extensions
    2468           0 :                     aFile = aElementName;
    2469           0 :                     aFile += ".";
    2470           0 :                     aFile += maLibElementFileExtension;
    2471             :                     try
    2472             :                     {
    2473           0 :                         xElementStream = xLibraryStor->openStreamElement( aFile, embed::ElementModes::READ );
    2474             :                     }
    2475           0 :                     catch(const uno::Exception& )
    2476             :                     {}
    2477             :                 }
    2478             : 
    2479          26 :                 if ( xElementStream.is() )
    2480             :                 {
    2481          26 :                     xInStream = xElementStream->getInputStream();
    2482             :                 }
    2483          26 :                 if ( !xInStream.is() )
    2484             :                 {
    2485             :                     SAL_WARN(
    2486             :                         "basic",
    2487             :                         "couldn't open library element stream - attempted to"
    2488             :                             " open library \"" << Name << '"');
    2489           0 :                     throw RuntimeException("couln't open library element stream", *this);
    2490          26 :                 }
    2491             :             }
    2492             :             else
    2493             :             {
    2494          56 :                 OUString aLibDirPath = pImplLib->maStorageURL;
    2495         112 :                 INetURLObject aElementInetObj( aLibDirPath );
    2496             :                 aElementInetObj.insertName( aElementName, false,
    2497             :                                             INetURLObject::LAST_SEGMENT, true,
    2498          56 :                                             INetURLObject::ENCODE_ALL );
    2499          56 :                 aElementInetObj.setExtension( maLibElementFileExtension );
    2500         112 :                 aFile = aElementInetObj.GetMainURL( INetURLObject::NO_DECODE );
    2501             :             }
    2502             : 
    2503         164 :             Reference< XNameContainer > xLib( pImplLib );
    2504             :             Any aAny = importLibraryElement( xLib, aElementName,
    2505         164 :                                              aFile, xInStream );
    2506          82 :             if( pImplLib->hasByName( aElementName ) )
    2507             :             {
    2508          82 :                 if( aAny.hasValue() )
    2509             :                 {
    2510          82 :                     pImplLib->maNameContainer.replaceByName( aElementName, aAny );
    2511             :                 }
    2512             :             }
    2513             :             else
    2514             :             {
    2515           0 :                 pImplLib->maNameContainer.insertNoCheck(aElementName, aAny);
    2516             :             }
    2517          82 :         }
    2518         148 :         pImplLib->implSetModified( false );
    2519        1296 :     }
    2520             : }
    2521             : 
    2522             : // Methods XLibraryContainer2
    2523           0 : sal_Bool SAL_CALL SfxLibraryContainer::isLibraryLink( const OUString& Name )
    2524             :     throw (NoSuchElementException, RuntimeException, std::exception)
    2525             : {
    2526           0 :     LibraryContainerMethodGuard aGuard( *this );
    2527           0 :     SfxLibrary* pImplLib = getImplLib( Name );
    2528           0 :     bool bRet = pImplLib->mbLink;
    2529           0 :     return bRet;
    2530             : }
    2531             : 
    2532           0 : OUString SAL_CALL SfxLibraryContainer::getLibraryLinkURL( const OUString& Name )
    2533             :     throw (IllegalArgumentException, NoSuchElementException, RuntimeException, std::exception)
    2534             : {
    2535           0 :     LibraryContainerMethodGuard aGuard( *this );
    2536           0 :     SfxLibrary* pImplLib = getImplLib( Name );
    2537           0 :     bool bLink = pImplLib->mbLink;
    2538           0 :     if( !bLink )
    2539             :     {
    2540           0 :         throw IllegalArgumentException();
    2541             :     }
    2542           0 :     OUString aRetStr = pImplLib->maLibInfoFileURL;
    2543           0 :     return aRetStr;
    2544             : }
    2545             : 
    2546           0 : sal_Bool SAL_CALL SfxLibraryContainer::isLibraryReadOnly( const OUString& Name )
    2547             :     throw (NoSuchElementException, RuntimeException, std::exception)
    2548             : {
    2549           0 :     LibraryContainerMethodGuard aGuard( *this );
    2550           0 :     SfxLibrary* pImplLib = getImplLib( Name );
    2551           0 :     bool bRet = pImplLib->mbReadOnly || (pImplLib->mbLink && pImplLib->mbReadOnlyLink);
    2552           0 :     return bRet;
    2553             : }
    2554             : 
    2555           0 : void SAL_CALL SfxLibraryContainer::setLibraryReadOnly( const OUString& Name, sal_Bool bReadOnly )
    2556             :     throw (NoSuchElementException, RuntimeException, std::exception)
    2557             : {
    2558           0 :     LibraryContainerMethodGuard aGuard( *this );
    2559           0 :     SfxLibrary* pImplLib = getImplLib( Name );
    2560           0 :     if( pImplLib->mbLink )
    2561             :     {
    2562           0 :         if( (pImplLib->mbReadOnlyLink ? 1 : 0) != bReadOnly )
    2563             :         {
    2564           0 :             pImplLib->mbReadOnlyLink = bReadOnly;
    2565           0 :             pImplLib->implSetModified( true );
    2566           0 :             maModifiable.setModified( true );
    2567             :         }
    2568             :     }
    2569             :     else
    2570             :     {
    2571           0 :         if( (pImplLib->mbReadOnly ? 1 : 0) != bReadOnly )
    2572             :         {
    2573           0 :             pImplLib->mbReadOnly = bReadOnly;
    2574           0 :             pImplLib->implSetModified( true );
    2575             :         }
    2576           0 :     }
    2577           0 : }
    2578             : 
    2579           0 : void SAL_CALL SfxLibraryContainer::renameLibrary( const OUString& Name, const OUString& NewName )
    2580             :     throw (NoSuchElementException, ElementExistException, RuntimeException, std::exception)
    2581             : {
    2582           0 :     LibraryContainerMethodGuard aGuard( *this );
    2583           0 :     if( maNameContainer.hasByName( NewName ) )
    2584             :     {
    2585           0 :         throw ElementExistException();
    2586             :     }
    2587             :     // Get and hold library before removing
    2588           0 :     Any aLibAny = maNameContainer.getByName( Name ) ;
    2589             : 
    2590             :     // #i24094 Maybe lib is not loaded!
    2591           0 :     Reference< XNameAccess > xNameAccess;
    2592           0 :     aLibAny >>= xNameAccess;
    2593           0 :     SfxLibrary* pImplLib = static_cast< SfxLibrary* >( xNameAccess.get() );
    2594           0 :     if( pImplLib->mbPasswordProtected && !pImplLib->mbPasswordVerified )
    2595             :     {
    2596           0 :         return;     // Lib with unverified password cannot be renamed
    2597             :     }
    2598           0 :     loadLibrary( Name );
    2599             : 
    2600             :     // Remove from container
    2601           0 :     maNameContainer.removeByName( Name );
    2602           0 :     maModifiable.setModified( true );
    2603             : 
    2604             :     // Rename library folder, but not for linked libraries
    2605           0 :     bool bMovedSuccessful = true;
    2606             : 
    2607             :     // Rename files
    2608           0 :     bool bStorage = mxStorage.is();
    2609           0 :     if( !bStorage && !pImplLib->mbLink )
    2610             :     {
    2611           0 :         bMovedSuccessful = false;
    2612             : 
    2613           0 :         OUString aLibDirPath = pImplLib->maStorageURL;
    2614             : 
    2615           0 :         INetURLObject aDestInetObj( maLibraryPath.getToken(1, (sal_Unicode)';'));
    2616             :         aDestInetObj.insertName( NewName, true, INetURLObject::LAST_SEGMENT,
    2617           0 :                                  true, INetURLObject::ENCODE_ALL );
    2618           0 :         OUString aDestDirPath = aDestInetObj.GetMainURL( INetURLObject::NO_DECODE );
    2619             : 
    2620             :         // Store new URL
    2621           0 :         OUString aLibInfoFileURL = pImplLib->maLibInfoFileURL;
    2622             :         checkStorageURL( aDestDirPath, pImplLib->maLibInfoFileURL, pImplLib->maStorageURL,
    2623           0 :                          pImplLib->maUnexpandedStorageURL );
    2624             : 
    2625             :         try
    2626             :         {
    2627           0 :             if( mxSFI->isFolder( aLibDirPath ) )
    2628             :             {
    2629           0 :                 if( !mxSFI->isFolder( aDestDirPath ) )
    2630             :                 {
    2631           0 :                     mxSFI->createFolder( aDestDirPath );
    2632             :                 }
    2633             :                 // Move index file
    2634             :                 try
    2635             :                 {
    2636           0 :                     if( mxSFI->exists( pImplLib->maLibInfoFileURL ) )
    2637             :                     {
    2638           0 :                         mxSFI->kill( pImplLib->maLibInfoFileURL );
    2639             :                     }
    2640           0 :                     mxSFI->move( aLibInfoFileURL, pImplLib->maLibInfoFileURL );
    2641             :                 }
    2642           0 :                 catch(const Exception& )
    2643             :                 {
    2644             :                 }
    2645             : 
    2646           0 :                 Sequence< OUString > aElementNames = xNameAccess->getElementNames();
    2647           0 :                 sal_Int32 nNameCount = aElementNames.getLength();
    2648           0 :                 const OUString* pNames = aElementNames.getConstArray();
    2649           0 :                 for( sal_Int32 i = 0 ; i < nNameCount ; i++ )
    2650             :                 {
    2651           0 :                     OUString aElementName = pNames[ i ];
    2652             : 
    2653           0 :                     INetURLObject aElementInetObj( aLibDirPath );
    2654             :                     aElementInetObj.insertName( aElementName, false,
    2655           0 :                         INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
    2656           0 :                     aElementInetObj.setExtension( maLibElementFileExtension );
    2657           0 :                     OUString aElementPath( aElementInetObj.GetMainURL( INetURLObject::NO_DECODE ) );
    2658             : 
    2659           0 :                     INetURLObject aElementDestInetObj( aDestDirPath );
    2660             :                     aElementDestInetObj.insertName( aElementName, false,
    2661             :                                                     INetURLObject::LAST_SEGMENT, true,
    2662           0 :                                                     INetURLObject::ENCODE_ALL );
    2663           0 :                     aElementDestInetObj.setExtension( maLibElementFileExtension );
    2664           0 :                     OUString aDestElementPath( aElementDestInetObj.GetMainURL( INetURLObject::NO_DECODE ) );
    2665             : 
    2666             :                     try
    2667             :                     {
    2668           0 :                         if( mxSFI->exists( aDestElementPath ) )
    2669             :                         {
    2670           0 :                             mxSFI->kill( aDestElementPath );
    2671             :                         }
    2672           0 :                         mxSFI->move( aElementPath, aDestElementPath );
    2673             :                     }
    2674           0 :                     catch(const Exception& )
    2675             :                     {
    2676             :                     }
    2677           0 :                 }
    2678           0 :                 pImplLib->storeResourcesAsURL( aDestDirPath, NewName );
    2679             : 
    2680             :                 // Delete folder if empty
    2681           0 :                 Sequence< OUString > aContentSeq = mxSFI->getFolderContents( aLibDirPath, true );
    2682           0 :                 sal_Int32 nCount = aContentSeq.getLength();
    2683           0 :                 if( !nCount )
    2684             :                 {
    2685           0 :                     mxSFI->kill( aLibDirPath );
    2686             :                 }
    2687             : 
    2688           0 :                 bMovedSuccessful = true;
    2689           0 :                 pImplLib->implSetModified( true );
    2690             :             }
    2691             :         }
    2692           0 :         catch(const Exception& )
    2693             :         {
    2694             :             // Restore old library
    2695           0 :             maNameContainer.insertByName( Name, aLibAny ) ;
    2696           0 :         }
    2697             :     }
    2698             : 
    2699           0 :     if( bStorage && !pImplLib->mbLink )
    2700             :     {
    2701           0 :         pImplLib->implSetModified( true );
    2702             :     }
    2703           0 :     if( bMovedSuccessful )
    2704             :     {
    2705           0 :            maNameContainer.insertByName( NewName, aLibAny ) ;
    2706           0 :     }
    2707             : }
    2708             : 
    2709             : 
    2710             : // Methods XInitialization
    2711       10416 : void SAL_CALL SfxLibraryContainer::initialize( const Sequence< Any >& _rArguments )
    2712             :     throw (Exception, RuntimeException, std::exception)
    2713             : {
    2714       10416 :     LibraryContainerMethodGuard aGuard( *this );
    2715       10416 :     sal_Int32 nArgCount = _rArguments.getLength();
    2716       10416 :     if ( nArgCount == 1 )
    2717             :     {
    2718       10416 :         OUString sInitialDocumentURL;
    2719       10640 :         Reference< XStorageBasedDocument > xDocument;
    2720       10416 :         if ( _rArguments[0] >>= sInitialDocumentURL )
    2721             :         {
    2722           0 :             initializeFromDocumentURL( sInitialDocumentURL );
    2723           0 :             return;
    2724             :         }
    2725             : 
    2726       10416 :         if ( _rArguments[0] >>= xDocument )
    2727             :         {
    2728       10416 :             initializeFromDocument( xDocument );
    2729       10192 :             return;
    2730         224 :         }
    2731             :     }
    2732             : 
    2733       10192 :     throw IllegalArgumentException();
    2734             : }
    2735             : 
    2736           0 : void SAL_CALL SfxLibraryContainer::initializeFromDocumentURL( const OUString& _rInitialDocumentURL )
    2737             : {
    2738           0 :     init( _rInitialDocumentURL, NULL );
    2739           0 : }
    2740             : 
    2741       10416 : void SAL_CALL SfxLibraryContainer::initializeFromDocument( const Reference< XStorageBasedDocument >& _rxDocument )
    2742             : {
    2743             :     // check whether this is a valid OfficeDocument, and obtain the document's root storage
    2744       10416 :     Reference< XStorage > xDocStorage;
    2745             :     try
    2746             :     {
    2747       10416 :         Reference< XServiceInfo > xSI( _rxDocument, UNO_QUERY_THROW );
    2748       10416 :         if ( xSI->supportsService("com.sun.star.document.OfficeDocument"))
    2749             :         {
    2750       10640 :             xDocStorage.set( _rxDocument->getDocumentStorage(), UNO_QUERY_THROW );
    2751             :         }
    2752       20384 :         Reference< XModel > xDocument( _rxDocument, UNO_QUERY_THROW );
    2753       20384 :         Reference< XComponent > xDocComponent( _rxDocument, UNO_QUERY_THROW );
    2754             : 
    2755       10192 :         mxOwnerDocument = xDocument;
    2756       20608 :         startComponentListening( xDocComponent );
    2757             :     }
    2758         224 :     catch( const Exception& ) { }
    2759             : 
    2760       10416 :     if ( !xDocStorage.is() )
    2761             :     {
    2762         224 :         throw IllegalArgumentException();
    2763             :     }
    2764       10192 :     init( OUString(), xDocStorage );
    2765       10192 : }
    2766             : 
    2767             : // OEventListenerAdapter
    2768       10189 : void SfxLibraryContainer::_disposing( const EventObject& _rSource )
    2769             : {
    2770             : #if OSL_DEBUG_LEVEL > 0
    2771             :     Reference< XModel > xDocument( mxOwnerDocument.get(), UNO_QUERY );
    2772             :     SAL_WARN_IF(
    2773             :         xDocument != _rSource.Source || !xDocument.is(), "basic",
    2774             :         "SfxLibraryContainer::_disposing: where does this come from?");
    2775             : #else
    2776             :     (void)_rSource;
    2777             : #endif
    2778       10189 :     dispose();
    2779       10189 : }
    2780             : 
    2781             : // OComponentHelper
    2782       10541 : void SAL_CALL SfxLibraryContainer::disposing()
    2783             : {
    2784       10541 :     Reference< XModel > xModel = mxOwnerDocument;
    2785       21082 :     EventObject aEvent( xModel.get() );
    2786       10541 :     maVBAScriptListeners.disposing( aEvent );
    2787       10541 :     stopAllComponentListening();
    2788       21082 :     mxOwnerDocument = WeakReference< XModel >();
    2789       10541 : }
    2790             : 
    2791             : // Methods XLibraryContainerPassword
    2792           0 : sal_Bool SAL_CALL SfxLibraryContainer::isLibraryPasswordProtected( const OUString& )
    2793             :     throw (NoSuchElementException, RuntimeException, std::exception)
    2794             : {
    2795           0 :     LibraryContainerMethodGuard aGuard( *this );
    2796           0 :     return sal_False;
    2797             : }
    2798             : 
    2799           0 : sal_Bool SAL_CALL SfxLibraryContainer::isLibraryPasswordVerified( const OUString& )
    2800             :     throw (IllegalArgumentException, NoSuchElementException, RuntimeException, std::exception)
    2801             : {
    2802           0 :     LibraryContainerMethodGuard aGuard( *this );
    2803           0 :     throw IllegalArgumentException();
    2804             : }
    2805             : 
    2806           0 : sal_Bool SAL_CALL SfxLibraryContainer::verifyLibraryPassword( const OUString&, const OUString& )
    2807             :     throw (IllegalArgumentException, NoSuchElementException, RuntimeException, std::exception)
    2808             : {
    2809           0 :     LibraryContainerMethodGuard aGuard( *this );
    2810           0 :     throw IllegalArgumentException();
    2811             : }
    2812             : 
    2813           0 : void SAL_CALL SfxLibraryContainer::changeLibraryPassword(const OUString&, const OUString&, const OUString& )
    2814             :     throw (IllegalArgumentException, NoSuchElementException, RuntimeException, std::exception)
    2815             : {
    2816           0 :     LibraryContainerMethodGuard aGuard( *this );
    2817           0 :     throw IllegalArgumentException();
    2818             : }
    2819             : 
    2820             : // Methods XContainer
    2821        3808 : void SAL_CALL SfxLibraryContainer::addContainerListener( const Reference< XContainerListener >& xListener )
    2822             :     throw (RuntimeException, std::exception)
    2823             : {
    2824        3808 :     LibraryContainerMethodGuard aGuard( *this );
    2825        3808 :     maNameContainer.setEventSource( static_cast< XInterface* >( (OWeakObject*)this ) );
    2826        3808 :     maNameContainer.addContainerListener( xListener );
    2827        3808 : }
    2828             : 
    2829           0 : void SAL_CALL SfxLibraryContainer::removeContainerListener( const Reference< XContainerListener >& xListener )
    2830             :     throw (RuntimeException, std::exception)
    2831             : {
    2832           0 :     LibraryContainerMethodGuard aGuard( *this );
    2833           0 :     maNameContainer.removeContainerListener( xListener );
    2834           0 : }
    2835             : 
    2836             : // Methods XLibraryContainerExport
    2837           0 : void SAL_CALL SfxLibraryContainer::exportLibrary( const OUString& Name, const OUString& URL,
    2838             :     const Reference< XInteractionHandler >& Handler )
    2839             :     throw ( uno::Exception, NoSuchElementException, RuntimeException, std::exception)
    2840             : {
    2841           0 :     LibraryContainerMethodGuard aGuard( *this );
    2842           0 :     SfxLibrary* pImplLib = getImplLib( Name );
    2843             : 
    2844           0 :     Reference< XSimpleFileAccess3 > xToUseSFI;
    2845           0 :     if( Handler.is() )
    2846             :     {
    2847           0 :         xToUseSFI = ucb::SimpleFileAccess::create( mxContext );
    2848           0 :         xToUseSFI->setInteractionHandler( Handler );
    2849             :     }
    2850             : 
    2851             :     // Maybe lib is not loaded?!
    2852           0 :     loadLibrary( Name );
    2853             : 
    2854           0 :     uno::Reference< ::com::sun::star::embed::XStorage > xDummyStor;
    2855           0 :     if( pImplLib->mbPasswordProtected )
    2856             :     {
    2857           0 :         implStorePasswordLibrary( pImplLib, Name, xDummyStor, URL, xToUseSFI, Handler );
    2858             :     }
    2859             :     else
    2860             :     {
    2861           0 :         implStoreLibrary( pImplLib, Name, xDummyStor, URL, xToUseSFI, Handler );
    2862             :     }
    2863           0 :     ::xmlscript::LibDescriptor aLibDesc;
    2864           0 :     aLibDesc.aName = Name;
    2865           0 :     aLibDesc.bLink = false;             // Link status gets lost?
    2866           0 :     aLibDesc.bReadOnly = pImplLib->mbReadOnly;
    2867           0 :     aLibDesc.bPreload = false;          // Preload status gets lost?
    2868           0 :     aLibDesc.bPasswordProtected = pImplLib->mbPasswordProtected;
    2869           0 :     aLibDesc.aElementNames = pImplLib->getElementNames();
    2870             : 
    2871           0 :     implStoreLibraryIndexFile( pImplLib, aLibDesc, xDummyStor, URL, xToUseSFI );
    2872           0 : }
    2873             : 
    2874        3100 : OUString SfxLibraryContainer::expand_url( const OUString& url )
    2875             :     throw(::com::sun::star::uno::RuntimeException)
    2876             : {
    2877        3100 :     if (url.startsWith( EXPAND_PROTOCOL ":" ))
    2878             :     {
    2879           0 :         if( !mxMacroExpander.is() )
    2880             :         {
    2881           0 :             Reference< util::XMacroExpander > xExpander = util::theMacroExpander::get(mxContext);
    2882           0 :             MutexGuard guard( Mutex::getGlobalMutex() );
    2883           0 :             if( !mxMacroExpander.is() )
    2884             :             {
    2885           0 :                 mxMacroExpander = xExpander;
    2886           0 :             }
    2887             :         }
    2888             : 
    2889           0 :         if( !mxMacroExpander.is() )
    2890             :         {
    2891           0 :             return url;
    2892             :         }
    2893             :         // cut protocol
    2894           0 :         OUString macro( url.copy( sizeof (EXPAND_PROTOCOL ":") -1 ) );
    2895             :         // decode uric class chars
    2896           0 :         macro = Uri::decode( macro, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
    2897             :         // expand macro string
    2898           0 :         OUString ret( mxMacroExpander->expandMacros( macro ) );
    2899           0 :         return ret;
    2900             :     }
    2901        3100 :     else if( mxStringSubstitution.is() )
    2902             :     {
    2903        3100 :         OUString ret( mxStringSubstitution->substituteVariables( url, false ) );
    2904        3100 :         return ret;
    2905             :     }
    2906             :     else
    2907             :     {
    2908           0 :         return url;
    2909             :     }
    2910             : }
    2911             : 
    2912             : //XLibraryContainer3
    2913           0 : OUString SAL_CALL SfxLibraryContainer::getOriginalLibraryLinkURL( const OUString& Name )
    2914             :     throw (IllegalArgumentException, NoSuchElementException, RuntimeException, std::exception)
    2915             : {
    2916           0 :     LibraryContainerMethodGuard aGuard( *this );
    2917           0 :     SfxLibrary* pImplLib = getImplLib( Name );
    2918           0 :     bool bLink = pImplLib->mbLink;
    2919           0 :     if( !bLink )
    2920             :     {
    2921           0 :         throw IllegalArgumentException();
    2922             :     }
    2923           0 :     OUString aRetStr = pImplLib->maOriginalStorageURL;
    2924           0 :     return aRetStr;
    2925             : }
    2926             : 
    2927             : 
    2928             : // XVBACompatibility
    2929        4066 : sal_Bool SAL_CALL SfxLibraryContainer::getVBACompatibilityMode() throw (RuntimeException, std::exception)
    2930             : {
    2931        4066 :     return mbVBACompat;
    2932             : }
    2933             : 
    2934          62 : void SAL_CALL SfxLibraryContainer::setVBACompatibilityMode( sal_Bool _vbacompatmodeon ) throw (RuntimeException, std::exception)
    2935             : {
    2936             :     /*  The member variable mbVBACompat must be set first, the following call
    2937             :         to getBasicManager() may call getVBACompatibilityMode() which returns
    2938             :         this value. */
    2939          62 :     mbVBACompat = _vbacompatmodeon;
    2940          62 :     if( BasicManager* pBasMgr = getBasicManager() )
    2941             :     {
    2942             :         // get the standard library
    2943          62 :         OUString aLibName = pBasMgr->GetName();
    2944          62 :         if ( aLibName.isEmpty())
    2945             :         {
    2946          60 :             aLibName = "Standard";
    2947             :         }
    2948          62 :         if( StarBASIC* pBasic = pBasMgr->GetLib( aLibName ) )
    2949             :         {
    2950          62 :             pBasic->SetVBAEnabled( _vbacompatmodeon );
    2951             :         }
    2952             :         /*  If in VBA compatibility mode, force creation of the VBA Globals
    2953             :             object. Each application will create an instance of its own
    2954             :             implementation and store it in its Basic manager. Implementations
    2955             :             will do all necessary additional initialization, such as
    2956             :             registering the global "This***Doc" UNO constant, starting the
    2957             :             document events processor etc.
    2958             :          */
    2959          62 :         if( mbVBACompat ) try
    2960             :         {
    2961          62 :             Reference< XModel > xModel( mxOwnerDocument );   // weak-ref -> ref
    2962         124 :             Reference< XMultiServiceFactory > xFactory( xModel, UNO_QUERY_THROW );
    2963         134 :             xFactory->createInstance("ooo.vba.VBAGlobals");
    2964             :         }
    2965          10 :         catch(const Exception& )
    2966             :         {
    2967          62 :         }
    2968             :     }
    2969          62 : }
    2970             : 
    2971          60 : void SAL_CALL SfxLibraryContainer::setProjectName( const OUString& _projectname ) throw (RuntimeException, std::exception)
    2972             : {
    2973          60 :     msProjectName = _projectname;
    2974          60 :     BasicManager* pBasMgr = getBasicManager();
    2975             :     // Temporary HACK
    2976             :     // Some parts of the VBA handling ( e.g. in core basic )
    2977             :     // code expect the name of the VBA project to be set as the name of
    2978             :     // the basic manager. Provide fail back here.
    2979          60 :     if( pBasMgr )
    2980             :     {
    2981          60 :         pBasMgr->SetName( msProjectName );
    2982             :     }
    2983          60 : }
    2984             : 
    2985           0 : sal_Int32 SAL_CALL SfxLibraryContainer::getRunningVBAScripts() throw (RuntimeException, std::exception)
    2986             : {
    2987           0 :     LibraryContainerMethodGuard aGuard( *this );
    2988           0 :     return mnRunningVBAScripts;
    2989             : }
    2990             : 
    2991           0 : void SAL_CALL SfxLibraryContainer::addVBAScriptListener( const Reference< vba::XVBAScriptListener >& rxListener ) throw (RuntimeException, std::exception)
    2992             : {
    2993           0 :     maVBAScriptListeners.addTypedListener( rxListener );
    2994           0 : }
    2995             : 
    2996           0 : void SAL_CALL SfxLibraryContainer::removeVBAScriptListener( const Reference< vba::XVBAScriptListener >& rxListener ) throw (RuntimeException, std::exception)
    2997             : {
    2998           0 :     maVBAScriptListeners.removeTypedListener( rxListener );
    2999           0 : }
    3000             : 
    3001         104 : void SAL_CALL SfxLibraryContainer::broadcastVBAScriptEvent( sal_Int32 nIdentifier, const OUString& rModuleName ) throw (RuntimeException, std::exception)
    3002             : {
    3003             :     // own lock for accessing the number of running scripts
    3004         104 :     enterMethod();
    3005         104 :     switch( nIdentifier )
    3006             :     {
    3007             :     case vba::VBAScriptEventId::SCRIPT_STARTED:
    3008          50 :         ++mnRunningVBAScripts;
    3009          50 :         break;
    3010             :     case vba::VBAScriptEventId::SCRIPT_STOPPED:
    3011          50 :         --mnRunningVBAScripts;
    3012          50 :         break;
    3013             :     }
    3014         104 :     leaveMethod();
    3015             : 
    3016         104 :     Reference< XModel > xModel = mxOwnerDocument;  // weak-ref -> ref
    3017         208 :     vba::VBAScriptEvent aEvent( Reference<XInterface>(xModel, UNO_QUERY), nIdentifier, rModuleName );
    3018         208 :     maVBAScriptListeners.notify( aEvent );
    3019         104 : }
    3020             : 
    3021             : // Methods XServiceInfo
    3022           0 : sal_Bool SAL_CALL SfxLibraryContainer::supportsService( const OUString& _rServiceName )
    3023             :     throw (RuntimeException, std::exception)
    3024             : {
    3025           0 :     return cppu::supportsService(this, _rServiceName);
    3026             : }
    3027             : 
    3028             : // Implementation class SfxLibrary
    3029             : 
    3030             : // Ctor
    3031        7482 : SfxLibrary::SfxLibrary( ModifiableHelper& _rModifiable, const Type& aType,
    3032             :     const Reference< XComponentContext >& xContext, const Reference< XSimpleFileAccess3 >& xSFI )
    3033             :         : OComponentHelper( m_aMutex )
    3034             :         , mxContext( xContext )
    3035             :         , mxSFI( xSFI )
    3036             :         , mrModifiable( _rModifiable )
    3037             :         , maNameContainer( aType )
    3038             :         , mbLoaded( true )
    3039             :         , mbIsModified( true )
    3040             :         , mbInitialised( false )
    3041             :         , mbLink( false )
    3042             :         , mbReadOnly( false )
    3043             :         , mbReadOnlyLink( false )
    3044             :         , mbPreload( false )
    3045             :         , mbPasswordProtected( false )
    3046             :         , mbPasswordVerified( false )
    3047             :         , mbDoc50Password( false )
    3048             :         , mbSharedIndexFile( false )
    3049        7482 :         , mbExtension( false )
    3050             : {
    3051        7482 : }
    3052             : 
    3053        2988 : SfxLibrary::SfxLibrary( ModifiableHelper& _rModifiable, const Type& aType,
    3054             :     const Reference< XComponentContext >& xContext, const Reference< XSimpleFileAccess3 >& xSFI,
    3055             :     const OUString& aLibInfoFileURL, const OUString& aStorageURL, bool ReadOnly )
    3056             :         : OComponentHelper( m_aMutex )
    3057             :         , mxContext( xContext )
    3058             :         , mxSFI( xSFI )
    3059             :         , mrModifiable( _rModifiable )
    3060             :         , maNameContainer( aType )
    3061             :         , mbLoaded( false )
    3062             :         , mbIsModified( true )
    3063             :         , mbInitialised( false )
    3064             :         , maLibInfoFileURL( aLibInfoFileURL )
    3065             :         , maStorageURL( aStorageURL )
    3066             :         , mbLink( true )
    3067             :         , mbReadOnly( false )
    3068             :         , mbReadOnlyLink( ReadOnly )
    3069             :         , mbPreload( false )
    3070             :         , mbPasswordProtected( false )
    3071             :         , mbPasswordVerified( false )
    3072             :         , mbDoc50Password( false )
    3073             :         , mbSharedIndexFile( false )
    3074        2988 :         , mbExtension( false )
    3075             : {
    3076        2988 : }
    3077             : 
    3078          12 : bool SfxLibrary::isLoadedStorable()
    3079             : {
    3080          12 :     return mbLoaded && (!mbPasswordProtected || mbPasswordVerified);
    3081             : }
    3082             : 
    3083        3538 : void SfxLibrary::implSetModified( bool _bIsModified )
    3084             : {
    3085        3538 :     if ( mbIsModified == _bIsModified )
    3086             :     {
    3087        3938 :         return;
    3088             :     }
    3089        3138 :     mbIsModified = _bIsModified;
    3090        3138 :     if ( mbIsModified )
    3091             :     {
    3092           6 :         mrModifiable.setModified( true );
    3093             :     }
    3094             : }
    3095             : 
    3096             : // Methods XInterface
    3097       27042 : Any SAL_CALL SfxLibrary::queryInterface( const Type& rType )
    3098             :     throw( RuntimeException, std::exception )
    3099             : {
    3100       27042 :     Any aRet;
    3101             : 
    3102       54084 :     aRet = Any(
    3103             :         ::cppu::queryInterface(
    3104             :             rType,
    3105             :             static_cast< XContainer * >( this ),
    3106             :             static_cast< XNameContainer * >( this ),
    3107             :             static_cast< XNameAccess * >( this ),
    3108             :             static_cast< XElementAccess * >( this ),
    3109       27042 :             static_cast< XChangesNotifier * >( this ) ) );
    3110       27042 :     if( !aRet.hasValue() )
    3111             :     {
    3112        9328 :         aRet = OComponentHelper::queryInterface( rType );
    3113             :     }
    3114       27042 :     return aRet;
    3115             : }
    3116             : 
    3117             : // Methods XElementAccess
    3118           0 : Type SfxLibrary::getElementType()
    3119             :     throw(RuntimeException, std::exception)
    3120             : {
    3121           0 :     return maNameContainer.getElementType();
    3122             : }
    3123             : 
    3124        8486 : sal_Bool SfxLibrary::hasElements()
    3125             :     throw(RuntimeException, std::exception)
    3126             : {
    3127        8486 :     bool bRet = maNameContainer.hasElements();
    3128        8486 :     return bRet;
    3129             : }
    3130             : 
    3131             : // Methods XNameAccess
    3132          82 : Any SfxLibrary::getByName( const OUString& aName )
    3133             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
    3134             : {
    3135          82 :     impl_checkLoaded();
    3136             : 
    3137          82 :     Any aRetAny = maNameContainer.getByName( aName ) ;
    3138          82 :     return aRetAny;
    3139             : }
    3140             : 
    3141        5208 : Sequence< OUString > SfxLibrary::getElementNames()
    3142             :     throw(RuntimeException, std::exception)
    3143             : {
    3144        5208 :     return maNameContainer.getElementNames();
    3145             : }
    3146             : 
    3147          96 : sal_Bool SfxLibrary::hasByName( const OUString& aName )
    3148             :     throw(RuntimeException, std::exception)
    3149             : {
    3150          96 :     bool bRet = maNameContainer.hasByName( aName );
    3151          96 :     return bRet;
    3152             : }
    3153             : 
    3154         318 : void SfxLibrary::impl_checkReadOnly()
    3155             : {
    3156         318 :     if( mbReadOnly || (mbLink && mbReadOnlyLink) )
    3157             :     {
    3158             :         throw IllegalArgumentException(
    3159             :             "Library is readonly.",
    3160             :             // TODO: resource
    3161             :             *this, 0
    3162           0 :         );
    3163             :     }
    3164         318 : }
    3165             : 
    3166         400 : void SfxLibrary::impl_checkLoaded()
    3167             : {
    3168         400 :     if ( !mbLoaded )
    3169             :     {
    3170             :         throw WrappedTargetException(
    3171             :             OUString(),
    3172             :             *this,
    3173             :             makeAny( LibraryNotLoadedException(
    3174             :                 OUString(),
    3175             :                 *this
    3176             :             ) )
    3177           0 :         );
    3178             :     }
    3179         400 : }
    3180             : 
    3181             : // Methods XNameReplace
    3182           0 : void SfxLibrary::replaceByName( const OUString& aName, const Any& aElement )
    3183             :     throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
    3184             : {
    3185           0 :     impl_checkReadOnly();
    3186           0 :     impl_checkLoaded();
    3187             : 
    3188             :     SAL_WARN_IF(
    3189             :         !isLibraryElementValid(aElement), "basic",
    3190             :         "SfxLibrary::replaceByName: replacing element is invalid!");
    3191             : 
    3192           0 :     maNameContainer.replaceByName( aName, aElement );
    3193           0 :     implSetModified( true );
    3194           0 : }
    3195             : 
    3196             : 
    3197             : // Methods XNameContainer
    3198         314 : void SfxLibrary::insertByName( const OUString& aName, const Any& aElement )
    3199             :     throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException, std::exception)
    3200             : {
    3201         314 :     impl_checkReadOnly();
    3202         314 :     impl_checkLoaded();
    3203             : 
    3204             :     SAL_WARN_IF(
    3205             :         !isLibraryElementValid(aElement), "basic",
    3206             :         "SfxLibrary::insertByName: to-be-inserted element is invalid!");
    3207             : 
    3208         314 :     maNameContainer.insertByName( aName, aElement );
    3209         314 :     implSetModified( true );
    3210         314 : }
    3211             : 
    3212           4 : void SfxLibrary::impl_removeWithoutChecks( const OUString& _rElementName )
    3213             : {
    3214           4 :     maNameContainer.removeByName( _rElementName );
    3215           4 :     implSetModified( true );
    3216             : 
    3217             :     // Remove element file
    3218           4 :     if( !maStorageURL.isEmpty() )
    3219             :     {
    3220           0 :         INetURLObject aElementInetObj( maStorageURL );
    3221             :         aElementInetObj.insertName( _rElementName, false,
    3222             :                                     INetURLObject::LAST_SEGMENT, true,
    3223           0 :                                     INetURLObject::ENCODE_ALL );
    3224           0 :         aElementInetObj.setExtension( maLibElementFileExtension );
    3225           0 :         OUString aFile = aElementInetObj.GetMainURL( INetURLObject::NO_DECODE );
    3226             : 
    3227             :         try
    3228             :         {
    3229           0 :             if( mxSFI->exists( aFile ) )
    3230             :             {
    3231           0 :                 mxSFI->kill( aFile );
    3232             :             }
    3233             :         }
    3234           0 :         catch(const Exception& )
    3235             :         {
    3236             :             DBG_UNHANDLED_EXCEPTION();
    3237           0 :         }
    3238             :     }
    3239           4 : }
    3240             : 
    3241           4 : void SfxLibrary::removeByName( const OUString& Name )
    3242             :     throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception)
    3243             : {
    3244           4 :     impl_checkReadOnly();
    3245           4 :     impl_checkLoaded();
    3246           4 :     impl_removeWithoutChecks( Name );
    3247           4 : }
    3248             : 
    3249             : // XTypeProvider
    3250           0 : Sequence< Type > SfxLibrary::getTypes()
    3251             :     throw( RuntimeException, std::exception )
    3252             : {
    3253             :     static OTypeCollection * s_pTypes_NameContainer = 0;
    3254             :     {
    3255           0 :         if( !s_pTypes_NameContainer )
    3256             :         {
    3257           0 :             MutexGuard aGuard( Mutex::getGlobalMutex() );
    3258           0 :             if( !s_pTypes_NameContainer )
    3259             :             {
    3260             :                 static OTypeCollection s_aTypes_NameContainer(
    3261           0 :                     cppu::UnoType<XNameContainer>::get(),
    3262           0 :                     cppu::UnoType<XContainer>::get(),
    3263           0 :                     cppu::UnoType<XChangesNotifier>::get(),
    3264           0 :                     OComponentHelper::getTypes() );
    3265           0 :                 s_pTypes_NameContainer = &s_aTypes_NameContainer;
    3266           0 :             }
    3267             :         }
    3268           0 :         return s_pTypes_NameContainer->getTypes();
    3269             :     }
    3270             : }
    3271             : 
    3272             : 
    3273           0 : Sequence< sal_Int8 > SfxLibrary::getImplementationId()
    3274             :     throw( RuntimeException, std::exception )
    3275             : {
    3276           0 :     return css::uno::Sequence<sal_Int8>();
    3277             : }
    3278             : 
    3279             : // Methods XContainer
    3280        5256 : void SAL_CALL SfxLibrary::addContainerListener( const Reference< XContainerListener >& xListener )
    3281             :     throw (RuntimeException, std::exception)
    3282             : {
    3283        5256 :     maNameContainer.setEventSource( static_cast< XInterface* >( (OWeakObject*)this ) );
    3284        5256 :     maNameContainer.addContainerListener( xListener );
    3285        5256 : }
    3286             : 
    3287           0 : void SAL_CALL SfxLibrary::removeContainerListener( const Reference< XContainerListener >& xListener )
    3288             :     throw (RuntimeException, std::exception)
    3289             : {
    3290           0 :     maNameContainer.removeContainerListener( xListener );
    3291           0 : }
    3292             : 
    3293             : // Methods XChangesNotifier
    3294          52 : void SAL_CALL SfxLibrary::addChangesListener( const Reference< XChangesListener >& xListener )
    3295             :     throw (RuntimeException, std::exception)
    3296             : {
    3297          52 :     maNameContainer.setEventSource( static_cast< XInterface* >( (OWeakObject*)this ) );
    3298          52 :     maNameContainer.addChangesListener( xListener );
    3299          52 : }
    3300             : 
    3301           0 : void SAL_CALL SfxLibrary::removeChangesListener( const Reference< XChangesListener >& xListener )
    3302             :     throw (RuntimeException, std::exception)
    3303             : {
    3304           0 :     maNameContainer.removeChangesListener( xListener );
    3305           0 : }
    3306             : 
    3307             : 
    3308             : // Implementation class ScriptExtensionIterator
    3309             : 
    3310             : #define sBasicLibMediaType "application/vnd.sun.star.basic-library"
    3311             : #define sDialogLibMediaType "application/vnd.sun.star.dialog-library"
    3312             : 
    3313         332 : ScriptExtensionIterator::ScriptExtensionIterator( void )
    3314             :     : m_xContext( comphelper::getProcessComponentContext() )
    3315             :     , m_eState( USER_EXTENSIONS )
    3316             :     , m_bUserPackagesLoaded( false )
    3317             :     , m_bSharedPackagesLoaded( false )
    3318             :     , m_bBundledPackagesLoaded( false )
    3319             :     , m_iUserPackage( 0 )
    3320             :     , m_iSharedPackage( 0 )
    3321             :        , m_iBundledPackage( 0 )
    3322         332 :     , m_pScriptSubPackageIterator( NULL )
    3323         332 : {}
    3324             : 
    3325         332 : OUString ScriptExtensionIterator::nextBasicOrDialogLibrary( bool& rbPureDialogLib )
    3326             : {
    3327         332 :     OUString aRetLib;
    3328             : 
    3329        1192 :     while( aRetLib.isEmpty() && m_eState != END_REACHED )
    3330             :     {
    3331         556 :         switch( m_eState )
    3332             :         {
    3333             :             case USER_EXTENSIONS:
    3334             :             {
    3335             :                 Reference< deployment::XPackage > xScriptPackage =
    3336         332 :                     implGetNextUserScriptPackage( rbPureDialogLib );
    3337         304 :                 if( !xScriptPackage.is() )
    3338             :                 {
    3339         304 :                     break;
    3340             :                 }
    3341           0 :                 aRetLib = xScriptPackage->getURL();
    3342           0 :                 break;
    3343             :             }
    3344             : 
    3345             :             case SHARED_EXTENSIONS:
    3346             :             {
    3347             :                 Reference< deployment::XPackage > xScriptPackage =
    3348         112 :                     implGetNextSharedScriptPackage( rbPureDialogLib );
    3349         112 :                 if( !xScriptPackage.is() )
    3350             :                 {
    3351         112 :                     break;
    3352             :                 }
    3353           0 :                 aRetLib = xScriptPackage->getURL();
    3354           0 :                 break;
    3355             :             }
    3356             :             case BUNDLED_EXTENSIONS:
    3357             :             {
    3358             :                 Reference< deployment::XPackage > xScriptPackage =
    3359         112 :                     implGetNextBundledScriptPackage( rbPureDialogLib );
    3360         112 :                 if( !xScriptPackage.is() )
    3361             :                 {
    3362         112 :                     break;
    3363             :                 }
    3364           0 :                 aRetLib = xScriptPackage->getURL();
    3365           0 :                 break;
    3366             :             }
    3367             :             case END_REACHED:
    3368             :                 SAL_WARN(
    3369             :                     "basic",
    3370             :                     ("ScriptExtensionIterator::nextBasicOrDialogLibrary():"
    3371             :                      " Invalid case END_REACHED"));
    3372           0 :                 break;
    3373             :         }
    3374             :     }
    3375             : 
    3376         304 :     return aRetLib;
    3377             : }
    3378             : 
    3379           0 : ScriptSubPackageIterator::ScriptSubPackageIterator( Reference< deployment::XPackage > xMainPackage )
    3380             :     : m_xMainPackage( xMainPackage )
    3381             :     , m_bIsValid( false )
    3382             :     , m_bIsBundle( false )
    3383             :     , m_nSubPkgCount( 0 )
    3384           0 :     , m_iNextSubPkg( 0 )
    3385             : {
    3386           0 :     Reference< deployment::XPackage > xScriptPackage;
    3387           0 :     if( !m_xMainPackage.is() )
    3388             :     {
    3389           0 :         return;
    3390             :     }
    3391             :     // Check if parent package is registered
    3392           0 :     beans::Optional< beans::Ambiguous<sal_Bool> > option( m_xMainPackage->isRegistered
    3393           0 :         ( Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>() ) );
    3394           0 :     bool bRegistered = false;
    3395           0 :     if( option.IsPresent )
    3396             :     {
    3397           0 :         beans::Ambiguous<sal_Bool> const & reg = option.Value;
    3398           0 :         if( !reg.IsAmbiguous && reg.Value )
    3399             :         {
    3400           0 :             bRegistered = true;
    3401             :         }
    3402             :     }
    3403           0 :     if( bRegistered )
    3404             :     {
    3405           0 :         m_bIsValid = true;
    3406           0 :         if( m_xMainPackage->isBundle() )
    3407             :         {
    3408           0 :             m_bIsBundle = true;
    3409           0 :             m_aSubPkgSeq = m_xMainPackage->getBundle( Reference<task::XAbortChannel>(),
    3410           0 :                                                       Reference<ucb::XCommandEnvironment>() );
    3411           0 :             m_nSubPkgCount = m_aSubPkgSeq.getLength();
    3412             :         }
    3413           0 :     }
    3414             : }
    3415             : 
    3416           0 : Reference< deployment::XPackage > ScriptSubPackageIterator::getNextScriptSubPackage( bool& rbPureDialogLib )
    3417             : {
    3418           0 :     rbPureDialogLib = false;
    3419             : 
    3420           0 :     Reference< deployment::XPackage > xScriptPackage;
    3421           0 :     if( !m_bIsValid )
    3422             :     {
    3423           0 :         return xScriptPackage;
    3424             :     }
    3425           0 :     if( m_bIsBundle )
    3426             :     {
    3427           0 :         const Reference< deployment::XPackage >* pSeq = m_aSubPkgSeq.getConstArray();
    3428             :         sal_Int32 iPkg;
    3429           0 :         for( iPkg = m_iNextSubPkg ; iPkg < m_nSubPkgCount ; ++iPkg )
    3430             :         {
    3431           0 :             const Reference< deployment::XPackage > xSubPkg = pSeq[ iPkg ];
    3432           0 :             xScriptPackage = implDetectScriptPackage( xSubPkg, rbPureDialogLib );
    3433           0 :             if( xScriptPackage.is() )
    3434             :             {
    3435           0 :                 break;
    3436             :             }
    3437           0 :         }
    3438           0 :         m_iNextSubPkg = iPkg + 1;
    3439             :     }
    3440             :     else
    3441             :     {
    3442           0 :         xScriptPackage = implDetectScriptPackage( m_xMainPackage, rbPureDialogLib );
    3443           0 :         m_bIsValid = false;     // No more script packages
    3444             :     }
    3445             : 
    3446           0 :     return xScriptPackage;
    3447             : }
    3448             : 
    3449           0 : Reference< deployment::XPackage > ScriptSubPackageIterator::implDetectScriptPackage ( const Reference< deployment::XPackage > xPackage,
    3450             :                                                                                       bool& rbPureDialogLib )
    3451             : {
    3452           0 :     Reference< deployment::XPackage > xScriptPackage;
    3453             : 
    3454           0 :     if( xPackage.is() )
    3455             :     {
    3456           0 :         const Reference< deployment::XPackageTypeInfo > xPackageTypeInfo = xPackage->getPackageType();
    3457           0 :         OUString aMediaType = xPackageTypeInfo->getMediaType();
    3458           0 :         if ( aMediaType == sBasicLibMediaType )
    3459             :         {
    3460           0 :             xScriptPackage = xPackage;
    3461             :         }
    3462           0 :         else if ( aMediaType == sDialogLibMediaType )
    3463             :         {
    3464           0 :             rbPureDialogLib = true;
    3465           0 :             xScriptPackage = xPackage;
    3466           0 :         }
    3467             :     }
    3468             : 
    3469           0 :     return xScriptPackage;
    3470             : }
    3471             : 
    3472         332 : Reference< deployment::XPackage > ScriptExtensionIterator::implGetNextUserScriptPackage( bool& rbPureDialogLib )
    3473             : {
    3474         332 :     Reference< deployment::XPackage > xScriptPackage;
    3475             : 
    3476         332 :     if( !m_bUserPackagesLoaded )
    3477             :     {
    3478             :         try
    3479             :         {
    3480         332 :             Reference< XExtensionManager > xManager = ExtensionManager::get( m_xContext );
    3481         392 :             m_aUserPackagesSeq = xManager->getDeployedExtensions(OUString("user"),
    3482             :                                                                  Reference< task::XAbortChannel >(),
    3483         392 :                                                                  Reference< ucb::XCommandEnvironment >() );
    3484             :         }
    3485         384 :         catch(const com::sun::star::uno::DeploymentException& )
    3486             :         {
    3487             :             // Special Office installations may not contain deployment code
    3488         192 :             m_eState = END_REACHED;
    3489         192 :             return xScriptPackage;
    3490             :         }
    3491             : 
    3492         112 :         m_bUserPackagesLoaded = true;
    3493             :     }
    3494             : 
    3495         112 :     if( m_iUserPackage == m_aUserPackagesSeq.getLength() )
    3496             :     {
    3497         112 :         m_eState = SHARED_EXTENSIONS;       // Later: SHARED_MODULE
    3498             :     }
    3499             :     else
    3500             :     {
    3501           0 :         if( m_pScriptSubPackageIterator == NULL )
    3502             :         {
    3503           0 :             const Reference< deployment::XPackage >* pUserPackages = m_aUserPackagesSeq.getConstArray();
    3504           0 :             Reference< deployment::XPackage > xPackage = pUserPackages[ m_iUserPackage ];
    3505             :             SAL_WARN_IF(
    3506             :                 !xPackage.is(), "basic",
    3507             :                 ("ScriptExtensionIterator::implGetNextUserScriptPackage():"
    3508             :                  " Invalid package"));
    3509           0 :             m_pScriptSubPackageIterator = new ScriptSubPackageIterator( xPackage );
    3510             :         }
    3511             : 
    3512           0 :         if( m_pScriptSubPackageIterator != NULL )
    3513             :         {
    3514           0 :             xScriptPackage = m_pScriptSubPackageIterator->getNextScriptSubPackage( rbPureDialogLib );
    3515           0 :             if( !xScriptPackage.is() )
    3516             :             {
    3517           0 :                 delete m_pScriptSubPackageIterator;
    3518           0 :                 m_pScriptSubPackageIterator = NULL;
    3519           0 :                 m_iUserPackage++;
    3520             :             }
    3521             :         }
    3522             :     }
    3523             : 
    3524         112 :     return xScriptPackage;
    3525             : }
    3526             : 
    3527         112 : Reference< deployment::XPackage > ScriptExtensionIterator::implGetNextSharedScriptPackage( bool& rbPureDialogLib )
    3528             : {
    3529         112 :     Reference< deployment::XPackage > xScriptPackage;
    3530             : 
    3531         112 :     if( !m_bSharedPackagesLoaded )
    3532             :     {
    3533             :         try
    3534             :         {
    3535         112 :             Reference< XExtensionManager > xSharedManager = ExtensionManager::get( m_xContext );
    3536         336 :             m_aSharedPackagesSeq = xSharedManager->getDeployedExtensions(OUString("shared"),
    3537             :                                                                          Reference< task::XAbortChannel >(),
    3538         336 :                                                                          Reference< ucb::XCommandEnvironment >() );
    3539             :         }
    3540           0 :         catch(const com::sun::star::uno::DeploymentException& )
    3541             :         {
    3542             :             // Special Office installations may not contain deployment code
    3543           0 :             return xScriptPackage;
    3544             :         }
    3545             : 
    3546         112 :         m_bSharedPackagesLoaded = true;
    3547             :     }
    3548             : 
    3549         112 :     if( m_iSharedPackage == m_aSharedPackagesSeq.getLength() )
    3550             :     {
    3551         112 :         m_eState = BUNDLED_EXTENSIONS;
    3552             :     }
    3553             :     else
    3554             :     {
    3555           0 :         if( m_pScriptSubPackageIterator == NULL )
    3556             :         {
    3557           0 :             const Reference< deployment::XPackage >* pSharedPackages = m_aSharedPackagesSeq.getConstArray();
    3558           0 :             Reference< deployment::XPackage > xPackage = pSharedPackages[ m_iSharedPackage ];
    3559             :             SAL_WARN_IF(
    3560             :                 !xPackage.is(), "basic",
    3561             :                 ("ScriptExtensionIterator::implGetNextSharedScriptPackage():"
    3562             :                  " Invalid package"));
    3563           0 :             m_pScriptSubPackageIterator = new ScriptSubPackageIterator( xPackage );
    3564             :         }
    3565             : 
    3566           0 :         if( m_pScriptSubPackageIterator != NULL )
    3567             :         {
    3568           0 :             xScriptPackage = m_pScriptSubPackageIterator->getNextScriptSubPackage( rbPureDialogLib );
    3569           0 :             if( !xScriptPackage.is() )
    3570             :             {
    3571           0 :                 delete m_pScriptSubPackageIterator;
    3572           0 :                 m_pScriptSubPackageIterator = NULL;
    3573           0 :                 m_iSharedPackage++;
    3574             :             }
    3575             :         }
    3576             :     }
    3577             : 
    3578         112 :     return xScriptPackage;
    3579             : }
    3580             : 
    3581         112 : Reference< deployment::XPackage > ScriptExtensionIterator::implGetNextBundledScriptPackage( bool& rbPureDialogLib )
    3582             : {
    3583         112 :     Reference< deployment::XPackage > xScriptPackage;
    3584             : 
    3585         112 :     if( !m_bBundledPackagesLoaded )
    3586             :     {
    3587             :         try
    3588             :         {
    3589         112 :             Reference< XExtensionManager > xManager = ExtensionManager::get( m_xContext );
    3590         336 :             m_aBundledPackagesSeq = xManager->getDeployedExtensions(OUString("bundled"),
    3591             :                                                                     Reference< task::XAbortChannel >(),
    3592         336 :                                                                     Reference< ucb::XCommandEnvironment >() );
    3593             :         }
    3594           0 :         catch(const com::sun::star::uno::DeploymentException& )
    3595             :         {
    3596             :             // Special Office installations may not contain deployment code
    3597           0 :             return xScriptPackage;
    3598             :         }
    3599             : 
    3600         112 :         m_bBundledPackagesLoaded = true;
    3601             :     }
    3602             : 
    3603         112 :     if( m_iBundledPackage == m_aBundledPackagesSeq.getLength() )
    3604             :     {
    3605         112 :         m_eState = END_REACHED;
    3606             :     }
    3607             :     else
    3608             :     {
    3609           0 :         if( m_pScriptSubPackageIterator == NULL )
    3610             :         {
    3611           0 :             const Reference< deployment::XPackage >* pBundledPackages = m_aBundledPackagesSeq.getConstArray();
    3612           0 :             Reference< deployment::XPackage > xPackage = pBundledPackages[ m_iBundledPackage ];
    3613             :             SAL_WARN_IF(
    3614             :                 !xPackage.is(), "basic",
    3615             :                 ("ScriptExtensionIterator::implGetNextBundledScriptPackage():"
    3616             :                  " Invalid package"));
    3617           0 :             m_pScriptSubPackageIterator = new ScriptSubPackageIterator( xPackage );
    3618             :         }
    3619             : 
    3620           0 :         if( m_pScriptSubPackageIterator != NULL )
    3621             :         {
    3622           0 :             xScriptPackage = m_pScriptSubPackageIterator->getNextScriptSubPackage( rbPureDialogLib );
    3623           0 :             if( !xScriptPackage.is() )
    3624             :             {
    3625           0 :                 delete m_pScriptSubPackageIterator;
    3626           0 :                 m_pScriptSubPackageIterator = NULL;
    3627           0 :                 m_iBundledPackage++;
    3628             :             }
    3629             :         }
    3630             :     }
    3631             : 
    3632         112 :     return xScriptPackage;
    3633             : }
    3634             : 
    3635        1203 : }   // namespace basic
    3636             : 
    3637             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10