1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_scripting.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <stdio.h> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include <cppuhelper/implementationentry.hxx> 34*cdf0e10cSrcweir #include <sal/config.h> 35*cdf0e10cSrcweir #include <rtl/uri.hxx> 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/util/XMacroExpander.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/frame/XModel.hpp> 43*cdf0e10cSrcweir #include <drafts/com/sun/star/script/framework/storage/XScriptInfoAccess.hpp> 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir #include "ScriptStorageManager.hxx" 46*cdf0e10cSrcweir #include <util/util.hxx> 47*cdf0e10cSrcweir #include <util/scriptingconstants.hxx> 48*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir using namespace ::rtl; 51*cdf0e10cSrcweir using namespace ::com::sun::star; 52*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 53*cdf0e10cSrcweir using namespace ::drafts::com::sun::star::script::framework; 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir namespace scripting_impl 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir static OUString s_implName = 59*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 60*cdf0e10cSrcweir "drafts.com.sun.star.script.framework.storage.ScriptStorageManager" ); 61*cdf0e10cSrcweir static OUString s_serviceName = 62*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( 63*cdf0e10cSrcweir "drafts.com.sun.star.script.framework.storage.ScriptStorageManager" ); 64*cdf0e10cSrcweir static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceName, 1 ); 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir //extern ::rtl_StandardModuleCount s_moduleCount = MODULE_COUNT_INIT; 67*cdf0e10cSrcweir //extern ::rtl_StandardModuleCount s_moduleCount; 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir //************************************************************************* 71*cdf0e10cSrcweir // ScriptStorageManager Constructor 72*cdf0e10cSrcweir ScriptStorageManager::ScriptStorageManager( const Reference< 73*cdf0e10cSrcweir XComponentContext > & xContext ) SAL_THROW ( ( RuntimeException ) ) 74*cdf0e10cSrcweir : m_xContext( xContext, UNO_SET_THROW ), m_count( 0 ), m_securityMgr( xContext ) 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir OSL_TRACE( "< ScriptStorageManager ctor called >\n" ); 77*cdf0e10cSrcweir //s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir try 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir // obtain the macro expander singleton to use in determining the 84*cdf0e10cSrcweir // location of the application script storage 85*cdf0e10cSrcweir Reference< util::XMacroExpander > xME( m_xContext->getValueByName( OUString::createFromAscii( 86*cdf0e10cSrcweir "/singletons/com.sun.star.util.theMacroExpander" ) ), UNO_QUERY_THROW ); 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir OUString base = OUString::createFromAscii( 89*cdf0e10cSrcweir SAL_CONFIGFILE( "${$BRAND_BASE_DIR/program/bootstrap" ) ); 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir setupAppStorage( xME, 92*cdf0e10cSrcweir base.concat( OUString::createFromAscii( "::BaseInstallation}/share" ) ), 93*cdf0e10cSrcweir OUSTR( "SHARE" ) ); 94*cdf0e10cSrcweir setupAppStorage( xME, 95*cdf0e10cSrcweir base.concat( OUString::createFromAscii( "::UserInstallation}/user" ) ), 96*cdf0e10cSrcweir OUSTR( "USER" ) ); 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir } 99*cdf0e10cSrcweir catch ( Exception & e ) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir throw RuntimeException( OUSTR( "ScriptStorageManager::ScriptStorageManager: " ).concat( e.Message ), Reference< XInterface >() ); 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir OSL_ASSERT( m_count == 2 ); 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir //************************************************************************* 107*cdf0e10cSrcweir // ScriptStorageManager setupAppStorage 108*cdf0e10cSrcweir void 109*cdf0e10cSrcweir ScriptStorageManager::setupAppStorage( 110*cdf0e10cSrcweir const Reference< util::XMacroExpander > & xME, 111*cdf0e10cSrcweir const OUString & storageStr, 112*cdf0e10cSrcweir const OUString & appStr) 113*cdf0e10cSrcweir SAL_THROW ( ( RuntimeException ) ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir try 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir Reference< ucb::XSimpleFileAccess > xSFA( 118*cdf0e10cSrcweir m_xMgr->createInstanceWithContext( 119*cdf0e10cSrcweir OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), 120*cdf0e10cSrcweir m_xContext 121*cdf0e10cSrcweir ), 122*cdf0e10cSrcweir UNO_QUERY_THROW 123*cdf0e10cSrcweir ); 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir setupAnyStorage( xSFA, xME->expandMacros( storageStr ), appStr ); 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir catch ( Exception & e ) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir throw RuntimeException( 130*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::setupAppStorage: " ).concat( e.Message ), 131*cdf0e10cSrcweir Reference< XInterface >() ); 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir //************************************************************************* 136*cdf0e10cSrcweir // ScriptStorageManager setupAnyStorage 137*cdf0e10cSrcweir sal_Int32 138*cdf0e10cSrcweir ScriptStorageManager::setupAnyStorage( 139*cdf0e10cSrcweir const Reference< ucb::XSimpleFileAccess > & xSFA, 140*cdf0e10cSrcweir const OUString & storageStr, 141*cdf0e10cSrcweir const OUString & origStringURI ) 142*cdf0e10cSrcweir SAL_THROW ( ( RuntimeException ) ) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir // Required for scope of fnc to protect all access read and writes to m_count 145*cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 146*cdf0e10cSrcweir try 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir // create a ScriptingStorage using the SimpleFileAccess, the storageID 150*cdf0e10cSrcweir // (from the count), and the URL to the application's shared area 151*cdf0e10cSrcweir Sequence < Any > aArgs( 3 ); 152*cdf0e10cSrcweir aArgs[ 0 ] <<= xSFA; 153*cdf0e10cSrcweir aArgs[ 1 ] <<= m_count; 154*cdf0e10cSrcweir aArgs[ 2 ] <<= storageStr; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir OSL_TRACE( "creating storage for: %s\n", 157*cdf0e10cSrcweir ::rtl::OUStringToOString( storageStr, 158*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir Reference< XInterface > xInterface( 161*cdf0e10cSrcweir m_xMgr->createInstanceWithArgumentsAndContext( 162*cdf0e10cSrcweir OUString::createFromAscii( "drafts.com.sun.star.script.framework.storage.ScriptStorage" ), 163*cdf0e10cSrcweir aArgs, 164*cdf0e10cSrcweir m_xContext 165*cdf0e10cSrcweir ), 166*cdf0e10cSrcweir UNO_QUERY_THROW 167*cdf0e10cSrcweir ); 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir // and place it in the hash_map. Increment the counter 170*cdf0e10cSrcweir m_ScriptStorageMap[ m_count++ ] = xInterface; 171*cdf0e10cSrcweir sal_Int32 sid = m_count - 1; 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir // create hash of original uri i.e. file:///home/users/docs/mydoc.sxw 174*cdf0e10cSrcweir // and storage id (sid) this will allow us to retrieve 175*cdf0e10cSrcweir // the sid based on the url of the document. 176*cdf0e10cSrcweir m_StorageIdOrigURIHash [ origStringURI ] = sid; 177*cdf0e10cSrcweir OSL_TRACE( "\tcreated with ID=%d\n", m_count - 1 ); 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir catch ( Exception & e ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir throw RuntimeException( 183*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::setupAnyStorage: " ).concat( 184*cdf0e10cSrcweir e.Message ), Reference< XInterface >() ); 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir return m_count -1; 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir //************************************************************************* 191*cdf0e10cSrcweir // ScriptStorageManager Destructor 192*cdf0e10cSrcweir ScriptStorageManager::~ScriptStorageManager() 193*cdf0e10cSrcweir SAL_THROW ( () ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir OSL_TRACE( "< ScriptStorageManager dtor called >\n" ); 196*cdf0e10cSrcweir // s_moduleCount.modCnt.release( &s_moduleCount.modCnt ); 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir //************************************************************************* 200*cdf0e10cSrcweir // This method assumes that the XSimpleFileAccess knows it's on root URL 201*cdf0e10cSrcweir // and can be used with relative URLs 202*cdf0e10cSrcweir sal_Int32 SAL_CALL 203*cdf0e10cSrcweir ScriptStorageManager::createScriptStorage( 204*cdf0e10cSrcweir const Reference< ucb::XSimpleFileAccess >& xSFA ) 205*cdf0e10cSrcweir throw ( RuntimeException ) 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorage\n" ); 208*cdf0e10cSrcweir ENSURE_OR_THROW( xSFA.is(), "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir return setupAnyStorage( xSFA, ::rtl::OUString::createFromAscii( "" ), 211*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "" ) ); 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir //************************************************************************* 215*cdf0e10cSrcweir sal_Int32 SAL_CALL 216*cdf0e10cSrcweir ScriptStorageManager::createScriptStorageWithURI( 217*cdf0e10cSrcweir const Reference< ucb::XSimpleFileAccess >& xSFA, const OUString & cStringURI ) 218*cdf0e10cSrcweir throw ( RuntimeException ) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorageWithURI\n" ); 221*cdf0e10cSrcweir ENSURE_OR_THROW( xSFA.is(), "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir // related to issue 11866 224*cdf0e10cSrcweir // warning dialog gets launched when adding binding to script in doc 225*cdf0e10cSrcweir // workaround issue: no functionProvider created on doc open 226*cdf0e10cSrcweir // if NODIALOG tag, strip from stringURI, set boolean=true 227*cdf0e10cSrcweir bool displayDialog = true; 228*cdf0e10cSrcweir ::rtl::OUString dialogTag = ::rtl::OUString::createFromAscii( "NoDialog::" ); 229*cdf0e10cSrcweir ::rtl::OUString stringURI = cStringURI; 230*cdf0e10cSrcweir if( stringURI.indexOf( dialogTag ) == 0 ) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir OSL_TRACE( "ScriptStorageManager::createScriptStorage: will not display security dialogs" ); 233*cdf0e10cSrcweir stringURI = stringURI.copy( dialogTag.getLength() ); 234*cdf0e10cSrcweir displayDialog = false; 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir sal_Int32 returnedID = getScriptStorageID(stringURI); 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir // convert file:///... url to vnd... syntax 240*cdf0e10cSrcweir ::rtl::OUString canonicalURI( 241*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "vnd.sun.star.pkg://" ) ); 242*cdf0e10cSrcweir canonicalURI = canonicalURI.concat( ::rtl::Uri::encode( stringURI, 243*cdf0e10cSrcweir rtl_UriCharClassUricNoSlash, rtl_UriEncodeCheckEscapes, 244*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ) ); 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir if (returnedID == -1) 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir OSL_TRACE("Creating new storage for %s", 249*cdf0e10cSrcweir ::rtl::OUStringToOString( stringURI, 250*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 251*cdf0e10cSrcweir returnedID = setupAnyStorage( xSFA, canonicalURI, stringURI ); 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir else 254*cdf0e10cSrcweir { 255*cdf0e10cSrcweir OSL_TRACE("Using existing storage for %s", 256*cdf0e10cSrcweir ::rtl::OUStringToOString( stringURI, 257*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir // np - removed previous scripting framework security handling 261*cdf0e10cSrcweir // now handled by modification to existing calls in sfx for basic 262*cdf0e10cSrcweir // 263*cdf0e10cSrcweir /* if( displayDialog ) 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir try 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir OSL_TRACE("Adding to security mgr for %s", 268*cdf0e10cSrcweir ::rtl::OUStringToOString( stringURI, 269*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 270*cdf0e10cSrcweir m_securityMgr.addScriptStorage( stringURI, returnedID ); 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir catch ( RuntimeException & rte ) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir throw RuntimeException( 275*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::createScriptStorageWithURI: " ).concat( 276*cdf0e10cSrcweir rte.Message ), Reference< XInterface >() ); 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir else 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir OSL_TRACE("No need to security mgr for %s", 282*cdf0e10cSrcweir ::rtl::OUStringToOString( stringURI, 283*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 284*cdf0e10cSrcweir }*/ 285*cdf0e10cSrcweir return returnedID; 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir //************************************************************************* 289*cdf0e10cSrcweir Reference < XInterface > SAL_CALL 290*cdf0e10cSrcweir ScriptStorageManager::getScriptStorage( sal_Int32 scriptStorageID ) 291*cdf0e10cSrcweir throw( RuntimeException ) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir OSL_TRACE( "** ==> ScriptStorageManager in getStorageInstance\n" ); 294*cdf0e10cSrcweir OSL_TRACE( "** ==> request for id=%d",scriptStorageID ); 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir ScriptStorage_map::const_iterator itr = 297*cdf0e10cSrcweir m_ScriptStorageMap.find( scriptStorageID ); 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir if ( itr == m_ScriptStorageMap.end() ) 300*cdf0e10cSrcweir { 301*cdf0e10cSrcweir throw RuntimeException( 302*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::getScriptStorage: invalid storage ID" ), 303*cdf0e10cSrcweir Reference< XInterface >() ); 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir ENSURE_OR_THROW( itr->second.is(), 306*cdf0e10cSrcweir "ScriptStorageManager::getScriptStorage: Cannot get ScriptStorage from ScriptStorageHash" ); 307*cdf0e10cSrcweir return itr->second; 308*cdf0e10cSrcweir } 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir //******************************************************************* 311*cdf0e10cSrcweir sal_Int32 SAL_CALL 312*cdf0e10cSrcweir ScriptStorageManager::getScriptStorageID( const ::rtl::OUString& origURI ) 313*cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 314*cdf0e10cSrcweir { 315*cdf0e10cSrcweir StorageId_hash::const_iterator it = m_StorageIdOrigURIHash.find( origURI ); 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir if ( it == m_StorageIdOrigURIHash.end() ) 318*cdf0e10cSrcweir { 319*cdf0e10cSrcweir OUString message = OUSTR( "ScriptStorageManager::getScriptStorageID(): Cannot find storage for " ); 320*cdf0e10cSrcweir if ( origURI.getLength() == 0 ) 321*cdf0e10cSrcweir { 322*cdf0e10cSrcweir message = message.concat( OUSTR("Empty URI") ); 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir else 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir message = message.concat( origURI ); 327*cdf0e10cSrcweir } 328*cdf0e10cSrcweir OSL_TRACE( ::rtl::OUStringToOString( message, 329*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 330*cdf0e10cSrcweir return -1; 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir return it->second; 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir //******************************************************************* 337*cdf0e10cSrcweir void 338*cdf0e10cSrcweir ScriptStorageManager::removeScriptDocURIHashEntry( const OUString & origURI ) 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir StorageId_hash::iterator it = m_StorageIdOrigURIHash.find( origURI ); 341*cdf0e10cSrcweir if ( it == m_StorageIdOrigURIHash.end() ) 342*cdf0e10cSrcweir { 343*cdf0e10cSrcweir OSL_TRACE( "ScriptStorageManager::removeScriptDocURIHashEntry: no entry to remove" ); 344*cdf0e10cSrcweir return; 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir // remove entry for this doc url from orig uri map. 348*cdf0e10cSrcweir m_StorageIdOrigURIHash.erase( it ); 349*cdf0e10cSrcweir } 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir //******************************************************************* 352*cdf0e10cSrcweir void SAL_CALL 353*cdf0e10cSrcweir ScriptStorageManager::refreshScriptStorage( const OUString & stringURI ) 354*cdf0e10cSrcweir throw( RuntimeException ) 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir OSL_TRACE( "** => ScriptStorageManager in refreshScriptStorage\n" ); 357*cdf0e10cSrcweir OSL_TRACE( "** => refreshing URI: %s\n", 358*cdf0e10cSrcweir ::rtl::OUStringToOString( 359*cdf0e10cSrcweir stringURI, RTL_TEXTENCODING_ASCII_US ).pData->buffer); 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir sal_Int32 storageID = getScriptStorageID( stringURI ); 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir if ( storageID == -1 ) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir OSL_TRACE( "** id was -1, no storage"); 366*cdf0e10cSrcweir // Refreshing noexistent storage - just return 367*cdf0e10cSrcweir return; 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir try 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir Reference < storage::XScriptStorageRefresh > xSSR( 373*cdf0e10cSrcweir getScriptStorage( storageID ), UNO_QUERY ); 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir xSSR->refresh(); 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir catch ( RuntimeException & e ) 378*cdf0e10cSrcweir { 379*cdf0e10cSrcweir throw RuntimeException( 380*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::refreshScriptStorage: " ).concat( 381*cdf0e10cSrcweir e.Message ), Reference< XInterface >() ); 382*cdf0e10cSrcweir } 383*cdf0e10cSrcweir catch ( Exception & e ) 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir throw RuntimeException( 386*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::refreshScriptStorage: " ).concat( 387*cdf0e10cSrcweir e.Message ), Reference< XInterface >() ); 388*cdf0e10cSrcweir } 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir //************************************************************************* 392*cdf0e10cSrcweir void SAL_CALL 393*cdf0e10cSrcweir ScriptStorageManager::checkPermission( const OUString & 394*cdf0e10cSrcweir scriptStorageURI, const OUString & permissionRequest ) 395*cdf0e10cSrcweir throw ( RuntimeException, lang::IllegalArgumentException, css::security::AccessControlException ) 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir try 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir m_securityMgr.checkPermission( scriptStorageURI, permissionRequest ); 400*cdf0e10cSrcweir } 401*cdf0e10cSrcweir catch ( css::security::AccessControlException & e ) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir throw css::security::AccessControlException( 404*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::checkPermission: AccessControlException: " ).concat( 405*cdf0e10cSrcweir e.Message ), Reference< XInterface >(), e.LackingPermission ); 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir catch ( lang::IllegalArgumentException & e ) 408*cdf0e10cSrcweir { 409*cdf0e10cSrcweir throw lang::IllegalArgumentException( 410*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::checkPermission: IllegalArgumentException: " ).concat( 411*cdf0e10cSrcweir e.Message ), Reference< XInterface >(), e.ArgumentPosition ); 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir catch ( RuntimeException & e ) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir throw RuntimeException( 416*cdf0e10cSrcweir OUSTR( "ScriptStorageManager::checkPermission: RuntimeException: " ).concat( 417*cdf0e10cSrcweir e.Message ), Reference< XInterface >() ); 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir //************************************************************************* 422*cdf0e10cSrcweir OUString SAL_CALL 423*cdf0e10cSrcweir ScriptStorageManager::getImplementationName( ) 424*cdf0e10cSrcweir throw( RuntimeException ) 425*cdf0e10cSrcweir { 426*cdf0e10cSrcweir return s_implName; 427*cdf0e10cSrcweir } 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir //************************************************************************* 430*cdf0e10cSrcweir sal_Bool SAL_CALL 431*cdf0e10cSrcweir ScriptStorageManager::supportsService( const OUString& serviceName ) 432*cdf0e10cSrcweir throw( RuntimeException ) 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir OUString const * pNames = s_serviceNames.getConstArray(); 435*cdf0e10cSrcweir for ( sal_Int32 nPos = s_serviceNames.getLength(); nPos--; ) 436*cdf0e10cSrcweir { 437*cdf0e10cSrcweir if ( serviceName.equals( pNames[ nPos ] ) ) 438*cdf0e10cSrcweir { 439*cdf0e10cSrcweir return sal_True; 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir return sal_False; 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir //************************************************************************* 446*cdf0e10cSrcweir Sequence< OUString > SAL_CALL 447*cdf0e10cSrcweir ScriptStorageManager::getSupportedServiceNames( ) 448*cdf0e10cSrcweir throw( RuntimeException ) 449*cdf0e10cSrcweir { 450*cdf0e10cSrcweir return s_serviceNames; 451*cdf0e10cSrcweir } 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir //************************************************************************* 454*cdf0e10cSrcweir void SAL_CALL 455*cdf0e10cSrcweir ScriptStorageManager::disposing( const ::com::sun::star::lang::EventObject& Source ) 456*cdf0e10cSrcweir throw ( ::com::sun::star::uno::RuntimeException ) 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir OSL_TRACE( "ScriptStorageManager::disposing started" ); 459*cdf0e10cSrcweir OSL_TRACE( "event object type=%s", 460*cdf0e10cSrcweir ::rtl::OUStringToOString( getCppuType( &Source ).getTypeName(), 461*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 462*cdf0e10cSrcweir OUString storageURI; 463*cdf0e10cSrcweir bool removeSecurityPermission = true; 464*cdf0e10cSrcweir try 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir Reference< XInterface > xInterface = Source.Source; 467*cdf0e10cSrcweir // no UNO_QUERY_THROW since we want a 2nd change to query if it's 468*cdf0e10cSrcweir // not a document being disposed 469*cdf0e10cSrcweir Reference< frame::XModel > xModel = Reference< frame::XModel > ( xInterface, UNO_QUERY ); 470*cdf0e10cSrcweir if( xModel.is() ) 471*cdf0e10cSrcweir { 472*cdf0e10cSrcweir storageURI = xModel->getURL(); 473*cdf0e10cSrcweir } 474*cdf0e10cSrcweir else 475*cdf0e10cSrcweir { 476*cdf0e10cSrcweir // UNO_QURY_THROW here since it's supposed to be either a doc 477*cdf0e10cSrcweir // or a XScriptInfo (in the case of a filesys script) 478*cdf0e10cSrcweir Reference< storage::XScriptInfo > xScriptInfo = Reference< storage::XScriptInfo > ( xInterface, UNO_QUERY_THROW ); 479*cdf0e10cSrcweir storageURI = xScriptInfo->getParcelURI().concat( xScriptInfo->getFunctionName() ); 480*cdf0e10cSrcweir // to save the user seeing the security dialogs every time they 481*cdf0e10cSrcweir // run the script we hang on to the permission for a given script 482*cdf0e10cSrcweir // for the lifetime of the Office 483*cdf0e10cSrcweir removeSecurityPermission = false; 484*cdf0e10cSrcweir // possibly need to encode it?? 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir if ( storageURI.getLength() > 0 ) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir OSL_TRACE( "URI disposing is ... %s", 489*cdf0e10cSrcweir ::rtl::OUStringToOString( storageURI, 490*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 491*cdf0e10cSrcweir } 492*cdf0e10cSrcweir } 493*cdf0e10cSrcweir catch ( RuntimeException& e ) 494*cdf0e10cSrcweir { 495*cdf0e10cSrcweir OUString message = 496*cdf0e10cSrcweir OUSTR( 497*cdf0e10cSrcweir "ScriptStorageManager::disposing: can't get script context, reason = " ); 498*cdf0e10cSrcweir message = message.concat( e.Message ); 499*cdf0e10cSrcweir OSL_TRACE( ::rtl::OUStringToOString( message, 500*cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 501*cdf0e10cSrcweir return; 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir // grab storage id. 506*cdf0e10cSrcweir sal_Int32 scriptStorageID = getScriptStorageID( storageURI ); 507*cdf0e10cSrcweir 508*cdf0e10cSrcweir // no need to do anything if there's no doc storage 509*cdf0e10cSrcweir if( scriptStorageID == -1 ) 510*cdf0e10cSrcweir { 511*cdf0e10cSrcweir return; 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir OSL_TRACE( "disposing storageID = %d", scriptStorageID ); 515*cdf0e10cSrcweir 516*cdf0e10cSrcweir // attempt to get the storage from the hash to ensure that we have a 517*cdf0e10cSrcweir // valid storageID 518*cdf0e10cSrcweir ScriptStorage_map::const_iterator itr = 519*cdf0e10cSrcweir m_ScriptStorageMap.find( scriptStorageID ); 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir if ( itr == m_ScriptStorageMap.end() ) 522*cdf0e10cSrcweir { 523*cdf0e10cSrcweir OSL_TRACE( "Entry for storage id %d doesn't exist in map", scriptStorageID ); 524*cdf0e10cSrcweir return; 525*cdf0e10cSrcweir } 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir // erase the entry from the hash 528*cdf0e10cSrcweir m_ScriptStorageMap.erase( scriptStorageID ); 529*cdf0e10cSrcweir removeScriptDocURIHashEntry( storageURI ); 530*cdf0e10cSrcweir if ( removeSecurityPermission ) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir m_securityMgr.removePermissionSettings ( storageURI ); 533*cdf0e10cSrcweir } 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir } // Namespace 536*cdf0e10cSrcweir 537*cdf0e10cSrcweir namespace scripting_runtimemgr 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir //************************************************************************* 540*cdf0e10cSrcweir Reference< XInterface > SAL_CALL 541*cdf0e10cSrcweir ssm_create( 542*cdf0e10cSrcweir const Reference< XComponentContext > & xCompC ) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir return ( cppu::OWeakObject * ) new ::scripting_impl::ScriptStorageManager( xCompC ); 545*cdf0e10cSrcweir } 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir //************************************************************************* 548*cdf0e10cSrcweir Sequence< OUString > 549*cdf0e10cSrcweir ssm_getSupportedServiceNames( ) 550*cdf0e10cSrcweir SAL_THROW( () ) 551*cdf0e10cSrcweir { 552*cdf0e10cSrcweir return ::scripting_impl::s_serviceNames; 553*cdf0e10cSrcweir } 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir //************************************************************************* 556*cdf0e10cSrcweir OUString 557*cdf0e10cSrcweir ssm_getImplementationName( ) 558*cdf0e10cSrcweir SAL_THROW( () ) 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir return ::scripting_impl::s_implName; 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir } 563