2003-09-16 14:23:32 +00:00
/*************************************************************************
*
2005-09-09 01:23:26 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2003-09-16 14:23:32 +00:00
*
2005-09-09 01:23:26 +00:00
* $ RCSfile : basprov . cxx , v $
2003-09-16 14:23:32 +00:00
*
2006-06-19 09:18:23 +00:00
* $ Revision : 1.18 $
2003-09-16 14:23:32 +00:00
*
2006-06-19 09:18:23 +00:00
* last change : $ Author : hr $ $ Date : 2006 - 06 - 19 10 : 18 : 23 $
2003-09-16 14:23:32 +00:00
*
2005-09-09 01:23:26 +00:00
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1 .
2003-09-16 14:23:32 +00:00
*
*
2005-09-09 01:23:26 +00:00
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2005 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
2003-09-16 14:23:32 +00:00
*
2005-09-09 01:23:26 +00:00
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
2003-09-16 14:23:32 +00:00
*
2005-09-09 01:23:26 +00:00
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
2003-09-16 14:23:32 +00:00
*
2005-09-09 01:23:26 +00:00
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
2003-09-16 14:23:32 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef SCRIPTING_BASPROV_HXX
# include "basprov.hxx"
# endif
# ifndef SCRIPTING_BASSCRIPT_HXX
# include "basscript.hxx"
# endif
2003-09-23 09:09:14 +00:00
# ifndef SCRIPTING_BASLIBNODE_HXX
# include "baslibnode.hxx"
# endif
2003-09-16 14:23:32 +00:00
# ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
# include <com/sun/star/frame/XModel.hpp>
# endif
2004-10-22 13:02:27 +00:00
# ifndef _COM_SUN_STAR_SCRIPT_BROWSE_BROWSENODETYPES_HPP_
# include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
2003-09-23 09:09:14 +00:00
# endif
2004-10-22 13:02:27 +00:00
# ifndef _COM_SUN_STAR_SCRIPT_PROVIDER_SCRIPTFRAMEWORKERRORTYPE_HPP_
# include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
2004-07-23 13:07:20 +00:00
# endif
2003-09-16 14:23:32 +00:00
# ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX_
# include <cppuhelper/implementationentry.hxx>
# endif
2004-08-12 12:17:46 +00:00
# ifndef _RTL_URI_HXX_
# include <rtl/uri.hxx>
# endif
# ifndef _OSL_PROCESS_H_
# include <osl/process.h>
# endif
# ifndef _OSL_FILE_HXX_
# include <osl/file.hxx>
# endif
2005-01-13 16:43:11 +00:00
# ifndef _VOS_MUTEX_HXX_
# include <vos/mutex.hxx>
# endif
# ifndef _SV_SVAPP_HXX
# include <vcl/svapp.hxx>
# endif
2003-09-16 14:23:32 +00:00
# ifndef _SBXCLASS_HXX
2005-04-13 07:13:40 +00:00
# include <basic/sbx.hxx>
2003-09-16 14:23:32 +00:00
# endif
# ifndef _BASMGR_HXX
# include <basic/basmgr.hxx>
# endif
# ifndef _SB_SBSTAR_HXX
# include <basic/sbstar.hxx>
# endif
# ifndef _SB_SBMOD_HXX
# include <basic/sbmod.hxx>
# endif
# ifndef _SB_SBMETH_HXX
# include <basic/sbmeth.hxx>
# endif
# ifndef _SFXAPP_HXX
# include <sfx2/app.hxx>
# endif
# ifndef _SFX_OBJSH_HXX
# include <sfx2/objsh.hxx>
# endif
2003-10-15 07:35:32 +00:00
# include <com/sun/star/util/XMacroExpander.hpp>
# include <com/sun/star/script/XLibraryContainer2.hpp>
2004-04-19 22:13:45 +00:00
# include <com/sun/star/uri/XUriReference.hpp>
# include <com/sun/star/uri/XUriReferenceFactory.hpp>
# include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
2004-07-23 13:07:20 +00:00
# include <util/util.hxx>
# include <util/MiscUtils.hxx>
2003-09-16 14:23:32 +00:00
using namespace : : com : : sun : : star ;
using namespace : : com : : sun : : star : : lang ;
using namespace : : com : : sun : : star : : uno ;
2004-10-22 13:02:27 +00:00
using namespace : : com : : sun : : star : : script ;
2004-07-23 13:07:20 +00:00
using namespace : : sf_misc ;
2003-09-16 14:23:32 +00:00
//.........................................................................
namespace basprov
{
//.........................................................................
// =============================================================================
// component operations
// =============================================================================
static : : rtl : : OUString getImplementationName_BasicProviderImpl ( )
{
static : : rtl : : OUString * pImplName = 0 ;
if ( ! pImplName )
{
: : osl : : MutexGuard aGuard ( : : osl : : Mutex : : getGlobalMutex ( ) ) ;
if ( ! pImplName )
{
static : : rtl : : OUString aImplName ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.comp.scripting.ScriptProviderForBasic " ) ) ;
pImplName = & aImplName ;
}
}
return * pImplName ;
}
// -----------------------------------------------------------------------------
static Sequence < : : rtl : : OUString > getSupportedServiceNames_BasicProviderImpl ( )
{
static Sequence < : : rtl : : OUString > * pNames = 0 ;
if ( ! pNames )
{
: : osl : : MutexGuard aGuard ( : : osl : : Mutex : : getGlobalMutex ( ) ) ;
if ( ! pNames )
{
2004-10-22 13:02:27 +00:00
static Sequence < : : rtl : : OUString > aNames ( 4 ) ;
aNames . getArray ( ) [ 0 ] = : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.script.provider.ScriptProviderForBasic " ) ) ;
aNames . getArray ( ) [ 1 ] = : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.script.provider.LanguageScriptProvider " ) ) ;
aNames . getArray ( ) [ 2 ] = : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.script.provider.ScriptProvider " ) ) ;
aNames . getArray ( ) [ 3 ] = : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.script.browse.BrowseNode " ) ) ;
2003-09-16 14:23:32 +00:00
pNames = & aNames ;
}
}
return * pNames ;
}
// =============================================================================
// BasicProviderImpl
// =============================================================================
BasicProviderImpl : : BasicProviderImpl ( const Reference < XComponentContext > & xContext )
2003-10-15 07:35:32 +00:00
: m_pAppBasicManager ( 0 )
, m_pDocBasicManager ( 0 )
, m_xLibContainerApp ( 0 )
, m_xLibContainerDoc ( 0 )
2003-09-16 14:23:32 +00:00
, m_xContext ( xContext )
2004-04-19 22:13:45 +00:00
, m_bIsAppScriptCtx ( true )
, m_bIsUserCtx ( true )
2003-09-16 14:23:32 +00:00
{
}
// -----------------------------------------------------------------------------
BasicProviderImpl : : ~ BasicProviderImpl ( )
{
}
2004-08-12 12:17:46 +00:00
// -----------------------------------------------------------------------------
bool BasicProviderImpl : : isLibraryShared ( const Reference < script : : XLibraryContainer > & rxLibContainer , const : : rtl : : OUString & rLibName )
{
bool bIsShared = false ;
Reference < script : : XLibraryContainer2 > xLibContainer ( rxLibContainer , UNO_QUERY ) ;
if ( xLibContainer . is ( ) & & xLibContainer - > hasByName ( rLibName ) & & xLibContainer - > isLibraryLink ( rLibName ) )
{
: : rtl : : OUString aFileURL ;
if ( m_xContext . is ( ) )
{
Reference < uri : : XUriReferenceFactory > xUriFac ;
Reference < lang : : XMultiComponentFactory > xSMgr ( m_xContext - > getServiceManager ( ) ) ;
if ( xSMgr . is ( ) )
{
xUriFac . set ( xSMgr - > createInstanceWithContext ( : : rtl : : OUString : : createFromAscii (
" com.sun.star.uri.UriReferenceFactory " ) , m_xContext ) , UNO_QUERY ) ;
}
if ( xUriFac . is ( ) )
{
: : rtl : : OUString aLinkURL ( xLibContainer - > getLibraryLinkURL ( rLibName ) ) ;
Reference < uri : : XUriReference > xUriRef ( xUriFac - > parse ( aLinkURL ) , UNO_QUERY ) ;
if ( xUriRef . is ( ) )
{
: : rtl : : OUString aScheme = xUriRef - > getScheme ( ) ;
if ( aScheme . equalsIgnoreAsciiCaseAscii ( " file " ) )
{
aFileURL = aLinkURL ;
}
else if ( aScheme . equalsIgnoreAsciiCaseAscii ( " vnd.sun.star.pkg " ) )
{
: : rtl : : OUString aAuthority = xUriRef - > getAuthority ( ) ;
if ( aAuthority . matchIgnoreAsciiCaseAsciiL ( RTL_CONSTASCII_STRINGPARAM ( " vnd.sun.star.expand: " ) ) )
{
: : rtl : : OUString aDecodedURL ( aAuthority . copy ( sizeof ( " vnd.sun.star.expand: " ) - 1 ) ) ;
aDecodedURL = : : rtl : : Uri : : decode ( aDecodedURL , rtl_UriDecodeWithCharset , RTL_TEXTENCODING_UTF8 ) ;
Reference < util : : XMacroExpander > xMacroExpander (
m_xContext - > getValueByName (
: : rtl : : OUString : : createFromAscii ( " /singletons/com.sun.star.util.theMacroExpander " ) ) ,
UNO_QUERY ) ;
if ( xMacroExpander . is ( ) )
aFileURL = xMacroExpander - > expandMacros ( aDecodedURL ) ;
}
}
}
}
}
if ( aFileURL . getLength ( ) )
{
osl : : DirectoryItem aFileItem ;
osl : : FileStatus aFileStatus ( FileStatusMask_FileURL ) ;
OSL_VERIFY ( osl : : DirectoryItem : : get ( aFileURL , aFileItem ) = = osl : : FileBase : : E_None ) ;
OSL_VERIFY ( aFileItem . getFileStatus ( aFileStatus ) = = osl : : FileBase : : E_None ) ;
: : rtl : : OUString aCanonicalFileURL ( aFileStatus . getFileURL ( ) ) ;
: : rtl : : OUString aShareURL ;
OSL_VERIFY ( osl_getExecutableFile ( & aShareURL . pData ) = = osl_Process_E_None ) ;
sal_Int32 nIndex = aShareURL . lastIndexOf ( ' / ' ) ;
if ( nIndex > = 0 )
{
nIndex = aShareURL . lastIndexOf ( ' / ' , nIndex ) ;
if ( nIndex > = 0 )
{
aShareURL = aShareURL . copy ( 0 , nIndex + 1 ) ;
aShareURL + = : : rtl : : OUString : : createFromAscii ( " share " ) ;
}
}
osl : : DirectoryItem aShareItem ;
osl : : FileStatus aShareStatus ( FileStatusMask_FileURL ) ;
OSL_VERIFY ( osl : : DirectoryItem : : get ( aShareURL , aShareItem ) = = osl : : FileBase : : E_None ) ;
OSL_VERIFY ( aShareItem . getFileStatus ( aShareStatus ) = = osl : : FileBase : : E_None ) ;
: : rtl : : OUString aCanonicalShareURL ( aShareStatus . getFileURL ( ) ) ;
if ( aCanonicalFileURL . match ( aCanonicalShareURL ) )
bIsShared = true ;
}
}
return bIsShared ;
}
2003-09-16 14:23:32 +00:00
// -----------------------------------------------------------------------------
// XServiceInfo
// -----------------------------------------------------------------------------
: : rtl : : OUString BasicProviderImpl : : getImplementationName ( ) throw ( RuntimeException )
{
return getImplementationName_BasicProviderImpl ( ) ;
}
// -----------------------------------------------------------------------------
sal_Bool BasicProviderImpl : : supportsService ( const : : rtl : : OUString & rServiceName ) throw ( RuntimeException )
{
Sequence < : : rtl : : OUString > aNames ( getSupportedServiceNames ( ) ) ;
const : : rtl : : OUString * pNames = aNames . getConstArray ( ) ;
const : : rtl : : OUString * pEnd = pNames + aNames . getLength ( ) ;
for ( ; pNames ! = pEnd & & ! pNames - > equals ( rServiceName ) ; + + pNames )
;
return pNames ! = pEnd ;
}
// -----------------------------------------------------------------------------
Sequence < : : rtl : : OUString > BasicProviderImpl : : getSupportedServiceNames ( ) throw ( RuntimeException )
{
return getSupportedServiceNames_BasicProviderImpl ( ) ;
}
// -----------------------------------------------------------------------------
// XInitialization
// -----------------------------------------------------------------------------
void BasicProviderImpl : : initialize ( const Sequence < Any > & aArguments ) throw ( Exception , RuntimeException )
{
// TODO
2005-01-13 16:43:11 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2003-09-16 14:23:32 +00:00
2003-10-15 07:35:32 +00:00
if ( aArguments . getLength ( ) = = 1 & & aArguments [ 0 ] . getValueType ( ) = = : : getCppuType ( ( const : : rtl : : OUString * ) NULL ) )
2003-09-16 14:23:32 +00:00
{
2003-10-15 07:35:32 +00:00
// Provider has been created with application context for user
// or share
2004-07-23 13:07:20 +00:00
aArguments [ 0 ] > > = m_sScriptingContext ;
2003-10-15 07:35:32 +00:00
2004-07-23 13:07:20 +00:00
: : rtl : : OUString sUser = OUSTR ( " user " ) ;
: : rtl : : OUString sShare = OUSTR ( " share " ) ;
: : rtl : : OUString sDoc = OUSTR ( " vnd.sun.star.tdoc " ) ;
2003-09-16 14:23:32 +00:00
2004-07-23 13:07:20 +00:00
if ( m_sScriptingContext . indexOf ( sDoc ) = = 0 )
2003-09-16 14:23:32 +00:00
{
2004-07-23 13:07:20 +00:00
Reference < frame : : XModel > xModel = MiscUtils : : tDocUrlToModel ( m_sScriptingContext ) ;
2003-09-16 14:23:32 +00:00
// TODO: use ScriptingContantsPool for SCRIPTING_DOC_REF
if ( xModel . is ( ) )
{
for ( SfxObjectShell * pObjShell = SfxObjectShell : : GetFirst ( ) ; pObjShell ; pObjShell = SfxObjectShell : : GetNext ( * pObjShell ) )
{
if ( xModel = = pObjShell - > GetModel ( ) )
{
2003-10-15 07:35:32 +00:00
m_pDocBasicManager = pObjShell - > GetBasicManager ( ) ;
m_xLibContainerDoc = Reference < script : : XLibraryContainer > ( pObjShell - > GetBasicContainer ( ) , UNO_QUERY ) ;
2004-07-23 13:07:20 +00:00
2003-09-16 14:23:32 +00:00
break ;
}
}
}
2004-07-23 13:07:20 +00:00
m_bIsAppScriptCtx = false ;
}
else if ( ! m_sScriptingContext . equals ( sUser ) )
{
m_bIsUserCtx = false ;
2003-09-16 14:23:32 +00:00
}
else
{
/*
throw RuntimeException (
: : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " BasicProviderImpl::initialize: no scripting context! " ) ) ,
Reference < XInterface > ( ) ) ;
*/
}
}
else
{
2004-07-23 13:07:20 +00:00
2003-09-16 14:23:32 +00:00
throw RuntimeException (
2004-07-23 13:07:20 +00:00
: : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " BasicProviderImpl::initialize: incorrect argument type " ) ) . concat ( aArguments [ 0 ] . getValueType ( ) . getTypeName ( ) ) ,
2003-09-16 14:23:32 +00:00
Reference < XInterface > ( ) ) ;
2004-07-23 13:07:20 +00:00
2003-09-16 14:23:32 +00:00
}
2004-07-23 13:07:20 +00:00
// TODO
if ( ! m_pAppBasicManager )
m_pAppBasicManager = SFX_APP ( ) - > GetBasicManager ( ) ;
2003-10-15 07:35:32 +00:00
if ( ! m_xLibContainerApp . is ( ) )
m_xLibContainerApp = Reference < script : : XLibraryContainer > ( SFX_APP ( ) - > GetBasicContainer ( ) , UNO_QUERY ) ;
2003-09-16 14:23:32 +00:00
}
// -----------------------------------------------------------------------------
2003-10-15 07:35:32 +00:00
2003-09-16 14:23:32 +00:00
// XScriptProvider
// -----------------------------------------------------------------------------
Reference < provider : : XScript > BasicProviderImpl : : getScript ( const : : rtl : : OUString & scriptURI )
2004-07-23 13:07:20 +00:00
throw ( provider : : ScriptFrameworkErrorException , RuntimeException )
2003-09-16 14:23:32 +00:00
{
// TODO
2005-01-13 16:43:11 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2003-09-16 14:23:32 +00:00
Reference < provider : : XScript > xScript ;
2004-04-19 22:13:45 +00:00
Reference < lang : : XMultiComponentFactory > xMcFac ( m_xContext - > getServiceManager ( ) ) ;
Reference < uri : : XUriReferenceFactory > xFac (
xMcFac - > createInstanceWithContext ( rtl : : OUString : : createFromAscii (
" com.sun.star.uri.UriReferenceFactory " ) , m_xContext ) , UNO_QUERY ) ;
2003-09-16 14:23:32 +00:00
2004-04-19 22:13:45 +00:00
if ( ! xFac . is ( ) )
2003-10-15 07:35:32 +00:00
{
2004-07-23 13:07:20 +00:00
throw provider : : ScriptFrameworkErrorException (
OUSTR ( " Failed to instantiate UriReferenceFactory " ) , Reference < XInterface > ( ) ,
scriptURI , OUSTR ( " Basic " ) ,
provider : : ScriptFrameworkErrorType : : UNKNOWN ) ;
2003-10-15 07:35:32 +00:00
}
2004-04-19 22:13:45 +00:00
Reference < uri : : XUriReference > uriRef (
xFac - > parse ( scriptURI ) , UNO_QUERY ) ;
Reference < uri : : XVndSunStarScriptUrl > sfUri ( uriRef , UNO_QUERY ) ;
if ( ! uriRef . is ( ) | | ! sfUri . is ( ) )
{
: : rtl : : OUString errorMsg = : : rtl : : OUString : : createFromAscii ( " BasicProviderImpl::getScript: failed to parse URI: " ) ;
2004-07-23 13:07:20 +00:00
errorMsg = errorMsg . concat ( scriptURI ) ;
throw provider : : ScriptFrameworkErrorException (
errorMsg , Reference < XInterface > ( ) ,
scriptURI , OUSTR ( " Basic " ) ,
provider : : ScriptFrameworkErrorType : : UNKNOWN ) ;
2004-04-19 22:13:45 +00:00
}
: : rtl : : OUString aDescription = sfUri - > getName ( ) ;
: : rtl : : OUString aLocation = sfUri - > getParameter (
: : rtl : : OUString : : createFromAscii ( " location " ) ) ;
2003-09-16 14:23:32 +00:00
sal_Int32 nIndex = 0 ;
: : rtl : : OUString aLibrary = aDescription . getToken ( 0 , ( sal_Unicode ) ' . ' , nIndex ) ;
: : rtl : : OUString aModule ;
if ( nIndex ! = - 1 )
aModule = aDescription . getToken ( 0 , ( sal_Unicode ) ' . ' , nIndex ) ;
: : rtl : : OUString aMethod ;
if ( nIndex ! = - 1 )
aMethod = aDescription . getToken ( 0 , ( sal_Unicode ) ' . ' , nIndex ) ;
2003-10-15 07:35:32 +00:00
if ( aLibrary . getLength ( ) ! = 0 & & aModule . getLength ( ) ! = 0 & & aMethod . getLength ( ) ! = 0 & & aLocation . getLength ( ) ! = 0 )
2003-09-16 14:23:32 +00:00
{
2003-10-15 07:35:32 +00:00
BasicManager * pBasicMgr = NULL ;
if ( aLocation . equals ( : : rtl : : OUString : : createFromAscii ( " document " ) ) )
{
pBasicMgr = m_pDocBasicManager ;
}
else if ( aLocation . equals ( : : rtl : : OUString : : createFromAscii ( " application " ) ) )
{
pBasicMgr = m_pAppBasicManager ;
}
if ( pBasicMgr )
2003-09-16 14:23:32 +00:00
{
2003-10-15 07:35:32 +00:00
StarBASIC * pBasic = pBasicMgr - > GetLib ( aLibrary ) ;
2003-09-16 14:23:32 +00:00
if ( ! pBasic )
{
2003-10-15 07:35:32 +00:00
USHORT nId = pBasicMgr - > GetLibId ( aLibrary ) ;
pBasicMgr - > LoadLib ( nId ) ;
pBasic = pBasicMgr - > GetLib ( aLibrary ) ;
2003-09-16 14:23:32 +00:00
}
if ( pBasic )
{
SbModule * pModule = pBasic - > FindModule ( aModule ) ;
if ( pModule )
{
SbxArray * pMethods = pModule - > GetMethods ( ) ;
if ( pMethods )
{
2003-09-23 09:09:14 +00:00
SbMethod * pMethod = static_cast < SbMethod * > ( pMethods - > Find ( aMethod , SbxCLASS_METHOD ) ) ;
2003-09-16 14:23:32 +00:00
if ( pMethod )
2004-07-23 13:07:20 +00:00
xScript = static_cast < provider : : XScript * > ( new BasicScriptImpl ( aDescription , pMethod ) ) ;
2003-09-16 14:23:32 +00:00
}
}
}
}
}
if ( ! xScript . is ( ) )
{
2004-07-23 13:07:20 +00:00
throw provider : : ScriptFrameworkErrorException (
: : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " BasicProviderImpl::getScript: no script! " ) ) , Reference < XInterface > ( ) ,
scriptURI , OUSTR ( " Basic " ) ,
provider : : ScriptFrameworkErrorType : : UNKNOWN ) ;
2003-09-16 14:23:32 +00:00
}
return xScript ;
}
2003-09-23 09:09:14 +00:00
// -----------------------------------------------------------------------------
// XBrowseNode
// -----------------------------------------------------------------------------
: : rtl : : OUString BasicProviderImpl : : getName ( ) throw ( RuntimeException )
{
// TODO
2005-01-13 16:43:11 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2003-09-23 09:09:14 +00:00
return : : rtl : : OUString : : createFromAscii ( " Basic " ) ;
}
// -----------------------------------------------------------------------------
Sequence < Reference < browse : : XBrowseNode > > BasicProviderImpl : : getChildNodes ( ) throw ( RuntimeException )
{
2005-01-13 16:43:11 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2003-09-23 09:09:14 +00:00
2004-08-12 12:17:46 +00:00
Reference < script : : XLibraryContainer > xLibContainer ;
BasicManager * pBasicManager = NULL ;
if ( m_bIsAppScriptCtx )
{
xLibContainer = m_xLibContainerApp ;
pBasicManager = m_pAppBasicManager ;
}
else
{
xLibContainer = m_xLibContainerDoc ;
pBasicManager = m_pDocBasicManager ;
}
2003-10-15 07:35:32 +00:00
2003-09-23 09:09:14 +00:00
Sequence < Reference < browse : : XBrowseNode > > aChildNodes ;
2004-08-12 12:17:46 +00:00
if ( pBasicManager & & xLibContainer . is ( ) )
2003-09-23 09:09:14 +00:00
{
2003-10-15 07:35:32 +00:00
Sequence < : : rtl : : OUString > aLibNames = xLibContainer - > getElementNames ( ) ;
2003-09-23 09:09:14 +00:00
sal_Int32 nLibCount = aLibNames . getLength ( ) ;
const : : rtl : : OUString * pLibNames = aLibNames . getConstArray ( ) ;
aChildNodes . realloc ( nLibCount ) ;
Reference < browse : : XBrowseNode > * pChildNodes = aChildNodes . getArray ( ) ;
2003-10-15 07:35:32 +00:00
sal_Int32 childsFound = 0 ;
2004-02-04 13:13:28 +00:00
2004-08-12 12:17:46 +00:00
for ( sal_Int32 i = 0 ; i < nLibCount ; + + i )
2003-09-23 09:09:14 +00:00
{
2004-08-12 12:17:46 +00:00
bool bCreate = false ;
if ( m_bIsAppScriptCtx )
2003-10-15 07:35:32 +00:00
{
2004-08-12 12:17:46 +00:00
bool bShared = isLibraryShared ( xLibContainer , pLibNames [ i ] ) ;
if ( ( m_bIsUserCtx & & ! bShared ) | | ( ! m_bIsUserCtx & & bShared ) )
bCreate = true ;
2003-10-15 07:35:32 +00:00
}
else
{
2004-08-12 12:17:46 +00:00
bCreate = true ;
}
if ( bCreate )
{
pChildNodes [ childsFound + + ] = static_cast < browse : : XBrowseNode * > ( new BasicLibraryNodeImpl (
m_xContext , m_sScriptingContext , pBasicManager , xLibContainer , pLibNames [ i ] , m_bIsAppScriptCtx ) ) ;
2003-10-15 07:35:32 +00:00
}
}
2004-08-12 12:17:46 +00:00
if ( childsFound ! = nLibCount )
2003-10-15 07:35:32 +00:00
aChildNodes . realloc ( childsFound ) ;
2003-09-23 09:09:14 +00:00
}
2004-08-12 12:17:46 +00:00
2003-09-23 09:09:14 +00:00
return aChildNodes ;
}
// -----------------------------------------------------------------------------
sal_Bool BasicProviderImpl : : hasChildNodes ( ) throw ( RuntimeException )
{
2005-01-13 16:43:11 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2003-09-23 09:09:14 +00:00
sal_Bool bReturn = sal_False ;
2003-10-15 07:35:32 +00:00
Reference < script : : XLibraryContainer > xLibContainer ;
if ( m_bIsAppScriptCtx )
{
xLibContainer = m_xLibContainerApp ;
}
else
{
xLibContainer = m_xLibContainerDoc ;
}
if ( xLibContainer . is ( ) )
bReturn = xLibContainer - > hasElements ( ) ;
2003-09-23 09:09:14 +00:00
return bReturn ;
}
// -----------------------------------------------------------------------------
sal_Int16 BasicProviderImpl : : getType ( ) throw ( RuntimeException )
{
2005-01-13 16:43:11 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2003-09-23 09:09:14 +00:00
return browse : : BrowseNodeTypes : : CONTAINER ;
}
2003-09-16 14:23:32 +00:00
// =============================================================================
// component operations
// =============================================================================
static Reference < XInterface > SAL_CALL create_BasicProviderImpl (
Reference < XComponentContext > const & xContext )
SAL_THROW ( ( ) )
{
return static_cast < lang : : XTypeProvider * > ( new BasicProviderImpl ( xContext ) ) ;
}
// -----------------------------------------------------------------------------
static struct : : cppu : : ImplementationEntry s_component_entries [ ] =
{
{
create_BasicProviderImpl , getImplementationName_BasicProviderImpl ,
getSupportedServiceNames_BasicProviderImpl , : : cppu : : createSingleComponentFactory ,
0 , 0
} ,
{ 0 , 0 , 0 , 0 , 0 , 0 }
} ;
// -----------------------------------------------------------------------------
//.........................................................................
} // namespace basprov
//.........................................................................
// =============================================================================
// component exports
// =============================================================================
extern " C "
{
void SAL_CALL component_getImplementationEnvironment (
const sal_Char * * ppEnvTypeName , uno_Environment * * ppEnv )
{
2006-06-19 09:18:23 +00:00
( void ) ppEnv ;
2003-09-16 14:23:32 +00:00
* ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME ;
}
sal_Bool SAL_CALL component_writeInfo (
lang : : XMultiServiceFactory * pServiceManager , registry : : XRegistryKey * pRegistryKey )
{
return : : cppu : : component_writeInfoHelper (
pServiceManager , pRegistryKey , : : basprov : : s_component_entries ) ;
}
void * SAL_CALL component_getFactory (
const sal_Char * pImplName , lang : : XMultiServiceFactory * pServiceManager ,
registry : : XRegistryKey * pRegistryKey )
{
return : : cppu : : component_getFactoryHelper (
pImplName , pServiceManager , pRegistryKey , : : basprov : : s_component_entries ) ;
}
}