LCOV - code coverage report
Current view: top level - basic/source/basmgr - basmgr.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 1092 0.0 %
Date: 2014-04-14 Functions: 0 158 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10