diff options
Diffstat (limited to 'scripting/source/storage')
21 files changed, 4998 insertions, 0 deletions
diff --git a/scripting/source/storage/ScriptData.hxx b/scripting/source/storage/ScriptData.hxx new file mode 100644 index 000000000000..925380021919 --- /dev/null +++ b/scripting/source/storage/ScriptData.hxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SCRIPTING_STORAGE_SCRIPTDATA_HXX_ +#define _SCRIPTING_STORAGE_SCRIPTDATA_HXX_ + +#include <vector> +#include <hash_map> + +#include <cppu/macros.hxx> +#include <rtl/ustring.hxx> + + + +namespace scripting_impl +{ + +typedef ::std::pair< ::rtl::OUString, ::rtl::OUString > str_pair; +typedef ::std::vector< str_pair > props_vec; +typedef ::std::hash_map< ::rtl::OUString, props_vec, ::rtl::OUStringHash, + ::std::equal_to< ::rtl::OUString > > strpairvec_map; +typedef ::std::hash_map< ::rtl::OUString, ::std::pair< ::rtl::OUString, + ::rtl::OUString >, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > strpair_map; +typedef ::std::hash_map< ::rtl::OUString, ::std::pair< props_vec, strpairvec_map >, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > filesets_map; + +struct ScriptData +{ + + inline ScriptData::ScriptData() SAL_THROW( () ) + : parcelURI() + , language() + , locales() + , functionname() + , logicalname() + , languagedepprops() + , filesets() + { + } + + inline ScriptData::ScriptData( const ::rtl::OUString __parcelURI, + const ::rtl::OUString& __language, + const strpair_map& __locales, + const ::rtl::OUString& __functionname, + const ::rtl::OUString& __logicalname, + const props_vec& __languagedepprops, + const filesets_map& __filesets ) SAL_THROW( () ) + : parcelURI( __parcelURI ) + , language( __language ) + , locales( __locales ) + , functionname( __functionname ) + , logicalname( __logicalname ) + , languagedepprops( __languagedepprops ) + , filesets( __filesets ) + { + } + + ::rtl::OUString parcelURI; + ::rtl::OUString language; + strpair_map locales; + ::rtl::OUString functionname; + ::rtl::OUString logicalname; + props_vec languagedepprops; + filesets_map filesets; +}; +} // namespace scripting_impl +#endif // _SCRIPTING_STORAGE_ScriptData_HXX_ + diff --git a/scripting/source/storage/ScriptElement.cxx b/scripting/source/storage/ScriptElement.cxx new file mode 100644 index 000000000000..335110118507 --- /dev/null +++ b/scripting/source/storage/ScriptElement.cxx @@ -0,0 +1,161 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" + +#include "ScriptElement.hxx" +#include <util/util.hxx> + +using namespace ::rtl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +typedef ::std::vector < ::std::pair < ::rtl::OUString, bool > > dependencies_vec; +typedef ::std::vector < ::std::pair < ::rtl::OUString, ::rtl::OUString > > deliveries_vec; + +namespace scripting_impl +{ + +//************************************************************************* +/** + Construct a ScriptElement from a ScriptData object + + @param sII + the ScriptDataObject +*/ +ScriptElement::ScriptElement( ScriptData & sII ) : + XMLElement( OUSTR( "parcel" ) ), + m_sII( sII ) +{ + OSL_TRACE( "ScriptElement ctor called\n" ); + + addAttribute( OUSTR( "language" ), sII.language ); + addAttribute( OUSTR( "xmlns:parcel" ), OUSTR( "scripting.dtd" ) ); + XMLElement* xScriptElt = new XMLElement( OUSTR( "script" ) ); + xScriptElt->addAttribute( OUSTR( "language" ), sII.language ); + Reference < xml::sax::XAttributeList > xal( xScriptElt ); + addSubElement( xal ); + + strpair_map::const_iterator mp_it = sII.locales.begin(); + strpair_map::const_iterator mp_itend = sII.locales.end(); + + for( ; mp_it != mp_itend; ++mp_it ) + { + XMLElement* xel = new XMLElement( OUSTR( "locale" ) ); + xel->addAttribute( OUSTR( "lang" ), mp_it->first ); + + { + XMLElement* subxel = new XMLElement( OUSTR( "displayname" ) ); + subxel->addAttribute( OUSTR( "value" ), mp_it->second.first ); + Reference < xml::sax::XAttributeList > subxattl( subxel ); + xel->addSubElement( subxattl ); + } + { + XMLElement* subxel = new XMLElement( OUSTR( "description" ), + mp_it->second.second ); + Reference< xml::sax::XAttributeList > subxattl( subxel ); + xel->addSubElement( subxattl ); + } + + Reference < xml::sax::XAttributeList > xal( xel ); + xScriptElt->addSubElement( xal ); + } + + { + XMLElement* xel = new XMLElement( OUSTR( "functionname" ) ); + xel->addAttribute( OUSTR( "value" ), sII.functionname ); + Reference < xml::sax::XAttributeList > xal( xel ); + xScriptElt->addSubElement( xal ); + } + + { + XMLElement* xel = new XMLElement( OUSTR( "logicalname" ) ); + xel->addAttribute( OUSTR( "value" ), sII.logicalname ); + Reference < xml::sax::XAttributeList > xal( xel ); + xScriptElt->addSubElement( xal ); + } + + props_vec::const_iterator vp_it = sII.languagedepprops.begin(); + props_vec::const_iterator vp_itend = sII.languagedepprops.end(); + + if ( vp_it != vp_itend ) + { + XMLElement* xel = new XMLElement( OUSTR( "languagedepprops" ) ); + + for( ; vp_it != vp_itend ; ++vp_it ) + { + XMLElement* subxel = new XMLElement( OUSTR( "prop" ) ); + subxel->addAttribute( OUSTR( "name" ), vp_it->first ); + subxel->addAttribute( OUSTR( "value" ), vp_it->second ); + Reference < xml::sax::XAttributeList > subxattl( subxel ); + xel->addSubElement( subxattl ); + } + + Reference < xml::sax::XAttributeList > xal( xel ); + xScriptElt->addSubElement( xal ); + } + + filesets_map::const_iterator fm_it = sII.filesets.begin(); + filesets_map::const_iterator fm_itend = sII.filesets.end(); + + for( ; fm_it != fm_itend; ++fm_it ) + { + XMLElement* xel = new XMLElement( OUSTR( "fileset" ) ); + xel->addAttribute( OUSTR( "name" ), fm_it->first ); + + vp_it = fm_it->second.first.begin(); + vp_itend = fm_it->second.first.end(); + + for( ; vp_it != vp_itend; ++vp_it ) + { + XMLElement* subxel = new XMLElement( OUSTR( "prop" ) ); + subxel->addAttribute( OUSTR( "name" ), vp_it->first ); + subxel->addAttribute( OUSTR("value"), vp_it->second ); + Reference < xml::sax::XAttributeList > subxattl( subxel ); + xel->addSubElement( subxattl ); + } + + strpairvec_map::const_iterator sm_it = fm_it->second.second.begin(); + strpairvec_map::const_iterator sm_itend = fm_it->second.second.end(); + + if( sm_it != sm_itend ) + { + // was there a purpose for contstructing this + // XMLElement* subxel = new XMLElement( OUSTR( "file" ) ); + xel->addAttribute( OUSTR( "name" ), sm_it->first ); + + } + } +} + +//************************************************************************* +ScriptElement::~ScriptElement() SAL_THROW(()) +{ +} + +} // namespace scripting_impl diff --git a/scripting/source/storage/ScriptElement.hxx b/scripting/source/storage/ScriptElement.hxx new file mode 100644 index 000000000000..70c7ab5276ec --- /dev/null +++ b/scripting/source/storage/ScriptElement.hxx @@ -0,0 +1,61 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SCRIPT_FRAMEWORK_STORAGE_SCRIPT_ELEMENT_HXX_ +#define _SCRIPT_FRAMEWORK_STORAGE_SCRIPT_ELEMENT_HXX_ + +#include <osl/mutex.hxx> + +#include "ScriptData.hxx" + +#include "XMLElement.hxx" + +namespace scripting_impl +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +class ScriptElement : public ::scripting_impl::XMLElement +{ +public: + /** + Construct a ScriptElement from a ScriptData object + + @param sII + the ScriptData Object + */ + explicit ScriptElement( ScriptData & sII ); + ~ScriptElement() SAL_THROW (()); + +private: + ScriptData m_sII; + +}; + +} + +#endif diff --git a/scripting/source/storage/ScriptInfo.cxx b/scripting/source/storage/ScriptInfo.cxx new file mode 100644 index 000000000000..bbe21f3546ec --- /dev/null +++ b/scripting/source/storage/ScriptInfo.cxx @@ -0,0 +1,373 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" +#include <cppuhelper/implementationentry.hxx> + +#include <hash_map> + +#include <osl/file.hxx> +#include <cppuhelper/implbase1.hxx> + +#include <com/sun/star/beans/XPropertyContainer.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> + +#include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp> + +#include <util/util.hxx> +#include "ScriptInfo.hxx" + +using namespace ::rtl; +using namespace com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::drafts::com::sun::star::script::framework; +using namespace ::drafts::com::sun::star::script::framework::storage; + +namespace scripting_impl +{ + +typedef ::std::hash_map < ::rtl::OUString, css::uno::Any, ::rtl::OUStringHash, + ::std::equal_to< ::rtl::OUString > > PropertySet_hash; + +class PropertySetImpl : public ::cppu::WeakImplHelper1< css::beans::XPropertySet > +{ + +public: + + PropertySetImpl(); + ~PropertySetImpl(); + +// XPropertySet implementation + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL + getPropertySetInfo() + throw ( css::uno::RuntimeException ); + virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, + const css::uno::Any& aValue ) + throw ( css::beans::UnknownPropertyException, + css::beans::PropertyVetoException, + css::lang::IllegalArgumentException, + css::lang::WrappedTargetException, + css::uno::RuntimeException ); + virtual css::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) + throw ( css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, + css::uno::RuntimeException ); + virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, + const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) + throw ( css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, + css::uno::RuntimeException ); + virtual void SAL_CALL removePropertyChangeListener( + const ::rtl::OUString& aPropertyName, + const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) + throw ( css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, + css::uno::RuntimeException ); + virtual void SAL_CALL addVetoableChangeListener( + const ::rtl::OUString& PropertyName, + const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) + throw ( css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, + css::uno::RuntimeException ); + virtual void SAL_CALL removeVetoableChangeListener( + const ::rtl::OUString& PropertyName, + const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) + throw ( css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, + css::uno::RuntimeException ); + +private: + friend class ScriptInfo; + + css::uno::Reference< css::uno::XComponentContext > m_xContext; + void PropertySetImpl::privateSetPropertyValue( const ::rtl::OUString& aPropertyName, const Any& aValue ) + throw ( beans::UnknownPropertyException, beans::PropertyVetoException, + lang::IllegalArgumentException, lang::WrappedTargetException, + RuntimeException ); + + osl::Mutex m_mutex; + PropertySet_hash m_propertyMap; +}; + +PropertySetImpl::PropertySetImpl() +{ + OSL_TRACE( "<PropertySetImpl ctor called\n" ); +} + +PropertySetImpl::~PropertySetImpl() +{ + OSL_TRACE( "<PropertySetImpl dtor called\n>" ); +} + +Reference< beans::XPropertySetInfo > SAL_CALL PropertySetImpl::getPropertySetInfo( ) + throw ( RuntimeException ) +{ + return Reference< beans::XPropertySetInfo > (); // Not supported +} + +void SAL_CALL PropertySetImpl::setPropertyValue( const ::rtl::OUString& aPropertyName, + const Any& aValue ) + throw ( beans::UnknownPropertyException, beans::PropertyVetoException, + lang::IllegalArgumentException, lang::WrappedTargetException, + RuntimeException ) +{ + throw RuntimeException( + OUSTR( "PropertySetImpl::setPropertyValue: method not supported. Read-only PropertySet" ), + Reference< XInterface >() ); +} + +void PropertySetImpl::privateSetPropertyValue( const ::rtl::OUString& aPropertyName, + const Any& aValue ) + throw ( beans::UnknownPropertyException, beans::PropertyVetoException, + lang::IllegalArgumentException, lang::WrappedTargetException, + RuntimeException ) +{ + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + m_propertyMap[ aPropertyName ] = aValue; +} + +//************************************************************************* +Any SAL_CALL PropertySetImpl::getPropertyValue( const ::rtl::OUString& PropertyName ) + throw ( beans::UnknownPropertyException, + lang::WrappedTargetException, RuntimeException ) +{ + if ( m_propertyMap.find( PropertyName ) == m_propertyMap.end() ) + { + throw RuntimeException( + + OUSTR( "PropertySetImpl::getPropertyValue: invalid PropertyName ").concat( + PropertyName), + Reference< XInterface >() ); + } + + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + Any returnValue = m_propertyMap[ PropertyName ]; + + return returnValue; +} + +//************************************************************************* +void SAL_CALL PropertySetImpl::addPropertyChangeListener( + const ::rtl::OUString& aPropertyName, + const Reference< beans::XPropertyChangeListener >& xListener ) + throw ( beans::UnknownPropertyException, lang::WrappedTargetException, + RuntimeException ) +{ + throw RuntimeException( + OUSTR( "PropertySetImpl::addPropertyChangeListener: method not supported" ), + Reference< XInterface >() ); +} + +//************************************************************************* +void SAL_CALL PropertySetImpl::removePropertyChangeListener( + const ::rtl::OUString& aPropertyName, + const Reference< beans::XPropertyChangeListener >& aListener ) + throw ( beans::UnknownPropertyException, lang::WrappedTargetException, + RuntimeException ) +{ + throw RuntimeException( + OUSTR( "PropertySetImpl::removePropertyChangeListener: method not supported" ), + Reference< XInterface >() ); +} + +//************************************************************************* +void SAL_CALL PropertySetImpl::addVetoableChangeListener( + const ::rtl::OUString& PropertyName, + const Reference< beans::XVetoableChangeListener >& aListener ) + throw ( beans::UnknownPropertyException, lang::WrappedTargetException, + RuntimeException ) +{ + throw RuntimeException( + OUSTR( "PropertySetImpl::addVetoableChangeListener: method not supported" ), + Reference< XInterface >() ); +} + +//************************************************************************* +void SAL_CALL PropertySetImpl::removeVetoableChangeListener( + const ::rtl::OUString& PropertyName, + const Reference< beans::XVetoableChangeListener >& aListener ) + throw ( beans::UnknownPropertyException, lang::WrappedTargetException, + RuntimeException ) +{ + throw RuntimeException( + OUSTR( "PropertySetImpl::removeVetoableChangeListener: method not supported" ), + Reference< XInterface >() ); +} + + +//************************************************************************* +ScriptInfo::ScriptInfo( const ScriptData & scriptData, sal_Int32 storageID ) + : m_scriptData( scriptData ), m_storageID( storageID ) +{ + OSL_TRACE( "< ++++++ ScriptInfo ctor called >\n" ); + OSL_TRACE( "< ++++++ parcelURI=%s>\n",::rtl::OUStringToOString(m_scriptData.parcelURI , RTL_TEXTENCODING_ASCII_US ).pData->buffer ); +} +//************************************************************************* +ScriptInfo::~ScriptInfo() +{ + OSL_TRACE( "< ScriptInfo dtor called >\n" ); +} +//************************************************************************* +OUString SAL_CALL ScriptInfo::getLogicalName( ) throw ( RuntimeException ) +{ + OSL_TRACE( "ScriptInfo::getLogicalName() " ); + return m_scriptData.logicalname; +} + +//************************************************************************* +OUString SAL_CALL ScriptInfo::getDescription( ) throw ( RuntimeException ) +{ + OUString rs_desc; + // TDB need to determine locale here, hardcoded at the moment + // to english + + OUString localeLang = OUString::createFromAscii( "en" ); + strpair_map::const_iterator str_it = + m_scriptData.locales.find( localeLang ); + + if( str_it == m_scriptData.locales.end() ) + { + OSL_TRACE( "No description set in meta-data" ); + return rs_desc; + } + rs_desc = str_it->second.second; + return rs_desc; +} + +//************************************************************************* +OUString SAL_CALL ScriptInfo::getLanguage( ) throw ( RuntimeException ) +{ + OSL_TRACE( "ScriptInfo::getLanguage() " ); + return m_scriptData.language; +} + +//************************************************************************* +OUString SAL_CALL ScriptInfo::getFunctionName( ) throw ( RuntimeException ) +{ + OSL_TRACE( "ScriptInfo::getFunctionName() " ); + return m_scriptData.functionname; +} + +//************************************************************************* +OUString SAL_CALL ScriptInfo::getParcelURI( ) throw ( RuntimeException ) +{ + return m_scriptData.parcelURI; +} + +//************************************************************************* +Reference< beans::XPropertySet > SAL_CALL ScriptInfo::getLanguageProperties( ) + throw ( RuntimeException ) +{ + PropertySetImpl* propSetImpl = new PropertySetImpl(); + Reference< beans::XPropertySet > xPropSet = propSetImpl; + + props_vec::const_iterator pv_it = m_scriptData.languagedepprops.begin(); + props_vec::const_iterator pv_itend = m_scriptData.languagedepprops.end(); + + for( ; pv_it != pv_itend; ++pv_it ) + { + try + { + propSetImpl->privateSetPropertyValue( pv_it->first, makeAny( pv_it->second ) ); + } + catch( Exception& e ) + { + OUString msg = OUSTR( + "ScriptInfo::getLanguage caught exception while setting property," ); + msg = msg.concat( OUSTR( " PropertryName: " ) ).concat( pv_it->first ); + msg = msg.concat( OUSTR( " \nException message is: " ) ); + msg = msg.concat( e.Message ); + throw RuntimeException( msg , Reference< XInterface >() ); + } + } + + return xPropSet; +} +//************************************************************************* +css::uno::Sequence< ::rtl::OUString > SAL_CALL ScriptInfo::getFileSetNames() +throw ( css::uno::RuntimeException ) +{ + OSL_TRACE("ScriptInfo::getFileSetNames"); + Sequence< OUString > results; + filesets_map::iterator fsm_it = m_scriptData.filesets.begin(); + filesets_map::iterator fsm_itend = m_scriptData.filesets.end(); + if( fsm_it == fsm_itend ) + { + OSL_TRACE( "ScriptInfo::getFileSetNames: no filesets" ); + return results; + } + results.realloc( m_scriptData.filesets.size() ); + for ( sal_Int32 count = 0; fsm_it != fsm_itend; ++fsm_it ) + { + OUString fileSetName = fsm_it->first; + OSL_TRACE( "ScriptInfo::getFileSetNames: adding name %s", + ::rtl::OUStringToOString( fileSetName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + results[ count++ ] = fileSetName; + } + return results; +} +//************************************************************************* +css::uno::Sequence< ::rtl::OUString > SAL_CALL +ScriptInfo::getFilesInFileSet( const ::rtl::OUString & fileSetName ) +throw ( css::uno::RuntimeException ) +{ + Sequence< OUString > results; + filesets_map::iterator fsm_it = m_scriptData.filesets.find( fileSetName ); + filesets_map::iterator fsm_itend = m_scriptData.filesets.end(); + if( fsm_it == fsm_itend ) + { + OSL_TRACE( "ScriptInfo::getFilesInFileSet: no fileset named %s", + ::rtl::OUStringToOString( fileSetName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return results; + } + + strpairvec_map files = fsm_it->second.second; + strpairvec_map::iterator spvm_it = files.begin(); + strpairvec_map::iterator spvm_itend = files.end(); + if( spvm_it == spvm_itend ) + { + OSL_TRACE( "ScriptInfo::getFilesInFileSet: no files in fileset %s", + ::rtl::OUStringToOString( fileSetName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return results; + } + results.realloc( files.size() ); + for( sal_Int32 count = 0; spvm_it != spvm_itend ; ++spvm_it ) + { + OUString fileName = spvm_it->first; + OSL_TRACE( "ScriptInfo::getFilesInFileSet: adding file %s", + ::rtl::OUStringToOString( fileName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + results[ count++ ] = fileName; + } + return results; +} +//************************************************************************* +} diff --git a/scripting/source/storage/ScriptInfo.hxx b/scripting/source/storage/ScriptInfo.hxx new file mode 100644 index 000000000000..a61126db8789 --- /dev/null +++ b/scripting/source/storage/ScriptInfo.hxx @@ -0,0 +1,75 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef __SCRIPT_FRAMEWORK_STORAGE_SCRIPTINFO_HXX_ +#define __SCRIPT_FRAMEWORK_STORAGE_SCRIPTINFO_HXX_ + +#include <cppuhelper/implbase1.hxx> // helper for component factory + +#include <com/sun/star/beans/XPropertySet.hpp> + +#include <drafts/com/sun/star/script/framework/storage/XScriptInfo.hpp> + +#include "ScriptData.hxx" + +namespace scripting_impl +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +class ScriptInfo : public ::cppu::WeakImplHelper1< dcsssf::storage::XScriptInfo > +{ +public: + explicit ScriptInfo( const ScriptData & scriptData, sal_Int32 storageID ); + virtual ~ScriptInfo(); + + // XScriptInfo + virtual ::rtl::OUString SAL_CALL getLogicalName() + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getDescription() + throw ( css::uno::RuntimeException ) ; + virtual ::rtl::OUString SAL_CALL getLanguage() throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getFunctionName() + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getParcelURI() + throw ( css::uno::RuntimeException ); + virtual css::uno::Reference< css::beans::XPropertySet > SAL_CALL + getLanguageProperties() throw ( css::uno::RuntimeException ); + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getFileSetNames() + throw ( css::uno::RuntimeException ); + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL + getFilesInFileSet( const ::rtl::OUString & fileSetName ) + throw ( css::uno::RuntimeException ); + +private: + ScriptData m_scriptData; + sal_Int32 m_storageID; +}; + +} +#endif // define __SCRIPTING_STORAGE... diff --git a/scripting/source/storage/ScriptInfoImpl.hxx b/scripting/source/storage/ScriptInfoImpl.hxx new file mode 100644 index 000000000000..c02ee1b57db2 --- /dev/null +++ b/scripting/source/storage/ScriptInfoImpl.hxx @@ -0,0 +1,93 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SCRIPTING_STORAGE_SCRIPTINFOIMPL_HXX_ +#define _SCRIPTING_STORAGE_SCRIPTINFOIMPL_HXX_ + +#include <vector> +#include <map> + +#include <cppu/macros.hxx> +#include <rtl/ustring.hxx> + + +typedef ::std::pair< ::rtl::OUString, ::rtl::OUString > str_pair; +typedef ::std::map< ::rtl::OUString, str_pair, + ::std::equal_to< ::rtl::OUString > > strpair_map; +typedef ::std::vector< str_pair > props_vec; +typedef ::std::map< ::rtl::OUString, ::std::pair< props_vec, strpair_map >, + ::std::equal_to< ::rtl::OUString > > filesets_map; + +namespace scripting_impl +{ + +struct ScriptInfoImpl +{ + + inline ScriptInfoImpl::ScriptInfoImpl() SAL_THROW( () ) + : parcelURI() + , language() + , locales() + , functionname() + , logicalname() + , languagedepprops() + , filesets() + { + } + + inline ScriptInfoImpl::ScriptInfoImpl( const ::rtl::OUString __parcelURI, + const ::rtl::OUString& __language, + const strpair_map& __locales, + const ::rtl::OUString& __functionname, + const ::rtl::OUString& __logicalname, + const langdepprops_vec& __languagedepprops, + const filesets_map& __filesets ) SAL_THROW( () ) + : parcelURI( __parcelURI ) + , language( __language ) + , locales( __locales ) + , functionname( __functionname ) + , logicalname( __logicalname ) + , languagedepprops( __languagedepprops ) + , filesets( __filesets ) + { + } + + ::rtl::OUString parcelURI; + ::rtl::OUString language; + strpair_map locales; + ::rtl::OUString functionname; + ::rtl::OUString logicalname; + props_vec languagedepprops; + filesets_map filesets; + +}; + + +} // namespace scripting_impl + +#endif // _SCRIPTING_STORAGE_SCRIPTINFOIMPL_HXX_ + diff --git a/scripting/source/storage/ScriptMetadataImporter.cxx b/scripting/source/storage/ScriptMetadataImporter.cxx new file mode 100644 index 000000000000..64dd87b2546b --- /dev/null +++ b/scripting/source/storage/ScriptMetadataImporter.cxx @@ -0,0 +1,532 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" + +#ifdef _DEBUG +#include <stdio.h> +#endif + +#include "ScriptMetadataImporter.hxx" + +#include <osl/mutex.hxx> + +#include <com/sun/star/xml/sax/XParser.hpp> +#include <rtl/string.h> + + +#include <util/util.hxx> + +using namespace ::rtl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace scripting_impl +{ +//************************************************************************* +ScriptMetadataImporter::ScriptMetadataImporter( + const Reference< XComponentContext > & xContext ) + : m_xContext( xContext ) +{ + OSL_TRACE( "< ScriptMetadataImporter ctor called >\n" ); + ms_localeDesc = new OUStringBuffer(); +} + +//************************************************************************* +ScriptMetadataImporter::~ScriptMetadataImporter() SAL_THROW( () ) +{ + OSL_TRACE( "< ScriptMetadataImporter dtor called >\n" ); + delete ms_localeDesc; +} + + +//************************************************************************* +void ScriptMetadataImporter::parseMetaData( + Reference< io::XInputStream > const & xInput, + const ::rtl::OUString & parcelURI, + InfoImpls_vec & io_ScriptDatas ) + throw ( xml::sax::SAXException, io::IOException, RuntimeException ) +{ + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + mpv_ScriptDatas = &io_ScriptDatas; + mpv_ScriptDatas->clear(); + + //Set the placeholder for the parcel URI + ms_parcelURI = parcelURI; + + //Get the parser service + validateXRef( m_xContext, + "ScriptMetadataImporter::parseMetaData: No context available" ); + + Reference< lang::XMultiComponentFactory > xMgr = + m_xContext->getServiceManager(); + + validateXRef( xMgr, + "ScriptMetadataImporter::parseMetaData: No service manager available" ); + + Reference< XInterface > xInterface = xMgr->createInstanceWithContext( + OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ); + + validateXRef( xInterface, "ScriptMetadataImporter::parseMetaData: cannot get SAX Parser" ); + Reference< xml::sax::XParser > xParser; + try + { + xParser.set( xInterface ,UNO_QUERY_THROW ); + } + catch (RuntimeException & re ) + { + OUString msg = OUString::createFromAscii( + "ScriptMetadata:Importer::parserMetaData cannot get XParser" ); + msg.concat( re.Message ); + throw RuntimeException( msg, Reference< XInterface > () ); + } + + // xxx todo: error handler, entity resolver omitted + // This class is the document handler for the parser + Reference< xml::sax::XDocumentHandler > t_smI( this ); + xParser->setDocumentHandler( t_smI ); + + //Set up the input for the parser, the XInputStream + xml::sax::InputSource source; + source.aInputStream = xInput; + source.sSystemId = OUSTR( "virtual file" ); + + OSL_TRACE( "ScriptMetadataImporter: Start the parser\n" ); + + try + { + xParser->parseStream( source ); + } + catch ( xml::sax::SAXException & saxe ) + { + OUString msg = OUString::createFromAscii( + "ScriptMetadata:Importer::parserMetaData SAXException" ); + msg.concat( saxe.Message ); + throw xml::sax::SAXException( msg, Reference< XInterface > (), + saxe.WrappedException ); + } + catch ( io::IOException & ioe ) + { + throw io::IOException( OUString::createFromAscii( + "ScriptMetadataImporter::parseMetaData IOException: " ) + ioe.Message, + Reference< XInterface > () ); + } + +#ifdef _DEBUG + catch ( ... ) + { + throw RuntimeException( OUString::createFromAscii( + "ScriptMetadataImporter::parseMetadata UnknownException: " ), + Reference< XInterface > () ); + } +#endif + + OSL_TRACE( "ScriptMetadataImporter: Parser finished\n "); + + OSL_TRACE( "ScriptMetadataImporter: vector size is %d\n", + mpv_ScriptDatas->size() ); +} + +//************************************************************************* +// XExtendedDocumentHandler impl +void ScriptMetadataImporter::startCDATA() + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: startCDATA()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::endCDATA() + throw ( RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: endDATA()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::comment( const ::rtl::OUString & sComment ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: comment()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::allowLineBreak() + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: allowLineBreak()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::unknown( const ::rtl::OUString & sString ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: unknown()\n" ); +} + +//************************************************************************* +// XDocumentHandler impl +void ScriptMetadataImporter::startDocument() + throw ( xml::sax::SAXException, RuntimeException ) +{ + // Ignore for now + OSL_TRACE( "ScriptMetadataImporter: startDocument()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::endDocument() + throw ( xml::sax::SAXException, RuntimeException ) +{ + // Ignore for now + OSL_TRACE( "ScriptMetadataImporter: endDocument()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::startElement( + const ::rtl::OUString& tagName, + const Reference< xml::sax::XAttributeList >& xAttribs ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + + OSL_TRACE( "Trace Message : ScriptMetadataImporter: startElement() %s\n", + ::rtl::OUStringToOString( tagName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + //Set the state of the state machine + setState( tagName ); + + //Processing the elements + switch( m_state ) + { + case SCRIPT: + m_ScriptData.parcelURI = ms_parcelURI; + m_ScriptData.language = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "language" )); + OSL_TRACE( "Trace Message: language is %s\n", + ::rtl::OUStringToOString( m_ScriptData.language, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case LOCALE: + ms_localeLang = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "lang" ) ); + OSL_TRACE( "Trace Message: Locale is %s\n", + ::rtl::OUStringToOString( ms_localeLang, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case DISPLAYNAME: + ms_localeDisName = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" )); + OSL_TRACE( "Trace Message: Displyaname is %s\n", + ::rtl::OUStringToOString( ms_localeDisName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FUNCTIONNAME: + m_ScriptData.functionname = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ); + OSL_TRACE( "Trace Message: Functionname is %s\n", + ::rtl::OUStringToOString( m_ScriptData.functionname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case LOGICALNAME: + m_ScriptData.logicalname = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" )); +#ifdef _DEBUG + fprintf(stderr, "Trace Message: logicalname is %s\n", + ::rtl::OUStringToOString( m_ScriptData.logicalname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); +#endif + break; + case LANGDEPPROPS: + m_ScriptData.languagedepprops.push_back( + ::std::make_pair( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ) + )); + OSL_TRACE( "Trace Message: Langdepprops is %s\t%s\n", + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FILESET: + ms_filesetname = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ); + OSL_TRACE( "Trace Message: filesetname is %s\n", + ::rtl::OUStringToOString(ms_filesetname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FILESETPROPS: + mv_filesetprops.push_back( ::std::make_pair( + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ) + )); + OSL_TRACE( "Trace Message: filesetprops is %s\t%s\n", + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FILES: + ms_filename = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ); + OSL_TRACE( "Trace Message: filename is %s\n", + ::rtl::OUStringToOString( ms_filename, + RTL_TEXTENCODING_ASCII_US).pData->buffer ); + break; + case FILEPROPS: + /** + mm_files.insert( strpair_pair( ms_filename, + str_pair( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value") ) ) + ) + ); + */ + mv_fileprops.push_back(str_pair( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value") ) ) ); + OSL_TRACE( "Trace Message: fileprops is %s\t%s\n", + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + + // to prevent compiler warnings + case PARCEL: + case DESCRIPTION: + case LANGUAGEDEPPROPS: + break; + } +} + +//************************************************************************* +void ScriptMetadataImporter::endElement( const ::rtl::OUString & aName ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + + //The end tag of an element + OSL_TRACE( "ScriptMetadataImporter: endElement() %s\n", + ::rtl::OUStringToOString( aName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + //Set the state + setState( aName ); + + + switch ( m_state ) + { + case PARCEL: + break; + case SCRIPT: + // np adjust logicalName to be equal to function name + // as logical name concept has been removed + m_ScriptData.logicalname = m_ScriptData.functionname; + mpv_ScriptDatas->push_back( m_ScriptData ); + m_ScriptData = ScriptData(); + break; + case LOCALE: + m_ScriptData.locales[ ms_localeLang ] = ::std::make_pair( + ms_localeDisName, ms_localeDesc->makeStringAndClear().trim() ); + break; + case FILESET: + OSL_TRACE("adding fileset %s to filesets map", + ::rtl::OUStringToOString( ms_filesetname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + m_ScriptData.filesets[ ms_filesetname ] = ::std::make_pair( + mv_filesetprops, mm_files ); + mm_files.clear(); + mv_filesetprops.clear(); + break; + case FILES: + OSL_TRACE("adding files %s to files map", + ::rtl::OUStringToOString( ms_filename, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + mm_files[ ms_filename ] = mv_fileprops; + mv_fileprops.clear(); + break; + // + // to prevent compiler warnings + case DISPLAYNAME: + case DESCRIPTION: + case FUNCTIONNAME: + case LOGICALNAME: + case LANGUAGEDEPPROPS: + case LANGDEPPROPS: + case FILESETPROPS: + case FILEPROPS: + break; + } +} + +//************************************************************************* +void ScriptMetadataImporter::characters( const ::rtl::OUString & aChars ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: characters()\n"); + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + switch ( m_state ) + { + case DESCRIPTION: + //Put description into the struct + ms_localeDesc->append(aChars); + break; + case PARCEL: + case SCRIPT: + case LOCALE: + case DISPLAYNAME: + case FUNCTIONNAME: + case LOGICALNAME: + case LANGUAGEDEPPROPS: + case LANGDEPPROPS: + case FILESETPROPS: + case FILEPROPS: + break; + } +} + +//************************************************************************* +void ScriptMetadataImporter::ignorableWhitespace( + const ::rtl::OUString & aWhitespaces ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: ignorableWhiteSpace()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::processingInstruction( + const ::rtl::OUString & aTarget, const ::rtl::OUString & aData ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: processingInstruction()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::setDocumentLocator( + const Reference< xml::sax::XLocator >& xLocator ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: setDocumentLocator()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::setState( const ::rtl::OUString & tagName ) +{ + //Set the state depending on the tag name of the current + //element the parser has arrived at + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "parcel" ) ) ) + { + //Parcel tag + m_state = PARCEL; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "script" ) ) ) + { + m_state = SCRIPT; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "locale" ) ) ) + { + m_state = LOCALE; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "displayname" ) ) ) + { + m_state = DISPLAYNAME; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "description" ) ) ) + { + m_state = DESCRIPTION; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "functionname" ) ) ) + { + m_state = FUNCTIONNAME; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "logicalname" ) ) ) + { + m_state = LOGICALNAME; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "languagedepprops" ) ) ) + { + m_state = LANGUAGEDEPPROPS; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "prop" ) ) ) + { + if( m_state == LANGUAGEDEPPROPS ) + { + m_state = LANGDEPPROPS; + } + else if( m_state == FILESET ) + { + m_state = FILESETPROPS; + } + else if( m_state == FILES ) + { + m_state = FILEPROPS; + } + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "fileset" ) ) ) + { + m_state = FILESET; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "file" ) ) ) + { + m_state = FILES; + } + else + { + //If there is a tag we don't know about, throw a exception (wobbler) :) + ::rtl::OUString str_sax = ::rtl::OUString::createFromAscii( "No Such Tag" ); + + OSL_TRACE( "ScriptMetadataImporter: No Such Tag: %s\n", + ::rtl::OUStringToOString( + tagName, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + throw xml::sax::SAXException( + str_sax, Reference< XInterface >(), Any() ); + } +} + +} diff --git a/scripting/source/storage/ScriptMetadataImporter.hxx b/scripting/source/storage/ScriptMetadataImporter.hxx new file mode 100644 index 000000000000..cb00833b7187 --- /dev/null +++ b/scripting/source/storage/ScriptMetadataImporter.hxx @@ -0,0 +1,251 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SCRIPTING_STORAGE_SCRIPTMETADATAIMPORTER_HXX_ +#define _SCRIPTING_STORAGE_SCRIPTMETADATAIMPORTER_HXX_ + +#include <vector> + +#include <rtl/ustring.h> +#include <rtl/ustrbuf.hxx> +#include <osl/mutex.hxx> +#include <cppuhelper/implbase1.hxx> // helper for component factory + +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> +#include <com/sun/star/io/XInputStream.hpp> + +#include "ScriptData.hxx" + +namespace scripting_impl +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +typedef ::std::vector< ScriptData > InfoImpls_vec; +typedef ::std::pair< ::rtl::OUString, ::std::pair< ::rtl::OUString, + ::rtl::OUString > > strpair_pair; + +/** + * Script Meta Data Importer + */ +class ScriptMetadataImporter : public + ::cppu::WeakImplHelper1< css::xml::sax::XExtendedDocumentHandler > +{ +public: + + /** + * This function will begin the parser and parse the meta data + * + * @param xInput The XInputStream for the parser which contains the XML + * @param parcelURI The parcel's URI in the document or the application + * + * @see css::io::XInputStream + */ + void parseMetaData( css::uno::Reference< css::io::XInputStream > + const & xInput, const ::rtl::OUString & parcelURI, + InfoImpls_vec & io_ScriptDatas ) + throw ( css::xml::sax::SAXException, css::io::IOException, + css::uno::RuntimeException ); + + /** + * Constructor for the meta-data parser + * + * @param XComponentContext + */ + explicit ScriptMetadataImporter( + const css::uno::Reference< css::uno::XComponentContext >& ); + + /** + * Destructor for the parser + */ + virtual ~ScriptMetadataImporter() SAL_THROW( () ); + + // XExtendedDocumentHandler impl + /** + * Function to handle the start of CDATA in XML + * + * @see com::sun::star::xml::sax::XExtendedDocumentHandler + */ + virtual void SAL_CALL startCDATA() + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle the end of CDATA in XML + * + * @see com::sun::star::xml::sax::XExtendedDocumentHandler + */ + virtual void SAL_CALL endCDATA() throw ( css::uno::RuntimeException ); + + /** + * Function to handle comments in XML + * + * @see com::sun::star::xml::sax::XExtendedDocumentHandler + */ + virtual void SAL_CALL comment( const ::rtl::OUString & sComment ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle line breaks in XML + * + * @see com::sun::star::xml::sax::XExtendedDocumentHandler + */ + virtual void SAL_CALL allowLineBreak() + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle unknowns in XML + * + * @see com::sun::star::xml::sax::XExtendedDocumentHandler + */ + virtual void SAL_CALL unknown( const ::rtl::OUString & sString ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle the start of XML document + * + * @see com::sun::star::xml::sax::XExtendedDocumentHandler + */ + // XDocumentHandler impl + virtual void SAL_CALL startDocument() + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle the end of the XML document + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL endDocument() + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle the start of an element + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL startElement( const ::rtl::OUString& aName, + const css::uno::Reference< css::xml::sax::XAttributeList > & xAttribs ) + throw ( css::xml::sax::SAXException, + css::uno::RuntimeException ); + + /** + * Function to handle the end of an element + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL endElement( const ::rtl::OUString & aName ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle characters in elements + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL characters( const ::rtl::OUString & aChars ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle whitespace + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString & aWhitespaces ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to handle XML processing instructions + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL processingInstruction( + const ::rtl::OUString & aTarget, const ::rtl::OUString & aData ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + /** + * Function to set the document locator + * + * @see com::sun::star::xml::sax::XDocumentHandler + */ + virtual void SAL_CALL setDocumentLocator( + const css::uno::Reference< css::xml::sax::XLocator >& xLocator ) + throw ( css::xml::sax::SAXException, css::uno::RuntimeException ); + + + +private: + + /** Vector contains the ScriptData structs */ + InfoImpls_vec* mpv_ScriptDatas; + + /** @internal */ + osl::Mutex m_mutex; + + /** @internal */ + css::uno::Reference< css::uno::XComponentContext > m_xContext; + + /** Placeholder for the parcel URI */ + ::rtl::OUString ms_parcelURI; + + /** States for state machine during parsing */ + enum { PARCEL, SCRIPT, LOCALE, DISPLAYNAME, DESCRIPTION, FUNCTIONNAME, + LOGICALNAME, LANGUAGEDEPPROPS, LANGDEPPROPS, FILESET, FILESETPROPS, + FILES, FILEPROPS } m_state; + + /** Build up the struct during parsing the meta data */ + ScriptData m_ScriptData; + + /** @internal */ + ::rtl::OUString ms_localeLang; + ::rtl::OUString ms_localeDisName; + ::rtl::OUStringBuffer *ms_localeDesc; + + props_vec mv_filesetprops; + + ::rtl::OUString ms_filename; + ::rtl::OUString ms_filesetname; + + props_vec mv_fileprops; + + strpairvec_map mm_files; + + InfoImpls_vec mv_ScriptDatas; + + /** + * Helper function to set the state + * + * @param tagName + * The current tag being processed + */ + void setState(const ::rtl::OUString & tagName); +} +; // class ScriptMetadataImporter + +} + +#endif diff --git a/scripting/source/storage/ScriptSecurityManager.cxx b/scripting/source/storage/ScriptSecurityManager.cxx new file mode 100755 index 000000000000..3fde4e466974 --- /dev/null +++ b/scripting/source/storage/ScriptSecurityManager.cxx @@ -0,0 +1,605 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" + +#include <com/sun/star/lang/XMultiComponentFactory.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/WrappedTargetException.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/beans/UnknownPropertyException.hpp> +#include <com/sun/star/container/XNameReplace.hpp> +#include <com/sun/star/util/XChangesBatch.hpp> +#include <com/sun/star/util/XMacroExpander.hpp> +#include <com/sun/star/util/XStringSubstitution.hpp> +#include <com/sun/star/awt/XDialog.hpp> +#include <com/sun/star/security/AccessControlException.hpp> +#include <com/sun/star/security/RuntimePermission.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptInfoAccess.hpp> +#include "ScriptSecurityManager.hxx" +#include <util/util.hxx> +#include <util/scriptingconstants.hxx> + + +using namespace ::rtl; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::drafts::com::sun::star::script::framework; + +// is this in the utils? +const char* const SCRIPTSTORAGEMANAGER_SERVICE = + "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager"; + +namespace scripting_securitymgr +{ + +static OUString s_configProv = ::rtl::OUString::createFromAscii( + "com.sun.star.configuration.ConfigurationProvider"); + +static OUString s_configAccess = ::rtl::OUString::createFromAscii( + "com.sun.star.configuration.ConfigurationAccess"); + +static OUString s_configUpdate = ::rtl::OUString::createFromAscii( + "com.sun.star.configuration.ConfigurationUpdateAccess"); + +static OUString s_securityDialog = ::rtl::OUString::createFromAscii( + "com.sun.star.script.framework.security.SecurityDialog"); + +static const int PERMISSION_NEVER = 0; +static const int PERMISSION_PATHLIST = 1; +static const int PERMISSION_ALWAYS = 2; + +static const int ALLOW_RUN = 1; +static const int ADD_TO_PATH = 2; + +//************************************************************************* +// ScriptSecurityManager Constructor +ScriptSecurityManager::ScriptSecurityManager( + const Reference< XComponentContext > & xContext ) throw ( RuntimeException ) + : m_xContext( xContext) +{ + OSL_TRACE( "< ScriptSecurityManager ctor called >\n" ); + validateXRef( m_xContext, + "ScriptSecurityManager::ScriptSecurityManager: invalid context" ); + + // get the service manager from the context + Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); + validateXRef( xMgr, + "ScriptSecurityManager::ScriptSecurityManager: cannot get ServiceManager" ); + + // create an instance of the ConfigurationProvider + Reference< XInterface > xInterface = xMgr->createInstanceWithContext( + s_configProv, m_xContext ); + validateXRef( xInterface, + "ScriptSecurityManager::ScriptSecurityManager: cannot get ConfigurationProvider" ); + // create an instance of the ConfigurationAccess for accessing the + // scripting security settings + m_xConfigProvFactory = Reference < lang::XMultiServiceFactory > ( xInterface, UNO_QUERY ); + validateXRef( m_xConfigProvFactory, + "ScriptSecurityManager::ScriptSecurityManager: cannot get XMultiServiceFactory interface from ConfigurationProvider" ); + +} + +void ScriptSecurityManager::addScriptStorage( rtl::OUString scriptStorageURL, + sal_Int32 storageID) +throw ( RuntimeException ) +{ + Permission_Hash::const_iterator ph_it = m_permissionSettings.find( scriptStorageURL ); + if ( ph_it != m_permissionSettings.end() ) + { + OSL_TRACE( "ScriptSecurityManager::addScriptStorage: already called for %s", + ::rtl::OUStringToOString( scriptStorageURL, + RTL_TEXTENCODING_ASCII_US ).pData->buffer); + return; + } + StoragePerm newPerm; + newPerm.scriptStorageURL=scriptStorageURL; + newPerm.storageID=storageID; + + // we err on the side of caution!! + newPerm.execPermission=sal_False; + + //need to check if storage has any scripts + try + { + /* need to replace this with something better, now logical names are + * gone + + Reference< XInterface > xInterface; + Any a = m_xContext->getValueByName( + OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); + if ( sal_False == ( a >>= xInterface ) ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager::addScriptStorage: could not obtain ScriptStorageManager singleton" ), + Reference< XInterface >() ); + } + validateXRef( xInterface, + "ScriptSecurityManager::addScriptStorage: cannot get Storage service" ); + Reference< storage::XScriptStorageManager > xScriptStorageManager( + xInterface, UNO_QUERY_THROW ); + Reference< XInterface > xScriptStorage = + xScriptStorageManager->getScriptStorage( storageID ); + validateXRef( xScriptStorage, + "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); + Reference< storage::XScriptInfoAccess > xScriptInfoAccess = + Reference< storage::XScriptInfoAccess > ( xScriptStorage, + UNO_QUERY_THROW ); + Sequence< ::rtl::OUString > logicalNames = xScriptInfoAccess->getScriptLogicalNames(); + if( !logicalNames.getLength() ) // we have no logical names + { + return; + } */ + + // we have some scripts so read config & decide on that basis + // Setup flags: m_runMacroSetting, m_warning, m_confirmationRequired, + readConfiguration(); + } + catch ( RuntimeException & rte ) + { + OSL_TRACE( "ScriptSecurityManager::addScriptStorage: caught RuntimeException: %s", + ::rtl::OUStringToOString( rte.Message, + RTL_TEXTENCODING_ASCII_US ).pData->buffer); + throw RuntimeException( + OUSTR( "ScriptSecurityManager::addScriptStorage: caught RuntimeException" ).concat( rte.Message ), + Reference< XInterface >() ); + } + + switch( m_runMacroSetting ) + { + case PERMISSION_NEVER: // never + { + OSL_TRACE("never run"); + break; + } + case PERMISSION_PATHLIST: // according to path list + { + OSL_TRACE("according to path"); + // check path + rtl::OUString path = scriptStorageURL.copy( 0, scriptStorageURL.lastIndexOf( '/' ) ); + OSL_TRACE( "no of elts in path list = %d", + (int)m_secureURL.getLength() ); + bool match = isSecureURL( path ); + if( match && ( m_warning == sal_True ) ) + { + OSL_TRACE("path match & warning dialog"); + int result = (int)executeStandardDialog(); + OSL_TRACE("result = %d", (int)result); + if ( (result&ALLOW_RUN) == ALLOW_RUN ) + { + newPerm.execPermission=sal_True; + } + break; + } + else if ( match ) + { + OSL_TRACE("path match & no warning dialog"); + newPerm.execPermission=sal_True; + break; + } + else if( m_confirmationRequired == sal_True ) + { + OSL_TRACE("no path match & confirmation dialog"); + int result = (int)executePathDialog( path ); + OSL_TRACE("result = %d", (int)result); + if ( (result&ALLOW_RUN) == ALLOW_RUN ) + { + newPerm.execPermission=sal_True; + } + if ( (result&ADD_TO_PATH) == ADD_TO_PATH ) + { + /* if checkbox clicked then need to add path to registry*/ + addToSecurePaths(path); + } + } + break; + } + case PERMISSION_ALWAYS: // always + if( m_warning == sal_True ) + { + OSL_TRACE("always & warning dialog"); + short result = executeStandardDialog(); + if ( (result&ALLOW_RUN) == ALLOW_RUN ) + { + newPerm.execPermission=sal_True; + } + } + else + { + OSL_TRACE("always & no warning dialog"); + newPerm.execPermission=sal_True; + } + break; + default: + // + throw RuntimeException( + OUSTR( "ScriptSecurityManager::addScriptStorage got invalid OfficeBasic setting"), + Reference< XInterface > ()); + } + + if ( newPerm.execPermission == sal_True ) + { + OSL_TRACE("setting exec permission to true for %s", + ::rtl::OUStringToOString( scriptStorageURL, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + } + else + { + OSL_TRACE("setting exec permission to false for %s", + ::rtl::OUStringToOString( scriptStorageURL, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + } + + m_permissionSettings[ scriptStorageURL ] = newPerm; +} + +bool ScriptSecurityManager::isSecureURL( const OUString & path ) +{ + bool match = false; + OSL_TRACE( "no of elts in path list = %d", + (int)m_secureURL.getLength() ); + OSL_TRACE("document path: %s", + ::rtl::OUStringToOString( path, + RTL_TEXTENCODING_ASCII_US ).pData->buffer); + int length = m_secureURL.getLength(); + for( int j = 0; j < length ; j++ ) + { + OSL_TRACE("path list element: %s", + ::rtl::OUStringToOString( m_secureURL[j], + RTL_TEXTENCODING_ASCII_US ).pData->buffer); +#ifdef WIN32 + OSL_TRACE("case insensitive comparison"); + if( path.equalsIgnoreAsciiCase( m_secureURL[j] ) ) +#else + OSL_TRACE("case sensitive comparison"); + if( path.equals( m_secureURL[j] ) ) +#endif + { + match = true; + break; + } + } + return match; +} + +short ScriptSecurityManager::executeStandardDialog() +throw ( RuntimeException ) +{ + OUString dummyString; + return executeDialog( dummyString ); +} + +short ScriptSecurityManager::executePathDialog( const OUString & path ) +throw ( RuntimeException ) +{ + return executeDialog( path ); +} + +short ScriptSecurityManager::executeDialog( const OUString & path ) +throw ( RuntimeException ) +{ + Sequence < Any > aArgs; + if( path.getLength() != 0 ) + { + OSL_TRACE("reallocing"); + aArgs.realloc(1); + aArgs[ 0 ] <<= path; + } + short result; + try + { + Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); + validateXRef( xMgr, + "ScriptSecurityManager::executeDialog: cannot get ServiceManager" ); + Reference< XInterface > xInterface = + xMgr->createInstanceWithArgumentsAndContext( s_securityDialog, + aArgs, m_xContext ); + validateXRef( xInterface, "ScriptSecurityManager::executeDialog: Can't create SecurityDialog" ); + Reference< awt::XDialog > xDialog( xInterface, UNO_QUERY_THROW ); + result = xDialog->execute(); + Reference< lang::XComponent > xComponent( xInterface, UNO_QUERY_THROW ); + validateXRef( xInterface, "ScriptSecurityManager::executeDialog: Can't get XComponent to dispose dialog" ); + xComponent->dispose(); + } + catch ( RuntimeException & rte ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager::executeDialog: caught RuntimeException: ").concat( rte.Message ), + Reference< XInterface > ()); + } + catch ( Exception & e ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager::executeDialog: caught Exception: ").concat( e.Message ), + Reference< XInterface > ()); + } + return result; +} + +/** + * checks to see whether the requested ScriptPermission is allowed. + * This was modelled after the Java AccessController, but at this time + * we can't see a good reason not to return a bool, rather than throw + * an exception if the request is not granted (as is the case in Java). + */ +void ScriptSecurityManager::checkPermission( const OUString & scriptStorageURL, + const OUString & permissionRequest ) + throw ( RuntimeException, lang::IllegalArgumentException, security::AccessControlException ) +{ + if( permissionRequest.equals( OUString::createFromAscii( "execute" ) ) ) + { + OSL_TRACE( + "ScriptSecurityManager::checkPermission: execute permission request for %s", + ::rtl::OUStringToOString( scriptStorageURL, + RTL_TEXTENCODING_ASCII_US ).pData->buffer); + Permission_Hash::const_iterator ph_it = m_permissionSettings.find( scriptStorageURL ); + Permission_Hash::const_iterator ph_itend = + m_permissionSettings.end(); + if ( ph_it != ph_itend ) + { + if ( ph_it->second.execPermission ) + { + return; + } + else + { + OSL_TRACE( "permission refused" ); + Any aPermission; + security::RuntimePermission permission; + permission.Name = OUString::createFromAscii( "execute" ).concat( scriptStorageURL ); + aPermission <<= permission; + throw security::AccessControlException( + OUString::createFromAscii( "ScriptSecurityManager::checkPermission: no execute permission for URL" ).concat( scriptStorageURL ), + Reference< XInterface > (), aPermission ); + } + } + // we should never get here!! + throw lang::IllegalArgumentException( OUString::createFromAscii( "ScriptSecurityManager::checkPermission: storageURL not found" ), Reference< XInterface > (), 0 ); + } + // inappropriate permission request + throw lang::IllegalArgumentException( OUString::createFromAscii( "ScriptSecurityManager::checkPermission: storageURL not found" ), Reference< XInterface > (), 1 ); +} + +void ScriptSecurityManager::removePermissionSettings ( ::rtl::OUString & scriptStorageURL ) +{ + Permission_Hash::const_iterator ph_it = + m_permissionSettings.find( scriptStorageURL ); + + if ( ph_it == m_permissionSettings.end() ) + { + OSL_TRACE( "Entry for storage url %s doesn't exist in map", + ::rtl::OUStringToOString( scriptStorageURL, + RTL_TEXTENCODING_ASCII_US ).pData->buffer); + return; + } + + // erase the entry from the hash + m_permissionSettings.erase( scriptStorageURL ); + +} + +void ScriptSecurityManager::readConfiguration() + throw ( RuntimeException) +{ + Reference< XInterface > xInterface; + try + { + beans::PropertyValue configPath; + configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); + configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); + Sequence < Any > aargs( 1 ); + aargs[ 0 ] <<= configPath; + validateXRef( m_xConfigProvFactory, + "ScriptSecurityManager::readConfiguration: ConfigProviderFactory no longer valid!" ); + xInterface = m_xConfigProvFactory->createInstanceWithArguments( s_configAccess, + aargs ); + validateXRef( xInterface, + "ScriptSecurityManager::readConfiguration: cannot get ConfigurationAccess" ); + // get the XPropertySet interface from the ConfigurationAccess service + Reference < beans::XPropertySet > xPropSet( xInterface, UNO_QUERY ); + Any value; + + value=xPropSet->getPropertyValue( OUSTR( "Confirmation" ) ); + if ( sal_False == ( value >>= m_confirmationRequired ) ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: can't get Confirmation setting" ), + Reference< XInterface > () ); + } + if ( m_confirmationRequired == sal_True ) + { + OSL_TRACE( "ScriptSecurityManager:readConfiguration: confirmation is true" ); + } + else + { + OSL_TRACE( "ScriptSecurityManager:readConfiguration: confirmation is false" ); + } + value=xPropSet->getPropertyValue( OUSTR( "Warning" ) ); + if ( sal_False == ( value >>= m_warning ) ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: can't get Warning setting" ), + Reference< XInterface > () ); + } + if ( m_warning == sal_True ) + { + OSL_TRACE( "ScriptSecurityManager:readConfiguration: warning is true" ); + } + else + { + OSL_TRACE( "ScriptSecurityManager:readConfiguration: warning is false" ); + } + value=xPropSet->getPropertyValue( OUSTR( "OfficeBasic" ) ); + if ( sal_False == ( value >>= m_runMacroSetting ) ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: can't get OfficeBasic setting" ), + Reference< XInterface > () ); + } + OSL_TRACE( "ScriptSecurityManager:readConfiguration: OfficeBasic = %d", m_runMacroSetting ); + value=xPropSet->getPropertyValue( OUSTR( "SecureURL" ) ); + if ( sal_False == ( value >>= m_secureURL ) ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: can't get SecureURL setting" ), + Reference< XInterface > () ); + } + } + catch ( beans::UnknownPropertyException & upe ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: Attempt to read unknown property: " ).concat( upe.Message ), + Reference< XInterface > () ); + } + catch ( lang::WrappedTargetException & wte ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: wrapped target exception? :" ).concat( wte.Message ), + Reference< XInterface > () ); + } + catch ( Exception & e ) + { + OSL_TRACE( "Unknown exception in readconf: %s", + ::rtl::OUStringToOString(e.Message , + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: exception? :" ).concat( e.Message ), + Reference< XInterface > () ); + } +#ifdef _DEBUG + catch ( ... ) + { + OSL_TRACE( "Completely Unknown exception in readconf!!!!!!"); + throw RuntimeException( + OUSTR( "ScriptSecurityManager:readConfiguration: exception? :" ), + Reference< XInterface > () ); + } +#endif + + int length = m_secureURL.getLength(); + + // PathSubstitution needed to interpret variables found in config + Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); + validateXRef( xMgr, + "ScriptSecurityManager::readConfiguration: cannot get XMultiComponentFactory" ); + xInterface = xMgr->createInstanceWithContext( + ::rtl::OUString::createFromAscii( + "com.sun.star.util.PathSubstitution"), m_xContext); + validateXRef( xInterface, + "ScriptSecurityManager::readConfiguration: cannot get ConfigurationProvider" ); + Reference< util::XStringSubstitution > xStringSubstitution( + xInterface, UNO_QUERY); + validateXRef( xStringSubstitution, + "ScriptSecurityManager::readConfiguration: cannot get ConfigurationProvider" ); + for( int i = 0; i < length; i++ ) + { + OSL_TRACE( "ScriptSecurityManager:readConfiguration path = %s", + ::rtl::OUStringToOString(m_secureURL[i] , + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + OSL_TRACE( "ScriptSecurityManager: subpath = %s", + ::rtl::OUStringToOString( + xStringSubstitution->substituteVariables( m_secureURL[i], true ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + m_secureURL[i] = xStringSubstitution->substituteVariables( m_secureURL[i], true ); + } +#ifdef _DEBUG + int length2 = m_secureURL.getLength(); + for( int j = 0; j < length2 ; j++ ) + { + OSL_TRACE( "ScriptSecurityManager: path = %s", + ::rtl::OUStringToOString(m_secureURL[j] , + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + } +#endif +} + +void ScriptSecurityManager::addToSecurePaths( const OUString & path ) +throw ( RuntimeException ) +{ + OSL_TRACE( "--->ScriptSecurityManager::addToSecurePaths" ); + beans::PropertyValue configPath; + configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); + configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); + Sequence < Any > aargs( 1 ); + aargs[ 0 ] <<= configPath; + Reference< XInterface > xInterface = m_xConfigProvFactory->createInstanceWithArguments( s_configUpdate, + aargs ); + validateXRef( xInterface, + "ScriptSecurityManager::addToSecurePaths: ScriptSecurityManager: cannot get ConfigurationUpdateAccess" ); + Reference < container::XNameReplace > xNameReplace( xInterface, UNO_QUERY ); + validateXRef( xNameReplace, + "ScriptSecurityManager::addToSecurePaths: ScriptSecurityManager: cannot get XNameReplace" ); + Reference < util::XChangesBatch > xChangesBatch( xInterface, UNO_QUERY ); + validateXRef( xChangesBatch, + "ScriptSecurityManager::addToSecurePaths: cannot get XChangesBatch" ); + + OSL_TRACE( "--->ScriptSecurityManager::addToSecurePaths: after if stuff" ); + Reference < beans::XPropertySet > xPropSet( xInterface, UNO_QUERY ); + css::uno::Sequence< rtl::OUString > newSecureURL; + Any value; + OUString pathListPropName = OUSTR ( "SecureURL" ); + value=xPropSet->getPropertyValue( pathListPropName ); + if ( sal_False == ( value >>= newSecureURL ) ) + { + throw RuntimeException( + OUSTR( "ScriptSecurityManager::addToSecurePaths: can't get SecureURL setting" ), + Reference< XInterface > () ); + } + try + { + sal_Int32 length = newSecureURL.getLength(); + newSecureURL.realloc( length + 1 ); + newSecureURL[ length ] = path; + Any aNewSecureURL; + aNewSecureURL <<= newSecureURL; + xNameReplace->replaceByName( pathListPropName, aNewSecureURL ); + xChangesBatch->commitChanges(); + m_secureURL = newSecureURL; + } + catch ( Exception & e ) + { + OSL_TRACE( "Error updating secure paths: " ); + throw RuntimeException( + OUSTR( "ScriptSecurityManager::addToSecurePaths: error updating SecureURL setting" ).concat( e.Message ), + Reference< XInterface > () ); + } +} + +//************************************************************************* +// ScriptSecurityManager Destructor +ScriptSecurityManager::~ScriptSecurityManager() +{ + OSL_TRACE( "< ScriptSecurityManager dtor called >\n" ); +} + +} // Namespace diff --git a/scripting/source/storage/ScriptSecurityManager.hxx b/scripting/source/storage/ScriptSecurityManager.hxx new file mode 100755 index 000000000000..29ca511f88f3 --- /dev/null +++ b/scripting/source/storage/ScriptSecurityManager.hxx @@ -0,0 +1,99 @@ +/************************************************************************* +* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * +************************************************************************/ + + +#ifndef _FRAMEWORK_SCRIPT_SCRIPTSECURITYMANAGER_HXX_ +#define _FRAMEWORK_SCRIPT_SCRIPTSECURITYMANAGER_HXX_ + +#include <hash_map> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/uno/RuntimeException.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/security/AccessControlException.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptInfo.hpp> + +namespace scripting_securitymgr +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +struct StoragePerm { + rtl::OUString scriptStorageURL; + sal_Int32 storageID; + sal_Bool execPermission; +}; + +typedef ::std::hash_map< ::rtl::OUString, StoragePerm, ::rtl::OUStringHash, + ::std::equal_to< ::rtl::OUString > > Permission_Hash; +/** + * Class responsible for managing the ScriptSecurity. + */ +class ScriptSecurityManager +{ +public: + explicit ScriptSecurityManager( + const css::uno::Reference< css::uno::XComponentContext > & xContext ) + throw ( css::uno::RuntimeException ); + ~ScriptSecurityManager(); + void addScriptStorage( rtl::OUString scriptStorageURL, sal_Int32 storageID) + throw ( css::uno::RuntimeException ); +/** + * checks to see if the requested permission can be granted + * checks to see whether the requested ScriptPeremission is allowed. + */ + void checkPermission( const rtl::OUString & scriptStorageURL, + const rtl::OUString & permissionRequest ) + throw ( css::uno::RuntimeException, css::lang::IllegalArgumentException, + css::security::AccessControlException ); + void removePermissionSettings ( ::rtl::OUString & scriptStorageURL ); +private: + void readConfiguration() throw (css::uno::RuntimeException); + + short executeDialog ( const rtl::OUString & path ) + throw (css::uno::RuntimeException); + short executeStandardDialog() + throw ( css::uno::RuntimeException ); + short executePathDialog(const rtl::OUString & path) + throw ( css::uno::RuntimeException ); + + void addToSecurePaths ( const rtl::OUString & path ) + throw (css::uno::RuntimeException); + bool isSecureURL( const rtl::OUString & path ); + css::uno::Reference< css::uno::XComponentContext > m_xContext; + sal_Bool m_confirmationRequired; + sal_Bool m_warning; + sal_Int32 m_runMacroSetting; + css::uno::Reference< css::lang::XMultiServiceFactory > m_xConfigProvFactory; + css::uno::Sequence< rtl::OUString > m_secureURL; + Permission_Hash m_permissionSettings; + +}; +} // scripting_securitymgr + +#endif //_FRAMEWORK_SCRIPT_SCRIPTSECURITYMANAGER_HXX_ diff --git a/scripting/source/storage/ScriptStorage.cxx b/scripting/source/storage/ScriptStorage.cxx new file mode 100644 index 000000000000..7315e9d35dd5 --- /dev/null +++ b/scripting/source/storage/ScriptStorage.cxx @@ -0,0 +1,895 @@ +/************************************************************************* +* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" +#include <osl/file.hxx> +#include <osl/time.h> +#include <cppuhelper/implementationentry.hxx> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/ucb/CommandAbortedException.hpp> +#include <com/sun/star/io/XActiveDataSource.hpp> +#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> + +#include <util/util.hxx> +#include <rtl/uri.hxx> + + +#include "ScriptData.hxx" +#include "ScriptInfo.hxx" +#include "ScriptStorage.hxx" +#include "ScriptElement.hxx" +#include "ScriptMetadataImporter.hxx" +#include "ScriptURI.hxx" + +using namespace ::rtl; +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::drafts::com::sun::star::script::framework; + +namespace scripting_impl +{ + +ScriptLanguages_hash* ScriptStorage::mh_scriptLangs = NULL; + +const sal_Char* const SERVICE_NAME = + "drafts.com.sun.star.script.framework.storage.ScriptStorage"; +const sal_Char* const IMPL_NAME = + "drafts.com.sun.star.script.framework.storage.ScriptStorage"; + +const sal_Char * const SCRIPT_DIR = "/Scripts"; +const sal_Char * const SCRIPT_PARCEL = "/parcel-descriptor.xml"; +const sal_Char * const SCRIPT_PARCEL_NAME_ONLY = "parcel-descriptor"; + +static OUString ss_implName = OUString::createFromAscii( IMPL_NAME ); +static OUString ss_serviceName = OUString::createFromAscii( SERVICE_NAME ); +static Sequence< OUString > ss_serviceNames = + Sequence< OUString >( &ss_serviceName, 1 ); + +const sal_uInt16 NUMBER_STORAGE_INITIALIZE_ARGS = 3; + +//extern ::rtl_StandardModuleCount s_moduleCount; + + + +//************************************************************************* +ScriptStorage::ScriptStorage( const Reference < + XComponentContext > & xContext ) +throw ( RuntimeException ) + : m_xContext( xContext ), m_bInitialised( false ) +{ + OSL_TRACE( "< ScriptStorage ctor called >\n" ); + + validateXRef( m_xContext, + "ScriptStorage::ScriptStorage : cannot get component context" ); + + m_xMgr = m_xContext->getServiceManager(); + validateXRef( m_xMgr, + "ScriptStorage::ScriptStorage : cannot get service manager" ); + + if( !mh_scriptLangs ) + { + ::osl::MutexGuard guard( ::osl::Mutex::getGlobalMutex() ); + if( !mh_scriptLangs ) + { + mh_scriptLangs = new ScriptLanguages_hash(); + Reference< XInterface > xInterface = + m_xMgr->createInstanceWithContext( + OUString::createFromAscii( + "com.sun.star.configuration.ConfigurationProvider" ) + , m_xContext ); + validateXRef( xInterface, + "ScriptStorage::ScriptStorage: cannot get ConfigurationProvider" ); + // create an instance of the ConfigurationAccess for accessing the + // scripting runtime settings + Reference< lang::XMultiServiceFactory > xConfigProvFactory = + Reference < lang::XMultiServiceFactory > + ( xInterface, UNO_QUERY_THROW ); + validateXRef( xConfigProvFactory, + "ScriptStorage::ScriptStorage: cannot get XMultiServiceFactory interface from ConfigurationProvider" ); + beans::PropertyValue configPath; + configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); + configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Scripting/ScriptRuntimes" ); + Sequence < Any > aargs( 1 ); + aargs[ 0 ] <<= configPath; + + xInterface = xConfigProvFactory->createInstanceWithArguments( + OUString::createFromAscii( + "com.sun.star.configuration.ConfigurationAccess"), + aargs ); + validateXRef( xInterface, + "ScriptStorage::ScriptStorage: cannot get ConfigurationAccess" ); + Reference< container::XNameAccess > xNameAccess = + Reference < container::XNameAccess > ( xInterface, + UNO_QUERY_THROW ); + validateXRef( xNameAccess, + "ScriptStorage::ScriptStorage: cannot get ConfigurationAccess" ); + Sequence< OUString > names = xNameAccess->getElementNames(); + for( int i = 0 ; i < names.getLength() ; i++ ) + { + OSL_TRACE( "Getting propertyset for Lang=%s", + ::rtl::OUStringToOString( names[i], RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + Reference< beans::XPropertySet > xPropSet = + Reference< beans::XPropertySet >( xNameAccess->getByName(names[i]), + UNO_QUERY_THROW ); + validateXRef( xPropSet, + "ScriptStorage::ScriptStorage: cannot get XPropertySet for name" ); + Any aProp = xPropSet->getPropertyValue( + OUString::createFromAscii( "SupportedFileExtensions") ); + Sequence< OUString > extns; + if( sal_False == ( aProp >>= extns ) ) + { + throw RuntimeException( + OUSTR( "ScriptStorage:ScriptStorage: can't get runtime extensions" ), + Reference< XInterface > () ); + } + for( int j = 0 ; j < extns.getLength() ; j++ ) + { + OSL_TRACE( "Adding Lang=%s, Extn=%s\n", + ::rtl::OUStringToOString( names[i], RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( extns[j], RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + (*mh_scriptLangs)[ extns[j] ] = + names[i]; + } + } + } + } +// s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); +} + +//************************************************************************* +ScriptStorage::~ScriptStorage() SAL_THROW( () ) +{ + OSL_TRACE( "< ScriptStorage dtor called >\n" ); +// s_moduleCount.modCnt.release( &s_moduleCount.modCnt ); +} + +//************************************************************************* +void +ScriptStorage::initialize( const Sequence <Any> & args ) +throw ( RuntimeException, Exception ) +{ + OSL_TRACE( "Entering ScriptStorage::initialize\n" ); + + // Should not be renitialised + if ( m_bInitialised ) + { + throw RuntimeException( + OUSTR( "ScriptStorage::initalize already initialized" ), + Reference<XInterface> () ); + } + + { // Protect member variable writes + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + + // Check args + if ( args.getLength() != NUMBER_STORAGE_INITIALIZE_ARGS ) + { + OSL_TRACE( "ScriptStorage::initialize: got wrong number of args\n" ); + throw RuntimeException( + OUSTR( "Invalid number of arguments provided!" ), + Reference< XInterface >() ); + } + + if ( sal_False == ( args[ 0 ] >>= m_xSimpleFileAccess ) ) + { + throw RuntimeException( + OUSTR( "Invalid XSimpleFileAccess argument provided!" ), + Reference< XInterface >() ); + } + + if ( sal_False == ( args[ 1 ] >>= m_scriptStorageID ) ) + { + throw RuntimeException( + OUSTR( "Invalid ScriptStorage ID argument provided!" ), + Reference< XInterface >() ); + + } + if ( sal_False == ( args[ 2 ] >>= m_stringUri ) ) + { + throw RuntimeException( + OUSTR( "Invalid String Uri argument provided!" ), + Reference< XInterface >() ); + } + } // End - Protect member variable writes + + OSL_TRACE( "uri: %s\n", ::rtl::OUStringToOString( + m_stringUri, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + try + { + // need to check for what??? + // what we have is a URI for the filesystem or document + // we need to check of the last element in the path has an + // extension that is associated with a script (eg. .bsh, .js etc) + OUString fileExtension = getFileExtension( m_stringUri ); + // and see if this is in our scripts map + ScriptLanguages_hash::iterator h_it = mh_scriptLangs->find( fileExtension ); + if ( h_it != mh_scriptLangs->end() ) + { + createForFilesystem( fileExtension ); + } + else + { + create(); + } + } + catch ( RuntimeException & re ) + { + OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::initialize" ); + throw RuntimeException( + OUSTR( "ScriptStorage::initalize RuntimeException: " ).concat( re.Message ), + Reference< XInterface > () ); + } + catch ( Exception & ue ) + { + OSL_TRACE( "caught com::sun::star::uno::Exception in ScriptStorage::initialize" ); + throw RuntimeException( + OUSTR( "ScriptStorage::initalize Exception: " ).concat( ue.Message ), + Reference< XInterface > () ); + } +#ifdef _DEBUG + catch ( ... ) + { + OSL_TRACE( "caught unknown Exception in ScriptStorage::initialize" ); + throw RuntimeException( + OUSTR( "ScriptStorage::initalize unknown exception: " ), + Reference< XInterface > () ); + } +#endif + + OSL_TRACE( "Parsed the XML\n" ); + + m_bInitialised = true; +} + +void +ScriptStorage::create() +throw ( RuntimeException, Exception ) +{ + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + try + { + // clear existing hashmap - rebuilding from scratch to avoid having + // to search for deleted elements on refresh + mh_implementations.clear(); + + OUString xStringUri(m_stringUri); + + ScriptMetadataImporter* SMI = new ScriptMetadataImporter( m_xContext ); + Reference< xml::sax::XExtendedDocumentHandler > xSMI( SMI ); + + validateXRef( xSMI, "ScriptStorage::create: failed to obtain valid XExtendedDocumentHandler" ); + + xStringUri = xStringUri.concat( ::rtl::OUString::createFromAscii( + SCRIPT_DIR ) ); + + // No Scripts directory - just return + if ( ! m_xSimpleFileAccess->isFolder( xStringUri ) ) + { + OSL_TRACE( "ScriptStorage::initialize: no Scripts dir for this storage - install problem\n" ); + return; + } + + // get the list of language folders under the Scripts directory + Sequence< ::rtl::OUString > languageDirs = + m_xSimpleFileAccess->getFolderContents( xStringUri, true ); + + Reference< io::XInputStream > xInput; + sal_Int32 languageDirsLength = languageDirs.getLength(); + for ( sal_Int32 i = 0; i < languageDirsLength ; ++i ) + { + OSL_TRACE( "contains: %s\n", ::rtl::OUStringToOString( + languageDirs[ i ], RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + if ( ! m_xSimpleFileAccess->isFolder( languageDirs[ i ] ) ) + { + continue; + } + + //get the list of parcel folders for each language folder + // under Scripts + Sequence< ::rtl::OUString > parcelDirs = + m_xSimpleFileAccess->getFolderContents( languageDirs[ i ], true ); + + sal_Int32 parcelDirsLength = parcelDirs.getLength(); + for ( sal_Int32 j = 0; j < parcelDirsLength ; ++j ) + { + OSL_TRACE( "contains: %s\n", + ::rtl::OUStringToOString( parcelDirs[ j ], + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + OUString parcelFile = parcelDirs[ j ].concat( + ::rtl::OUString::createFromAscii( SCRIPT_PARCEL ) ); + + // Do not have a valid parcel.xml + if ( !m_xSimpleFileAccess->exists( parcelFile ) || + m_xSimpleFileAccess->isFolder( parcelFile ) ) + { + continue; + } + OSL_TRACE( "parcel file: %s\n", + ::rtl::OUStringToOString( parcelFile, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + xInput = m_xSimpleFileAccess->openFileRead( parcelFile ); + // Failed to get input stream + if ( !xInput.is() ) + { + continue; + } + + OSL_TRACE( "Parse the metadata \n" ); + Datas_vec vScriptDatas; + try + { + SMI->parseMetaData( xInput, parcelDirs[ j ], vScriptDatas ); + } + catch ( xml::sax::SAXException & saxe ) + { + if ( xInput.is() ) + { + xInput->closeInput(); + } + OSL_TRACE( + "caught com::sun::star::xml::sax::SAXException in ScriptStorage::create %s", + ::rtl::OUStringToOString( saxe.Message, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + continue; + } + catch ( io::IOException & ioe ) + { + if ( xInput.is() ) + { + xInput->closeInput(); + } + OSL_TRACE( + "caught com::sun::star::io::IOException in ScriptStorage::create" ); + continue; + } + xInput->closeInput(); + + updateMaps( vScriptDatas ); + } + } + } + catch ( io::IOException & ioe ) + { + //From ScriptMetadata Importer + OSL_TRACE( "caught com::sun::star::io::IOException in ScriptStorage::create" ); + throw RuntimeException( + OUSTR( "ScriptStorage::create IOException: " ).concat( ioe.Message ), + Reference< XInterface > () ); + + } + catch ( ucb::CommandAbortedException & cae ) + { + OSL_TRACE( "caught com::sun::star::ucb::CommandAbortedException in ScriptStorage::create" ); + throw RuntimeException( + OUSTR( + "ScriptStorage::create CommandAbortedException: " ).concat( cae.Message ), + Reference< XInterface > () ); + } + catch ( RuntimeException & re ) + { + OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::create" ); + throw RuntimeException( + OUSTR( "ScriptStorage::create RuntimeException: " ).concat( re.Message ), + Reference< XInterface > () ); + } + catch ( Exception & ue ) + { + OSL_TRACE( "caught com::sun::star::uno::Exception in ScriptStorage::create" ); + throw RuntimeException( + OUSTR( "ScriptStorage::create Exception: " ).concat( ue.Message ), + Reference< XInterface > () ); + } +#ifdef _DEBUG + catch ( ... ) + { + OSL_TRACE( "caught unknown Exception in ScriptStorage::create" ); + throw RuntimeException( + OUSTR( "ScriptStorage::initalize unknown exception: " ), + Reference< XInterface > () ); + } +#endif + + OSL_TRACE( "Parsed the XML\n" ); + + m_bInitialised = true; +} + +//************************************************************************* +// private method to create the usual data structures for scripts located +// on the filesystem. +// parcelURI = the path to the script +// functionName = the full filename with extension +// logicalName = the filename without the extension +void +ScriptStorage::createForFilesystem( const OUString & fileExtension ) +throw ( RuntimeException, Exception ) +{ + // need to decode as file urls are encoded + OUString xStringUri = ::rtl::Uri::decode( m_stringUri, + rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ASCII_US ); + + // no x-platform issues here as we are dealing with URLs + sal_Int32 lastFileSep = xStringUri.lastIndexOf( '/' ); + // the char just after the filesep + lastFileSep += 1; + sal_Int32 lastFileExt = xStringUri.lastIndexOf( fileExtension ); + OUString searchString = OUString::createFromAscii( "://" ); + sal_Int32 searchStringLength = searchString.getLength(); + sal_Int32 startPath = xStringUri.indexOf( searchString ); + sal_Int32 uriLength = xStringUri.getLength(); + OUString fileNameNoExt = xStringUri.copy( lastFileSep , + lastFileExt - lastFileSep - 1 ); + OUString fileName = xStringUri.copy( lastFileSep, uriLength - lastFileSep ); + OUString filePath = xStringUri.copy( startPath + searchStringLength, + lastFileSep - startPath - searchStringLength ); + OUString filePathWithName = xStringUri.copy( startPath + searchStringLength, + uriLength - startPath - searchStringLength ); + + ScriptData scriptData; + scriptData.language = mh_scriptLangs->find( fileExtension )->second; + OSL_TRACE( "\t language = %s", ::rtl::OUStringToOString( + scriptData.language, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + // do we need to encode this? + scriptData.functionname = fileName; + OSL_TRACE( "\t functionName = %s", ::rtl::OUStringToOString( + scriptData.functionname, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + //scriptData.functionname = ::rtl::Uri::encode( fileName, + //rtl_UriCharClassUricNoSlash, rtl_UriEncodeCheckEscapes, + //RTL_TEXTENCODING_ASCII_US ); + + scriptData.parcelURI = filePath; + OSL_TRACE( "\t parcelURI = %s", ::rtl::OUStringToOString( + scriptData.parcelURI, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + scriptData.logicalname = fileNameNoExt; + OSL_TRACE( "\t logicalName = %s", ::rtl::OUStringToOString( + scriptData.logicalname, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + // and now push onto the usual structures + ScriptFunction_hash sfh; + sfh[ scriptData.functionname ] = scriptData; + mh_implementations[ scriptData.language ] = sfh; + m_bInitialised = true; +} + +//************************************************************************* +// private method to return the file extension, eg. bsh, js etc +OUString +ScriptStorage::getFileExtension( const OUString & stringUri ) +{ + OUString fileExtension; + sal_Int32 lastDot = stringUri.lastIndexOf( '.' ); + if( lastDot > 0 ) { + sal_Int32 stringUriLength = stringUri.getLength(); + fileExtension = stringUri.copy( lastDot +1 , stringUriLength - lastDot - 1 ); + } + else + { + fileExtension = OUString::createFromAscii(""); + } + return fileExtension; +} + +//************************************************************************* +// private method for updating hashmaps +void +ScriptStorage::updateMaps( const Datas_vec & vScriptDatas ) +{ + + Datas_vec::const_iterator it_end = vScriptDatas.end(); + // step through the vector of ScripImplInfos returned from parse + for ( Datas_vec::const_iterator it = vScriptDatas.begin() ; it != it_end; ++it ) + { + //find the Datas_vec for this logical name + ScriptData_hash::iterator h_it = mh_implementations.find( it->language ); + + if ( h_it == mh_implementations.end() ) + { + //if it's null, need to create a new Datas_vec + OSL_TRACE( + "updateMaps: new language: %s\n", rtl::OUStringToOString( + it->language, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + OSL_TRACE( + "updateMaps: adding functionname: %s\n", rtl::OUStringToOString( + it->functionname, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + ScriptFunction_hash sfh; + sfh[ it->functionname ] = *it; + mh_implementations[ it->language ] = sfh; + } + else + { + OSL_TRACE( + "updateMaps: adding functionname: %s\n", rtl::OUStringToOString( + it->functionname, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + OSL_TRACE( " language name: %s\n", + rtl::OUStringToOString( it->functionname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + h_it->second[ it->functionname ] = *it; + } + } +} + +//************************************************************************* +// XScriptStorageExport::save +void +ScriptStorage::save() +throw ( RuntimeException ) +{ + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + Reference< io::XActiveDataSource > xSource; + Reference< io::XOutputStream > xOS; + + // xScriptInvocation = Reference<XScriptInvocation>(xx, UNO_QUERY_THROW); + Reference< xml::sax::XExtendedDocumentHandler > xHandler; + + OUString parcel_suffix = OUString::createFromAscii( SCRIPT_PARCEL ); + OUString ou_parcel = OUString( + RTL_CONSTASCII_USTRINGPARAM( SCRIPT_PARCEL_NAME_ONLY ) ); + + try + { + ScriptData_hash::iterator it_end = mh_implementations.end(); + for ( ScriptData_hash::iterator it = mh_implementations.begin() ; it != it_end; ++it ) + { + ::rtl::OUString logName = it->first; + ScriptFunction_hash::iterator it_sfh_end = it->second.end(); + for ( ScriptFunction_hash::iterator it_sfh = it->second.begin(); + it_sfh != it_sfh_end ; ++it_sfh ) + { + ScriptOutput_hash::const_iterator it_parcels = + mh_parcels.find( it_sfh->second.parcelURI ); + if ( it_parcels == mh_parcels.end() ) + { + //create new outputstream + OUString parcel_xml_path = it_sfh->second.parcelURI.concat( + parcel_suffix ); + m_xSimpleFileAccess->kill( parcel_xml_path ); + xOS = m_xSimpleFileAccess->openFileWrite( parcel_xml_path ); + + OSL_TRACE( "saving: %s\n", rtl::OUStringToOString( + it_sfh->second.parcelURI.concat( OUString::createFromAscii( + "/parcel.xml" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + Reference< XInterface > xInterface = + m_xMgr->createInstanceWithContext( + OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ), + m_xContext ); + validateXRef( xInterface, "ScriptStorage::save: cannot get sax.Writer" ); + xHandler = Reference<xml::sax::XExtendedDocumentHandler>( + xInterface, UNO_QUERY_THROW ); + xSource = Reference< io::XActiveDataSource >( + xHandler, UNO_QUERY_THROW ); + xSource->setOutputStream( xOS ); + + writeMetadataHeader( xHandler ); + + mh_parcels[ it_sfh->second.parcelURI ] = xHandler; + } + else + { + xHandler = it_parcels->second; + } + + ScriptElement* pSE = new ScriptElement( it_sfh->second ); + // this is to get pSE released correctly + Reference < xml::sax::XAttributeList > xal( pSE ); + pSE->dump( xHandler ); + } + } + + ScriptOutput_hash::const_iterator out_it_end = mh_parcels.end(); + + for ( ScriptOutput_hash::const_iterator out_it = mh_parcels.begin(); + out_it != out_it_end; ++out_it ) + { + out_it->second->ignorableWhitespace( ::rtl::OUString() ); + out_it->second->endDocument(); + xSource.set( out_it->second, UNO_QUERY ); + Reference< io::XOutputStream > xOS = xSource->getOutputStream(); + xOS->closeOutput(); + + } + + // clear the hash map, as all output streams have been closed. + // need to re-create on next save + mh_parcels.clear(); + } + // *** TODO - other exception handling IO etc. + catch ( RuntimeException & re ) + { + OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::save" ); + throw RuntimeException( + OUSTR( "ScriptStorage::save RuntimeException: " ).concat( + re.Message ), + Reference< XInterface > () ); + } +} + +//************************************************************************* +void +ScriptStorage::refresh() +throw (RuntimeException) +{ + OSL_TRACE("** => ScriptStorage: in refresh()\n"); + + // guard against concurrent refreshes + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + try + { + create(); + + } + catch ( RuntimeException & re ) + { + OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::refresh" ); + throw RuntimeException( + OUSTR( "ScriptStorage::refresh RuntimeException: " ).concat( re.Message ), + Reference< XInterface > () ); + } + catch ( Exception & ue ) + { + OSL_TRACE( "caught com::sun::star::uno::Exception in ScriptStorage::refresh" ); + throw RuntimeException( + OUSTR( "ScriptStorage::refresh Exception: " ).concat( ue.Message ), + Reference< XInterface > () ); + } +} + +//************************************************************************* +void +ScriptStorage::writeMetadataHeader( + Reference <xml::sax::XExtendedDocumentHandler> & xHandler ) +{ + xHandler->startDocument(); + OUString aDocTypeStr( RTL_CONSTASCII_USTRINGPARAM( + "<!DOCTYPE parcel SYSTEM \"scripting.dtd\">" ) ); + xHandler->unknown( aDocTypeStr ); + xHandler->ignorableWhitespace( OUString() ); +} + + +//************************************************************************* +Sequence< ::rtl::OUString > +ScriptStorage::getScriptLogicalNames() +throw ( RuntimeException ) +{ + Sequence< ::rtl::OUString > results; + // comment out the rest, and ultimately remove method + /*ScriptInfo_hash::iterator h_it = mh_implementations.begin(); + ScriptInfo_hash::iterator h_itEnd = mh_implementations.end(); + if ( h_it == h_itEnd ) + { + OSL_TRACE( "ScriptStorage::getImplementations: EMPTY STORAGE"); + return results; + } + results.realloc( mh_implementations.size() ); + + //find the implementations for the given logical name + try + { + + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + + for ( sal_Int32 count = 0; h_it != h_itEnd ; ++h_it ) + { + ::rtl::OUString logicalName = h_it->first; + OSL_TRACE( "Adding %s at index %d ", ::rtl::OUStringToOString( + logicalName, RTL_TEXTENCODING_ASCII_US ).pData->buffer, count); + results[ count++ ] = logicalName; + } + + } + catch ( RuntimeException & re ) + { + throw RuntimeException( + OUSTR( "ScriptStorage::getScriptLogicalNames RuntimeException: " ).concat( re.Message ), + Reference< XInterface > () ); + } + catch ( Exception & e ) + { + throw RuntimeException( OUSTR( + "ScriptStorage::getScriptLogicalNames Exception: " ).concat( + e.Message ), Reference< XInterface > () ); + } */ + return results; +} + +//************************************************************************* +Sequence< Reference< storage::XScriptInfo > > +ScriptStorage::getImplementations( const ::rtl::OUString & queryURI ) +throw ( lang::IllegalArgumentException, + RuntimeException ) +{ + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); +// format is script:://[function_name]?language=[languge]&location=[location] +// LogicalName is now not used anymore, further more the ScriptURI class +// will be retired also and a new UNO service will be used. Additionally the +// parcel-description will also need to be modified to remove logical name +// ScriprtMetaDataImporter has been modified to ignore the Logical name +// definined in the parcel-desc.xml. As an interim temp solution the Datas_vec +// structure that is returned from ScriptMetDataImporter sets the logicalname +// to the function name. ScriptURI class has been changed in the same way. +// + Sequence< Reference< storage::XScriptInfo > > results; + ScriptURI scriptURI( queryURI ); + OSL_TRACE( "getting impl for language %s, function name: %s", + ::rtl::OUStringToOString( scriptURI.getLanguage(), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( scriptURI.getFunctionName(), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + ScriptData_hash::iterator h_itEnd = mh_implementations.end(); + ScriptData_hash::iterator h_it = mh_implementations.begin(); + if ( h_it == h_itEnd ) + { + OSL_TRACE( "ScriptStorage::getImplementations: EMPTY STORAGE" ); + return results; + } + + //find the implementations for the given language + h_it = mh_implementations.find( scriptURI.getLanguage() ); + + if ( h_it == h_itEnd ) + { + OSL_TRACE( "ScriptStorage::getImplementations: no impls found for %s", + ::rtl::OUStringToOString( scriptURI.getLanguage(), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return results; + } + + //find the implementations for the given language + ScriptFunction_hash::const_iterator it_datas = h_it->second.find( + scriptURI.getLogicalName() ); + ScriptFunction_hash::const_iterator it_datas_end = h_it->second.end(); + + if ( it_datas == it_datas_end ) + { + OSL_TRACE( "ScriptStorage::getImplementations: no impls found for %s", + ::rtl::OUStringToOString( scriptURI.getFunctionName(), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return results; + } + + results.realloc( 1 ); + ScriptData scriptData = it_datas->second; + OSL_TRACE( "ScriptStorage::getImplementations: impls found for %s", + ::rtl::OUStringToOString( scriptData.functionname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + Reference< storage::XScriptInfo > xScriptInfo = + new ScriptInfo ( scriptData, m_scriptStorageID ); + results[ 0 ] = xScriptInfo; + + return results; +} + +//************************************************************************* +Sequence< Reference< storage::XScriptInfo > > SAL_CALL +ScriptStorage::getAllImplementations() throw ( RuntimeException ) +{ + ::osl::Guard< osl::Mutex > aGuard( m_mutex ); + Sequence< Reference< storage::XScriptInfo > > results; + ScriptData_hash::iterator h_itEnd = mh_implementations.end(); + ScriptData_hash::iterator h_it = mh_implementations.begin(); + if ( h_it == h_itEnd ) + { + OSL_TRACE( "ScriptStorage::getImplementations: EMPTY STORAGE" ); + return results; + } + + + //iterate through each logical name and gather each implementation + //for that name + for ( sal_Int32 count = 0; h_it != h_itEnd; ++h_it ) + { + results.realloc( h_it->second.size() + count ); + OSL_TRACE( "Adding implementations for %s", + ::rtl::OUStringToOString( h_it->first, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + ScriptFunction_hash::const_iterator it_sfh = h_it->second.begin(); + ScriptFunction_hash::const_iterator it_sfh_end = h_it->second.end(); + OSL_TRACE( "Adding %d to sequence of impls ", h_it->second.size() ); + for ( ; it_sfh != it_sfh_end ; ++it_sfh ) + { + Reference< storage::XScriptInfo > xScriptInfo = new ScriptInfo ( + it_sfh->second, m_scriptStorageID ); + + results[ count++ ] = xScriptInfo; + } + } + return results; + +} + +//************************************************************************* +OUString SAL_CALL ScriptStorage::getImplementationName( ) +throw( RuntimeException ) +{ + return ss_implName; +} + +//************************************************************************* +sal_Bool SAL_CALL ScriptStorage::supportsService( const OUString& serviceName ) +throw( RuntimeException ) +{ + OUString const * pNames = ss_serviceNames.getConstArray(); + for ( sal_Int32 nPos = ss_serviceNames.getLength(); nPos--; ) + { + if ( serviceName.equals( pNames[ nPos ] ) ) + { + return sal_True; + } + } + return sal_False; +} + +//************************************************************************* +Sequence<OUString> SAL_CALL ScriptStorage::getSupportedServiceNames( ) +throw( RuntimeException ) +{ + return ss_serviceNames; +} + +} // namespace scripting_impl + + +namespace scripting_runtimemgr +{ + +//************************************************************************* +Reference<XInterface> SAL_CALL ss_create( + const Reference< XComponentContext > & xCompC ) +{ + return ( cppu::OWeakObject * ) new ::scripting_impl::ScriptStorage( xCompC ); +} + +//************************************************************************* +Sequence<OUString> ss_getSupportedServiceNames( ) +SAL_THROW( () ) +{ + return ::scripting_impl::ss_serviceNames; +} + +//************************************************************************* +OUString ss_getImplementationName( ) +SAL_THROW( () ) +{ + return ::scripting_impl::ss_implName; +} +}//end namespace diff --git a/scripting/source/storage/ScriptStorage.hxx b/scripting/source/storage/ScriptStorage.hxx new file mode 100644 index 000000000000..a94e2abc3027 --- /dev/null +++ b/scripting/source/storage/ScriptStorage.hxx @@ -0,0 +1,205 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef __SCRIPTING_STORAGE_SCRIPTSTORAGE_HXX_ +#define __SCRIPTING_STORAGE_SCRIPTSTORAGE_HXX_ + +#include <vector> +#include <hash_map> + +#include <osl/mutex.hxx> +#include <cppuhelper/implbase5.hxx> // helper for component factory + +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/ucb/XSimpleFileAccess.hpp> +#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> + +#include <drafts/com/sun/star/script/framework/storage/XScriptInfoAccess.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptStorageExport.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptStorageRefresh.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptInfo.hpp> + +namespace scripting_impl +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +//Typedefs +//============================================================================= +typedef ::std::vector< ScriptData > Datas_vec; +//----------------------------------------------------------------------------- +// function name -> ScriptData +typedef ::std::hash_map < ::rtl::OUString, ScriptData, ::rtl::OUStringHash, + ::std::equal_to< ::rtl::OUString > > ScriptFunction_hash; +//----------------------------------------------------------------------------- +// language -> hash of function name -> ScriptData +typedef ::std::hash_map < ::rtl::OUString, ScriptFunction_hash, + ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > +ScriptData_hash; +//----------------------------------------------------------------------------- +typedef ::std::hash_map < ::rtl::OUString, +css::uno::Reference< css::xml::sax::XExtendedDocumentHandler >, +::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > +ScriptOutput_hash; +//----------------------------------------------------------------------------- +typedef ::std::hash_map < ::rtl::OUString, +::rtl::OUString, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > +ScriptLanguages_hash; + +//============================================================================= + +class ScriptStorage : public + ::cppu::WeakImplHelper5< + css::lang::XServiceInfo, + css::lang::XInitialization, + dcsssf::storage::XScriptInfoAccess, + dcsssf::storage::XScriptStorageExport, + dcsssf::storage::XScriptStorageRefresh > +{ +public: + //Constructors and Destructors + //========================================================================= + explicit ScriptStorage( + const css::uno::Reference< css::uno::XComponentContext > & xContext ) + throw ( css::uno::RuntimeException ); + //------------------------------------------------------------------------- + virtual ~ScriptStorage() SAL_THROW( () ); + //========================================================================= + + // XServiceInfo impl + //========================================================================= + virtual ::rtl::OUString SAL_CALL getImplementationName() + throw ( css::uno::RuntimeException ); + //------------------------------------------------------------------------- + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString & ServiceName ) + throw ( css::uno::RuntimeException ); + //------------------------------------------------------------------------- + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() + throw ( css::uno::RuntimeException ); + //------------------------------------------------------------------------- + static css::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames_Static(); + //========================================================================= + + // XInitialization impl + //========================================================================= + virtual void SAL_CALL + initialize( css::uno::Sequence< css::uno::Any > const & args ) + throw ( css::uno::RuntimeException, css::uno::Exception ); + //========================================================================= + + //XScriptInfoAccess + //========================================================================= + /** + * Get the logical names for this storage + * + * @return sequence < ::rtl::OUString > + * The logical names + */ + virtual css::uno::Sequence< ::rtl::OUString > + SAL_CALL getScriptLogicalNames() + throw ( css::uno::RuntimeException ); + + //========================================================================= + /** + * Get the implementations for a given URI + * + * @param queryURI + * The URI to get the implementations for + * + * @return sequence < XScriptInfo > + * The URIs of the implementations + */ + virtual css::uno::Sequence< css::uno::Reference< dcsssf::storage::XScriptInfo > > + SAL_CALL getImplementations( + const ::rtl::OUString& queryURI ) + throw ( css::lang::IllegalArgumentException, css::uno::RuntimeException ); + + //========================================================================= + /** + * Get all script implementations + * + * + * @return sequence < XScriptInfo > + * script implementations + */ + virtual css::uno::Sequence< css::uno::Reference< dcsssf::storage::XScriptInfo > > + SAL_CALL getAllImplementations() + throw ( css::uno::RuntimeException ); + + //========================================================================= + + /** + * Save the scripts stored in the ScriptStorage into the corresponding + * area (document or application) + */ + void SAL_CALL save() + throw ( css::uno::RuntimeException ); + //========================================================================= + + /** + * Refresh the ScriptStorage from the data stored in the corresponding area + * (document or application). + */ + void SAL_CALL refresh() + throw ( css::uno::RuntimeException ); + //========================================================================= + +private: + + css::uno::Reference< css::uno::XComponentContext > m_xContext; + css::uno::Reference< css::ucb::XSimpleFileAccess > m_xSimpleFileAccess; + css::uno::Reference< css::lang::XMultiComponentFactory > m_xMgr; + + ::std::vector < ::rtl::OUString > mv_logicalNames; + static ScriptLanguages_hash* mh_scriptLangs; + ScriptData_hash mh_implementations; + ScriptOutput_hash mh_parcels; + sal_Int32 m_scriptStorageID; + ::rtl::OUString m_stringUri; + + osl::Mutex m_mutex; + bool m_bInitialised; + + void updateMaps( const Datas_vec & vScriptDatas ); + void writeMetadataHeader( + css::uno::Reference < css::xml::sax::XExtendedDocumentHandler > & xExDocHandler ); + void create () + throw (css::uno::RuntimeException, css::uno::Exception); + void createForFilesystem ( const ::rtl::OUString & scriptLanguage ) + throw (css::uno::RuntimeException, css::uno::Exception); + ::rtl::OUString getFileExtension ( const ::rtl::OUString & stringUri ); + +}; // class ScriptingStorage + +} // namespace scripting_impl + +#endif diff --git a/scripting/source/storage/ScriptStorageManager.cxx b/scripting/source/storage/ScriptStorageManager.cxx new file mode 100644 index 000000000000..77ca5a45dd15 --- /dev/null +++ b/scripting/source/storage/ScriptStorageManager.cxx @@ -0,0 +1,573 @@ +/************************************************************************* +* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" + +#include <stdio.h> + +#include <cppuhelper/implementationentry.hxx> +#include <sal/config.h> +#include <rtl/uri.hxx> + +#include <com/sun/star/ucb/XSimpleFileAccess.hpp> +#include <com/sun/star/util/XMacroExpander.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XMultiComponentFactory.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptInfoAccess.hpp> + +#include "ScriptStorageManager.hxx" +#include <util/util.hxx> +#include <util/scriptingconstants.hxx> + +using namespace ::rtl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::drafts::com::sun::star::script::framework; + +namespace scripting_impl +{ + +static OUString s_implName = + ::rtl::OUString::createFromAscii( + "drafts.com.sun.star.script.framework.storage.ScriptStorageManager" ); +static OUString s_serviceName = + ::rtl::OUString::createFromAscii( + "drafts.com.sun.star.script.framework.storage.ScriptStorageManager" ); +static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceName, 1 ); + +//extern ::rtl_StandardModuleCount s_moduleCount = MODULE_COUNT_INIT; +//extern ::rtl_StandardModuleCount s_moduleCount; + + +//************************************************************************* +// ScriptStorageManager Constructor +ScriptStorageManager::ScriptStorageManager( const Reference< + XComponentContext > & xContext ) SAL_THROW ( ( RuntimeException ) ) + : m_xContext( xContext ), m_count( 0 ), m_securityMgr( xContext ) +{ + OSL_TRACE( "< ScriptStorageManager ctor called >\n" ); + //s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); + + validateXRef( m_xContext, + "ScriptStorageManager::ScriptStorageManager : cannot get component context" ); + + m_xMgr = m_xContext->getServiceManager(); + validateXRef( m_xMgr, + "ScriptStorageManager::ScriptStorageManager : cannot get service manager" ); + + try + { + // obtain the macro expander singleton to use in determining the + // location of the application script storage + Any aAny = m_xContext->getValueByName( OUString::createFromAscii( + "/singletons/com.sun.star.util.theMacroExpander" ) ); + Reference< util::XMacroExpander > xME; + if ( sal_False == ( aAny >>= xME ) ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::ScriptStorageManager: can't get XMacroExpander" ), + Reference< XInterface >() ); + } + validateXRef( xME, "ScriptStorageManager constructor: can't get MacroExpander" ); + + OUString base = OUString::createFromAscii( + SAL_CONFIGFILE( "${$BRAND_BASE_DIR/program/bootstrap" ) ); + + setupAppStorage( xME, + base.concat( OUString::createFromAscii( "::BaseInstallation}/share" ) ), + OUSTR( "SHARE" ) ); + setupAppStorage( xME, + base.concat( OUString::createFromAscii( "::UserInstallation}/user" ) ), + OUSTR( "USER" ) ); + + } + catch ( Exception & e ) + { + throw RuntimeException( OUSTR( "ScriptStorageManager::ScriptStorageManager: " ).concat( e.Message ), Reference< XInterface >() ); + } + OSL_ASSERT( m_count == 2 ); +} + +//************************************************************************* +// ScriptStorageManager setupAppStorage +void +ScriptStorageManager::setupAppStorage( + const Reference< util::XMacroExpander > & xME, + const OUString & storageStr, + const OUString & appStr) +SAL_THROW ( ( RuntimeException ) ) +{ + try + { + Reference< XInterface > xInterface = + m_xMgr->createInstanceWithContext( + OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ); + validateXRef( xInterface, + "ScriptStorageManager constructor: can't get SimpleFileAccess XInterface" ); + Reference< ucb::XSimpleFileAccess > xSFA( xInterface, UNO_QUERY_THROW ); + + setupAnyStorage( xSFA, xME->expandMacros( storageStr ), appStr ); + } + catch ( Exception & e ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::setupAppStorage: " ).concat( e.Message ), + Reference< XInterface >() ); + } +} + +//************************************************************************* +// ScriptStorageManager setupAnyStorage +sal_Int32 +ScriptStorageManager::setupAnyStorage( + const Reference< ucb::XSimpleFileAccess > & xSFA, + const OUString & storageStr, + const OUString & origStringURI ) +SAL_THROW ( ( RuntimeException ) ) +{ + // Required for scope of fnc to protect all access read and writes to m_count + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + try + { + + // create a ScriptingStorage using the SimpleFileAccess, the storageID + // (from the count), and the URL to the application's shared area + Sequence < Any > aArgs( 3 ); + aArgs[ 0 ] <<= xSFA; + aArgs[ 1 ] <<= m_count; + aArgs[ 2 ] <<= storageStr; + + OSL_TRACE( "creating storage for: %s\n", + ::rtl::OUStringToOString( storageStr, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + Reference< XInterface > xInterface = + m_xMgr->createInstanceWithArgumentsAndContext( + OUString::createFromAscii( + "drafts.com.sun.star.script.framework.storage.ScriptStorage" ), + aArgs, m_xContext ); + + validateXRef( xInterface, "ScriptStorageManager:: setupAnyStorage: Can't create ScriptStorage for share" ); + + // and place it in the hash_map. Increment the counter + m_ScriptStorageMap[ m_count++ ] = xInterface; + sal_Int32 sid = m_count - 1; + + // create hash of original uri i.e. file:///home/users/docs/mydoc.sxw + // and storage id (sid) this will allow us to retrieve + // the sid based on the url of the document. + m_StorageIdOrigURIHash [ origStringURI ] = sid; + OSL_TRACE( "\tcreated with ID=%d\n", m_count - 1 ); + + } + catch ( Exception & e ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::setupAnyStorage: " ).concat( + e.Message ), Reference< XInterface >() ); + } + + return m_count -1; +} + +//************************************************************************* +// ScriptStorageManager Destructor +ScriptStorageManager::~ScriptStorageManager() +SAL_THROW ( () ) +{ + OSL_TRACE( "< ScriptStorageManager dtor called >\n" ); +// s_moduleCount.modCnt.release( &s_moduleCount.modCnt ); +} + +//************************************************************************* +// This method assumes that the XSimpleFileAccess knows it's on root URL +// and can be used with relative URLs +sal_Int32 SAL_CALL +ScriptStorageManager::createScriptStorage( + const Reference< ucb::XSimpleFileAccess >& xSFA ) +throw ( RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorage\n" ); + validateXRef( xSFA, + "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); + + return setupAnyStorage( xSFA, ::rtl::OUString::createFromAscii( "" ), + ::rtl::OUString::createFromAscii( "" ) ); +} + +//************************************************************************* +sal_Int32 SAL_CALL +ScriptStorageManager::createScriptStorageWithURI( + const Reference< ucb::XSimpleFileAccess >& xSFA, const OUString & cStringURI ) +throw ( RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorageWithURI\n" ); + validateXRef( xSFA, "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); + + // related to issue 11866 + // warning dialog gets launched when adding binding to script in doc + // workaround issue: no functionProvider created on doc open + // if NODIALOG tag, strip from stringURI, set boolean=true + bool displayDialog = true; + ::rtl::OUString dialogTag = ::rtl::OUString::createFromAscii( "NoDialog::" ); + ::rtl::OUString stringURI = cStringURI; + if( stringURI.indexOf( dialogTag ) == 0 ) + { + OSL_TRACE( "ScriptStorageManager::createScriptStorage: will not display security dialogs" ); + stringURI = stringURI.copy( dialogTag.getLength() ); + displayDialog = false; + } + sal_Int32 returnedID = getScriptStorageID(stringURI); + + + // convert file:///... url to vnd... syntax + ::rtl::OUString canonicalURI( + ::rtl::OUString::createFromAscii( "vnd.sun.star.pkg://" ) ); + canonicalURI = canonicalURI.concat( ::rtl::Uri::encode( stringURI, + rtl_UriCharClassUricNoSlash, rtl_UriEncodeCheckEscapes, + RTL_TEXTENCODING_ASCII_US ) ); + + if (returnedID == -1) + { + OSL_TRACE("Creating new storage for %s", + ::rtl::OUStringToOString( stringURI, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + returnedID = setupAnyStorage( xSFA, canonicalURI, stringURI ); + } + else + { + OSL_TRACE("Using existing storage for %s", + ::rtl::OUStringToOString( stringURI, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + } + +// np - removed previous scripting framework security handling +// now handled by modification to existing calls in sfx for basic +// +/* if( displayDialog ) + { + try + { + OSL_TRACE("Adding to security mgr for %s", + ::rtl::OUStringToOString( stringURI, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + m_securityMgr.addScriptStorage( stringURI, returnedID ); + } + catch ( RuntimeException & rte ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::createScriptStorageWithURI: " ).concat( + rte.Message ), Reference< XInterface >() ); + } + } + else + { + OSL_TRACE("No need to security mgr for %s", + ::rtl::OUStringToOString( stringURI, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + }*/ + return returnedID; +} + +//************************************************************************* +Reference < XInterface > SAL_CALL +ScriptStorageManager::getScriptStorage( sal_Int32 scriptStorageID ) +throw( RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptStorageManager in getStorageInstance\n" ); + OSL_TRACE( "** ==> request for id=%d",scriptStorageID ); + + ScriptStorage_map::const_iterator itr = + m_ScriptStorageMap.find( scriptStorageID ); + + if ( itr == m_ScriptStorageMap.end() ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::getScriptStorage: invalid storage ID" ), + Reference< XInterface >() ); + } + validateXRef( itr->second, + "ScriptStorageManager::getScriptStorage: Cannot get ScriptStorage from ScriptStorageHash" ); + return itr->second; +} + +//******************************************************************* +sal_Int32 SAL_CALL +ScriptStorageManager::getScriptStorageID( const ::rtl::OUString& origURI ) + throw (::com::sun::star::uno::RuntimeException) +{ + StorageId_hash::const_iterator it = m_StorageIdOrigURIHash.find( origURI ); + + if ( it == m_StorageIdOrigURIHash.end() ) + { + OUString message = OUSTR( "ScriptStorageManager::getScriptStorageID(): Cannot find storage for " ); + if ( origURI.getLength() == 0 ) + { + message = message.concat( OUSTR("Empty URI") ); + } + else + { + message = message.concat( origURI ); + } + OSL_TRACE( ::rtl::OUStringToOString( message, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return -1; + } + + return it->second; +} + +//******************************************************************* +void +ScriptStorageManager::removeScriptDocURIHashEntry( const OUString & origURI ) +{ + StorageId_hash::iterator it = m_StorageIdOrigURIHash.find( origURI ); + if ( it == m_StorageIdOrigURIHash.end() ) + { + OSL_TRACE( "ScriptStorageManager::removeScriptDocURIHashEntry: no entry to remove" ); + return; + } + + // remove entry for this doc url from orig uri map. + m_StorageIdOrigURIHash.erase( it ); +} + +//******************************************************************* +void SAL_CALL +ScriptStorageManager::refreshScriptStorage( const OUString & stringURI ) +throw( RuntimeException ) +{ + OSL_TRACE( "** => ScriptStorageManager in refreshScriptStorage\n" ); + OSL_TRACE( "** => refreshing URI: %s\n", + ::rtl::OUStringToOString( + stringURI, RTL_TEXTENCODING_ASCII_US ).pData->buffer); + + sal_Int32 storageID = getScriptStorageID( stringURI ); + + if ( storageID == -1 ) + { + OSL_TRACE( "** id was -1, no storage"); + // Refreshing noexistent storage - just return + return; + } + + try + { + Reference < storage::XScriptStorageRefresh > xSSR( + getScriptStorage( storageID ), UNO_QUERY ); + + xSSR->refresh(); + } + catch ( RuntimeException & e ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::refreshScriptStorage: " ).concat( + e.Message ), Reference< XInterface >() ); + } + catch ( Exception & e ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::refreshScriptStorage: " ).concat( + e.Message ), Reference< XInterface >() ); + } +} + +//************************************************************************* +void SAL_CALL +ScriptStorageManager::checkPermission( const OUString & +scriptStorageURI, const OUString & permissionRequest ) +throw ( RuntimeException, lang::IllegalArgumentException, css::security::AccessControlException ) +{ + try + { + m_securityMgr.checkPermission( scriptStorageURI, permissionRequest ); + } + catch ( css::security::AccessControlException & e ) + { + throw css::security::AccessControlException( + OUSTR( "ScriptStorageManager::checkPermission: AccessControlException: " ).concat( + e.Message ), Reference< XInterface >(), e.LackingPermission ); + } + catch ( lang::IllegalArgumentException & e ) + { + throw lang::IllegalArgumentException( + OUSTR( "ScriptStorageManager::checkPermission: IllegalArgumentException: " ).concat( + e.Message ), Reference< XInterface >(), e.ArgumentPosition ); + } + catch ( RuntimeException & e ) + { + throw RuntimeException( + OUSTR( "ScriptStorageManager::checkPermission: RuntimeException: " ).concat( + e.Message ), Reference< XInterface >() ); + } +} + +//************************************************************************* +OUString SAL_CALL +ScriptStorageManager::getImplementationName( ) +throw( RuntimeException ) +{ + return s_implName; +} + +//************************************************************************* +sal_Bool SAL_CALL +ScriptStorageManager::supportsService( const OUString& serviceName ) +throw( RuntimeException ) +{ + OUString const * pNames = s_serviceNames.getConstArray(); + for ( sal_Int32 nPos = s_serviceNames.getLength(); nPos--; ) + { + if ( serviceName.equals( pNames[ nPos ] ) ) + { + return sal_True; + } + } + return sal_False; +} + +//************************************************************************* +Sequence< OUString > SAL_CALL +ScriptStorageManager::getSupportedServiceNames( ) +throw( RuntimeException ) +{ + return s_serviceNames; +} + +//************************************************************************* +void SAL_CALL +ScriptStorageManager::disposing( const ::com::sun::star::lang::EventObject& Source ) +throw ( ::com::sun::star::uno::RuntimeException ) +{ + OSL_TRACE( "ScriptStorageManager::disposing started" ); + OSL_TRACE( "event object type=%s", + ::rtl::OUStringToOString( getCppuType( &Source ).getTypeName(), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + OUString storageURI; + bool removeSecurityPermission = true; + try + { + Reference< XInterface > xInterface = Source.Source; + // no UNO_QUERY_THROW since we want a 2nd change to query if it's + // not a document being disposed + Reference< frame::XModel > xModel = Reference< frame::XModel > ( xInterface, UNO_QUERY ); + if( xModel.is() ) + { + storageURI = xModel->getURL(); + } + else + { + // UNO_QURY_THROW here since it's supposed to be either a doc + // or a XScriptInfo (in the case of a filesys script) + Reference< storage::XScriptInfo > xScriptInfo = Reference< storage::XScriptInfo > ( xInterface, UNO_QUERY_THROW ); + storageURI = xScriptInfo->getParcelURI().concat( xScriptInfo->getFunctionName() ); + // to save the user seeing the security dialogs every time they + // run the script we hang on to the permission for a given script + // for the lifetime of the Office + removeSecurityPermission = false; + // possibly need to encode it?? + } + if ( storageURI.getLength() > 0 ) + { + OSL_TRACE( "URI disposing is ... %s", + ::rtl::OUStringToOString( storageURI, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + } + } + catch ( RuntimeException& e ) + { + OUString message = + OUSTR( + "ScriptStorageManager::disposing: can't get script context, reason = " ); + message = message.concat( e.Message ); + OSL_TRACE( ::rtl::OUStringToOString( message, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return; + } + + + // grab storage id. + sal_Int32 scriptStorageID = getScriptStorageID( storageURI ); + + // no need to do anything if there's no doc storage + if( scriptStorageID == -1 ) + { + return; + } + + OSL_TRACE( "disposing storageID = %d", scriptStorageID ); + + // attempt to get the storage from the hash to ensure that we have a + // valid storageID + ScriptStorage_map::const_iterator itr = + m_ScriptStorageMap.find( scriptStorageID ); + + if ( itr == m_ScriptStorageMap.end() ) + { + OSL_TRACE( "Entry for storage id %d doesn't exist in map", scriptStorageID ); + return; + } + + // erase the entry from the hash + m_ScriptStorageMap.erase( scriptStorageID ); + removeScriptDocURIHashEntry( storageURI ); + if ( removeSecurityPermission ) + { + m_securityMgr.removePermissionSettings ( storageURI ); + } +} +} // Namespace + +namespace scripting_runtimemgr +{ +//************************************************************************* +Reference< XInterface > SAL_CALL +ssm_create( + const Reference< XComponentContext > & xCompC ) +{ + return ( cppu::OWeakObject * ) new ::scripting_impl::ScriptStorageManager( xCompC ); +} + +//************************************************************************* +Sequence< OUString > +ssm_getSupportedServiceNames( ) +SAL_THROW( () ) +{ + return ::scripting_impl::s_serviceNames; +} + +//************************************************************************* +OUString +ssm_getImplementationName( ) +SAL_THROW( () ) +{ + return ::scripting_impl::s_implName; +} +} diff --git a/scripting/source/storage/ScriptStorageManager.hxx b/scripting/source/storage/ScriptStorageManager.hxx new file mode 100644 index 000000000000..2c2563971511 --- /dev/null +++ b/scripting/source/storage/ScriptStorageManager.hxx @@ -0,0 +1,225 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifndef _DRAFTS_COM_SUN_STAR_SCRIPT_FRAMEWORK_STORAGE_SCRIPTSTORAGEMANAGER_HXX_ +#define _DRAFTS_COM_SUN_STAR_SCRIPT_FRAMEWORK_STORAGE_SCRIPTSTORAGEMANAGER_HXX_ + +#include <hash_map> +#include <map> + +#include <osl/mutex.hxx> +#include <cppuhelper/implbase4.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/security/AccessControlException.hpp> +#include <com/sun/star/uno/RuntimeException.hpp> + +#include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptStorageRefresh.hpp> +#include <drafts/com/sun/star/script/framework/storage/XScriptInfo.hpp> +#include <drafts/com/sun/star/script/framework/security/XScriptSecurity.hpp> +#include "ScriptSecurityManager.hxx" + + +namespace scripting_impl +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +// Define a map used to store the ScriptingStorages key;d by ID +typedef ::std::map < sal_Int32, css::uno::Reference < css::uno::XInterface > > + ScriptStorage_map; + +typedef ::std::hash_map < ::rtl::OUString, sal_Int32, ::rtl::OUStringHash> + StorageId_hash; + +class ScriptStorageManager : public + ::cppu::WeakImplHelper4 < dcsssf::storage::XScriptStorageManager, + dcsssf::security::XScriptSecurity, css::lang::XServiceInfo, + css::lang::XEventListener > +{ +public: + explicit ScriptStorageManager( + const css::uno::Reference< css::uno::XComponentContext > & xContext ) + SAL_THROW ( ( css::uno::RuntimeException ) ); + + + ~ScriptStorageManager() SAL_THROW ( () ); + + // XServiceInfo implementation + //====================================================================== + virtual ::rtl::OUString SAL_CALL getImplementationName() + throw( css::uno::RuntimeException ); + //---------------------------------------------------------------------- + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) + throw( css::uno::RuntimeException ); + //---------------------------------------------------------------------- + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() + throw( css::uno::RuntimeException ); + //====================================================================== + + //XScriptStorageManager + //====================================================================== + /** + create a ScriptStorage using the XSimpleFileAccess passed as an + argument, and return a ID for getting the associated ScriptStorage + + @params xSFA + an implementation of XSimpleFileAccess that knows its own base URL + and can thus take URLs relative to that base. + + @returns an unsigned short ScriptStorage ID, which can be used in the + getScriptStorage method + */ + virtual sal_Int32 SAL_CALL createScriptStorage( + const css::uno::Reference< css::ucb::XSimpleFileAccess > & xSFA ) + throw ( css::uno::RuntimeException ); + //---------------------------------------------------------------------- + /** + create a ScriptStorage using the XSimpleFileAccess, and a string URL + and return a ID for getting the associated ScriptStorage + + @params xSFA + a standard implementation of XSimpleFileAccess + + @params stringURI + a string URI to the head of the script storage + + @returns an unsigned short ScriptStorage ID, which can be used in the + getScriptStorage method + */ + virtual sal_Int32 SAL_CALL + createScriptStorageWithURI( + const css::uno::Reference< css::ucb::XSimpleFileAccess >& xSFA, + const ::rtl::OUString& stringURI ) + throw ( css::uno::RuntimeException ); + //---------------------------------------------------------------------- + /** + get a ScriptStorage component using its scriptStorageID + + @params scriptStorageID + the usigned short returned by one of the methods above. ID=0 is + reserved for the application/share scripts, and ID=1 is reserved + for the application/user scripts + + @returns an XInterface to a component that implements the ScriptStorage + service + */ + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getScriptStorage( + sal_Int32 scriptStorageID ) + throw ( css::uno::RuntimeException ); + + /** + get a ScriptStorage ID using storage URI + + @param scriptStorageURI + the file URL for the document will retrieve storage id for the document, special treatment is reserved for the strings "USER"and "SHARE" which + retrieve storage id for application/user application/share areas respectively. + + + @returns as long ScriptStorage ID (-1 if no storage exists), which can be used in getScriptStorage method. + + */ + + virtual sal_Int32 SAL_CALL getScriptStorageID( const ::rtl::OUString& scriptStorageURI ) + throw (::com::sun::star::uno::RuntimeException); + + /** + refresh a storage component using its URI + + @param StringURI + URI of storage area, for documents, url to document eg, file:///home/user/ADocument.sxw To refresh the storage for user or share area, use USER or SHARE respectively instead or a url. + + */ + + virtual void SAL_CALL refreshScriptStorage(const ::rtl::OUString & stringURI) + throw ( css::uno::RuntimeException ); + //====================================================================== + + //XScriptSecurity + //====================================================================== + //---------------------------------------------------------------------- + /** + the language independent interface for invocation + + @param scriptURI + a string containing the script URI + + @returns + the value returned from the function being invoked + + @throws IllegalArgumentException + if there is no matching script name + + */ + virtual void SAL_CALL ScriptStorageManager::checkPermission( + const rtl::OUString & scriptStorageURI, + const rtl::OUString & permissionRequest ) + throw ( css::uno::RuntimeException, css::lang::IllegalArgumentException, + css::security::AccessControlException ); + //====================================================================== + + //XEventListener + //====================================================================== + + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) + throw ( css::uno::RuntimeException ); + +private: + ScriptStorageManager( const ScriptStorageManager & ); + ScriptStorageManager& operator= ( const ScriptStorageManager & ); + + void removeScriptDocURIHashEntry( const ::rtl::OUString & origURI ); + + // to obtain other services if needed + css::uno::Reference< css::uno::XComponentContext > m_xContext; + css::uno::Reference< css::lang::XMultiComponentFactory > m_xMgr; + ::osl::Mutex m_mutex; + ScriptStorage_map m_ScriptStorageMap; + StorageId_hash m_StorageIdOrigURIHash; + sal_Int32 m_count; + scripting_securitymgr::ScriptSecurityManager m_securityMgr; + + void setupAppStorage( const css::uno::Reference< css::util::XMacroExpander > & xME, + const ::rtl::OUString & storageStr, + const ::rtl::OUString & appStr) + SAL_THROW ( ( css::uno::RuntimeException ) ); + + sal_Int32 setupAnyStorage( + const css::uno::Reference< css::ucb::XSimpleFileAccess> & xSFA, + const ::rtl::OUString & storageStr, + const ::rtl::OUString & origStringURI ) + SAL_THROW ( ( css::uno::RuntimeException ) ); + +}; +} // scripting_impl + +#endif //_COM_SUN_STAR_SCRIPTING_STORAGE_SCRIPTSTORAGEMANAGER_HXX_ diff --git a/scripting/source/storage/ScriptURI.cxx b/scripting/source/storage/ScriptURI.cxx new file mode 100644 index 000000000000..0b9159ec03af --- /dev/null +++ b/scripting/source/storage/ScriptURI.cxx @@ -0,0 +1,227 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" +#include <osl/diagnose.h> +#include <osl/file.h> + +#ifdef _DEBUG +#include <stdio.h> +#endif + +//Local headers +#include "ScriptURI.hxx" +#include <util/util.hxx> + +using namespace ::rtl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; + + +namespace scripting_impl { + +static const OUString schema = OUString::createFromAscii( "vnd.sun.star.script://" ); + +/** + * Constructor + * + * @param scriptURI the string script URI + */ +ScriptURI::ScriptURI( const ::rtl::OUString& scriptURI ) + throw ( IllegalArgumentException ) : m_uri( scriptURI ) +{ + OSL_TRACE( "received uri: %s\n",::rtl::OUStringToOString( m_uri, RTL_TEXTENCODING_ASCII_US).pData->buffer ); + set_values( parseIt() ); + if( !isValid() ) + { + OSL_TRACE( "ScriptURI ctor: throwing IllegalArgException" ); + throw IllegalArgumentException( + OUSTR( "Failed to parse invalid URI: " ).concat( scriptURI ), + Reference < XInterface > (), 1 ); + } +} + +/** + * Destuctor + * + */ +// dtor should never throw exceptions, so ensure this by specifying it +ScriptURI::~ScriptURI() SAL_THROW( () ) +{ + OSL_TRACE( "< ScriptURI dtor called >\n" ); +} + +/** + * This function is used to determine if this object represents a valid URI + * + */ +bool ScriptURI::isValid( ) { + return ( m_valid == sal_True ); +} + +/** + * This function returns the location of the script + * + */ +::rtl::OUString ScriptURI::getLocation( ) +{ + return m_location; +} + +/** + * This function returns the language of the script, eg. java, StarBasic,... + * + */ +::rtl::OUString ScriptURI::getLanguage( ) +{ + return m_language; +} + +/** + * This function returns the language dependent function name of the script + * + */ +::rtl::OUString ScriptURI::getFunctionName( ) +{ + return m_functionName; +} + +/** + * This function returns the language independent logical name of the script + * + */ +::rtl::OUString ScriptURI::getLogicalName( ) +{ + return m_logicalName; +} + +/** + * This function returns the full URI + * + */ +::rtl::OUString ScriptURI::getURI( ) +{ + return m_uri; +} + +//Private mutex guarded method for setting the members +void ScriptURI::set_values( scripting_impl::Uri values ) +{ + osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + m_valid = values.valid; + m_location = values.location; + m_language = values.language; +// format is vnd.sun.star.script://[function_name]?language=[languge]&location=[location] +// LogicalName is now not used anymore, further more the ScriptURI class +// will be retired also and a new UNO service will be used. Additionally the +// parcel-description will also need to be modified to remove logical name +// In order to temporarly support the existing code functionname is +// set to the logica name parsed by this class. So getLogicalName() and +// getFunctionName() return identical string. +// + + m_functionName = values.logicalName; + m_logicalName = values.logicalName; + +} +/** + * This is a private method used for parsing the URI received by the + * initialization. + * + */ +// rather naive parsing? +Uri ScriptURI::parseIt() +{ + sal_Int32 schemaLen = schema.getLength(); + scripting_impl::Uri results; + results.valid = sal_True; + //attempt to parse + // check that it starts vnd.sun.star.script + // better check for OBO errors here + if( m_uri.indexOf( schema ) != 0 ) + { + OSL_TRACE( "wrong schema" ); + results.valid=sal_False; + return results; + } + + // substr from here to the '?' and set the logical name + sal_Int32 len = m_uri.indexOf( '?' ); + if( len == -1 ) + { + // no queries so just set the logical name + results.logicalName = m_uri.copy( schemaLen ); + return results; + } + results.logicalName = m_uri.copy( schemaLen, len-schemaLen ); + OSL_TRACE( "log name: %s\n", ::rtl::OUStringToOString( results.logicalName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + len++; + // now get the attributes + OUString attr; + do + { + attr = m_uri.getToken( 0, '&', len ); + OSL_TRACE( "chunk: %s\n", ::rtl::OUStringToOString( attr, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + if( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "language" ) ) + == sal_True ) + { + sal_Int32 len2 = attr.indexOf('='); + results.language = attr.copy( len2 + 1 ); + continue; + } + else if ( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "location" ) ) + == sal_True ) + { + sal_Int32 len2 = attr.indexOf( '=' ); + results.location = attr.copy( len2 + 1 ); + continue; + } + else if ( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "function" ) ) + == sal_True ) + { + sal_Int32 len2 = attr.indexOf( '=' ); + results.functionName = attr.copy( len2 + 1 ); + continue; + } + else + { + OSL_TRACE( "Unknown attribute?\n" ); + } + } + while ( len >= 0 ); + + // parse is good + return results; +} + +} // namespace script_uri diff --git a/scripting/source/storage/ScriptURI.hxx b/scripting/source/storage/ScriptURI.hxx new file mode 100644 index 000000000000..d4387f5dee10 --- /dev/null +++ b/scripting/source/storage/ScriptURI.hxx @@ -0,0 +1,120 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef __FRAMEWORK_STORAGE_SCRIPTURI_HXX_ +#define __FRAMEWORK_STORAGE_SCRIPTURI_HXX_ + +#include <osl/mutex.hxx> +#include <rtl/ustring> + +#include <com/sun/star/lang/IllegalArgumentException.hpp> + +namespace scripting_impl { +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +struct Uri { + bool valid; + ::rtl::OUString uri; + ::rtl::OUString location; + ::rtl::OUString language; + ::rtl::OUString functionName; + ::rtl::OUString logicalName; +}; +/** + * Helper class for dealing with script URIs. + */ +class ScriptURI +{ +public: + ScriptURI( const ::rtl::OUString& scriptURI ) + throw ( css::lang::IllegalArgumentException ); + virtual ~ScriptURI() SAL_THROW ( () ); + + /** + * This function returns the location of the script + * + */ + virtual ::rtl::OUString getLocation(); + + /** + * This function returns the language of the script, eg. java, + * StarBasic,... + * + */ + virtual ::rtl::OUString getLanguage(); + + /** + * This function returns the language dependent function name of + * the script + */ + virtual ::rtl::OUString getFunctionName(); + + /** + * This function returns the language independent logical name of + * the script + */ + virtual ::rtl::OUString getLogicalName(); + + /** + * This function returns the full URI + * + */ + virtual ::rtl::OUString getURI(); + +private: + ::osl::Mutex m_mutex; + + /** @internal */ + sal_Bool m_valid; + + //the private strings + /** the string representation of the this objects URI */ + ::rtl::OUString m_uri; + /** the location of the script referred to by this URI */ + ::rtl::OUString m_location; + /** the language of the script referred to by this URI */ + ::rtl::OUString m_language; + /** the language dependent function name of the script referred to by this URI */ + ::rtl::OUString m_functionName; + /** the language independent logical name of the script referred to by this URI */ + ::rtl::OUString m_logicalName; + + //attempt to parse the URI provided + /** @internal */ + Uri parseIt(); + //set the members + /** @internal */ + void set_values( Uri ); + bool isValid(); +} +; // class ScriptURI + +} //namespace script_uri + +#endif // define __FRAMEWORK_STORAGE_SCRIPTURI_HXX_ diff --git a/scripting/source/storage/XMLElement.cxx b/scripting/source/storage/XMLElement.cxx new file mode 100644 index 000000000000..0f8346476fc0 --- /dev/null +++ b/scripting/source/storage/XMLElement.cxx @@ -0,0 +1,169 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" +#include "XMLElement.hxx" +#include <osl/diagnose.h> + +using namespace rtl; +using namespace com::sun::star; +using namespace com::sun::star::uno; + +namespace scripting_impl +{ + +//************************************************************************* +void XMLElement::addAttribute( OUString const & rAttrName, OUString const & rValue ) +SAL_THROW( () ) +{ + OSL_TRACE( "XMLElement::addAttribute\n" ); + + _attrNames.push_back( rAttrName ); + _attrValues.push_back( rValue ); +} + +//************************************************************************* +void XMLElement::addSubElement( Reference< xml::sax::XAttributeList > const & xElem ) +SAL_THROW( () ) +{ + OSL_TRACE( "XMLElement::addSubElement\n" ); + + _subElems.push_back( xElem ); +} + +//************************************************************************* +Reference< xml::sax::XAttributeList > XMLElement::getSubElement( sal_Int32 nIndex ) +SAL_THROW( () ) +{ + OSL_TRACE( "XMLElement::getSubElement\n" ); + + return _subElems[ ( size_t )nIndex ]; +} + +//************************************************************************* +void XMLElement::dumpSubElements( Reference< xml::sax::XExtendedDocumentHandler > const & xOut ) +{ + OSL_TRACE( "+++++ XMLElement::dumpSubElement\n" ); + + for ( size_t nPos = 0; nPos < _subElems.size(); ++nPos ) + { + XMLElement * pElem = static_cast< XMLElement * >( _subElems[ nPos ].get() ); + pElem->dump( xOut ); + } +} + +//************************************************************************* +void XMLElement::dump( Reference< xml::sax::XExtendedDocumentHandler > const & xOut ) +{ + OSL_TRACE( "XMLElement::dump" ); + + xOut->ignorableWhitespace( OUString() ); + OSL_TRACE( "XMLElement::dump starting %s",::rtl::OUStringToOString( + _name, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + xOut->startElement( _name, static_cast< xml::sax::XAttributeList * >( this ) ); + // Write out CDATA + if( _chars.getLength() > 0 ) + { + xOut->ignorableWhitespace( OUString() ); + xOut->characters( _chars ); + } + // write sub elements + dumpSubElements( xOut ); + xOut->ignorableWhitespace( OUString() ); + xOut->endElement( _name ); + OSL_TRACE( "XMLElement::dump ending %s",::rtl::OUStringToOString( + _name, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); +} + +//************************************************************************* +// XAttributeList +sal_Int16 XMLElement::getLength() +throw ( RuntimeException ) +{ + OSL_TRACE( "XMLElement::getLength\n" ); + + return _attrNames.size(); +} + +//************************************************************************* +OUString XMLElement::getNameByIndex( sal_Int16 nPos ) +throw ( RuntimeException ) +{ + OSL_TRACE( "XMLElement::getNameByIndex\n" ); + OSL_ASSERT( ( size_t )nPos < _attrNames.size() ); + + return _attrNames[ nPos ]; +} + +//************************************************************************* +OUString XMLElement::getTypeByIndex( sal_Int16 nPos ) +throw ( RuntimeException ) +{ + OSL_TRACE( "XMLElement::getTypeByIndex\n" ); + OSL_ASSERT( (size_t)nPos < _attrNames.size() ); + + // xxx todo + return OUString(); +} + +//************************************************************************* +OUString XMLElement::getTypeByName( OUString const & rName ) +throw ( RuntimeException ) +{ + OSL_TRACE( "XMLElement::getTypeByName\n" ); + // xxx todo + return OUString(); +} + +//************************************************************************* +OUString XMLElement::getValueByIndex( sal_Int16 nPos ) +throw ( RuntimeException ) +{ + OSL_TRACE( "XMLElement::getValueByIndex\n" ); + OSL_ASSERT( ( size_t )nPos < _attrNames.size() ); + + return _attrValues[ nPos ]; +} + +//************************************************************************* +OUString XMLElement::getValueByName( OUString const & rName ) +throw ( RuntimeException ) +{ + OSL_TRACE( "XMLElement::getValueByName\n" ); + + for ( size_t nPos = 0; nPos < _attrNames.size(); ++nPos ) + { + if (_attrNames[ nPos ] == rName) + { + return _attrValues[ nPos ]; + } + } + return OUString(); +} + +} diff --git a/scripting/source/storage/XMLElement.hxx b/scripting/source/storage/XMLElement.hxx new file mode 100644 index 000000000000..c5798454a556 --- /dev/null +++ b/scripting/source/storage/XMLElement.hxx @@ -0,0 +1,140 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SCRIPTING_XML_ELEMENT_HXX_ +#define _SCRIPTING_XML_ELEMENT_HXX_ + +#include <vector> + +#include <cppuhelper/implbase1.hxx> + +#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> + +namespace scripting_impl +{ +// for simplification +#define css ::com::sun::star +#define dcsssf ::drafts::com::sun::star::script::framework + +/*################################################################################################## + + EXPORTING + +##################################################################################################*/ + +//================================================================================================== +class XMLElement : public ::cppu::WeakImplHelper1< css::xml::sax::XAttributeList > +{ +public: + inline XMLElement( ::rtl::OUString const & name, ::rtl::OUString const & chars ) + SAL_THROW( () ) + : _name( name ), _chars( chars ) + { + } + + inline XMLElement( ::rtl::OUString const & name ) + SAL_THROW( () ) + : _name( name ) + { + } + + /** Adds a sub element of element. + + @param xElem element reference + */ + void SAL_CALL addSubElement( + css::uno::Reference< css::xml::sax::XAttributeList > const & xElem ) + SAL_THROW( () ); + + /** Gets sub element of given index. The index follows order in which sub elements were added. + + @param nIndex index of sub element + */ + css::uno::Reference< css::xml::sax::XAttributeList > SAL_CALL getSubElement( + sal_Int32 nIndex ) + SAL_THROW( () ); + + /** Adds an attribute to elements. + + @param rAttrName qname of attribute + @param rValue value string of element + */ + void SAL_CALL addAttribute( ::rtl::OUString const & rAttrName, + ::rtl::OUString const & rValue ) + SAL_THROW( () ); + + /** Gets the tag name (qname) of element. + + @return + qname of element + */ + inline ::rtl::OUString SAL_CALL getName() SAL_THROW( () ) + { + return _name; + } + + /** Dumps out element (and all sub elements). + + @param xOut document handler to be written to + */ + void SAL_CALL dump( + css::uno::Reference< css::xml::sax::XExtendedDocumentHandler > const & xOut ); + /** Dumps out sub elements (and all further sub elements). + + @param xOut document handler to be written to + */ + void SAL_CALL dumpSubElements( + css::uno::Reference< css::xml::sax::XExtendedDocumentHandler > const & xOut ); + + // XAttributeList + virtual sal_Int16 SAL_CALL getLength() + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getNameByIndex( sal_Int16 nPos ) + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getTypeByIndex( sal_Int16 nPos ) + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getTypeByName( ::rtl::OUString const & rName ) + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getValueByIndex( sal_Int16 nPos ) + throw ( css::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getValueByName( ::rtl::OUString const & rName ) + throw ( css::uno::RuntimeException ); + +protected: + ::rtl::OUString _name; + + ::rtl::OUString _chars; + + ::std::vector< ::rtl::OUString > _attrNames; + ::std::vector< ::rtl::OUString > _attrValues; + + ::std::vector< css::uno::Reference< + css::xml::sax::XAttributeList > > _subElems; +}; + +} + +#endif diff --git a/scripting/source/storage/exports.dxp b/scripting/source/storage/exports.dxp new file mode 100644 index 000000000000..9630d7e06768 --- /dev/null +++ b/scripting/source/storage/exports.dxp @@ -0,0 +1,3 @@ +component_getImplementationEnvironment +component_writeInfo +component_getFactory diff --git a/scripting/source/storage/makefile.mk b/scripting/source/storage/makefile.mk new file mode 100644 index 000000000000..7ba35edf0692 --- /dev/null +++ b/scripting/source/storage/makefile.mk @@ -0,0 +1,53 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org 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 version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME= scripting +TARGET= storage +USE_DEFFILE= TRUE +ENABLE_EXCEPTIONS=TRUE +COMP1TYPELIST=$(TARGET) + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# ------------------------------------------------------------------ + +SLOFILES=\ + $(SLO)$/ScriptURI.obj\ + $(SLO)$/ScriptStorage.obj\ + $(SLO)$/ScriptInfo.obj\ + $(SLO)$/ScriptMetadataImporter.obj\ + $(SLO)$/ScriptElement.obj\ + $(SLO)$/XMLElement.obj\ + $(SLO)$/ScriptStorageManager.obj\ + $(SLO)$/ScriptSecurityManager.obj\ + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/scripting/source/storage/storage.xml b/scripting/source/storage/storage.xml new file mode 100644 index 000000000000..6438dc7006b2 --- /dev/null +++ b/scripting/source/storage/storage.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE module-description PUBLIC "-//StarOffice//DTD ComponentDescription 1.0//EN" "module-description.dtd"> +<module-description xmlns:xlink="http://www.w3.org/1999/xlink"> + <module-name>storage</module-name> + <component-description> + <author></author> + <name>drafts.com.sun.star.script.framework.storage.ScriptStorage</name> + <description></description> + <loader-name>com.sun.star.loader.SharedLibrary</loader-name> + <language>c++</language> + <status value="draft"/> + <supported-service>drafts.com.sun.star.script.framework.storage.ScriptingStorage</supported-service> + <type>com.sun.star.beans.XPropertySet</type> + <type>com.sun.star.beans.XPropertyContainer</type> + <type>com.sun.star.uno.Exception</type> + <type>com.sun.star.uno.XComponentContext</type> + <type>com.sun.star.uno.XWeak</type> + <type>com.sun.star.io.IOException</type> + <type>com.sun.star.io.XStream</type> + <type>com.sun.star.io.XOutputStream</type> + <type>com.sun.star.registry.XRegistryKey</type> + <type>drafts.com.sun.star.script.framework.storage.XScriptInfo</type> + <type>drafts.com.sun.star.script.framework.storage.XScriptInfoAccess</type> + <type>drafts.com.sun.star.script.framework.security.XScriptSecurity</type> + <type>drafts.com.sun.star.script.framework.storage.XScriptStorageExport</type> + <type>drafts.com.sun.star.script.framework.storage.XScriptStorageRefresh</type> + <type>com.sun.star.lang.XInitialization</type> + <type>drafts.com.sun.star.script.framework.storage.XScriptStorageManager</type> + <type>com.sun.star.xml.sax.XExtendedDocumentHandler</type> + <type>com.sun.star.xml.sax.XParser</type> + <type>com.sun.star.io.XInputStream</type> + <type>com.sun.star.ucb.XSimpleFileAccess2</type> + <type>com.sun.star.xml.sax.SAXException</type> + <type>com.sun.star.xml.sax.XAttributeList</type> + <type>com.sun.star.io.XActiveDataSource</type> + <type>com.sun.star.security.AccessControlException</type> + <type>com.sun.star.security.RuntimePermission</type> + <type>com.sun.star.lang.IllegalArgumentException</type> + </component-description> + <project-build-dependency>cppuhelper</project-build-dependency> + <project-build-dependency>cppu</project-build-dependency> + <project-build-dependency>sal</project-build-dependency> + <runtime-module-dependency>cppuhelper2$(COM)</runtime-module-dependency> + <runtime-module-dependency>cppu2</runtime-module-dependency> + <runtime-module-dependency>sal2</runtime-module-dependency> + <runtime-module-dependency>ucb</runtime-module-dependency> +</module-description> |