LCOV - code coverage report
Current view: top level - basic/source/basmgr - basmgr.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 232 1029 22.5 %
Date: 2015-06-13 12:38:46 Functions: 36 148 24.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 <tools/stream.hxx>
      21             : #include <sot/storage.hxx>
      22             : #include <tools/urlobj.hxx>
      23             : #include <svl/smplhint.hxx>
      24             : #include <vcl/svapp.hxx>
      25             : #include <vcl/window.hxx>
      26             : #include <vcl/wrkwin.hxx>
      27             : #include <vcl/msgbox.hxx>
      28             : #include <basic/sbx.hxx>
      29             : #include <sot/storinfo.hxx>
      30             : #include <unotools/pathoptions.hxx>
      31             : #include <tools/debug.hxx>
      32             : #include <tools/diagnose_ex.h>
      33             : #include <basic/sbmod.hxx>
      34             : #include <unotools/intlwrapper.hxx>
      35             : #include <comphelper/processfactory.hxx>
      36             : #include <comphelper/string.hxx>
      37             : 
      38             : #include <basic/sbuno.hxx>
      39             : #include <basic/basmgr.hxx>
      40             : #include "global.hxx"
      41             : #include <sbunoobj.hxx>
      42             : #include "basrid.hxx"
      43             : #include "sbintern.hxx"
      44             : #include <sb.hrc>
      45             : 
      46             : #include <vector>
      47             : #include <boost/ptr_container/ptr_vector.hpp>
      48             : 
      49             : #define LIB_SEP         0x01
      50             : #define LIBINFO_SEP     0x02
      51             : #define LIBINFO_ID      0x1491
      52             : #define PASSWORD_MARKER 0x31452134
      53             : 
      54             : 
      55             : // Library API, implemented for XML import/export
      56             : 
      57             : #include <com/sun/star/container/XNameContainer.hpp>
      58             : #include <com/sun/star/container/XContainer.hpp>
      59             : #include <com/sun/star/script/XStarBasicAccess.hpp>
      60             : #include <com/sun/star/script/XStarBasicModuleInfo.hpp>
      61             : #include <com/sun/star/script/XStarBasicDialogInfo.hpp>
      62             : #include <com/sun/star/script/XStarBasicLibraryInfo.hpp>
      63             : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
      64             : #include <com/sun/star/script/ModuleInfo.hpp>
      65             : #include <com/sun/star/script/vba/XVBACompatibility.hpp>
      66             : #include <com/sun/star/script/vba/XVBAModuleInfo.hpp>
      67             : #include <com/sun/star/ucb/ContentCreationException.hpp>
      68             : 
      69             : #include <cppuhelper/implbase1.hxx>
      70             : 
      71             : using com::sun::star::uno::Reference;
      72             : using namespace com::sun::star;
      73             : using namespace com::sun::star::script;
      74             : using namespace cppu;
      75             : 
      76             : typedef WeakImplHelper1< container::XNameContainer > NameContainerHelper;
      77             : typedef WeakImplHelper1< script::XStarBasicModuleInfo > ModuleInfoHelper;
      78             : typedef WeakImplHelper1< script::XStarBasicDialogInfo > DialogInfoHelper;
      79             : typedef WeakImplHelper1< script::XStarBasicLibraryInfo > LibraryInfoHelper;
      80             : typedef WeakImplHelper1< script::XStarBasicAccess > StarBasicAccessHelper;
      81             : 
      82             : // Version 1
      83             : //    sal_uInt32    nEndPos
      84             : //    sal_uInt16    nId
      85             : //    sal_uInt16    nVer
      86             : //    bool      bDoLoad
      87             : //    String    LibName
      88             : //    String    AbsStorageName
      89             : //    String    RelStorageName
      90             : // Version 2
      91             : //  + bool      bReference
      92             : 
      93             : static const char szStdLibName[] = "Standard";
      94             : static const char szBasicStorage[] = "StarBASIC";
      95             : static const char szOldManagerStream[] = "BasicManager";
      96             : static const char szManagerStream[] = "BasicManager2";
      97             : static const char szImbedded[] = "LIBIMBEDDED";
      98             : static const char szCryptingKey[] = "CryptedBasic";
      99             : 
     100           0 : TYPEINIT1( BasicManager, SfxBroadcaster );
     101             : 
     102         262 : const StreamMode eStreamReadMode = StreamMode::READ | StreamMode::NOCREATE | StreamMode::SHARE_DENYALL;
     103         262 : const StreamMode eStorageReadMode = StreamMode::READ | StreamMode::SHARE_DENYWRITE;
     104             : 
     105             : 
     106             : // BasicManager impl data
     107             : struct BasicManagerImpl
     108             : {
     109             :     LibraryContainerInfo    maContainerInfo;
     110             : 
     111             :     // Save stream data
     112             :     SvMemoryStream*  mpManagerStream;
     113             :     SvMemoryStream** mppLibStreams;
     114             :     sal_Int32        mnLibStreamCount;
     115             : 
     116             :     boost::ptr_vector<BasicLibInfo> aLibs;
     117             :     OUString         aBasicLibPath;
     118             : 
     119        2118 :     BasicManagerImpl()
     120             :         : mpManagerStream( NULL )
     121             :         , mppLibStreams( NULL )
     122        2118 :         , mnLibStreamCount( 0 )
     123        2118 :     {}
     124             :     ~BasicManagerImpl();
     125             : };
     126             : 
     127        4104 : BasicManagerImpl::~BasicManagerImpl()
     128             : {
     129        2052 :     delete mpManagerStream;
     130        2052 :     if( mppLibStreams )
     131             :     {
     132           0 :         for( sal_Int32 i = 0 ; i < mnLibStreamCount ; i++ )
     133           0 :             delete mppLibStreams[i];
     134           0 :         delete[] mppLibStreams;
     135             :     }
     136        2052 : }
     137             : 
     138             : 
     139             : // BasMgrContainerListenerImpl
     140             : 
     141             : 
     142             : typedef ::cppu::WeakImplHelper1< container::XContainerListener > ContainerListenerHelper;
     143             : 
     144        9040 : class BasMgrContainerListenerImpl: public ContainerListenerHelper
     145             : {
     146             :     BasicManager* mpMgr;
     147             :     OUString maLibName;      // empty -> no lib, but lib container
     148             : 
     149             : public:
     150        5217 :     BasMgrContainerListenerImpl( BasicManager* pMgr, const OUString& aLibName )
     151             :         : mpMgr( pMgr )
     152        5217 :         , maLibName( aLibName ) {}
     153             : 
     154             :     static void insertLibraryImpl( const uno::Reference< script::XLibraryContainer >& xScriptCont, BasicManager* pMgr,
     155             :                                    uno::Any aLibAny, const OUString& aLibName );
     156             :     static void addLibraryModulesImpl( BasicManager* pMgr, uno::Reference< container::XNameAccess > xLibNameAccess,
     157             :                                        const OUString& aLibName );
     158             : 
     159             : 
     160             :     // XEventListener
     161             :     virtual void SAL_CALL disposing( const lang::EventObject& Source )
     162             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
     163             : 
     164             :     // XContainerListener
     165             :     virtual void SAL_CALL elementInserted( const container::ContainerEvent& Event )
     166             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
     167             :     virtual void SAL_CALL elementReplaced( const container::ContainerEvent& Event )
     168             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
     169             :     virtual void SAL_CALL elementRemoved( const container::ContainerEvent& Event )
     170             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
     171             : };
     172             : 
     173             : 
     174             : 
     175             : // BasMgrContainerListenerImpl
     176             : 
     177             : 
     178        3100 : void BasMgrContainerListenerImpl::insertLibraryImpl( const uno::Reference< script::XLibraryContainer >& xScriptCont,
     179             :     BasicManager* pMgr, uno::Any aLibAny, const OUString& aLibName )
     180             : {
     181        3100 :     Reference< container::XNameAccess > xLibNameAccess;
     182        3100 :     aLibAny >>= xLibNameAccess;
     183             : 
     184        3100 :     if( !pMgr->GetLib( aLibName ) )
     185             :     {
     186        1033 :         BasicManager* pBasMgr = static_cast< BasicManager* >( pMgr );
     187             : #ifdef DBG_UTIL
     188             :         StarBASIC* pLib =
     189             : #endif
     190        1033 :         pBasMgr->CreateLibForLibContainer( aLibName, xScriptCont );
     191             :         DBG_ASSERT( pLib, "XML Import: Basic library could not be created");
     192             :     }
     193             : 
     194        6200 :     uno::Reference< container::XContainer> xLibContainer( xLibNameAccess, uno::UNO_QUERY );
     195        3100 :     if( xLibContainer.is() )
     196             :     {
     197             :         // Register listener for library
     198             :         Reference< container::XContainerListener > xLibraryListener
     199             :             = static_cast< container::XContainerListener* >
     200        3100 :                 ( new BasMgrContainerListenerImpl( pMgr, aLibName ) );
     201        3100 :         xLibContainer->addContainerListener( xLibraryListener );
     202             :     }
     203             : 
     204        3100 :     if( xScriptCont->isLibraryLoaded( aLibName ) )
     205             :     {
     206        2100 :         addLibraryModulesImpl( pMgr, xLibNameAccess, aLibName );
     207        3100 :     }
     208        3100 : }
     209             : 
     210             : 
     211        2100 : void BasMgrContainerListenerImpl::addLibraryModulesImpl( BasicManager* pMgr,
     212             :     uno::Reference< container::XNameAccess > xLibNameAccess, const OUString& aLibName )
     213             : {
     214        2100 :     uno::Sequence< OUString > aModuleNames = xLibNameAccess->getElementNames();
     215        2100 :     sal_Int32 nModuleCount = aModuleNames.getLength();
     216             : 
     217        2100 :     StarBASIC* pLib = pMgr->GetLib( aLibName );
     218             :     DBG_ASSERT( pLib, "BasMgrContainerListenerImpl::addLibraryModulesImpl: Unknown lib!");
     219        2100 :     if( pLib )
     220             :     {
     221        2100 :         const OUString* pNames = aModuleNames.getConstArray();
     222        2169 :         for( sal_Int32 j = 0 ; j < nModuleCount ; j++ )
     223             :         {
     224          69 :             OUString aModuleName = pNames[ j ];
     225         138 :             uno::Any aElement = xLibNameAccess->getByName( aModuleName );
     226         138 :             OUString aMod;
     227          69 :             aElement >>= aMod;
     228         138 :             uno::Reference< vba::XVBAModuleInfo > xVBAModuleInfo( xLibNameAccess, uno::UNO_QUERY );
     229          69 :             if ( xVBAModuleInfo.is() && xVBAModuleInfo->hasModuleInfo( aModuleName ) )
     230             :             {
     231           0 :                 ModuleInfo mInfo = xVBAModuleInfo->getModuleInfo( aModuleName );
     232             :                 OSL_TRACE("#addLibraryModulesImpl - aMod");
     233           0 :                 pLib->MakeModule32( aModuleName, mInfo, aMod );
     234             :             }
     235             :             else
     236          69 :         pLib->MakeModule32( aModuleName, aMod );
     237          69 :         }
     238             : 
     239        2100 :         pLib->SetModified( false );
     240        2100 :     }
     241        2100 : }
     242             : 
     243             : 
     244             : 
     245             : // XEventListener
     246             : 
     247             : 
     248           0 : void SAL_CALL BasMgrContainerListenerImpl::disposing( const lang::EventObject& Source )
     249             :     throw( uno::RuntimeException, std::exception )
     250             : {
     251             :     (void)Source;
     252           0 : }
     253             : 
     254             : // XContainerListener
     255             : 
     256             : 
     257        2196 : void SAL_CALL BasMgrContainerListenerImpl::elementInserted( const container::ContainerEvent& Event )
     258             :     throw( uno::RuntimeException, std::exception )
     259             : {
     260        2196 :     bool bLibContainer = maLibName.isEmpty();
     261        2196 :     OUString aName;
     262        2196 :     Event.Accessor >>= aName;
     263             : 
     264        2196 :     if( bLibContainer )
     265             :     {
     266        2034 :         uno::Reference< script::XLibraryContainer > xScriptCont( Event.Source, uno::UNO_QUERY );
     267        2034 :         insertLibraryImpl( xScriptCont, mpMgr, Event.Element, aName );
     268        2034 :         StarBASIC* pLib = mpMgr->GetLib( aName );
     269        2034 :         if ( pLib )
     270             :         {
     271        2034 :             uno::Reference< vba::XVBACompatibility > xVBACompat( xScriptCont, uno::UNO_QUERY );
     272        2034 :             if ( xVBACompat.is() )
     273        2034 :                 pLib->SetVBAEnabled( xVBACompat->getVBACompatibilityMode() );
     274        2034 :         }
     275             :     }
     276             :     else
     277             :     {
     278             : 
     279         162 :         StarBASIC* pLib = mpMgr->GetLib( maLibName );
     280             :         DBG_ASSERT( pLib, "BasMgrContainerListenerImpl::elementInserted: Unknown lib!");
     281         162 :         if( pLib )
     282             :         {
     283         162 :             SbModule* pMod = pLib->FindModule( aName );
     284         162 :             if( !pMod )
     285             :             {
     286         162 :             OUString aMod;
     287         162 :             Event.Element >>= aMod;
     288         324 :                 uno::Reference< vba::XVBAModuleInfo > xVBAModuleInfo( Event.Source, uno::UNO_QUERY );
     289         162 :                 if ( xVBAModuleInfo.is() && xVBAModuleInfo->hasModuleInfo( aName ) )
     290             :                 {
     291         162 :                     ModuleInfo mInfo = xVBAModuleInfo->getModuleInfo( aName );
     292         162 :                     pLib->MakeModule32( aName, mInfo, aMod );
     293             :                 }
     294             :                 else
     295           0 :                     pLib->MakeModule32( aName, aMod );
     296         324 :                 pLib->SetModified( false );
     297             :             }
     298             :         }
     299        2196 :     }
     300        2196 : }
     301             : 
     302             : 
     303             : 
     304           0 : void SAL_CALL BasMgrContainerListenerImpl::elementReplaced( const container::ContainerEvent& Event )
     305             :     throw( uno::RuntimeException, std::exception )
     306             : {
     307           0 :     OUString aName;
     308           0 :     Event.Accessor >>= aName;
     309             : 
     310             :     // Replace not possible for library container
     311             : #ifdef DBG_UTIL
     312             :     bool bLibContainer = maLibName.isEmpty();
     313             : #endif
     314             :     DBG_ASSERT( !bLibContainer, "library container fired elementReplaced()");
     315             : 
     316           0 :     StarBASIC* pLib = mpMgr->GetLib( maLibName );
     317           0 :     if( pLib )
     318             :     {
     319           0 :         SbModule* pMod = pLib->FindModule( aName );
     320           0 :         OUString aMod;
     321           0 :         Event.Element >>= aMod;
     322             : 
     323           0 :         if( pMod )
     324           0 :                 pMod->SetSource32( aMod );
     325             :         else
     326           0 :                 pLib->MakeModule32( aName, aMod );
     327             : 
     328           0 :         pLib->SetModified( false );
     329           0 :     }
     330           0 : }
     331             : 
     332             : 
     333             : 
     334           0 : void SAL_CALL BasMgrContainerListenerImpl::elementRemoved( const container::ContainerEvent& Event )
     335             :     throw( uno::RuntimeException, std::exception )
     336             : {
     337           0 :     OUString aName;
     338           0 :     Event.Accessor >>= aName;
     339             : 
     340           0 :     bool bLibContainer = maLibName.isEmpty();
     341           0 :     if( bLibContainer )
     342             :     {
     343           0 :         StarBASIC* pLib = mpMgr->GetLib( aName );
     344           0 :         if( pLib )
     345             :         {
     346           0 :             sal_uInt16 nLibId = mpMgr->GetLibId( aName );
     347           0 :             mpMgr->RemoveLib( nLibId, false );
     348             :         }
     349             :     }
     350             :     else
     351             :     {
     352           0 :         StarBASIC* pLib = mpMgr->GetLib( maLibName );
     353           0 :         SbModule* pMod = pLib ? pLib->FindModule( aName ) : NULL;
     354           0 :         if( pMod )
     355             :         {
     356           0 :             pLib->Remove( pMod );
     357           0 :             pLib->SetModified( false );
     358             :         }
     359           0 :     }
     360           0 : }
     361             : 
     362           0 : BasicError::BasicError( sal_uInt64 nId, BasicErrorReason nR, const OUString& rErrStr ) :
     363           0 :     aErrStr( rErrStr )
     364             : {
     365           0 :     nErrorId    = nId;
     366           0 :     nReason     = nR;
     367           0 : }
     368             : 
     369           0 : BasicError::BasicError( const BasicError& rErr ) :
     370           0 :     aErrStr( rErr.aErrStr )
     371             : {
     372           0 :     nErrorId    = rErr.nErrorId;
     373           0 :     nReason     = rErr.nReason;
     374           0 : }
     375             : 
     376             : 
     377             : 
     378             : 
     379        2500 : class BasicLibInfo
     380             : {
     381             : private:
     382             :     StarBASICRef    xLib;
     383             :     OUString          aLibName;
     384             :     OUString          aStorageName;   // string is sufficient, unique at runtime
     385             :     OUString          aRelStorageName;
     386             :     OUString          aPassword;
     387             : 
     388             :     bool              bDoLoad;
     389             :     bool              bReference;
     390             :     bool              bPasswordVerified;
     391             : 
     392             :     // Lib represents library in new UNO library container
     393             :     uno::Reference< script::XLibraryContainer > mxScriptCont;
     394             : 
     395             : public:
     396             :     BasicLibInfo();
     397             : 
     398           0 :     bool&             IsReference()           { return bReference; }
     399             : 
     400           0 :     bool              IsExtern() const        { return aStorageName != szImbedded; }
     401             : 
     402           0 :     void              SetStorageName( const OUString& rName )   { aStorageName = rName; }
     403           0 :     const OUString&   GetStorageName() const                  { return aStorageName; }
     404             : 
     405           0 :     void              SetRelStorageName( const OUString& rN )   { aRelStorageName = rN; }
     406           0 :     const OUString&   GetRelStorageName() const               { return aRelStorageName; }
     407             : 
     408       79270 :     StarBASICRef      GetLib() const
     409             :     {
     410       84235 :         if( mxScriptCont.is() && mxScriptCont->hasByName( aLibName ) &&
     411        4965 :             !mxScriptCont->isLibraryLoaded( aLibName ) )
     412           1 :                 return StarBASICRef();
     413       79269 :         return xLib;
     414             :     }
     415           0 :     StarBASICRef&     GetLibRef()                         { return xLib; }
     416        3151 :     void              SetLib( StarBASIC* pBasic )         { xLib = pBasic; }
     417             : 
     418       26193 :     const OUString&   GetLibName() const                  { return aLibName; }
     419        3151 :     void              SetLibName( const OUString& rName )   { aLibName = rName; }
     420             : 
     421             :     // Only temporary for Load/Save
     422           0 :     bool              DoLoad()                            { return bDoLoad; }
     423             : 
     424        2001 :     bool              HasPassword() const                 { return !aPassword.isEmpty(); }
     425           0 :     const OUString&   GetPassword() const                 { return aPassword; }
     426           0 :     void              SetPassword( const OUString& rNewPassword )
     427           0 :                                                         { aPassword = rNewPassword; }
     428           0 :     void              SetPasswordVerified()               { bPasswordVerified = true; }
     429             : 
     430             :     static BasicLibInfo*    Create( SotStorageStream& rSStream );
     431             : 
     432           0 :     uno::Reference< script::XLibraryContainer > GetLibraryContainer()
     433           0 :         { return mxScriptCont; }
     434        1033 :     void SetLibraryContainer( const uno::Reference< script::XLibraryContainer >& xScriptCont )
     435        1033 :         { mxScriptCont = xScriptCont; }
     436             : };
     437             : 
     438             : 
     439        3151 : BasicLibInfo::BasicLibInfo()
     440             : {
     441        3151 :     bReference          = false;
     442        3151 :     bPasswordVerified   = false;
     443        3151 :     bDoLoad             = false;
     444        3151 :     mxScriptCont        = NULL;
     445        3151 :     aStorageName        = szImbedded;
     446        3151 :     aRelStorageName     = szImbedded;
     447        3151 : }
     448             : 
     449           0 : BasicLibInfo* BasicLibInfo::Create( SotStorageStream& rSStream )
     450             : {
     451           0 :     BasicLibInfo* pInfo = new BasicLibInfo;
     452             : 
     453             :     sal_uInt32 nEndPos;
     454             :     sal_uInt16 nId;
     455             :     sal_uInt16 nVer;
     456             : 
     457           0 :     rSStream.ReadUInt32( nEndPos );
     458           0 :     rSStream.ReadUInt16( nId );
     459           0 :     rSStream.ReadUInt16( nVer );
     460             : 
     461             :     DBG_ASSERT( nId == LIBINFO_ID, "No BasicLibInfo?!" );
     462           0 :     if( nId == LIBINFO_ID )
     463             :     {
     464             :         // Reload?
     465             :         bool bDoLoad;
     466           0 :         rSStream.ReadCharAsBool( bDoLoad );
     467           0 :         pInfo->bDoLoad = bDoLoad;
     468             : 
     469             :         // The name of the lib...
     470           0 :         OUString aName = rSStream.ReadUniOrByteString(rSStream.GetStreamCharSet());
     471           0 :         pInfo->SetLibName( aName );
     472             : 
     473             :         // Absolute path...
     474           0 :         OUString aStorageName = rSStream.ReadUniOrByteString(rSStream.GetStreamCharSet());
     475           0 :         pInfo->SetStorageName( aStorageName );
     476             : 
     477             :         // Relative path...
     478           0 :         OUString aRelStorageName = rSStream.ReadUniOrByteString(rSStream.GetStreamCharSet());
     479           0 :         pInfo->SetRelStorageName( aRelStorageName );
     480             : 
     481           0 :         if ( nVer >= 2 )
     482             :         {
     483             :             bool bReferenz;
     484           0 :             rSStream.ReadCharAsBool( bReferenz );
     485           0 :             pInfo->IsReference() = bReferenz;
     486             :         }
     487             : 
     488           0 :         rSStream.Seek( nEndPos );
     489             :     }
     490           0 :     return pInfo;
     491             : }
     492             : 
     493        2006 : BasicManager::BasicManager( SotStorage& rStorage, const OUString& rBaseURL, StarBASIC* pParentFromStdLib, OUString* pLibPath, bool bDocMgr ) : mbDocMgr( bDocMgr )
     494             : {
     495        2006 :     Init();
     496             : 
     497        2006 :     if( pLibPath )
     498             :     {
     499        2006 :         mpImpl->aBasicLibPath = *pLibPath;
     500             :     }
     501        2006 :     OUString aStorName( rStorage.GetName() );
     502        2006 :     maStorageName = INetURLObject(aStorName, INetProtocol::File).GetMainURL( INetURLObject::NO_DECODE );
     503             : 
     504             : 
     505             :     // If there is no Manager Stream, no further actions are necessary
     506        2006 :     if ( rStorage.IsStream( OUString(szManagerStream) ) )
     507             :     {
     508           0 :         LoadBasicManager( rStorage, rBaseURL );
     509             :         // StdLib contains Parent:
     510           0 :         StarBASIC* pStdLib = GetStdLib();
     511             :         DBG_ASSERT( pStdLib, "Standard-Lib not loaded?" );
     512           0 :         if ( !pStdLib )
     513             :         {
     514             :             // Should never happen, but if it happens we wont crash...
     515           0 :             pStdLib = new StarBASIC( NULL, mbDocMgr );
     516             : 
     517           0 :             if (mpImpl->aLibs.empty())
     518           0 :                 CreateLibInfo();
     519             : 
     520           0 :             BasicLibInfo& rStdLibInfo = mpImpl->aLibs.front();
     521             : 
     522           0 :             rStdLibInfo.SetLib( pStdLib );
     523           0 :             StarBASICRef xStdLib = rStdLibInfo.GetLib();
     524           0 :             xStdLib->SetName( OUString(szStdLibName) );
     525           0 :             rStdLibInfo.SetLibName( OUString(szStdLibName) );
     526           0 :             xStdLib->SetFlag( SBX_DONTSTORE | SBX_EXTSEARCH );
     527           0 :             xStdLib->SetModified( false );
     528             :         }
     529             :         else
     530             :         {
     531           0 :             pStdLib->SetParent( pParentFromStdLib );
     532             :             // The other get StdLib as parent:
     533             : 
     534           0 :             for ( sal_uInt16 nBasic = 1; nBasic < GetLibCount(); nBasic++ )
     535             :             {
     536           0 :                 StarBASIC* pBasic = GetLib( nBasic );
     537           0 :                 if ( pBasic )
     538             :                 {
     539           0 :                     pStdLib->Insert( pBasic );
     540           0 :                     pBasic->SetFlag( SBX_EXTSEARCH );
     541             :                 }
     542             :             }
     543             :             // Modified through insert
     544           0 :             pStdLib->SetModified( false );
     545             :         }
     546             : 
     547             :         // #91626 Save all stream data to save it unmodified if basic isn't modified
     548             :         // in an 6.0+ office. So also the old basic dialogs can be saved.
     549           0 :         tools::SvRef<SotStorageStream> xManagerStream = rStorage.OpenSotStream( OUString(szManagerStream), eStreamReadMode );
     550           0 :         mpImpl->mpManagerStream = new SvMemoryStream();
     551           0 :         static_cast<SvStream*>(&xManagerStream)->ReadStream( *mpImpl->mpManagerStream );
     552             : 
     553           0 :         tools::SvRef<SotStorage> xBasicStorage = rStorage.OpenSotStorage( OUString(szBasicStorage), eStorageReadMode, false );
     554           0 :         if( xBasicStorage.Is() && !xBasicStorage->GetError() )
     555             :         {
     556           0 :             sal_uInt16 nLibs = GetLibCount();
     557           0 :             mpImpl->mppLibStreams = new SvMemoryStream*[ nLibs ];
     558           0 :             for( sal_uInt16 nL = 0; nL < nLibs; nL++ )
     559             :             {
     560           0 :                 BasicLibInfo& rInfo = mpImpl->aLibs[nL];
     561           0 :                 tools::SvRef<SotStorageStream> xBasicStream = xBasicStorage->OpenSotStream( rInfo.GetLibName(), eStreamReadMode );
     562           0 :                 mpImpl->mppLibStreams[nL] = new SvMemoryStream();
     563           0 :                 static_cast<SvStream*>(&xBasicStream)->ReadStream( *( mpImpl->mppLibStreams[nL] ) );
     564           0 :             }
     565           0 :         }
     566             :     }
     567             :     else
     568             :     {
     569        2006 :         ImpCreateStdLib( pParentFromStdLib );
     570        2006 :         if ( rStorage.IsStream( OUString(szOldManagerStream) ) )
     571           0 :             LoadOldBasicManager( rStorage );
     572        2006 :     }
     573        2006 : }
     574             : 
     575        2001 : void copyToLibraryContainer( StarBASIC* pBasic, const LibraryContainerInfo& rInfo )
     576             : {
     577        2001 :     uno::Reference< script::XLibraryContainer > xScriptCont( rInfo.mxScriptCont.get() );
     578        2001 :     if ( !xScriptCont.is() )
     579           0 :         return;
     580             : 
     581        4002 :     OUString aLibName = pBasic->GetName();
     582        2001 :     if( !xScriptCont->hasByName( aLibName ) )
     583        2001 :         xScriptCont->createLibrary( aLibName );
     584             : 
     585        4002 :     uno::Any aLibAny = xScriptCont->getByName( aLibName );
     586        4002 :     uno::Reference< container::XNameContainer > xLib;
     587        2001 :     aLibAny >>= xLib;
     588        2001 :     if ( !xLib.is() )
     589           0 :         return;
     590             : 
     591        2001 :     sal_uInt16 nModCount = pBasic->GetModules()->Count();
     592        2001 :     for ( sal_uInt16 nMod = 0 ; nMod < nModCount ; nMod++ )
     593             :     {
     594           0 :         SbModule* pModule = static_cast<SbModule*>(pBasic->GetModules()->Get( nMod ));
     595             :         DBG_ASSERT( pModule, "Module not received!" );
     596             : 
     597           0 :         OUString aModName = pModule->GetName();
     598           0 :         if( !xLib->hasByName( aModName ) )
     599             :         {
     600           0 :             OUString aSource = pModule->GetSource32();
     601           0 :             uno::Any aSourceAny;
     602           0 :             aSourceAny <<= aSource;
     603           0 :             xLib->insertByName( aModName, aSourceAny );
     604             :         }
     605        2001 :     }
     606             : }
     607             : 
     608        2113 : const uno::Reference< script::XPersistentLibraryContainer >& BasicManager::GetDialogLibraryContainer()  const
     609             : {
     610        2113 :     return mpImpl->maContainerInfo.mxDialogCont;
     611             : }
     612             : 
     613        2217 : const uno::Reference< script::XPersistentLibraryContainer >& BasicManager::GetScriptLibraryContainer()  const
     614             : {
     615        2217 :     return mpImpl->maContainerInfo.mxScriptCont;
     616             : }
     617             : 
     618        2117 : void BasicManager::SetLibraryContainerInfo( const LibraryContainerInfo& rInfo )
     619             : {
     620        2117 :     mpImpl->maContainerInfo = rInfo;
     621             : 
     622        2117 :     uno::Reference< script::XLibraryContainer > xScriptCont( mpImpl->maContainerInfo.mxScriptCont.get() );
     623        2117 :     if( xScriptCont.is() )
     624             :     {
     625             :         // Register listener for lib container
     626        2117 :         OUString aEmptyLibName;
     627             :         uno::Reference< container::XContainerListener > xLibContainerListener
     628             :             = static_cast< container::XContainerListener* >
     629        4234 :                 ( new BasMgrContainerListenerImpl( this, aEmptyLibName ) );
     630             : 
     631        4234 :         uno::Reference< container::XContainer> xLibContainer( xScriptCont, uno::UNO_QUERY );
     632        2117 :         xLibContainer->addContainerListener( xLibContainerListener );
     633             : 
     634        4234 :         uno::Sequence< OUString > aScriptLibNames = xScriptCont->getElementNames();
     635        2117 :         const OUString* pScriptLibName = aScriptLibNames.getConstArray();
     636        2117 :         sal_Int32 i, nNameCount = aScriptLibNames.getLength();
     637             : 
     638        2117 :         if( nNameCount )
     639             :         {
     640        1182 :             for( i = 0 ; i < nNameCount ; ++i, ++pScriptLibName )
     641             :             {
     642        1066 :                 uno::Any aLibAny = xScriptCont->getByName( *pScriptLibName );
     643             : 
     644        1066 :                 if ( *pScriptLibName == "Standard" )
     645          65 :                     xScriptCont->loadLibrary( *pScriptLibName );
     646             : 
     647             :                 BasMgrContainerListenerImpl::insertLibraryImpl
     648        1066 :                     ( xScriptCont, this, aLibAny, *pScriptLibName );
     649        1066 :             }
     650             :         }
     651             :         else
     652             :         {
     653             :             // No libs? Maybe an 5.2 document already loaded
     654        4002 :             for( BasicLibInfo& rBasLibInfo: mpImpl->aLibs )
     655             :             {
     656        2001 :                 StarBASIC* pLib = rBasLibInfo.GetLib();
     657        2001 :                 if( !pLib )
     658             :                 {
     659           0 :                     bool bLoaded = ImpLoadLibrary( &rBasLibInfo, NULL, false );
     660           0 :                     if( bLoaded )
     661           0 :                         pLib = rBasLibInfo.GetLib();
     662             :                 }
     663        2001 :                 if( pLib )
     664             :                 {
     665        2001 :                     copyToLibraryContainer( pLib, mpImpl->maContainerInfo );
     666        2001 :                     if( rBasLibInfo.HasPassword() )
     667             :                     {
     668             :                         OldBasicPassword* pOldBasicPassword =
     669           0 :                             mpImpl->maContainerInfo.mpOldBasicPassword;
     670           0 :                         if( pOldBasicPassword )
     671             :                         {
     672             :                             pOldBasicPassword->setLibraryPassword
     673           0 :                                 ( pLib->GetName(), rBasLibInfo.GetPassword() );
     674           0 :                             rBasLibInfo.SetPasswordVerified();
     675             :                         }
     676             :                     }
     677             :                 }
     678             :             }
     679        2117 :         }
     680             :     }
     681             : 
     682        2117 :     SetGlobalUNOConstant( "BasicLibraries", makeAny( mpImpl->maContainerInfo.mxScriptCont ) );
     683        2117 :     SetGlobalUNOConstant( "DialogLibraries", makeAny( mpImpl->maContainerInfo.mxDialogCont ) );
     684        2117 : }
     685             : 
     686         112 : BasicManager::BasicManager( StarBASIC* pSLib, OUString* pLibPath, bool bDocMgr ) : mbDocMgr( bDocMgr )
     687             : {
     688         112 :     Init();
     689             :     DBG_ASSERT( pSLib, "BasicManager cannot be created with a NULL-Pointer!" );
     690             : 
     691         112 :     if( pLibPath )
     692             :     {
     693         112 :         mpImpl->aBasicLibPath = *pLibPath;
     694             :     }
     695         112 :     BasicLibInfo* pStdLibInfo = CreateLibInfo();
     696         112 :     pStdLibInfo->SetLib( pSLib );
     697         112 :     StarBASICRef xStdLib = pStdLibInfo->GetLib();
     698         112 :     xStdLib->SetName(OUString(szStdLibName));
     699         112 :     pStdLibInfo->SetLibName(OUString(szStdLibName) );
     700         112 :     pSLib->SetFlag( SBX_DONTSTORE | SBX_EXTSEARCH );
     701             : 
     702             :     // Save is only necessary if basic has changed
     703         112 :     xStdLib->SetModified( false );
     704         112 : }
     705             : 
     706           0 : void BasicManager::ImpMgrNotLoaded( const OUString& rStorageName )
     707             : {
     708             :     // pErrInf is only destroyed if the error os processed by an
     709             :     // ErrorHandler
     710           0 :     StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_MGROPEN, rStorageName, ERRCODE_BUTTON_OK );
     711           0 :     aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::OPENMGRSTREAM, rStorageName));
     712             : 
     713             :     // Create a stdlib otherwise we crash!
     714           0 :     BasicLibInfo* pStdLibInfo = CreateLibInfo();
     715           0 :     pStdLibInfo->SetLib( new StarBASIC( NULL, mbDocMgr ) );
     716           0 :     StarBASICRef xStdLib = pStdLibInfo->GetLib();
     717           0 :     xStdLib->SetName( OUString(szStdLibName) );
     718           0 :     pStdLibInfo->SetLibName( OUString(szStdLibName) );
     719           0 :     xStdLib->SetFlag( SBX_DONTSTORE | SBX_EXTSEARCH );
     720           0 :     xStdLib->SetModified( false );
     721           0 : }
     722             : 
     723             : 
     724        2006 : void BasicManager::ImpCreateStdLib( StarBASIC* pParentFromStdLib )
     725             : {
     726        2006 :     BasicLibInfo* pStdLibInfo = CreateLibInfo();
     727        2006 :     StarBASIC* pStdLib = new StarBASIC( pParentFromStdLib, mbDocMgr );
     728        2006 :     pStdLibInfo->SetLib( pStdLib );
     729        2006 :     pStdLib->SetName( OUString(szStdLibName) );
     730        2006 :     pStdLibInfo->SetLibName( OUString(szStdLibName) );
     731        2006 :     pStdLib->SetFlag( SBX_DONTSTORE | SBX_EXTSEARCH );
     732        2006 : }
     733             : 
     734           0 : void BasicManager::LoadBasicManager( SotStorage& rStorage, const OUString& rBaseURL, bool bLoadLibs )
     735             : {
     736           0 :     tools::SvRef<SotStorageStream> xManagerStream = rStorage.OpenSotStream( OUString(szManagerStream), eStreamReadMode );
     737             : 
     738           0 :     OUString aStorName( rStorage.GetName() );
     739             :     // #i13114 removed, DBG_ASSERT( aStorName.Len(), "No Storage Name!" );
     740             : 
     741           0 :     if ( !xManagerStream.Is() || xManagerStream->GetError() || ( xManagerStream->Seek( STREAM_SEEK_TO_END ) == 0 ) )
     742             :     {
     743           0 :         ImpMgrNotLoaded( aStorName );
     744           0 :         return;
     745             :     }
     746             : 
     747           0 :     maStorageName = INetURLObject(aStorName, INetProtocol::File).GetMainURL( INetURLObject::NO_DECODE );
     748             :     // #i13114 removed, DBG_ASSERT(aStorageName.Len() != 0, "Bad storage name");
     749             : 
     750           0 :     OUString aRealStorageName = maStorageName;  // for relative paths, can be modified through BaseURL
     751             : 
     752           0 :     if ( !rBaseURL.isEmpty() )
     753             :     {
     754           0 :         INetURLObject aObj( rBaseURL );
     755           0 :         if ( aObj.GetProtocol() == INetProtocol::File )
     756             :         {
     757           0 :             aRealStorageName = aObj.PathToFileName();
     758           0 :         }
     759             :     }
     760             : 
     761           0 :     xManagerStream->SetBufferSize( 1024 );
     762           0 :     xManagerStream->Seek( STREAM_SEEK_TO_BEGIN );
     763             : 
     764             :     sal_uInt32 nEndPos;
     765           0 :     xManagerStream->ReadUInt32( nEndPos );
     766             : 
     767             :     sal_uInt16 nLibs;
     768           0 :     xManagerStream->ReadUInt16( nLibs );
     769             :     // Plausibility!
     770           0 :     if( nLibs & 0xF000 )
     771             :     {
     772             :         DBG_ASSERT( false, "BasicManager-Stream defect!" );
     773           0 :         return;
     774             :     }
     775           0 :     const size_t nMinBasicLibSize(8);
     776           0 :     const size_t nMaxPossibleLibs = xManagerStream->remainingSize() / nMinBasicLibSize;
     777           0 :     if (nLibs > nMaxPossibleLibs)
     778             :     {
     779             :         SAL_WARN("basic", "Parsing error: " << nMaxPossibleLibs <<
     780             :                  " max possible entries, but " << nLibs << " claimed, truncating");
     781           0 :         nLibs = nMaxPossibleLibs;
     782             :     }
     783           0 :     for (sal_uInt16 nL = 0; nL < nLibs; ++nL)
     784             :     {
     785           0 :         BasicLibInfo* pInfo = BasicLibInfo::Create( *xManagerStream );
     786             : 
     787             :         // Correct absolute pathname if relative is existing.
     788             :         // Always try relative first if there are two stands on disk
     789           0 :         if ( !pInfo->GetRelStorageName().isEmpty() && pInfo->GetRelStorageName() != szImbedded )
     790             :         {
     791           0 :             INetURLObject aObj( aRealStorageName, INetProtocol::File );
     792           0 :             aObj.removeSegment();
     793           0 :             bool bWasAbsolute = false;
     794           0 :             aObj = aObj.smartRel2Abs( pInfo->GetRelStorageName(), bWasAbsolute );
     795             : 
     796             :             //*** TODO: Replace if still necessary
     797             :             //*** TODO-End
     798           0 :             if ( ! mpImpl->aBasicLibPath.isEmpty() )
     799             :             {
     800             :                 // Search lib in path
     801           0 :                 OUString aSearchFile = pInfo->GetRelStorageName();
     802           0 :                 OUString aSearchFileOldFormat(aSearchFile);
     803           0 :                 SvtPathOptions aPathCFG;
     804           0 :                 if( aPathCFG.SearchFile( aSearchFileOldFormat, SvtPathOptions::PATH_BASIC ) )
     805             :                 {
     806           0 :                     pInfo->SetStorageName( aSearchFile );
     807           0 :                 }
     808           0 :             }
     809             :         }
     810             : 
     811           0 :         mpImpl->aLibs.push_back( pInfo );
     812             :         // Libs from external files should be loaded only when necessary.
     813             :         // But references are loaded at once, otherwise some big customers get into trouble
     814           0 :         if ( bLoadLibs && pInfo->DoLoad() &&
     815           0 :             ( !pInfo->IsExtern() ||  pInfo->IsReference()))
     816             :         {
     817           0 :             ImpLoadLibrary( pInfo, &rStorage );
     818             :         }
     819             :     }
     820             : 
     821           0 :     xManagerStream->Seek( nEndPos );
     822           0 :     xManagerStream->SetBufferSize( 0 );
     823           0 :     xManagerStream.Clear();
     824             : }
     825             : 
     826           0 : void BasicManager::LoadOldBasicManager( SotStorage& rStorage )
     827             : {
     828           0 :     tools::SvRef<SotStorageStream> xManagerStream = rStorage.OpenSotStream( OUString(szOldManagerStream), eStreamReadMode );
     829             : 
     830           0 :     OUString aStorName( rStorage.GetName() );
     831             :     DBG_ASSERT( aStorName.getLength(), "No Storage Name!" );
     832             : 
     833           0 :     if ( !xManagerStream.Is() || xManagerStream->GetError() || ( xManagerStream->Seek( STREAM_SEEK_TO_END ) == 0 ) )
     834             :     {
     835           0 :         ImpMgrNotLoaded( aStorName );
     836           0 :         return;
     837             :     }
     838             : 
     839           0 :     xManagerStream->SetBufferSize( 1024 );
     840           0 :     xManagerStream->Seek( STREAM_SEEK_TO_BEGIN );
     841             :     sal_uInt32 nBasicStartOff, nBasicEndOff;
     842           0 :     xManagerStream->ReadUInt32( nBasicStartOff );
     843           0 :     xManagerStream->ReadUInt32( nBasicEndOff );
     844             : 
     845             :     DBG_ASSERT( !xManagerStream->GetError(), "Invalid Manager-Stream!" );
     846             : 
     847           0 :     xManagerStream->Seek( nBasicStartOff );
     848           0 :     if( !ImplLoadBasic( *xManagerStream, mpImpl->aLibs.front().GetLibRef() ) )
     849             :     {
     850           0 :         StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_MGROPEN, aStorName, ERRCODE_BUTTON_OK );
     851           0 :         aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::OPENMGRSTREAM, aStorName));
     852             :         // and it proceeds ...
     853             :     }
     854           0 :     xManagerStream->Seek( nBasicEndOff+1 ); // +1: 0x00 as separator
     855           0 :     OUString aLibs = xManagerStream->ReadUniOrByteString(xManagerStream->GetStreamCharSet());
     856           0 :     xManagerStream->SetBufferSize( 0 );
     857           0 :     xManagerStream.Clear(); // Close stream
     858             : 
     859           0 :     if ( !aLibs.isEmpty() )
     860             :     {
     861           0 :         OUString aCurStorageName( aStorName );
     862           0 :         INetURLObject aCurStorage( aCurStorageName, INetProtocol::File );
     863           0 :         sal_Int32 nLibs = comphelper::string::getTokenCount(aLibs, LIB_SEP);
     864           0 :         for ( sal_Int32 nLib = 0; nLib < nLibs; nLib++ )
     865             :         {
     866           0 :             OUString aLibInfo(aLibs.getToken(nLib, LIB_SEP));
     867             :             // TODO: Remove == 2
     868             :             DBG_ASSERT( ( comphelper::string::getTokenCount(aLibInfo, LIBINFO_SEP) == 2 ) || ( comphelper::string::getTokenCount(aLibInfo, LIBINFO_SEP) == 3 ), "Invalid Lib-Info!" );
     869           0 :             OUString aLibName( aLibInfo.getToken( 0, LIBINFO_SEP ) );
     870           0 :             OUString aLibAbsStorageName( aLibInfo.getToken( 1, LIBINFO_SEP ) );
     871           0 :             OUString aLibRelStorageName( aLibInfo.getToken( 2, LIBINFO_SEP ) );
     872           0 :             INetURLObject aLibAbsStorage( aLibAbsStorageName, INetProtocol::File );
     873             : 
     874           0 :             INetURLObject aLibRelStorage( aStorName );
     875           0 :             aLibRelStorage.removeSegment();
     876           0 :             bool bWasAbsolute = false;
     877           0 :             aLibRelStorage = aLibRelStorage.smartRel2Abs( aLibRelStorageName, bWasAbsolute);
     878             :             DBG_ASSERT(!bWasAbsolute, "RelStorageName was absolute!" );
     879             : 
     880           0 :             tools::SvRef<SotStorage> xStorageRef;
     881           0 :             if ( aLibAbsStorage == aCurStorage || aLibRelStorageName == szImbedded )
     882             :             {
     883           0 :                 xStorageRef = &rStorage;
     884             :             }
     885             :             else
     886             :             {
     887           0 :                 xStorageRef = new SotStorage( false, aLibAbsStorage.GetMainURL
     888           0 :                     ( INetURLObject::NO_DECODE ), eStorageReadMode );
     889           0 :                 if ( xStorageRef->GetError() != ERRCODE_NONE )
     890           0 :                     xStorageRef = new SotStorage( false, aLibRelStorage.
     891           0 :                     GetMainURL( INetURLObject::NO_DECODE ), eStorageReadMode );
     892             :             }
     893           0 :             if ( xStorageRef.Is() )
     894             :             {
     895           0 :                 AddLib( *xStorageRef, aLibName, false );
     896             :             }
     897             :             else
     898             :             {
     899           0 :                 StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_LIBLOAD, aStorName, ERRCODE_BUTTON_OK );
     900           0 :                 aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::STORAGENOTFOUND, aStorName));
     901             :             }
     902           0 :         }
     903           0 :     }
     904             : }
     905             : 
     906        6156 : BasicManager::~BasicManager()
     907             : {
     908             :     // Notify listener if something needs to be saved
     909        2052 :     Broadcast( SfxSimpleHint( SFX_HINT_DYING) );
     910             : 
     911             :     // Destroy Basic-Infos...
     912             :     // In reverse order
     913        2052 :     delete mpImpl;
     914        4104 : }
     915             : 
     916           0 : void BasicManager::LegacyDeleteBasicManager( BasicManager*& _rpManager )
     917             : {
     918           0 :     delete _rpManager;
     919           0 :     _rpManager = NULL;
     920           0 : }
     921             : 
     922             : 
     923           0 : bool BasicManager::HasExeCode( const OUString& sLib )
     924             : {
     925           0 :     StarBASIC* pLib = GetLib(sLib);
     926           0 :     if ( pLib )
     927             :     {
     928           0 :         SbxArray* pMods = pLib->GetModules();
     929           0 :         sal_uInt16 nMods = pMods ? pMods->Count() : 0;
     930           0 :         for( sal_uInt16 i = 0; i < nMods; i++ )
     931             :         {
     932           0 :             SbModule* p = static_cast<SbModule*>( pMods->Get( i ) );
     933           0 :             if ( p )
     934           0 :                 if ( p->HasExeCode() )
     935           0 :                     return true;
     936             :         }
     937             :     }
     938           0 :     return false;
     939             : }
     940             : 
     941        2118 : void BasicManager::Init()
     942             : {
     943        2118 :     mpImpl = new BasicManagerImpl();
     944        2118 : }
     945             : 
     946        3151 : BasicLibInfo* BasicManager::CreateLibInfo()
     947             : {
     948        3151 :     BasicLibInfo* pInf = new BasicLibInfo;
     949        3151 :     mpImpl->aLibs.push_back( pInf );
     950        3151 :     return pInf;
     951             : }
     952             : 
     953           0 : bool BasicManager::ImpLoadLibrary( BasicLibInfo* pLibInfo, SotStorage* pCurStorage, bool bInfosOnly )
     954             : {
     955             :     try {
     956             :     DBG_ASSERT( pLibInfo, "LibInfo!?" );
     957             : 
     958           0 :     OUString aStorageName( pLibInfo->GetStorageName() );
     959           0 :     if ( aStorageName.isEmpty() || aStorageName == szImbedded )
     960             :     {
     961           0 :         aStorageName = GetStorageName();
     962             :     }
     963           0 :     tools::SvRef<SotStorage> xStorage;
     964             :     // The current must not be opened again...
     965           0 :     if ( pCurStorage )
     966             :     {
     967           0 :         OUString aStorName( pCurStorage->GetName() );
     968             :         // #i13114 removed, DBG_ASSERT( aStorName.Len(), "No Storage Name!" );
     969             : 
     970           0 :         INetURLObject aCurStorageEntry(aStorName, INetProtocol::File);
     971             :         // #i13114 removed, DBG_ASSERT(aCurStorageEntry.GetMainURL( INetURLObject::NO_DECODE ).Len() != 0, "Bad storage name");
     972             : 
     973           0 :         INetURLObject aStorageEntry(aStorageName, INetProtocol::File);
     974             :         // #i13114 removed, DBG_ASSERT(aCurStorageEntry.GetMainURL( INetURLObject::NO_DECODE ).Len() != 0, "Bad storage name");
     975             : 
     976           0 :         if ( aCurStorageEntry == aStorageEntry )
     977             :         {
     978           0 :             xStorage = pCurStorage;
     979           0 :         }
     980             :     }
     981             : 
     982           0 :     if ( !xStorage.Is() )
     983             :     {
     984           0 :         xStorage = new SotStorage( false, aStorageName, eStorageReadMode );
     985             :     }
     986           0 :     tools::SvRef<SotStorage> xBasicStorage = xStorage->OpenSotStorage( OUString(szBasicStorage), eStorageReadMode, false );
     987             : 
     988           0 :     if ( !xBasicStorage.Is() || xBasicStorage->GetError() )
     989             :     {
     990           0 :         StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_MGROPEN, xStorage->GetName(), ERRCODE_BUTTON_OK );
     991           0 :         aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::OPENLIBSTORAGE, pLibInfo->GetLibName()));
     992             :     }
     993             :     else
     994             :     {
     995             :         // In the Basic-Storage every lib is in a Stream...
     996           0 :         tools::SvRef<SotStorageStream> xBasicStream = xBasicStorage->OpenSotStream( pLibInfo->GetLibName(), eStreamReadMode );
     997           0 :         if ( !xBasicStream.Is() || xBasicStream->GetError() )
     998             :         {
     999           0 :             StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_LIBLOAD , pLibInfo->GetLibName(), ERRCODE_BUTTON_OK );
    1000           0 :             aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::OPENLIBSTREAM, pLibInfo->GetLibName()));
    1001             :         }
    1002             :         else
    1003             :         {
    1004           0 :             bool bLoaded = false;
    1005           0 :             if ( xBasicStream->Seek( STREAM_SEEK_TO_END ) != 0 )
    1006             :             {
    1007           0 :                 if ( !bInfosOnly )
    1008             :                 {
    1009           0 :                     if ( !pLibInfo->GetLib().Is() )
    1010             :                     {
    1011           0 :                         pLibInfo->SetLib( new StarBASIC( GetStdLib(), mbDocMgr ) );
    1012             :                     }
    1013           0 :                     xBasicStream->SetBufferSize( 1024 );
    1014           0 :                     xBasicStream->Seek( STREAM_SEEK_TO_BEGIN );
    1015           0 :                     bLoaded = ImplLoadBasic( *xBasicStream, pLibInfo->GetLibRef() );
    1016           0 :                     xBasicStream->SetBufferSize( 0 );
    1017           0 :                     StarBASICRef xStdLib = pLibInfo->GetLib();
    1018           0 :                     xStdLib->SetName( pLibInfo->GetLibName() );
    1019           0 :                     xStdLib->SetModified( false );
    1020           0 :                     xStdLib->SetFlag( SBX_DONTSTORE );
    1021             :                 }
    1022             :                 else
    1023             :                 {
    1024             :                     // Skip Basic...
    1025           0 :                     xBasicStream->Seek( STREAM_SEEK_TO_BEGIN );
    1026           0 :                     ImplEncryptStream( *xBasicStream );
    1027           0 :                     SbxBase::Skip( *xBasicStream );
    1028           0 :                     bLoaded = true;
    1029             :                 }
    1030             :             }
    1031           0 :             if ( !bLoaded )
    1032             :             {
    1033           0 :                 StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_LIBLOAD, pLibInfo->GetLibName(), ERRCODE_BUTTON_OK );
    1034           0 :                 aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::BASICLOADERROR, pLibInfo->GetLibName()));
    1035             :             }
    1036             :             else
    1037             :             {
    1038             :                 // Perhaps there are additional information in the stream...
    1039           0 :                 xBasicStream->SetCryptMaskKey(szCryptingKey);
    1040           0 :                 xBasicStream->RefreshBuffer();
    1041           0 :                 sal_uInt32 nPasswordMarker = 0;
    1042           0 :                 xBasicStream->ReadUInt32( nPasswordMarker );
    1043           0 :                 if ( ( nPasswordMarker == PASSWORD_MARKER ) && !xBasicStream->IsEof() )
    1044             :                 {
    1045           0 :                     OUString aPassword = xBasicStream->ReadUniOrByteString(
    1046           0 :                         xBasicStream->GetStreamCharSet());
    1047           0 :                     pLibInfo->SetPassword( aPassword );
    1048             :                 }
    1049           0 :                 xBasicStream->SetCryptMaskKey(OString());
    1050           0 :                 CheckModules( pLibInfo->GetLib(), pLibInfo->IsReference() );
    1051             :             }
    1052           0 :             return bLoaded;
    1053           0 :         }
    1054           0 :     }
    1055             :     }
    1056           0 :     catch (const css::ucb::ContentCreationException&)
    1057             :     {
    1058             :     }
    1059           0 :     return false;
    1060             : }
    1061             : 
    1062           0 : bool BasicManager::ImplEncryptStream( SvStream& rStrm )
    1063             : {
    1064           0 :     sal_Size nPos = rStrm.Tell();
    1065             :     sal_uInt32 nCreator;
    1066           0 :     rStrm.ReadUInt32( nCreator );
    1067           0 :     rStrm.Seek( nPos );
    1068           0 :     bool bProtected = false;
    1069           0 :     if ( nCreator != SBXCR_SBX )
    1070             :     {
    1071             :         // Should only be the case for encrypted Streams
    1072           0 :         bProtected = true;
    1073           0 :         rStrm.SetCryptMaskKey(szCryptingKey);
    1074           0 :         rStrm.RefreshBuffer();
    1075             :     }
    1076           0 :     return bProtected;
    1077             : }
    1078             : 
    1079             : // This code is necessary to load the BASIC of Beta 1
    1080             : // TODO: Which Beta 1?
    1081           0 : bool BasicManager::ImplLoadBasic( SvStream& rStrm, StarBASICRef& rOldBasic ) const
    1082             : {
    1083           0 :     bool bProtected = ImplEncryptStream( rStrm );
    1084           0 :     SbxBaseRef xNew = SbxBase::Load( rStrm );
    1085           0 :     bool bLoaded = false;
    1086           0 :     if( xNew.Is() )
    1087             :     {
    1088           0 :         if( xNew->IsA( TYPE(StarBASIC) ) )
    1089             :         {
    1090           0 :             StarBASIC* pNew = static_cast<StarBASIC*>(static_cast<SbxBase*>(xNew));
    1091             :             // Use the Parent of the old BASICs
    1092           0 :             if( rOldBasic.Is() )
    1093             :             {
    1094           0 :                 pNew->SetParent( rOldBasic->GetParent() );
    1095           0 :                 if( pNew->GetParent() )
    1096             :                 {
    1097           0 :                     pNew->GetParent()->Insert( pNew );
    1098             :                 }
    1099           0 :                 pNew->SetFlag( SBX_EXTSEARCH );
    1100             :             }
    1101           0 :             rOldBasic = pNew;
    1102             : 
    1103             :             // Fill new libray container (5.2 -> 6.0)
    1104           0 :             copyToLibraryContainer( pNew, mpImpl->maContainerInfo );
    1105             : 
    1106           0 :             pNew->SetModified( false );
    1107           0 :             bLoaded = true;
    1108             :         }
    1109             :     }
    1110           0 :     if ( bProtected )
    1111             :     {
    1112           0 :         rStrm.SetCryptMaskKey(OString());
    1113             :     }
    1114           0 :     return bLoaded;
    1115             : }
    1116             : 
    1117           0 : void BasicManager::CheckModules( StarBASIC* pLib, bool bReference )
    1118             : {
    1119           0 :     if ( !pLib )
    1120             :     {
    1121           0 :         return;
    1122             :     }
    1123           0 :     bool bModified = pLib->IsModified();
    1124             : 
    1125           0 :     for ( sal_uInt16 nMod = 0; nMod < pLib->GetModules()->Count(); nMod++ )
    1126             :     {
    1127           0 :         SbModule* pModule = static_cast<SbModule*>(pLib->GetModules()->Get( nMod ));
    1128             :         DBG_ASSERT( pModule, "Module not received!" );
    1129           0 :         if ( !pModule->IsCompiled() && !StarBASIC::GetErrorCode() )
    1130             :         {
    1131           0 :             StarBASIC::Compile( pModule );
    1132             :         }
    1133             :     }
    1134             : 
    1135             :     // #67477, AB 8.12.99 On demand compile in referenced libs should not
    1136             :     // cause modified
    1137           0 :     if( !bModified && bReference )
    1138             :     {
    1139             :         OSL_FAIL( "Referenced basic library is not compiled!" );
    1140           0 :         pLib->SetModified( false );
    1141             :     }
    1142             : }
    1143             : 
    1144           0 : StarBASIC* BasicManager::AddLib( SotStorage& rStorage, const OUString& rLibName, bool bReference )
    1145             : {
    1146           0 :     OUString aStorName( rStorage.GetName() );
    1147             :     DBG_ASSERT( !aStorName.isEmpty(), "No Storage Name!" );
    1148             : 
    1149           0 :     OUString aStorageName = INetURLObject(aStorName, INetProtocol::File).GetMainURL( INetURLObject::NO_DECODE );
    1150             :     DBG_ASSERT(!aStorageName.isEmpty(), "Bad storage name");
    1151             : 
    1152           0 :     OUString aNewLibName( rLibName );
    1153           0 :     while ( HasLib( aNewLibName ) )
    1154             :     {
    1155           0 :         aNewLibName += "_";
    1156             :     }
    1157           0 :     BasicLibInfo* pLibInfo = CreateLibInfo();
    1158             :     // Use original name otherwise ImpLoadLibrary failes...
    1159           0 :     pLibInfo->SetLibName( rLibName );
    1160             :     // but doesn't work this way if name exists twice
    1161           0 :     sal_uInt16 nLibId = (sal_uInt16) mpImpl->aLibs.size() - 1;
    1162             : 
    1163             :     // Set StorageName before load because it is compared with pCurStorage
    1164           0 :     pLibInfo->SetStorageName( aStorageName );
    1165           0 :     bool bLoaded = ImpLoadLibrary( pLibInfo, &rStorage );
    1166             : 
    1167           0 :     if ( bLoaded )
    1168             :     {
    1169           0 :         if ( aNewLibName != rLibName )
    1170             :         {
    1171           0 :             pLibInfo->SetLibName(aNewLibName);
    1172             :         }
    1173           0 :         if ( bReference )
    1174             :         {
    1175           0 :             pLibInfo->GetLib()->SetModified( false );   // Don't save in this case
    1176           0 :             pLibInfo->SetRelStorageName( OUString() );
    1177           0 :             pLibInfo->IsReference() = true;
    1178             :         }
    1179             :         else
    1180             :         {
    1181           0 :             pLibInfo->GetLib()->SetModified( true ); // Must be saved after Add!
    1182           0 :             pLibInfo->SetStorageName( OUString(szImbedded) ); // Save in BasicManager-Storage
    1183             :         }
    1184             :     }
    1185             :     else
    1186             :     {
    1187           0 :         RemoveLib( nLibId, false );
    1188           0 :         pLibInfo = 0;
    1189             :     }
    1190             : 
    1191           0 :     return pLibInfo ? &*pLibInfo->GetLib() : 0;
    1192             : 
    1193             : }
    1194             : 
    1195           0 : bool BasicManager::IsReference( sal_uInt16 nLib )
    1196             : {
    1197             :     DBG_ASSERT( nLib < mpImpl->aLibs.size(), "Lib does not exist!" );
    1198           0 :     if ( nLib < mpImpl->aLibs.size() )
    1199             :     {
    1200           0 :         return mpImpl->aLibs[nLib].IsReference();
    1201             :     }
    1202           0 :     return false;
    1203             : }
    1204             : 
    1205           0 : bool BasicManager::RemoveLib( sal_uInt16 nLib )
    1206             : {
    1207             :     // Only pyhsical deletion if no reference
    1208           0 :     return RemoveLib( nLib, !IsReference( nLib ) );
    1209             : }
    1210             : 
    1211           0 : bool BasicManager::RemoveLib( sal_uInt16 nLib, bool bDelBasicFromStorage )
    1212             : {
    1213             :     DBG_ASSERT( nLib, "Standard-Lib cannot be removed!" );
    1214             : 
    1215             :     DBG_ASSERT( !nLib || nLib  < mpImpl->aLibs.size(), "Lib not found!" );
    1216             : 
    1217           0 :     if( !nLib || nLib  < mpImpl->aLibs.size() )
    1218             :     {
    1219           0 :         StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_REMOVELIB, OUString(), ERRCODE_BUTTON_OK );
    1220           0 :         aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::STDLIB, OUString()));
    1221           0 :         return false;
    1222             :     }
    1223             : 
    1224           0 :     boost::ptr_vector<BasicLibInfo>::iterator itLibInfo = mpImpl->aLibs.begin() + nLib;
    1225             : 
    1226             :     // If one of the streams cannot be opened, this is not an error,
    1227             :     // because BASIC was never written before...
    1228           0 :     if ( bDelBasicFromStorage && !itLibInfo->IsReference() &&
    1229           0 :             ( !itLibInfo->IsExtern() || SotStorage::IsStorageFile( itLibInfo->GetStorageName() ) ) )
    1230             :     {
    1231           0 :         tools::SvRef<SotStorage> xStorage;
    1232             :         try
    1233             :         {
    1234           0 :             if (!itLibInfo->IsExtern())
    1235             :             {
    1236           0 :                 xStorage = new SotStorage(false, GetStorageName());
    1237             :             }
    1238             :             else
    1239             :             {
    1240           0 :                 xStorage = new SotStorage(false, itLibInfo->GetStorageName());
    1241             :             }
    1242             :         }
    1243           0 :         catch (const css::ucb::ContentCreationException& e)
    1244             :         {
    1245             :             SAL_WARN("basic", "BasicManager::RemoveLib: Caught exception: " << e.Message);
    1246             :         }
    1247             : 
    1248           0 :         if (xStorage.Is() && xStorage->IsStorage(OUString(szBasicStorage)))
    1249             :         {
    1250             :             tools::SvRef<SotStorage> xBasicStorage = xStorage->OpenSotStorage
    1251           0 :                             ( OUString(szBasicStorage), STREAM_STD_READWRITE, false );
    1252             : 
    1253           0 :             if ( !xBasicStorage.Is() || xBasicStorage->GetError() )
    1254             :             {
    1255           0 :                 StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_REMOVELIB, OUString(), ERRCODE_BUTTON_OK );
    1256           0 :                 aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::OPENLIBSTORAGE, itLibInfo->GetLibName()));
    1257             :             }
    1258           0 :             else if ( xBasicStorage->IsStream( itLibInfo->GetLibName() ) )
    1259             :             {
    1260           0 :                 xBasicStorage->Remove( itLibInfo->GetLibName() );
    1261           0 :                 xBasicStorage->Commit();
    1262             : 
    1263             :                 // If no further stream available,
    1264             :                 // delete the SubStorage.
    1265           0 :                 SvStorageInfoList aInfoList;
    1266           0 :                 xBasicStorage->FillInfoList( &aInfoList );
    1267           0 :                 if ( aInfoList.empty() )
    1268             :                 {
    1269           0 :                     xBasicStorage.Clear();
    1270           0 :                     xStorage->Remove( OUString(szBasicStorage) );
    1271           0 :                     xStorage->Commit();
    1272             :                     // If no further Streams or SubStorages available,
    1273             :                     // delete the Storage, too.
    1274           0 :                     aInfoList.clear();
    1275           0 :                     xStorage->FillInfoList( &aInfoList );
    1276           0 :                     if ( aInfoList.empty() )
    1277             :                     {
    1278             :                         //OUString aName_( xStorage->GetName() );
    1279           0 :                         xStorage.Clear();
    1280             :                         //*** TODO: Replace if still necessary
    1281             :                         //SfxContentHelper::Kill( aName );
    1282             :                         //*** TODO-End
    1283             :                     }
    1284           0 :                 }
    1285           0 :             }
    1286           0 :         }
    1287             :     }
    1288           0 :     if ( itLibInfo->GetLib().Is() )
    1289             :     {
    1290           0 :         GetStdLib()->Remove( itLibInfo->GetLib() );
    1291             :     }
    1292           0 :     mpImpl->aLibs.erase(itLibInfo);
    1293           0 :     return true;    // Remove was successful, del unimportant
    1294             : }
    1295             : 
    1296           0 : sal_uInt16 BasicManager::GetLibCount() const
    1297             : {
    1298           0 :     return (sal_uInt16)mpImpl->aLibs.size();
    1299             : }
    1300             : 
    1301       64954 : StarBASIC* BasicManager::GetLib( sal_uInt16 nLib ) const
    1302             : {
    1303             :     DBG_ASSERT( nLib < mpImpl->aLibs.size(), "Lib does not exist!" );
    1304       64954 :     if ( nLib < mpImpl->aLibs.size() )
    1305             :     {
    1306       64954 :         return mpImpl->aLibs[nLib].GetLib();
    1307             :     }
    1308           0 :     return 0;
    1309             : }
    1310             : 
    1311       58331 : StarBASIC* BasicManager::GetStdLib() const
    1312             : {
    1313       58331 :     StarBASIC* pLib = GetLib( 0 );
    1314       58331 :     return pLib;
    1315             : }
    1316             : 
    1317       13236 : StarBASIC* BasicManager::GetLib( const OUString& rName ) const
    1318             : {
    1319       28259 :     for(const BasicLibInfo& rLib: mpImpl->aLibs)
    1320             :     {
    1321       26193 :         if ( rLib.GetLibName().equalsIgnoreAsciiCase( rName ))// Check if available...
    1322             :         {
    1323       11170 :             return rLib.GetLib();
    1324             :         }
    1325             :     }
    1326        2066 :     return 0;
    1327             : }
    1328             : 
    1329           0 : sal_uInt16 BasicManager::GetLibId( const OUString& rName ) const
    1330             : {
    1331           0 :     for (size_t i = 0; i < mpImpl->aLibs.size(); i++)
    1332             :     {
    1333           0 :         if ( mpImpl->aLibs[i].GetLibName().equalsIgnoreAsciiCase( rName ))
    1334             :         {
    1335           0 :             return (sal_uInt16)i;
    1336             :         }
    1337             :     }
    1338           0 :     return LIB_NOTFOUND;
    1339             : }
    1340             : 
    1341           0 : bool BasicManager::HasLib( const OUString& rName ) const
    1342             : {
    1343           0 :     for(const BasicLibInfo& rLib: mpImpl->aLibs)
    1344             :     {
    1345           0 :         if ( rLib.GetLibName().equalsIgnoreAsciiCase( rName ))// Check if available...
    1346             :         {
    1347           0 :             return true;
    1348             :         }
    1349             :     }
    1350           0 :     return false;
    1351             : }
    1352             : 
    1353           0 : OUString BasicManager::GetLibName( sal_uInt16 nLib )
    1354             : {
    1355             :     DBG_ASSERT(  nLib < mpImpl->aLibs.size(), "Lib?!" );
    1356           0 :     if ( nLib < mpImpl->aLibs.size() )
    1357             :     {
    1358           0 :         return mpImpl->aLibs[nLib].GetLibName();
    1359             :     }
    1360           0 :     return OUString();
    1361             : }
    1362             : 
    1363           0 : bool BasicManager::LoadLib( sal_uInt16 nLib )
    1364             : {
    1365           0 :     bool bDone = false;
    1366             :     DBG_ASSERT( nLib < mpImpl->aLibs.size() , "Lib?!" );
    1367           0 :     if ( nLib < mpImpl->aLibs.size() )
    1368             :     {
    1369           0 :         BasicLibInfo& rLibInfo = mpImpl->aLibs[nLib];
    1370           0 :         uno::Reference< script::XLibraryContainer > xLibContainer = rLibInfo.GetLibraryContainer();
    1371           0 :         if( xLibContainer.is() )
    1372             :         {
    1373           0 :             OUString aLibName = rLibInfo.GetLibName();
    1374           0 :             xLibContainer->loadLibrary( aLibName );
    1375           0 :             bDone = xLibContainer->isLibraryLoaded( aLibName );;
    1376             :         }
    1377             :         else
    1378             :         {
    1379           0 :             bDone = ImpLoadLibrary( &rLibInfo, NULL, false );
    1380           0 :             StarBASIC* pLib = GetLib( nLib );
    1381           0 :             if ( pLib )
    1382             :             {
    1383           0 :                 GetStdLib()->Insert( pLib );
    1384           0 :                 pLib->SetFlag( SBX_EXTSEARCH );
    1385             :             }
    1386           0 :         }
    1387             :     }
    1388             :     else
    1389             :     {
    1390           0 :         StringErrorInfo* pErrInf = new StringErrorInfo( ERRCODE_BASMGR_LIBLOAD, OUString(), ERRCODE_BUTTON_OK );
    1391           0 :         aErrors.push_back(BasicError(*pErrInf, BasicErrorReason::LIBNOTFOUND, OUString::number(nLib)));
    1392             :     }
    1393           0 :     return bDone;
    1394             : }
    1395             : 
    1396           0 : StarBASIC* BasicManager::CreateLib( const OUString& rLibName )
    1397             : {
    1398           0 :     if ( GetLib( rLibName ) )
    1399             :     {
    1400           0 :         return 0;
    1401             :     }
    1402           0 :     BasicLibInfo* pLibInfo = CreateLibInfo();
    1403           0 :     StarBASIC* pNew = new StarBASIC( GetStdLib(), mbDocMgr );
    1404           0 :     GetStdLib()->Insert( pNew );
    1405           0 :     pNew->SetFlag( SBX_EXTSEARCH | SBX_DONTSTORE );
    1406           0 :     pLibInfo->SetLib( pNew );
    1407           0 :     pLibInfo->SetLibName( rLibName );
    1408           0 :     pLibInfo->GetLib()->SetName( rLibName );
    1409           0 :     return pLibInfo->GetLib();
    1410             : }
    1411             : 
    1412             : // For XML import/export:
    1413           0 : StarBASIC* BasicManager::CreateLib( const OUString& rLibName, const OUString& Password,
    1414             :                                     const OUString& LinkTargetURL )
    1415             : {
    1416             :     // Ask if lib exists because standard lib is always there
    1417           0 :     StarBASIC* pLib = GetLib( rLibName );
    1418           0 :     if( !pLib )
    1419             :     {
    1420           0 :         if( !LinkTargetURL.isEmpty())
    1421             :         {
    1422             :             try
    1423             :             {
    1424           0 :                 tools::SvRef<SotStorage> xStorage = new SotStorage(false, LinkTargetURL, StreamMode::READ | StreamMode::SHARE_DENYWRITE);
    1425           0 :                 if (!xStorage->GetError())
    1426             :                 {
    1427           0 :                     pLib = AddLib(*xStorage, rLibName, true);
    1428           0 :                 }
    1429             :             }
    1430           0 :             catch (const css::ucb::ContentCreationException& e)
    1431             :             {
    1432             :                 SAL_WARN("basic", "BasicManager::RemoveLib: Caught exception: " << e.Message);
    1433             :             }
    1434             :             DBG_ASSERT( pLib, "XML Import: Linked basic library could not be loaded");
    1435             :         }
    1436             :         else
    1437             :         {
    1438           0 :             pLib = CreateLib( rLibName );
    1439           0 :             if( Password.isEmpty())
    1440             :             {
    1441           0 :                 BasicLibInfo* pLibInfo = FindLibInfo( pLib );
    1442           0 :                 pLibInfo ->SetPassword( Password );
    1443             :             }
    1444             :         }
    1445             :         //ExternalSourceURL ?
    1446             :     }
    1447           0 :     return pLib;
    1448             : }
    1449             : 
    1450        1033 : StarBASIC* BasicManager::CreateLibForLibContainer( const OUString& rLibName,
    1451             :     const uno::Reference< script::XLibraryContainer >& xScriptCont )
    1452             : {
    1453        1033 :     if ( GetLib( rLibName ) )
    1454             :     {
    1455           0 :         return 0;
    1456             :     }
    1457        1033 :     BasicLibInfo* pLibInfo = CreateLibInfo();
    1458        1033 :     StarBASIC* pNew = new StarBASIC( GetStdLib(), mbDocMgr );
    1459        1033 :     GetStdLib()->Insert( pNew );
    1460        1033 :     pNew->SetFlag( SBX_EXTSEARCH | SBX_DONTSTORE );
    1461        1033 :     pLibInfo->SetLib( pNew );
    1462        1033 :     pLibInfo->SetLibName( rLibName );
    1463        1033 :     pLibInfo->GetLib()->SetName( rLibName );
    1464        1033 :     pLibInfo->SetLibraryContainer( xScriptCont );
    1465        1033 :     return pNew;
    1466             : }
    1467             : 
    1468             : 
    1469           0 : BasicLibInfo* BasicManager::FindLibInfo( StarBASIC* pBasic )
    1470             : {
    1471           0 :     for(BasicLibInfo& rLib: mpImpl->aLibs)
    1472             :     {
    1473           0 :         if ( rLib.GetLib() == pBasic )
    1474             :         {
    1475           0 :             return &rLib;
    1476             :         }
    1477             :     }
    1478           0 :     return NULL;
    1479             : }
    1480             : 
    1481             : 
    1482           0 : bool BasicManager::IsBasicModified() const
    1483             : {
    1484           0 :     for(const BasicLibInfo& rLib: mpImpl->aLibs)
    1485             :     {
    1486           0 :         if ( rLib.GetLib().Is() && rLib.GetLib()->IsModified() )
    1487             :         {
    1488           0 :             return true;
    1489             :         }
    1490             :     }
    1491           0 :     return false;
    1492             : }
    1493             : 
    1494             : 
    1495       34331 : bool BasicManager::GetGlobalUNOConstant( const sal_Char* _pAsciiName, uno::Any& aOut )
    1496             : {
    1497       34331 :     bool bRes = false;
    1498       34331 :     StarBASIC* pStandardLib = GetStdLib();
    1499             :     OSL_PRECOND( pStandardLib, "BasicManager::GetGlobalUNOConstant: no lib to read from!" );
    1500       34331 :     if ( pStandardLib )
    1501       34331 :         bRes = pStandardLib->GetUNOConstant( _pAsciiName, aOut );
    1502       34331 :     return bRes;
    1503             : }
    1504             : 
    1505       21934 : uno::Any BasicManager::SetGlobalUNOConstant( const sal_Char* _pAsciiName, const uno::Any& _rValue )
    1506             : {
    1507       21934 :     uno::Any aOldValue;
    1508             : 
    1509       21934 :     StarBASIC* pStandardLib = GetStdLib();
    1510             :     OSL_PRECOND( pStandardLib, "BasicManager::SetGlobalUNOConstant: no lib to insert into!" );
    1511       21934 :     if ( !pStandardLib )
    1512           0 :         return aOldValue;
    1513             : 
    1514       43868 :     OUString sVarName( OUString::createFromAscii( _pAsciiName ) );
    1515             : 
    1516             :     // obtain the old value
    1517       21934 :     SbxVariable* pVariable = pStandardLib->Find( sVarName, SbxCLASS_OBJECT );
    1518       21934 :     if ( pVariable )
    1519       21265 :         aOldValue = sbxToUnoValue( pVariable );
    1520             : 
    1521       43868 :     SbxObjectRef xUnoObj = GetSbUnoObject( sVarName, _rValue );
    1522       21934 :     xUnoObj->SetFlag( SBX_DONTSTORE );
    1523       21934 :     pStandardLib->Insert( xUnoObj );
    1524             : 
    1525       21934 :     return aOldValue;
    1526             : }
    1527             : 
    1528          52 : bool BasicManager::LegacyPsswdBinaryLimitExceeded( uno::Sequence< OUString >& _out_rModuleNames )
    1529             : {
    1530             :     try
    1531             :     {
    1532          52 :         uno::Reference< container::XNameAccess > xScripts( GetScriptLibraryContainer(), uno::UNO_QUERY_THROW );
    1533         104 :         uno::Reference< script::XLibraryContainerPassword > xPassword( GetScriptLibraryContainer(), uno::UNO_QUERY_THROW );
    1534             : 
    1535         104 :         uno::Sequence< OUString > aNames( xScripts->getElementNames() );
    1536          52 :         const OUString* pNames = aNames.getConstArray();
    1537          52 :         const OUString* pNamesEnd = aNames.getConstArray() + aNames.getLength();
    1538         105 :         for ( ; pNames != pNamesEnd; ++pNames )
    1539             :         {
    1540          53 :             if( !xPassword->isLibraryPasswordProtected( *pNames ) )
    1541         105 :                 continue;
    1542             : 
    1543           1 :             StarBASIC* pBasicLib = GetLib( *pNames );
    1544           1 :             if ( !pBasicLib )
    1545           1 :                 continue;
    1546             : 
    1547           0 :             uno::Reference< container::XNameAccess > xScriptLibrary( xScripts->getByName( *pNames ), uno::UNO_QUERY_THROW );
    1548           0 :             uno::Sequence< OUString > aElementNames( xScriptLibrary->getElementNames() );
    1549           0 :             sal_Int32 nLen = aElementNames.getLength();
    1550             : 
    1551           0 :             uno::Sequence< OUString > aBigModules( nLen );
    1552           0 :             sal_Int32 nBigModules = 0;
    1553             : 
    1554           0 :             const OUString* pElementNames = aElementNames.getConstArray();
    1555           0 :             const OUString* pElementNamesEnd = aElementNames.getConstArray() + aElementNames.getLength();
    1556           0 :             for ( ; pElementNames != pElementNamesEnd; ++pElementNames )
    1557             :             {
    1558           0 :                 SbModule* pMod = pBasicLib->FindModule( *pElementNames );
    1559           0 :                 if ( pMod && pMod->ExceedsLegacyModuleSize() )
    1560           0 :                     aBigModules[ nBigModules++ ] = *pElementNames;
    1561             :             }
    1562             : 
    1563           0 :             if ( nBigModules )
    1564             :             {
    1565           0 :                 aBigModules.realloc( nBigModules );
    1566           0 :                 _out_rModuleNames = aBigModules;
    1567           0 :                 return true;
    1568             :             }
    1569          52 :         }
    1570             :     }
    1571           0 :     catch( const uno::Exception& )
    1572             :     {
    1573             :         DBG_UNHANDLED_EXCEPTION();
    1574             :     }
    1575          52 :     return false;
    1576             : }
    1577             : 
    1578             : 
    1579             : namespace
    1580             : {
    1581           0 :     SbMethod* lcl_queryMacro( BasicManager* i_manager, OUString const& i_fullyQualifiedName )
    1582             :     {
    1583           0 :         sal_Int32 nLast = 0;
    1584           0 :         const OUString sParse = i_fullyQualifiedName;
    1585           0 :         OUString sLibName = sParse.getToken( (sal_Int32)0, (sal_Unicode)'.', nLast );
    1586           0 :         OUString sModule = sParse.getToken( (sal_Int32)0, (sal_Unicode)'.', nLast );
    1587           0 :         OUString sMacro;
    1588           0 :         if(nLast >= 0)
    1589             :         {
    1590           0 :             sMacro = OUString(sParse.getStr() + nLast, sParse.getLength() - nLast );
    1591             :         }
    1592             :         else
    1593             :         {
    1594           0 :             sMacro = sParse;
    1595             :         }
    1596             : 
    1597           0 :         utl::TransliterationWrapper& rTransliteration = SbGlobal::GetTransliteration();
    1598           0 :         sal_uInt16 nLibCount = i_manager->GetLibCount();
    1599           0 :         for ( sal_uInt16 nLib = 0; nLib < nLibCount; ++nLib )
    1600             :         {
    1601           0 :             if ( rTransliteration.isEqual( i_manager->GetLibName( nLib ), sLibName ) )
    1602             :             {
    1603           0 :                 StarBASIC* pLib = i_manager->GetLib( nLib );
    1604           0 :                 if( !pLib )
    1605             :                 {
    1606           0 :                     i_manager->LoadLib( nLib );
    1607           0 :                     pLib = i_manager->GetLib( nLib );
    1608             :                 }
    1609             : 
    1610           0 :                 if( pLib )
    1611             :                 {
    1612           0 :                     sal_uInt16 nModCount = pLib->GetModules()->Count();
    1613           0 :                     for( sal_uInt16 nMod = 0; nMod < nModCount; ++nMod )
    1614             :                     {
    1615           0 :                         SbModule* pMod = static_cast<SbModule*>(pLib->GetModules()->Get( nMod ));
    1616           0 :                         if ( pMod && rTransliteration.isEqual( pMod->GetName(), sModule ) )
    1617             :                         {
    1618           0 :                             SbMethod* pMethod = static_cast<SbMethod*>(pMod->Find( sMacro, SbxCLASS_METHOD ));
    1619           0 :                             if( pMethod )
    1620             :                             {
    1621           0 :                                 return pMethod;
    1622             :                             }
    1623             :                         }
    1624             :                     }
    1625             :                 }
    1626             :             }
    1627             :         }
    1628           0 :         return 0;
    1629             :     }
    1630             : }
    1631             : 
    1632           0 : bool BasicManager::HasMacro( OUString const& i_fullyQualifiedName ) const
    1633             : {
    1634           0 :     return ( NULL != lcl_queryMacro( const_cast< BasicManager* >( this ), i_fullyQualifiedName ) );
    1635             : }
    1636             : 
    1637           0 : ErrCode BasicManager::ExecuteMacro( OUString const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue )
    1638             : {
    1639           0 :     SbMethod* pMethod = lcl_queryMacro( this, i_fullyQualifiedName );
    1640           0 :     ErrCode nError = 0;
    1641           0 :     if ( pMethod )
    1642             :     {
    1643           0 :         if ( i_arguments )
    1644           0 :             pMethod->SetParameters( i_arguments );
    1645           0 :         nError = pMethod->Call( i_retValue );
    1646             :     }
    1647             :     else
    1648           0 :         nError = ERRCODE_BASIC_PROC_UNDEFINED;
    1649           0 :     return nError;
    1650             : }
    1651             : 
    1652           0 : ErrCode BasicManager::ExecuteMacro( OUString const& i_fullyQualifiedName, OUString const& i_commaSeparatedArgs, SbxValue* i_retValue )
    1653             : {
    1654           0 :     SbMethod* pMethod = lcl_queryMacro( this, i_fullyQualifiedName );
    1655           0 :     if ( !pMethod )
    1656             :     {
    1657           0 :         return ERRCODE_BASIC_PROC_UNDEFINED;
    1658             :     }
    1659             :     // arguments must be quoted
    1660           0 :     OUString sQuotedArgs;
    1661           0 :     OUStringBuffer sArgs( i_commaSeparatedArgs );
    1662           0 :     if ( sArgs.getLength()<2 || sArgs[1] == '\"')
    1663             :     {
    1664             :         // no args or already quoted args
    1665           0 :         sQuotedArgs = sArgs.makeStringAndClear();
    1666             :     }
    1667             :     else
    1668             :     {
    1669             :         // quote parameters
    1670           0 :         sArgs.remove( 0, 1 );
    1671           0 :         sArgs.remove( sArgs.getLength() - 1, 1 );
    1672             : 
    1673           0 :         sQuotedArgs = "(";
    1674           0 :         OUString sArgs2 = sArgs.makeStringAndClear();
    1675           0 :         sal_Int32 nCount = comphelper::string::getTokenCount(sArgs2, ',');
    1676           0 :         for (sal_Int32 n = 0; n < nCount; ++n)
    1677             :         {
    1678           0 :             sQuotedArgs += "\"";
    1679           0 :             sQuotedArgs += sArgs2.getToken(n, ',');
    1680           0 :             sQuotedArgs += "\"";
    1681           0 :             if ( n < nCount - 1 )
    1682             :             {
    1683           0 :                 sQuotedArgs += ",";
    1684             :             }
    1685             :         }
    1686             : 
    1687           0 :         sQuotedArgs += ")";
    1688             :     }
    1689             : 
    1690             :     // add quoted arguments and do the call
    1691           0 :     OUString sCall;
    1692           0 :     sCall += "[";
    1693           0 :     sCall += pMethod->GetName();
    1694           0 :     sCall += sQuotedArgs;
    1695           0 :     sCall += "]";
    1696             : 
    1697           0 :     SbxVariable* pRet = pMethod->GetParent()->Execute( sCall );
    1698           0 :     if ( pRet && ( pRet != pMethod ) )
    1699             :     {
    1700           0 :         *i_retValue = *pRet;
    1701             :     }
    1702           0 :     return SbxBase::GetError();
    1703             : }
    1704             : 
    1705             : 
    1706             : 
    1707           0 : class ModuleInfo_Impl : public ModuleInfoHelper
    1708             : {
    1709             :     OUString maName;
    1710             :     OUString maLanguage;
    1711             :     OUString maSource;
    1712             : 
    1713             : public:
    1714           0 :     ModuleInfo_Impl( const OUString& aName, const OUString& aLanguage, const OUString& aSource )
    1715           0 :         : maName( aName ), maLanguage( aLanguage), maSource( aSource ) {}
    1716             : 
    1717             :     // Methods XStarBasicModuleInfo
    1718           0 :     virtual OUString SAL_CALL getName() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1719           0 :         { return maName; }
    1720           0 :     virtual OUString SAL_CALL getLanguage() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1721           0 :         { return maLanguage; }
    1722           0 :     virtual OUString SAL_CALL getSource() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1723           0 :         { return maSource; }
    1724             : };
    1725             : 
    1726             : 
    1727             : 
    1728             : 
    1729           0 : class DialogInfo_Impl : public DialogInfoHelper
    1730             : {
    1731             :     OUString maName;
    1732             :     uno::Sequence< sal_Int8 > mData;
    1733             : 
    1734             : public:
    1735           0 :     DialogInfo_Impl( const OUString& aName, const uno::Sequence< sal_Int8 >& Data )
    1736           0 :         : maName( aName ), mData( Data ) {}
    1737             : 
    1738             :     // Methods XStarBasicDialogInfo
    1739           0 :     virtual OUString SAL_CALL getName() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1740           0 :         { return maName; }
    1741           0 :     virtual uno::Sequence< sal_Int8 > SAL_CALL getData() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1742           0 :         { return mData; }
    1743             : };
    1744             : 
    1745             : 
    1746             : 
    1747             : 
    1748           0 : class LibraryInfo_Impl : public LibraryInfoHelper
    1749             : {
    1750             :     OUString maName;
    1751             :     uno::Reference< container::XNameContainer > mxModuleContainer;
    1752             :     uno::Reference< container::XNameContainer > mxDialogContainer;
    1753             :     OUString maPassword;
    1754             :     OUString maExternaleSourceURL;
    1755             :     OUString maLinkTargetURL;
    1756             : 
    1757             : public:
    1758           0 :     LibraryInfo_Impl
    1759             :     (
    1760             :         const OUString& aName,
    1761             :         uno::Reference< container::XNameContainer > xModuleContainer,
    1762             :         uno::Reference< container::XNameContainer > xDialogContainer,
    1763             :         const OUString& aPassword,
    1764             :         const OUString& aExternaleSourceURL,
    1765             :         const OUString& aLinkTargetURL
    1766             :     )
    1767             :         : maName( aName )
    1768             :         , mxModuleContainer( xModuleContainer )
    1769             :         , mxDialogContainer( xDialogContainer )
    1770             :         , maPassword( aPassword )
    1771             :         , maExternaleSourceURL( aExternaleSourceURL )
    1772           0 :         , maLinkTargetURL( aLinkTargetURL )
    1773           0 :     {}
    1774             : 
    1775             :     // Methods XStarBasicLibraryInfo
    1776           0 :     virtual OUString SAL_CALL getName() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1777           0 :         { return maName; }
    1778           0 :     virtual uno::Reference< container::XNameContainer > SAL_CALL getModuleContainer() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1779           0 :         { return mxModuleContainer; }
    1780           0 :     virtual uno::Reference< container::XNameContainer > SAL_CALL getDialogContainer() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1781           0 :         { return mxDialogContainer; }
    1782           0 :     virtual OUString SAL_CALL getPassword() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1783           0 :         { return maPassword; }
    1784           0 :     virtual OUString SAL_CALL getExternalSourceURL() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1785           0 :         { return maExternaleSourceURL; }
    1786           0 :     virtual OUString SAL_CALL getLinkTargetURL() throw(uno::RuntimeException, std::exception) SAL_OVERRIDE
    1787           0 :         { return maLinkTargetURL; }
    1788             : };
    1789             : 
    1790             : 
    1791             : 
    1792           0 : class ModuleContainer_Impl : public NameContainerHelper
    1793             : {
    1794             :     StarBASIC* mpLib;
    1795             : 
    1796             : public:
    1797           0 :     explicit ModuleContainer_Impl( StarBASIC* pLib )
    1798           0 :         :mpLib( pLib ) {}
    1799             : 
    1800             :     // Methods XElementAccess
    1801             :     virtual uno::Type SAL_CALL getElementType()
    1802             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1803             :     virtual sal_Bool SAL_CALL hasElements()
    1804             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1805             : 
    1806             :     // Methods XNameAccess
    1807             :     virtual uno::Any SAL_CALL getByName( const OUString& aName )
    1808             :         throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1809             :     virtual uno::Sequence< OUString > SAL_CALL getElementNames()
    1810             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1811             :     virtual sal_Bool SAL_CALL hasByName( const OUString& aName )
    1812             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1813             : 
    1814             :     // Methods XNameReplace
    1815             :     virtual void SAL_CALL replaceByName( const OUString& aName, const uno::Any& aElement )
    1816             :         throw(lang::IllegalArgumentException, container::NoSuchElementException,
    1817             :               lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1818             : 
    1819             :     // Methods XNameContainer
    1820             :     virtual void SAL_CALL insertByName( const OUString& aName, const uno::Any& aElement )
    1821             :         throw(lang::IllegalArgumentException, container::ElementExistException,
    1822             :               lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1823             :     virtual void SAL_CALL removeByName( const OUString& Name )
    1824             :         throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1825             : };
    1826             : 
    1827             : // Methods XElementAccess
    1828           0 : uno::Type ModuleContainer_Impl::getElementType()
    1829             :     throw(uno::RuntimeException, std::exception)
    1830             : {
    1831           0 :     uno::Type aModuleType = cppu::UnoType<script::XStarBasicModuleInfo>::get();
    1832           0 :     return aModuleType;
    1833             : }
    1834             : 
    1835           0 : sal_Bool ModuleContainer_Impl::hasElements()
    1836             :     throw(uno::RuntimeException, std::exception)
    1837             : {
    1838           0 :     SbxArray* pMods = mpLib ? mpLib->GetModules() : NULL;
    1839           0 :     return pMods && pMods->Count() > 0;
    1840             : }
    1841             : 
    1842             : // Methods XNameAccess
    1843           0 : uno::Any ModuleContainer_Impl::getByName( const OUString& aName )
    1844             :     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    1845             : {
    1846           0 :     SbModule* pMod = mpLib ? mpLib->FindModule( aName ) : NULL;
    1847           0 :     if( !pMod )
    1848           0 :         throw container::NoSuchElementException();
    1849             :     uno::Reference< script::XStarBasicModuleInfo > xMod = static_cast<XStarBasicModuleInfo*>(new ModuleInfo_Impl
    1850           0 :         ( aName, "StarBasic", pMod->GetSource32() ));
    1851           0 :     uno::Any aRetAny;
    1852           0 :     aRetAny <<= xMod;
    1853           0 :     return aRetAny;
    1854             : }
    1855             : 
    1856           0 : uno::Sequence< OUString > ModuleContainer_Impl::getElementNames()
    1857             :     throw(uno::RuntimeException, std::exception)
    1858             : {
    1859           0 :     SbxArray* pMods = mpLib ? mpLib->GetModules() : NULL;
    1860           0 :     sal_uInt16 nMods = pMods ? pMods->Count() : 0;
    1861           0 :     uno::Sequence< OUString > aRetSeq( nMods );
    1862           0 :     OUString* pRetSeq = aRetSeq.getArray();
    1863           0 :     for( sal_uInt16 i = 0 ; i < nMods ; i++ )
    1864             :     {
    1865           0 :         SbxVariable* pMod = pMods->Get( i );
    1866           0 :         pRetSeq[i] = OUString( pMod->GetName() );
    1867             :     }
    1868           0 :     return aRetSeq;
    1869             : }
    1870             : 
    1871           0 : sal_Bool ModuleContainer_Impl::hasByName( const OUString& aName )
    1872             :     throw(uno::RuntimeException, std::exception)
    1873             : {
    1874           0 :     SbModule* pMod = mpLib ? mpLib->FindModule( aName ) : NULL;
    1875           0 :     bool bRet = (pMod != NULL);
    1876           0 :     return bRet;
    1877             : }
    1878             : 
    1879             : 
    1880             : // Methods XNameReplace
    1881           0 : void ModuleContainer_Impl::replaceByName( const OUString& aName, const uno::Any& aElement )
    1882             :     throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    1883             : {
    1884           0 :     removeByName( aName );
    1885           0 :     insertByName( aName, aElement );
    1886           0 : }
    1887             : 
    1888             : 
    1889             : // Methods XNameContainer
    1890           0 : void ModuleContainer_Impl::insertByName( const OUString& aName, const uno::Any& aElement )
    1891             :     throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    1892             : {
    1893           0 :     uno::Type aModuleType = cppu::UnoType<script::XStarBasicModuleInfo>::get();
    1894           0 :     uno::Type aAnyType = aElement.getValueType();
    1895           0 :     if( aModuleType != aAnyType )
    1896             :     {
    1897           0 :         throw lang::IllegalArgumentException();
    1898             :     }
    1899           0 :     uno::Reference< script::XStarBasicModuleInfo > xMod;
    1900           0 :     aElement >>= xMod;
    1901           0 :     mpLib->MakeModule32( aName, xMod->getSource() );
    1902           0 : }
    1903             : 
    1904           0 : void ModuleContainer_Impl::removeByName( const OUString& Name )
    1905             :     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    1906             : {
    1907           0 :     SbModule* pMod = mpLib ? mpLib->FindModule( Name ) : NULL;
    1908           0 :     if( !pMod )
    1909             :     {
    1910           0 :         throw container::NoSuchElementException();
    1911             :     }
    1912           0 :     mpLib->Remove( pMod );
    1913           0 : }
    1914             : 
    1915             : 
    1916             : 
    1917             : 
    1918           0 : uno::Sequence< sal_Int8 > implGetDialogData( SbxObject* pDialog )
    1919             : {
    1920           0 :     SvMemoryStream aMemStream;
    1921           0 :     pDialog->Store( aMemStream );
    1922           0 :     sal_Size nLen = aMemStream.Tell();
    1923           0 :     uno::Sequence< sal_Int8 > aData( nLen );
    1924           0 :     sal_Int8* pDestData = aData.getArray();
    1925           0 :     const sal_Int8* pSrcData = static_cast<const sal_Int8*>(aMemStream.GetData());
    1926           0 :     memcpy( pDestData, pSrcData, nLen );
    1927           0 :     return aData;
    1928             : }
    1929             : 
    1930           0 : SbxObject* implCreateDialog( const uno::Sequence< sal_Int8 >& aData )
    1931             : {
    1932           0 :     sal_Int8* pData = const_cast< uno::Sequence< sal_Int8 >& >(aData).getArray();
    1933           0 :     SvMemoryStream aMemStream( pData, aData.getLength(), StreamMode::READ );
    1934           0 :     SbxBase* pBase = SbxBase::Load( aMemStream );
    1935           0 :     return dynamic_cast<SbxObject*>(pBase);
    1936             : }
    1937             : 
    1938             : // HACK! Because this value is defined in basctl/inc/vcsbxdef.hxx
    1939             : // which we can't include here, we have to use the value directly
    1940             : #define SBXID_DIALOG        101
    1941             : 
    1942             : 
    1943           0 : class DialogContainer_Impl : public NameContainerHelper
    1944             : {
    1945             :     StarBASIC* mpLib;
    1946             : 
    1947             : public:
    1948           0 :     explicit DialogContainer_Impl( StarBASIC* pLib )
    1949           0 :         :mpLib( pLib ) {}
    1950             : 
    1951             :     // Methods XElementAccess
    1952             :     virtual uno::Type SAL_CALL getElementType()
    1953             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1954             :     virtual sal_Bool SAL_CALL hasElements()
    1955             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1956             : 
    1957             :     // Methods XNameAccess
    1958             :     virtual uno::Any SAL_CALL getByName( const OUString& aName )
    1959             :         throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1960             :     virtual uno::Sequence< OUString > SAL_CALL getElementNames()
    1961             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1962             :     virtual sal_Bool SAL_CALL hasByName( const OUString& aName )
    1963             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1964             : 
    1965             :     // Methods XNameReplace
    1966             :     virtual void SAL_CALL replaceByName( const OUString& aName, const uno::Any& aElement )
    1967             :         throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1968             : 
    1969             :     // Methods XNameContainer
    1970             :     virtual void SAL_CALL insertByName( const OUString& aName, const uno::Any& aElement )
    1971             :         throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1972             :     virtual void SAL_CALL removeByName( const OUString& Name )
    1973             :         throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    1974             : };
    1975             : 
    1976             : // Methods XElementAccess
    1977           0 : uno::Type DialogContainer_Impl::getElementType()
    1978             :     throw(uno::RuntimeException, std::exception)
    1979             : {
    1980           0 :     uno::Type aModuleType = cppu::UnoType<script::XStarBasicDialogInfo>::get();
    1981           0 :     return aModuleType;
    1982             : }
    1983             : 
    1984           0 : sal_Bool DialogContainer_Impl::hasElements()
    1985             :     throw(uno::RuntimeException, std::exception)
    1986             : {
    1987           0 :     bool bRet = false;
    1988             : 
    1989           0 :     sal_Int16 nCount = mpLib->GetObjects()->Count();
    1990           0 :     for( sal_Int16 nObj = 0; nObj < nCount ; nObj++ )
    1991             :     {
    1992           0 :         SbxVariable* pVar = mpLib->GetObjects()->Get( nObj );
    1993           0 :         if ( pVar->ISA( SbxObject ) && ( static_cast<SbxObject*>(pVar)->GetSbxId() == SBXID_DIALOG ) )
    1994             :         {
    1995           0 :             bRet = true;
    1996           0 :             break;
    1997             :         }
    1998             :     }
    1999           0 :     return bRet;
    2000             : }
    2001             : 
    2002             : // Methods XNameAccess
    2003           0 : uno::Any DialogContainer_Impl::getByName( const OUString& aName )
    2004             :     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2005             : {
    2006           0 :     SbxVariable* pVar = mpLib->GetObjects()->Find( aName, SbxCLASS_DONTCARE );
    2007           0 :     if( !( pVar && pVar->ISA( SbxObject ) &&
    2008           0 :            ( static_cast<SbxObject*>(pVar)->GetSbxId() == SBXID_DIALOG ) ) )
    2009             :     {
    2010           0 :         throw container::NoSuchElementException();
    2011             :     }
    2012             : 
    2013             :     uno::Reference< script::XStarBasicDialogInfo > xDialog =
    2014             :         static_cast<XStarBasicDialogInfo*>(new DialogInfo_Impl
    2015           0 :             ( aName, implGetDialogData( static_cast<SbxObject*>(pVar) ) ));
    2016             : 
    2017           0 :     uno::Any aRetAny;
    2018           0 :     aRetAny <<= xDialog;
    2019           0 :     return aRetAny;
    2020             : }
    2021             : 
    2022           0 : uno::Sequence< OUString > DialogContainer_Impl::getElementNames()
    2023             :     throw(uno::RuntimeException, std::exception)
    2024             : {
    2025           0 :     sal_Int16 nCount = mpLib->GetObjects()->Count();
    2026           0 :     uno::Sequence< OUString > aRetSeq( nCount );
    2027           0 :     OUString* pRetSeq = aRetSeq.getArray();
    2028           0 :     sal_Int32 nDialogCounter = 0;
    2029             : 
    2030           0 :     for( sal_Int16 nObj = 0; nObj < nCount ; nObj++ )
    2031             :     {
    2032           0 :         SbxVariable* pVar = mpLib->GetObjects()->Get( nObj );
    2033           0 :         if ( pVar->ISA( SbxObject ) && ( static_cast<SbxObject*>(pVar)->GetSbxId() == SBXID_DIALOG ) )
    2034             :         {
    2035           0 :             pRetSeq[ nDialogCounter ] = OUString( pVar->GetName() );
    2036           0 :             nDialogCounter++;
    2037             :         }
    2038             :     }
    2039           0 :     aRetSeq.realloc( nDialogCounter );
    2040           0 :     return aRetSeq;
    2041             : }
    2042             : 
    2043           0 : sal_Bool DialogContainer_Impl::hasByName( const OUString& aName )
    2044             :     throw(uno::RuntimeException, std::exception)
    2045             : {
    2046           0 :     bool bRet = false;
    2047           0 :     SbxVariable* pVar = mpLib->GetObjects()->Find( aName, SbxCLASS_DONTCARE );
    2048           0 :     if( pVar && pVar->ISA( SbxObject ) &&
    2049           0 :            ( static_cast<SbxObject*>(pVar)->GetSbxId() == SBXID_DIALOG ) )
    2050             :     {
    2051           0 :         bRet = true;
    2052             :     }
    2053           0 :     return bRet;
    2054             : }
    2055             : 
    2056             : 
    2057             : // Methods XNameReplace
    2058           0 : void DialogContainer_Impl::replaceByName( const OUString& aName, const uno::Any& aElement )
    2059             :     throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2060             : {
    2061           0 :     removeByName( aName );
    2062           0 :     insertByName( aName, aElement );
    2063           0 : }
    2064             : 
    2065             : 
    2066             : // Methods XNameContainer
    2067           0 : void DialogContainer_Impl::insertByName( const OUString& aName, const uno::Any& aElement )
    2068             :     throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2069             : {
    2070             :     (void)aName;
    2071           0 :     uno::Type aModuleType = cppu::UnoType<script::XStarBasicDialogInfo>::get();
    2072           0 :     uno::Type aAnyType = aElement.getValueType();
    2073           0 :     if( aModuleType != aAnyType )
    2074             :     {
    2075           0 :         throw lang::IllegalArgumentException();
    2076             :     }
    2077           0 :     uno::Reference< script::XStarBasicDialogInfo > xMod;
    2078           0 :     aElement >>= xMod;
    2079           0 :     SbxObjectRef xDialog = implCreateDialog( xMod->getData() );
    2080           0 :     mpLib->Insert( xDialog );
    2081           0 : }
    2082             : 
    2083           0 : void DialogContainer_Impl::removeByName( const OUString& Name )
    2084             :     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2085             : {
    2086             :     (void)Name;
    2087           0 :     SbxVariable* pVar = mpLib->GetObjects()->Find( Name, SbxCLASS_DONTCARE );
    2088           0 :     if( !( pVar && pVar->ISA( SbxObject ) &&
    2089           0 :            ( static_cast<SbxObject*>(pVar)->GetSbxId() == SBXID_DIALOG ) ) )
    2090             :     {
    2091           0 :         throw container::NoSuchElementException();
    2092             :     }
    2093           0 :     mpLib->Remove( pVar );
    2094           0 : }
    2095             : 
    2096             : 
    2097             : 
    2098             : 
    2099             : 
    2100           0 : class LibraryContainer_Impl : public NameContainerHelper
    2101             : {
    2102             :     BasicManager* mpMgr;
    2103             : 
    2104             : public:
    2105           0 :     explicit LibraryContainer_Impl( BasicManager* pMgr )
    2106           0 :         :mpMgr( pMgr ) {}
    2107             : 
    2108             :     // Methods XElementAccess
    2109             :     virtual uno::Type SAL_CALL getElementType()
    2110             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2111             :     virtual sal_Bool SAL_CALL hasElements()
    2112             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2113             : 
    2114             :     // Methods XNameAccess
    2115             :     virtual uno::Any SAL_CALL getByName( const OUString& aName )
    2116             :         throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2117             :     virtual uno::Sequence< OUString > SAL_CALL getElementNames()
    2118             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2119             :     virtual sal_Bool SAL_CALL hasByName( const OUString& aName )
    2120             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2121             : 
    2122             :     // Methods XNameReplace
    2123             :     virtual void SAL_CALL replaceByName( const OUString& aName, const uno::Any& aElement )
    2124             :         throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2125             : 
    2126             :     // Methods XNameContainer
    2127             :     virtual void SAL_CALL insertByName( const OUString& aName, const uno::Any& aElement )
    2128             :         throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2129             :     virtual void SAL_CALL removeByName( const OUString& Name )
    2130             :         throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2131             : };
    2132             : 
    2133             : 
    2134             : // Methods XElementAccess
    2135           0 : uno::Type LibraryContainer_Impl::getElementType()
    2136             :     throw(uno::RuntimeException, std::exception)
    2137             : {
    2138           0 :     uno::Type aType = cppu::UnoType<script::XStarBasicLibraryInfo>::get();
    2139           0 :     return aType;
    2140             : }
    2141             : 
    2142           0 : sal_Bool LibraryContainer_Impl::hasElements()
    2143             :     throw(uno::RuntimeException, std::exception)
    2144             : {
    2145           0 :     sal_Int32 nLibs = mpMgr->GetLibCount();
    2146           0 :     bool bRet = (nLibs > 0);
    2147           0 :     return bRet;
    2148             : }
    2149             : 
    2150             : // Methods XNameAccess
    2151           0 : uno::Any LibraryContainer_Impl::getByName( const OUString& aName )
    2152             :     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2153             : {
    2154           0 :     uno::Any aRetAny;
    2155           0 :     if( !mpMgr->HasLib( aName ) )
    2156           0 :         throw container::NoSuchElementException();
    2157           0 :     StarBASIC* pLib = mpMgr->GetLib( aName );
    2158             : 
    2159             :     uno::Reference< container::XNameContainer > xModuleContainer =
    2160           0 :         static_cast<container::XNameContainer*>(new ModuleContainer_Impl( pLib ));
    2161             : 
    2162             :     uno::Reference< container::XNameContainer > xDialogContainer =
    2163           0 :         static_cast<container::XNameContainer*>(new DialogContainer_Impl( pLib ));
    2164             : 
    2165           0 :     BasicLibInfo* pLibInfo = mpMgr->FindLibInfo( pLib );
    2166             : 
    2167           0 :     OUString aPassword = pLibInfo->GetPassword();
    2168             : 
    2169             :     // TODO Only provide extern info!
    2170           0 :     OUString aExternaleSourceURL;
    2171           0 :     OUString aLinkTargetURL;
    2172           0 :     if( pLibInfo->IsReference() )
    2173             :     {
    2174           0 :         aLinkTargetURL = pLibInfo->GetStorageName();
    2175             :     }
    2176           0 :     else if( pLibInfo->IsExtern() )
    2177             :     {
    2178           0 :         aExternaleSourceURL = pLibInfo->GetStorageName();
    2179             :     }
    2180             :     uno::Reference< script::XStarBasicLibraryInfo > xLibInfo = new LibraryInfo_Impl
    2181             :     (
    2182             :         aName,
    2183             :         xModuleContainer,
    2184             :         xDialogContainer,
    2185             :         aPassword,
    2186             :         aExternaleSourceURL,
    2187             :         aLinkTargetURL
    2188           0 :     );
    2189             : 
    2190           0 :     aRetAny <<= xLibInfo;
    2191           0 :     return aRetAny;
    2192             : }
    2193             : 
    2194           0 : uno::Sequence< OUString > LibraryContainer_Impl::getElementNames()
    2195             :     throw(uno::RuntimeException, std::exception)
    2196             : {
    2197           0 :     sal_uInt16 nLibs = mpMgr->GetLibCount();
    2198           0 :     uno::Sequence< OUString > aRetSeq( nLibs );
    2199           0 :     OUString* pRetSeq = aRetSeq.getArray();
    2200           0 :     for( sal_uInt16 i = 0 ; i < nLibs ; i++ )
    2201             :     {
    2202           0 :         pRetSeq[i] = OUString( mpMgr->GetLibName( i ) );
    2203             :     }
    2204           0 :     return aRetSeq;
    2205             : }
    2206             : 
    2207           0 : sal_Bool LibraryContainer_Impl::hasByName( const OUString& aName )
    2208             :     throw(uno::RuntimeException, std::exception)
    2209             : {
    2210           0 :     bool bRet = mpMgr->HasLib( aName );
    2211           0 :     return bRet;
    2212             : }
    2213             : 
    2214             : // Methods XNameReplace
    2215           0 : void LibraryContainer_Impl::replaceByName( const OUString& aName, const uno::Any& aElement )
    2216             :     throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2217             : {
    2218           0 :     removeByName( aName );
    2219           0 :     insertByName( aName, aElement );
    2220           0 : }
    2221             : 
    2222             : // Methods XNameContainer
    2223           0 : void LibraryContainer_Impl::insertByName( const OUString& aName, const uno::Any& aElement )
    2224             :     throw(lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2225             : {
    2226             :     (void)aName;
    2227             :     (void)aElement;
    2228             :     // TODO: Insert a complete Library?!
    2229           0 : }
    2230             : 
    2231           0 : void LibraryContainer_Impl::removeByName( const OUString& Name )
    2232             :     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2233             : {
    2234           0 :     StarBASIC* pLib = mpMgr->GetLib( Name );
    2235           0 :     if( !pLib )
    2236             :     {
    2237           0 :         throw container::NoSuchElementException();
    2238             :     }
    2239           0 :     sal_uInt16 nLibId = mpMgr->GetLibId( Name );
    2240           0 :     mpMgr->RemoveLib( nLibId );
    2241           0 : }
    2242             : 
    2243             : 
    2244             : 
    2245             : typedef WeakImplHelper1< script::XStarBasicAccess > StarBasicAccessHelper;
    2246             : 
    2247             : 
    2248           0 : class StarBasicAccess_Impl : public StarBasicAccessHelper
    2249             : {
    2250             :     BasicManager* mpMgr;
    2251             :     uno::Reference< container::XNameContainer > mxLibContainer;
    2252             : 
    2253             : public:
    2254           0 :     explicit StarBasicAccess_Impl( BasicManager* pMgr )
    2255           0 :         :mpMgr( pMgr ) {}
    2256             : 
    2257             : public:
    2258             :     // Methods
    2259             :     virtual uno::Reference< container::XNameContainer > SAL_CALL getLibraryContainer()
    2260             :         throw(uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2261             :     virtual void SAL_CALL createLibrary( const OUString& LibName, const OUString& Password,
    2262             :         const OUString& ExternalSourceURL, const OUString& LinkTargetURL )
    2263             :             throw(container::ElementExistException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2264             :     virtual void SAL_CALL addModule( const OUString& LibraryName, const OUString& ModuleName,
    2265             :         const OUString& Language, const OUString& Source )
    2266             :             throw(container::NoSuchElementException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2267             :     virtual void SAL_CALL addDialog( const OUString& LibraryName, const OUString& DialogName,
    2268             :         const uno::Sequence< sal_Int8 >& Data )
    2269             :             throw(container::NoSuchElementException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
    2270             : };
    2271             : 
    2272           0 : uno::Reference< container::XNameContainer > SAL_CALL StarBasicAccess_Impl::getLibraryContainer()
    2273             :     throw(uno::RuntimeException, std::exception)
    2274             : {
    2275           0 :     if( !mxLibContainer.is() )
    2276           0 :         mxLibContainer = static_cast<container::XNameContainer*>(new LibraryContainer_Impl( mpMgr ));
    2277           0 :     return mxLibContainer;
    2278             : }
    2279             : 
    2280           0 : void SAL_CALL StarBasicAccess_Impl::createLibrary
    2281             : (
    2282             :     const OUString& LibName,
    2283             :     const OUString& Password,
    2284             :     const OUString& ExternalSourceURL,
    2285             :     const OUString& LinkTargetURL
    2286             : )
    2287             :     throw(container::ElementExistException, uno::RuntimeException, std::exception)
    2288             : {
    2289             :     (void)ExternalSourceURL;
    2290             : #ifdef DBG_UTIL
    2291             :     StarBASIC* pLib =
    2292             : #endif
    2293           0 :     mpMgr->CreateLib( LibName, Password, LinkTargetURL );
    2294             :     DBG_ASSERT( pLib, "XML Import: Basic library could not be created");
    2295           0 : }
    2296             : 
    2297           0 : void SAL_CALL StarBasicAccess_Impl::addModule
    2298             : (
    2299             :     const OUString& LibraryName,
    2300             :     const OUString& ModuleName,
    2301             :     const OUString& Language,
    2302             :     const OUString& Source
    2303             : )
    2304             :     throw(container::NoSuchElementException, uno::RuntimeException, std::exception)
    2305             : {
    2306             :     (void)Language;
    2307           0 :     StarBASIC* pLib = mpMgr->GetLib( LibraryName );
    2308             :     DBG_ASSERT( pLib, "XML Import: Lib for module unknown");
    2309           0 :     if( pLib )
    2310             :     {
    2311           0 :         pLib->MakeModule32( ModuleName, Source );
    2312             :     }
    2313           0 : }
    2314             : 
    2315           0 : void SAL_CALL StarBasicAccess_Impl::addDialog
    2316             : (
    2317             :     const OUString& LibraryName,
    2318             :     const OUString& DialogName,
    2319             :     const uno::Sequence< sal_Int8 >& Data
    2320             : )
    2321             :     throw(container::NoSuchElementException, uno::RuntimeException, std::exception)
    2322             : {
    2323             :     (void)LibraryName;
    2324             :     (void)DialogName;
    2325             :     (void)Data;
    2326           0 : }
    2327             : 
    2328             : // Basic XML Import/Export
    2329           0 : uno::Reference< script::XStarBasicAccess > getStarBasicAccess( BasicManager* pMgr )
    2330             : {
    2331             :     uno::Reference< script::XStarBasicAccess > xRet =
    2332           0 :         new StarBasicAccess_Impl( pMgr );
    2333           0 :     return xRet;
    2334         786 : }
    2335             : 
    2336             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11