1*2c696243SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2c696243SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2c696243SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2c696243SAndrew Rist * distributed with this work for additional information
6*2c696243SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2c696243SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2c696243SAndrew Rist * "License"); you may not use this file except in compliance
9*2c696243SAndrew Rist * with the License. You may obtain a copy of the License at
10*2c696243SAndrew Rist *
11*2c696243SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2c696243SAndrew Rist *
13*2c696243SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2c696243SAndrew Rist * software distributed under the License is distributed on an
15*2c696243SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2c696243SAndrew Rist * KIND, either express or implied. See the License for the
17*2c696243SAndrew Rist * specific language governing permissions and limitations
18*2c696243SAndrew Rist * under the License.
19*2c696243SAndrew Rist *
20*2c696243SAndrew Rist *************************************************************/
21*2c696243SAndrew Rist
22*2c696243SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_scripting.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <vector>
28cdf0e10cSrcweir #include <stdlib.h>
29cdf0e10cSrcweir
30cdf0e10cSrcweir #include <cppuhelper/implementationentry.hxx>
31cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
32cdf0e10cSrcweir #include <com/sun/star/security/AccessControlException.hpp>
33cdf0e10cSrcweir
34cdf0e10cSrcweir #include <util/util.hxx>
35cdf0e10cSrcweir #include <util/scriptingconstants.hxx>
36cdf0e10cSrcweir
37cdf0e10cSrcweir #include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp>
38cdf0e10cSrcweir #include <drafts/com/sun/star/script/framework/security/XScriptSecurity.hpp>
39cdf0e10cSrcweir
40cdf0e10cSrcweir #include "ScriptNameResolverImpl.hxx"
41cdf0e10cSrcweir #include "ScriptRuntimeManager.hxx"
42cdf0e10cSrcweir
43cdf0e10cSrcweir using namespace ::rtl;
44cdf0e10cSrcweir using namespace ::com::sun::star;
45cdf0e10cSrcweir using namespace ::com::sun::star::uno;
46cdf0e10cSrcweir using namespace ::drafts::com::sun::star::script::framework;
47cdf0e10cSrcweir
48cdf0e10cSrcweir namespace scripting_runtimemgr
49cdf0e10cSrcweir {
50cdf0e10cSrcweir
51cdf0e10cSrcweir const sal_Char* const LANGUAGE_TO_RESOLVE_ON[] = { "All" }; // should be configurable
52cdf0e10cSrcweir OUString nrs_implName = OUString::createFromAscii(
53cdf0e10cSrcweir "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" );
54cdf0e10cSrcweir OUString nrs_serviceName = OUString::createFromAscii(
55cdf0e10cSrcweir "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" );
56cdf0e10cSrcweir Sequence< OUString > nrs_serviceNames = Sequence< OUString >( &nrs_serviceName, 1 );
57cdf0e10cSrcweir
58cdf0e10cSrcweir const char* const SCRIPTSTORAGEMANAGER_SERVICE =
59cdf0e10cSrcweir "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager";
60cdf0e10cSrcweir
61cdf0e10cSrcweir extern ::rtl_StandardModuleCount s_moduleCount;
62cdf0e10cSrcweir
63cdf0e10cSrcweir // define storages to search
64cdf0e10cSrcweir static ::std::vector< sal_Int32 >* m_pSearchIDs = NULL;
65cdf0e10cSrcweir
66cdf0e10cSrcweir //*************************************************************************
ScriptNameResolverImpl(const Reference<XComponentContext> & xContext)67cdf0e10cSrcweir ScriptNameResolverImpl::ScriptNameResolverImpl(
68cdf0e10cSrcweir const Reference< XComponentContext > & xContext ) :
69cdf0e10cSrcweir m_xContext( xContext, UNO_SET_THROW )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir OSL_TRACE( "< ScriptNameResolverImpl ctor called >\n" );
72cdf0e10cSrcweir validateXRef( m_xContext, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid context" );
73cdf0e10cSrcweir m_xMultiComFac.set( m_xContext->getServiceManager(), UNO_SET_THROW );
74cdf0e10cSrcweir
75cdf0e10cSrcweir if( !m_pSearchIDs )
76cdf0e10cSrcweir {
77cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_mutex );
78cdf0e10cSrcweir if( !m_pSearchIDs )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
81cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool::instance();
82cdf0e10cSrcweir m_pSearchIDs = new ::std::vector< sal_Int32 >();
83cdf0e10cSrcweir m_pSearchIDs->push_back( scriptingConstantsPool.DOC_STORAGE_ID_NOT_SET );
84cdf0e10cSrcweir m_pSearchIDs->push_back( scriptingConstantsPool.USER_STORAGE_ID );
85cdf0e10cSrcweir m_pSearchIDs->push_back( scriptingConstantsPool.SHARED_STORAGE_ID );
86cdf0e10cSrcweir }
87cdf0e10cSrcweir }
88cdf0e10cSrcweir
89cdf0e10cSrcweir s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt );
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir //*************************************************************************
~ScriptNameResolverImpl()93cdf0e10cSrcweir ScriptNameResolverImpl::~ScriptNameResolverImpl()
94cdf0e10cSrcweir {
95cdf0e10cSrcweir OSL_TRACE( "< ScriptNameResolverImpl dtor called >\n" );
96cdf0e10cSrcweir s_moduleCount.modCnt.release( &s_moduleCount.modCnt );
97cdf0e10cSrcweir }
98cdf0e10cSrcweir
99cdf0e10cSrcweir //*************************************************************************
resolve(const::rtl::OUString & scriptURI,Any & invocationCtx)100cdf0e10cSrcweir Reference< storage::XScriptInfo > ScriptNameResolverImpl::resolve(
101cdf0e10cSrcweir const ::rtl::OUString & scriptURI, Any& invocationCtx )
102cdf0e10cSrcweir throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeException )
103cdf0e10cSrcweir {
104cdf0e10cSrcweir
105cdf0e10cSrcweir Reference< storage::XScriptInfo > resolvedName;
106cdf0e10cSrcweir Reference< beans::XPropertySet > xPropSetScriptingContext;
107cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
108cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool::instance();
109cdf0e10cSrcweir
110cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::resolve: in resolve - start" );
111cdf0e10cSrcweir
112cdf0e10cSrcweir if ( sal_False == ( invocationCtx >>= xPropSetScriptingContext ) )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir throw RuntimeException( OUSTR(
115cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : unable to get XScriptingContext from param" ),
116cdf0e10cSrcweir Reference< XInterface > () );
117cdf0e10cSrcweir }
118cdf0e10cSrcweir
119cdf0e10cSrcweir Any any;
120cdf0e10cSrcweir OUString docUri;
121cdf0e10cSrcweir sal_Int32 filesysScriptStorageID = -1;
122cdf0e10cSrcweir Reference < storage::XScriptStorageManager > xScriptStorageMgr;
123cdf0e10cSrcweir sal_Int32 docSid;
124cdf0e10cSrcweir try
125cdf0e10cSrcweir {
126cdf0e10cSrcweir any = xPropSetScriptingContext->getPropertyValue(
127cdf0e10cSrcweir scriptingConstantsPool.DOC_URI );
128cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::resolve: in resolve - got anyUri" );
129cdf0e10cSrcweir if ( sal_False == ( any >>= docUri ) )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir throw RuntimeException( OUSTR(
132cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : unable to get doc Uri from xPropSetScriptingContext" ),
133cdf0e10cSrcweir Reference< XInterface > () );
134cdf0e10cSrcweir }
135cdf0e10cSrcweir any = xPropSetScriptingContext->getPropertyValue(
136cdf0e10cSrcweir scriptingConstantsPool.DOC_STORAGE_ID );
137cdf0e10cSrcweir if ( sal_False == ( any >>= docSid ) )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir throw RuntimeException( OUSTR(
140cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : unable to get doc storage id from xPropSetScriptingContext" ),
141cdf0e10cSrcweir Reference< XInterface > () );
142cdf0e10cSrcweir }
143cdf0e10cSrcweir }
144cdf0e10cSrcweir catch ( Exception & e )
145cdf0e10cSrcweir {
146cdf0e10cSrcweir OUString temp = OUSTR(
147cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : problem with getPropertyValue" );
148cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ),
149cdf0e10cSrcweir Reference< XInterface > () );
150cdf0e10cSrcweir }
151cdf0e10cSrcweir #ifdef _DEBUG
152cdf0e10cSrcweir catch ( ... )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir throw RuntimeException( OUSTR(
155cdf0e10cSrcweir "ScriptNameResolverImpl::resolve Unknown Exception caught - RuntimeException rethrown" ),
156cdf0e10cSrcweir Reference< XInterface > () );
157cdf0e10cSrcweir }
158cdf0e10cSrcweir #endif
159cdf0e10cSrcweir
160cdf0e10cSrcweir
161cdf0e10cSrcweir ::rtl::OString docUriO(
162cdf0e10cSrcweir ::rtl::OUStringToOString( docUri , RTL_TEXTENCODING_ASCII_US ) );
163cdf0e10cSrcweir OSL_TRACE(
164cdf0e10cSrcweir "ScriptNameResolverImpl::resolve: *** >>> DOC URI: %s, doc sid is %d\n",
165cdf0e10cSrcweir docUriO.pData->buffer, docSid );
166cdf0e10cSrcweir
167cdf0e10cSrcweir
168cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::resolve Starting..." );
169cdf0e10cSrcweir OUString docString = OUString::createFromAscii( "location=document" );
170cdf0e10cSrcweir OUString userString = OUString::createFromAscii( "location=user" );
171cdf0e10cSrcweir OUString shareString = OUString::createFromAscii( "location=share" );
172cdf0e10cSrcweir OUString filesysString = OUString::createFromAscii( "location=filesystem" );
173cdf0e10cSrcweir
174cdf0e10cSrcweir // initialise vector with doc, user and share
175cdf0e10cSrcweir
176cdf0e10cSrcweir // m_pSearchIDs is initialised as follows,
177cdf0e10cSrcweir // m_pSearchIDs [ 0 ] empty
178cdf0e10cSrcweir // m_pSearchIDs [ 1 ] user storage id
179cdf0e10cSrcweir // m_pSearchIDs [ 2 ] share " "
180cdf0e10cSrcweir
181cdf0e10cSrcweir ::std::vector< sal_Int32 > m_vSearchIDs = *m_pSearchIDs;
182cdf0e10cSrcweir m_vSearchIDs[ 0 ] = docSid;
183cdf0e10cSrcweir
184cdf0e10cSrcweir if ( scriptURI.indexOf( docString ) != -1 )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir OSL_TRACE("Full resolution available, search document");
187cdf0e10cSrcweir // search in document
188cdf0e10cSrcweir m_vSearchIDs.resize( 1 );
189cdf0e10cSrcweir }
190cdf0e10cSrcweir else if ( scriptURI.indexOf( userString ) != -1 )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir OSL_TRACE("Full resolution available, search user");
193cdf0e10cSrcweir // search in user
194cdf0e10cSrcweir m_vSearchIDs[ 0 ] = ( *m_pSearchIDs )[ 1 ];
195cdf0e10cSrcweir m_vSearchIDs.resize( 1 );
196cdf0e10cSrcweir }
197cdf0e10cSrcweir else if ( scriptURI.indexOf( shareString ) != -1 )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir OSL_TRACE("Full resolution available, search share");
200cdf0e10cSrcweir // search in share
201cdf0e10cSrcweir m_vSearchIDs[ 0 ] = ( *m_pSearchIDs )[ 2 ];
202cdf0e10cSrcweir m_vSearchIDs.resize( 1 );
203cdf0e10cSrcweir }
204cdf0e10cSrcweir else if ( scriptURI.indexOf( filesysString ) != -1 )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir OSL_TRACE("Full resolution available, create & search filesystem");
207cdf0e10cSrcweir OUString filesysURL;
208cdf0e10cSrcweir try
209cdf0e10cSrcweir {
210cdf0e10cSrcweir filesysURL = getFilesysURL( scriptURI );
211cdf0e10cSrcweir }
212cdf0e10cSrcweir catch ( lang::IllegalArgumentException & e )
213cdf0e10cSrcweir {
214cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " );
215cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
216cdf0e10cSrcweir }
217cdf0e10cSrcweir Reference< XInterface > xInterface(
218cdf0e10cSrcweir m_xMultiComFac->createInstanceWithContext(
219cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ),
220cdf0e10cSrcweir m_xContext
221cdf0e10cSrcweir ),
222cdf0e10cSrcweir UNO_SET_THROW
223cdf0e10cSrcweir );
224cdf0e10cSrcweir Reference < ucb::XSimpleFileAccess > xSimpleFileAccess = Reference <
225cdf0e10cSrcweir ucb::XSimpleFileAccess > ( xInterface, UNO_QUERY_THROW );
226cdf0e10cSrcweir
227cdf0e10cSrcweir // do we need to encode this? hope not.
228cdf0e10cSrcweir OSL_TRACE( ">>>> About to create storage for %s",
229cdf0e10cSrcweir ::rtl::OUStringToOString( filesysURL,
230cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer );
231cdf0e10cSrcweir // ask storage manager to create storage
232cdf0e10cSrcweir try
233cdf0e10cSrcweir {
234cdf0e10cSrcweir // need to get the ScriptStorageManager
235cdf0e10cSrcweir xScriptStorageMgr.set( m_xContext->getValueByName(
236cdf0e10cSrcweir scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ), UNO_QUERY_THROW );
237cdf0e10cSrcweir filesysScriptStorageID =
238cdf0e10cSrcweir xScriptStorageMgr->createScriptStorageWithURI(
239cdf0e10cSrcweir xSimpleFileAccess, filesysURL );
240cdf0e10cSrcweir OSL_TRACE( ">>>> Created storage %d - for %s ",
241cdf0e10cSrcweir filesysScriptStorageID, ::rtl::OUStringToOString(
242cdf0e10cSrcweir filesysURL, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
243cdf0e10cSrcweir }
244cdf0e10cSrcweir catch ( RuntimeException & e )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " );
247cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
248cdf0e10cSrcweir }
249cdf0e10cSrcweir m_vSearchIDs[ 0 ] = filesysScriptStorageID;
250cdf0e10cSrcweir m_vSearchIDs.resize( 1 );
251cdf0e10cSrcweir }
252cdf0e10cSrcweir else
253cdf0e10cSrcweir {
254cdf0e10cSrcweir OSL_TRACE("Only partial uri available, search doc, user & share");
255cdf0e10cSrcweir // is this illegal or do we search in a default way
256cdf0e10cSrcweir // if we get to here a uri has been passed in that has:
257cdf0e10cSrcweir // a) not got a location specified
258cdf0e10cSrcweir // b) an illegal location
259cdf0e10cSrcweir
260cdf0e10cSrcweir // detect illegal location
261cdf0e10cSrcweir if ( scriptURI.indexOf( OUString::createFromAscii( "location=" ) ) != -1 )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir OSL_TRACE(
264cdf0e10cSrcweir "ScriptNameResolver::resolve, throwing IllegalArgException" );
265cdf0e10cSrcweir throw lang::IllegalArgumentException(
266cdf0e10cSrcweir OUSTR( "invalid URI: " ).concat( scriptURI ),
267cdf0e10cSrcweir Reference < XInterface > (), 1 );
268cdf0e10cSrcweir
269cdf0e10cSrcweir }
270cdf0e10cSrcweir // leave vSearchIDs take care of the search...
271cdf0e10cSrcweir }
272cdf0e10cSrcweir
273cdf0e10cSrcweir ::std::vector< sal_Int32 >::const_iterator iter;
274cdf0e10cSrcweir ::std::vector< sal_Int32 >::const_iterator iterEnd = m_vSearchIDs.end();
275cdf0e10cSrcweir
276cdf0e10cSrcweir for ( iter = m_vSearchIDs.begin() ; iter != iterEnd; ++iter )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir try
279cdf0e10cSrcweir {
280cdf0e10cSrcweir OSL_TRACE( "** about to resolve from storage using id %d from vector of size %d",
281cdf0e10cSrcweir *iter, m_vSearchIDs.size() );
282cdf0e10cSrcweir if ( ( resolvedName = resolveURIFromStorageID( *iter, docUri, scriptURI ) ).is() )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir OSL_TRACE( "found match in uri from storage %d", *iter );
285cdf0e10cSrcweir xPropSetScriptingContext->setPropertyValue(
286cdf0e10cSrcweir scriptingConstantsPool.RESOLVED_STORAGE_ID, makeAny(*iter) );
287cdf0e10cSrcweir break;
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
290cdf0e10cSrcweir }
291cdf0e10cSrcweir catch ( css::security::AccessControlException & e )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir // no execute permission
294cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::resolve : AccessControlException " );
295cdf0e10cSrcweir continue;
296cdf0e10cSrcweir }
297cdf0e10cSrcweir catch ( beans::UnknownPropertyException & e )
298cdf0e10cSrcweir {
299cdf0e10cSrcweir OUString temp = OUSTR(
300cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : UnknownPropertyException" );
301cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ),
302cdf0e10cSrcweir Reference< XInterface > () );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir catch ( beans::PropertyVetoException & e )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir OUString temp = OUSTR(
307cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : PropertyVetoException " );
308cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ),
309cdf0e10cSrcweir Reference< XInterface > () );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir catch ( lang::IllegalArgumentException & e )
312cdf0e10cSrcweir {
313cdf0e10cSrcweir OUString temp = OUSTR(
314cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : IllegalArgumentException " );
315cdf0e10cSrcweir throw lang::IllegalArgumentException( temp.concat( e.Message ),
316cdf0e10cSrcweir Reference< XInterface > (), e.ArgumentPosition );
317cdf0e10cSrcweir }
318cdf0e10cSrcweir catch ( lang::WrappedTargetException & e )
319cdf0e10cSrcweir {
320cdf0e10cSrcweir OUString temp = OUSTR(
321cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : WrappedTargetException " );
322cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ),
323cdf0e10cSrcweir Reference< XInterface > () );
324cdf0e10cSrcweir }
325cdf0e10cSrcweir catch ( Exception & e )
326cdf0e10cSrcweir {
327cdf0e10cSrcweir OSL_TRACE(
328cdf0e10cSrcweir "Exception thrown by storage %d, failed to match uri: %s",
329cdf0e10cSrcweir *iter,
330cdf0e10cSrcweir ::rtl::OUStringToOString( e.Message,
331cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer );
332cdf0e10cSrcweir OUString temp = OUSTR(
333cdf0e10cSrcweir "ScriptNameResolverImpl::resolve : unknown exception" );
334cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ),
335cdf0e10cSrcweir Reference< XInterface > () );
336cdf0e10cSrcweir }
337cdf0e10cSrcweir #ifdef _DEBUG
338cdf0e10cSrcweir catch ( ... )
339cdf0e10cSrcweir {
340cdf0e10cSrcweir OSL_TRACE(
341cdf0e10cSrcweir "unknown exception thrown by storage %d, failed to match uri",
342cdf0e10cSrcweir *iter );
343cdf0e10cSrcweir OUString temp = OUSTR(
344cdf0e10cSrcweir "ScriptNameResolverImpl::resolve Unknown exception caught - RuntimeException rethrown" );
345cdf0e10cSrcweir throw RuntimeException( temp,
346cdf0e10cSrcweir Reference< XInterface > () );
347cdf0e10cSrcweir }
348cdf0e10cSrcweir #endif
349cdf0e10cSrcweir
350cdf0e10cSrcweir }
351cdf0e10cSrcweir if ( !resolvedName.is() )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir if( filesysScriptStorageID > 2 )
354cdf0e10cSrcweir {
355cdf0e10cSrcweir // get the filesys storage and dispose of it
356cdf0e10cSrcweir Reference< XInterface > xScriptStorage( xScriptStorageMgr->getScriptStorage( filesysScriptStorageID ), UNO_SET_THROW );
357cdf0e10cSrcweir Reference< storage::XScriptInfoAccess > xScriptInfoAccess = Reference<
358cdf0e10cSrcweir storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW );
359cdf0e10cSrcweir Sequence< Reference< storage::XScriptInfo > > results =
360cdf0e10cSrcweir xScriptInfoAccess->getAllImplementations( );
361cdf0e10cSrcweir Reference < lang::XEventListener > xEL_ScriptStorageMgr(( xScriptStorageMgr ,UNO_QUERY_THROW );
362cdf0e10cSrcweir lang::EventObject event( results[ 0 ] );
363cdf0e10cSrcweir xEL_ScriptStorageMgr->disposing( event );
364cdf0e10cSrcweir }
365cdf0e10cSrcweir throw lang::IllegalArgumentException( OUSTR(
366cdf0e10cSrcweir "ScriptNameResolverImpl::resolve: no script found for uri=" ).concat( scriptURI ),
367cdf0e10cSrcweir Reference< XInterface > (), 0 );
368cdf0e10cSrcweir }
369cdf0e10cSrcweir return resolvedName;
370cdf0e10cSrcweir }
371cdf0e10cSrcweir
372cdf0e10cSrcweir //*************************************************************************
373cdf0e10cSrcweir OUString SAL_CALL
374cdf0e10cSrcweir ScriptNameResolverImpl::getImplementationName( )
375cdf0e10cSrcweir throw( RuntimeException )
376cdf0e10cSrcweir {
377cdf0e10cSrcweir return nrs_implName;
378cdf0e10cSrcweir }
379cdf0e10cSrcweir
380cdf0e10cSrcweir //*************************************************************************
381cdf0e10cSrcweir sal_Bool SAL_CALL
382cdf0e10cSrcweir ScriptNameResolverImpl::supportsService( const OUString& serviceName )
383cdf0e10cSrcweir throw( RuntimeException )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir OUString const * pNames = nrs_serviceNames.getConstArray();
386cdf0e10cSrcweir for ( sal_Int32 nPos = nrs_serviceNames.getLength(); nPos--; )
387cdf0e10cSrcweir {
388cdf0e10cSrcweir if ( serviceName.equals( pNames[ nPos ] ) )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir return sal_True;
391cdf0e10cSrcweir }
392cdf0e10cSrcweir }
393cdf0e10cSrcweir return sal_False;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir
396cdf0e10cSrcweir //*************************************************************************
397cdf0e10cSrcweir
398cdf0e10cSrcweir Reference< storage::XScriptInfo >
399cdf0e10cSrcweir ScriptNameResolverImpl::resolveURIFromStorageID
400cdf0e10cSrcweir ( sal_Int32 sid, const ::rtl::OUString & docURI,
401cdf0e10cSrcweir const ::rtl::OUString& scriptURI )
402cdf0e10cSrcweir SAL_THROW ( ( lang::IllegalArgumentException, css::security::AccessControlException, RuntimeException ) )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir Reference< storage::XScriptInfo > resolvedScriptInfo;
405cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
406cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool::instance();
407cdf0e10cSrcweir if ( sid == scriptingConstantsPool.DOC_STORAGE_ID_NOT_SET )
408cdf0e10cSrcweir {
409cdf0e10cSrcweir OSL_TRACE( "@@@@ **** ScriptNameResolverImpl::resolve DOC_STORAGE_ID_NOT_SET" );
410cdf0e10cSrcweir return resolvedScriptInfo;
411cdf0e10cSrcweir }
412cdf0e10cSrcweir try
413cdf0e10cSrcweir {
414cdf0e10cSrcweir OUString permissionURI = docURI;
415cdf0e10cSrcweir OUString filesysString = OUString::createFromAscii( "location=filesystem" );
416cdf0e10cSrcweir if ( scriptURI.indexOf( filesysString ) != -1 )
417cdf0e10cSrcweir {
418cdf0e10cSrcweir // in the case of filesys scripts we're checking whether the
419cdf0e10cSrcweir // location of the script, rather than the location of the document,
420cdf0e10cSrcweir // has execute permission
421cdf0e10cSrcweir try
422cdf0e10cSrcweir {
423cdf0e10cSrcweir permissionURI = getFilesysURL( scriptURI );
424cdf0e10cSrcweir }
425cdf0e10cSrcweir catch ( lang::IllegalArgumentException & e )
426cdf0e10cSrcweir {
427cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::resolveFromURI: " );
428cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
429cdf0e10cSrcweir }
430cdf0e10cSrcweir }
431cdf0e10cSrcweir Reference< storage::XScriptInfoAccess > storage( getStorageInstance( sid, permissionURI ), UNO_SET_THROW );
432cdf0e10cSrcweir Sequence< Reference< storage::XScriptInfo > > results =
433cdf0e10cSrcweir storage->getImplementations( scriptURI );
434cdf0e10cSrcweir
435cdf0e10cSrcweir const sal_Int32 length = results.getLength();
436cdf0e10cSrcweir
437cdf0e10cSrcweir if ( !length )
438cdf0e10cSrcweir {
439cdf0e10cSrcweir return resolvedScriptInfo;
440cdf0e10cSrcweir }
441cdf0e10cSrcweir
442cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::resolve Got some results..." );
443cdf0e10cSrcweir // if we get results, just return first in list,
444cdf0e10cSrcweir // storage has already matched language, function name etc. if
445cdf0e10cSrcweir // that information was in the uri
446cdf0e10cSrcweir resolvedScriptInfo = results[ 0 ];
447cdf0e10cSrcweir }
448cdf0e10cSrcweir catch ( css::security::AccessControlException & ace )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir OUString temp = OUSTR(
451cdf0e10cSrcweir "ScriptRuntimeManager::resolveURIFromStorageID AccessControlException: " );
452cdf0e10cSrcweir throw css::security::AccessControlException( temp.concat( ace.Message ),
453cdf0e10cSrcweir Reference< XInterface > (),
454cdf0e10cSrcweir ace.LackingPermission );
455cdf0e10cSrcweir }
456cdf0e10cSrcweir catch ( lang::IllegalArgumentException & iae )
457cdf0e10cSrcweir {
458cdf0e10cSrcweir OUString temp = OUSTR(
459cdf0e10cSrcweir "ScriptRuntimeManager::resolveURIFromStorageID IllegalArgumentException: " );
460cdf0e10cSrcweir throw lang::IllegalArgumentException( temp.concat( iae.Message ),
461cdf0e10cSrcweir Reference< XInterface > (),
462cdf0e10cSrcweir iae.ArgumentPosition );
463cdf0e10cSrcweir }
464cdf0e10cSrcweir catch ( RuntimeException & re )
465cdf0e10cSrcweir {
466cdf0e10cSrcweir OUString temp = OUSTR(
467cdf0e10cSrcweir "ScriptRuntimeManager::resolveURIFromStorageID RuntimeException: " );
468cdf0e10cSrcweir throw RuntimeException( temp.concat( re.Message ),
469cdf0e10cSrcweir Reference< XInterface > () );
470cdf0e10cSrcweir }
471cdf0e10cSrcweir catch ( Exception & e )
472cdf0e10cSrcweir {
473cdf0e10cSrcweir OUString temp = OUSTR(
474cdf0e10cSrcweir "ScriptNameResolverImpl::resolveURIFromStorageID : Exception caught - RuntimeException rethrown" );
475cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ),
476cdf0e10cSrcweir Reference< XInterface > () );
477cdf0e10cSrcweir }
478cdf0e10cSrcweir #ifdef _DEBUG
479cdf0e10cSrcweir catch ( ... )
480cdf0e10cSrcweir {
481cdf0e10cSrcweir throw RuntimeException( OUSTR(
482cdf0e10cSrcweir "ScriptNameResolverImpl::resolveURIFromStorageID Unknown exception caught - RuntimeException rethrown" ),
483cdf0e10cSrcweir Reference< XInterface > () );
484cdf0e10cSrcweir }
485cdf0e10cSrcweir #endif
486cdf0e10cSrcweir return resolvedScriptInfo;
487cdf0e10cSrcweir }
488cdf0e10cSrcweir //*************************************************************************
489cdf0e10cSrcweir
490cdf0e10cSrcweir Reference< storage::XScriptInfoAccess >
491cdf0e10cSrcweir
492cdf0e10cSrcweir ScriptNameResolverImpl::getStorageInstance( sal_Int32 sid,
493cdf0e10cSrcweir const ::rtl::OUString & permissionURI ) SAL_THROW ( ( RuntimeException, css::security::AccessControlException, lang::IllegalArgumentException ) )
494cdf0e10cSrcweir {
495cdf0e10cSrcweir Reference< storage::XScriptInfoAccess > xScriptInfoAccess;
496cdf0e10cSrcweir try
497cdf0e10cSrcweir {
498cdf0e10cSrcweir Reference< XInterface > xInterface( m_xContext->getValueByName(
499cdf0e10cSrcweir OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ), UNO_QUERY_THROW );
500cdf0e10cSrcweir // check that we have permissions for this storage
501cdf0e10cSrcweir Reference< dcsssf::security::XScriptSecurity > xScriptSecurity( xInterface, UNO_QUERY_THROW );
502cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
503cdf0e10cSrcweir scripting_constants::ScriptingConstantsPool::instance();
504cdf0e10cSrcweir // if we dealing with a document storage (ie. not user or share
505cdf0e10cSrcweir // we need to check the permission
506cdf0e10cSrcweir if( ( sid != scriptingConstantsPool.USER_STORAGE_ID ) &&
507cdf0e10cSrcweir ( sid != scriptingConstantsPool.SHARED_STORAGE_ID ) )
508cdf0e10cSrcweir {
509cdf0e10cSrcweir xScriptSecurity->checkPermission( permissionURI,
510cdf0e10cSrcweir OUString::createFromAscii( "execute" ) );
511cdf0e10cSrcweir // if we get here, the checkPermission hasn't thrown an
512cdf0e10cSrcweir // AccessControlException, ie. permission has been granted
513cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::getStorageInstance: got execute permission for ID=%d", sid );
514cdf0e10cSrcweir }
515cdf0e10cSrcweir Reference< storage::XScriptStorageManager > xScriptStorageManager( xInterface, UNO_QUERY_THROW );
516cdf0e10cSrcweir Reference< XInterface > xScriptStorage( ScriptStorageManager->getScriptStorage( sid ), UNO_SET_THROW );
517cdf0e10cSrcweir xScriptInfoAccess.set( xScriptStorage, UNO_QUERY_THROW );
518cdf0e10cSrcweir }
519cdf0e10cSrcweir catch ( lang::IllegalArgumentException & e )
520cdf0e10cSrcweir {
521cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
522cdf0e10cSrcweir throw lang::IllegalArgumentException( temp.concat( e.Message ),
523cdf0e10cSrcweir Reference< XInterface >(), e.ArgumentPosition );
524cdf0e10cSrcweir }
525cdf0e10cSrcweir catch ( css::security::AccessControlException & e )
526cdf0e10cSrcweir {
527cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: AccessControlException " );
528cdf0e10cSrcweir throw css::security::AccessControlException( temp.concat( e.Message ), Reference< XInterface >(), e.LackingPermission );
529cdf0e10cSrcweir }
530cdf0e10cSrcweir catch ( RuntimeException & re )
531cdf0e10cSrcweir {
532cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
533cdf0e10cSrcweir throw RuntimeException( temp.concat( re.Message ), Reference< XInterface >() );
534cdf0e10cSrcweir }
535cdf0e10cSrcweir catch ( Exception & e )
536cdf0e10cSrcweir {
537cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
538cdf0e10cSrcweir throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
539cdf0e10cSrcweir }
540cdf0e10cSrcweir return xScriptInfoAccess;
541cdf0e10cSrcweir }
542cdf0e10cSrcweir //*************************************************************************
543cdf0e10cSrcweir OUString
544cdf0e10cSrcweir ScriptNameResolverImpl::getFilesysURL( const OUString & scriptURI )
545cdf0e10cSrcweir throw( lang::IllegalArgumentException )
546cdf0e10cSrcweir {
547cdf0e10cSrcweir OUString filePath;
548cdf0e10cSrcweir OUString fileName;
549cdf0e10cSrcweir OUString filesysString = OUString::createFromAscii( "location=filesystem" );
550cdf0e10cSrcweir sal_Int32 locationPos = scriptURI.indexOf( filesysString );
551cdf0e10cSrcweir // expect location=filesys:file:///foo/bar/myscript.bsh etc
552cdf0e10cSrcweir // except the file url at this point is encoded
553cdf0e10cSrcweir // so we should be ok searching for the '&'
554cdf0e10cSrcweir sal_Int32 filesysStrLen = filesysString.getLength() + 1;
555cdf0e10cSrcweir sal_Int32 endOfLocn = scriptURI.indexOf( '&', locationPos );
556cdf0e10cSrcweir if (endOfLocn == -1 )
557cdf0e10cSrcweir {
558cdf0e10cSrcweir filePath = scriptURI.copy( locationPos + filesysString.getLength() + 1 );
559cdf0e10cSrcweir }
560cdf0e10cSrcweir else
561cdf0e10cSrcweir {
562cdf0e10cSrcweir filePath = scriptURI.copy( locationPos + filesysStrLen,
563cdf0e10cSrcweir endOfLocn - locationPos - filesysStrLen );
564cdf0e10cSrcweir }
565cdf0e10cSrcweir //file name shoul also be encoded so again ok to search for '&'
566cdf0e10cSrcweir OUString functionKey = OUString::createFromAscii( "function=" );
567cdf0e10cSrcweir sal_Int32 functionKeyLength = functionKey.getLength();
568cdf0e10cSrcweir sal_Int32 functionNamePos = scriptURI.indexOf( functionKey );
569cdf0e10cSrcweir if ( functionNamePos > 0 )
570cdf0e10cSrcweir {
571cdf0e10cSrcweir sal_Int32 endOfFn = scriptURI.indexOf( '&', functionNamePos );
572cdf0e10cSrcweir if ( endOfFn == -1 )
573cdf0e10cSrcweir {
574cdf0e10cSrcweir fileName = scriptURI.copy( functionNamePos + functionKeyLength );
575cdf0e10cSrcweir }
576cdf0e10cSrcweir else
577cdf0e10cSrcweir {
578cdf0e10cSrcweir fileName = scriptURI.copy( functionNamePos + functionKeyLength,
579cdf0e10cSrcweir endOfFn - functionNamePos - functionKeyLength );
580cdf0e10cSrcweir }
581cdf0e10cSrcweir }
582cdf0e10cSrcweir else
583cdf0e10cSrcweir {
584cdf0e10cSrcweir // we need to throw
585cdf0e10cSrcweir OUString temp = OUSTR( "ScriptNameResolverImpl::getFilesysURL: error getting the filesysURL" );
586cdf0e10cSrcweir throw lang::IllegalArgumentException( temp, Reference< XInterface >(), 0 );
587cdf0e10cSrcweir }
588cdf0e10cSrcweir filePath+=fileName;
589cdf0e10cSrcweir OSL_TRACE( "ScriptNameResolverImpl::getFilesysURL: filesys URL = %s",
590cdf0e10cSrcweir ::rtl::OUStringToOString( filePath,
591cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).pData->buffer );
592cdf0e10cSrcweir return filePath;
593cdf0e10cSrcweir }
594cdf0e10cSrcweir //*************************************************************************
595cdf0e10cSrcweir Sequence<OUString> SAL_CALL
596cdf0e10cSrcweir ScriptNameResolverImpl::getSupportedServiceNames( )
597cdf0e10cSrcweir throw( RuntimeException )
598cdf0e10cSrcweir {
599cdf0e10cSrcweir return nrs_serviceNames;
600cdf0e10cSrcweir }
601cdf0e10cSrcweir
602cdf0e10cSrcweir //*************************************************************************
603cdf0e10cSrcweir Reference< XInterface > SAL_CALL scriptnri_create(
604cdf0e10cSrcweir Reference< XComponentContext > const & xComponentContext )
605cdf0e10cSrcweir SAL_THROW( ( Exception ) )
606cdf0e10cSrcweir {
607cdf0e10cSrcweir return ( cppu::OWeakObject * ) new ScriptNameResolverImpl( xComponentContext );
608cdf0e10cSrcweir }
609cdf0e10cSrcweir
610cdf0e10cSrcweir //*************************************************************************
611cdf0e10cSrcweir Sequence< OUString > scriptnri_getSupportedServiceNames() SAL_THROW( () )
612cdf0e10cSrcweir {
613cdf0e10cSrcweir return nrs_serviceNames;
614cdf0e10cSrcweir }
615cdf0e10cSrcweir
616cdf0e10cSrcweir //*************************************************************************
617cdf0e10cSrcweir OUString scriptnri_getImplementationName() SAL_THROW( () )
618cdf0e10cSrcweir {
619cdf0e10cSrcweir return nrs_implName;
620cdf0e10cSrcweir }
621cdf0e10cSrcweir } // namespace scripting_runtimemgr
622