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

Generated by: LCOV version 1.10