1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_scripting.hxx"
26*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
27*b1cdbd2cSJim Jagielski #include <osl/time.h>
28*b1cdbd2cSJim Jagielski #include <cppuhelper/implementationentry.hxx>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/CommandAbortedException.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSource.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <util/util.hxx>
38*b1cdbd2cSJim Jagielski #include <rtl/uri.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include "ScriptData.hxx"
42*b1cdbd2cSJim Jagielski #include "ScriptInfo.hxx"
43*b1cdbd2cSJim Jagielski #include "ScriptStorage.hxx"
44*b1cdbd2cSJim Jagielski #include "ScriptElement.hxx"
45*b1cdbd2cSJim Jagielski #include "ScriptMetadataImporter.hxx"
46*b1cdbd2cSJim Jagielski #include "ScriptURI.hxx"
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski using namespace ::rtl;
49*b1cdbd2cSJim Jagielski using namespace ::cppu;
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
52*b1cdbd2cSJim Jagielski using namespace ::drafts::com::sun::star::script::framework;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski namespace scripting_impl
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski ScriptLanguages_hash* ScriptStorage::mh_scriptLangs = NULL;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski const sal_Char* const SERVICE_NAME =
60*b1cdbd2cSJim Jagielski     "drafts.com.sun.star.script.framework.storage.ScriptStorage";
61*b1cdbd2cSJim Jagielski const sal_Char* const IMPL_NAME =
62*b1cdbd2cSJim Jagielski     "drafts.com.sun.star.script.framework.storage.ScriptStorage";
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski const sal_Char * const SCRIPT_DIR = "/Scripts";
65*b1cdbd2cSJim Jagielski const sal_Char * const SCRIPT_PARCEL = "/parcel-descriptor.xml";
66*b1cdbd2cSJim Jagielski const sal_Char * const SCRIPT_PARCEL_NAME_ONLY = "parcel-descriptor";
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski static OUString ss_implName = OUString::createFromAscii( IMPL_NAME );
69*b1cdbd2cSJim Jagielski static OUString ss_serviceName = OUString::createFromAscii( SERVICE_NAME );
70*b1cdbd2cSJim Jagielski static Sequence< OUString > ss_serviceNames =
71*b1cdbd2cSJim Jagielski     Sequence< OUString >( &ss_serviceName, 1 );
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski const sal_uInt16 NUMBER_STORAGE_INITIALIZE_ARGS = 3;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski //extern ::rtl_StandardModuleCount s_moduleCount;
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski //*************************************************************************
ScriptStorage(const Reference<XComponentContext> & xContext)80*b1cdbd2cSJim Jagielski ScriptStorage::ScriptStorage( const Reference <
81*b1cdbd2cSJim Jagielski                               XComponentContext > & xContext )
82*b1cdbd2cSJim Jagielski throw ( RuntimeException )
83*b1cdbd2cSJim Jagielski         : m_xContext( xContext, UNO_SET_THROW ), m_bInitialised( false )
84*b1cdbd2cSJim Jagielski {
85*b1cdbd2cSJim Jagielski     OSL_TRACE( "< ScriptStorage ctor called >\n" );
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW );
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski     if( !mh_scriptLangs )
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski         ::osl::MutexGuard guard( ::osl::Mutex::getGlobalMutex() );
92*b1cdbd2cSJim Jagielski         if( !mh_scriptLangs )
93*b1cdbd2cSJim Jagielski         {
94*b1cdbd2cSJim Jagielski             mh_scriptLangs = new ScriptLanguages_hash();
95*b1cdbd2cSJim Jagielski             Reference< lang::XMultiServiceFactory > xConfigProvFactory(
96*b1cdbd2cSJim Jagielski                 m_xMgr->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" ), m_xContext ),
97*b1cdbd2cSJim Jagielski                 UNO_QUERY_THROW );
98*b1cdbd2cSJim Jagielski             // create an instance of the ConfigurationAccess for accessing the
99*b1cdbd2cSJim Jagielski             // scripting runtime settings
100*b1cdbd2cSJim Jagielski             beans::PropertyValue configPath;
101*b1cdbd2cSJim Jagielski             configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" );
102*b1cdbd2cSJim Jagielski             configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Scripting/ScriptRuntimes" );
103*b1cdbd2cSJim Jagielski             Sequence < Any > aargs( 1 );
104*b1cdbd2cSJim Jagielski             aargs[ 0 ] <<= configPath;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski             Reference< container::XNameAccess > xNameAccess(
107*b1cdbd2cSJim Jagielski                 xConfigProvFactory->createInstanceWithArguments(
108*b1cdbd2cSJim Jagielski                     OUString::createFromAscii( "com.sun.star.configuration.ConfigurationAccess" ),
109*b1cdbd2cSJim Jagielski                     aargs
110*b1cdbd2cSJim Jagielski                 ),
111*b1cdbd2cSJim Jagielski                 UNO_QUERY_THROW );
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski             Sequence< OUString > names = xNameAccess->getElementNames();
114*b1cdbd2cSJim Jagielski             for( int i = 0 ; i < names.getLength() ; i++ )
115*b1cdbd2cSJim Jagielski             {
116*b1cdbd2cSJim Jagielski                 OSL_TRACE(  "Getting propertyset for Lang=%s",
117*b1cdbd2cSJim Jagielski                     ::rtl::OUStringToOString( names[i], RTL_TEXTENCODING_ASCII_US ).pData->buffer );
118*b1cdbd2cSJim Jagielski                 Reference< beans::XPropertySet > xPropSet( xNameAccess->getByName( names[i] ), UNO_QUERY_THROW );
119*b1cdbd2cSJim Jagielski                 Any aProp = xPropSet->getPropertyValue(
120*b1cdbd2cSJim Jagielski                         OUString::createFromAscii( "SupportedFileExtensions") );
121*b1cdbd2cSJim Jagielski                 Sequence< OUString > extns;
122*b1cdbd2cSJim Jagielski                 if( sal_False == ( aProp >>= extns ) )
123*b1cdbd2cSJim Jagielski                 {
124*b1cdbd2cSJim Jagielski                     throw RuntimeException(
125*b1cdbd2cSJim Jagielski                         OUSTR( "ScriptStorage:ScriptStorage: can't get runtime extensions" ),
126*b1cdbd2cSJim Jagielski                         Reference< XInterface > () );
127*b1cdbd2cSJim Jagielski                 }
128*b1cdbd2cSJim Jagielski                 for( int j = 0 ; j < extns.getLength() ; j++ )
129*b1cdbd2cSJim Jagielski                 {
130*b1cdbd2cSJim Jagielski                     OSL_TRACE(  "Adding Lang=%s, Extn=%s\n",
131*b1cdbd2cSJim Jagielski                         ::rtl::OUStringToOString( names[i], RTL_TEXTENCODING_ASCII_US ).pData->buffer,
132*b1cdbd2cSJim Jagielski                         ::rtl::OUStringToOString( extns[j], RTL_TEXTENCODING_ASCII_US ).pData->buffer );
133*b1cdbd2cSJim Jagielski                     (*mh_scriptLangs)[ extns[j] ] =
134*b1cdbd2cSJim Jagielski                         names[i];
135*b1cdbd2cSJim Jagielski                 }
136*b1cdbd2cSJim Jagielski             }
137*b1cdbd2cSJim Jagielski         }
138*b1cdbd2cSJim Jagielski     }
139*b1cdbd2cSJim Jagielski //    s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt );
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski //*************************************************************************
~ScriptStorage()143*b1cdbd2cSJim Jagielski ScriptStorage::~ScriptStorage() SAL_THROW( () )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski     OSL_TRACE( "< ScriptStorage dtor called >\n" );
146*b1cdbd2cSJim Jagielski //    s_moduleCount.modCnt.release( &s_moduleCount.modCnt );
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski //*************************************************************************
150*b1cdbd2cSJim Jagielski void
initialize(const Sequence<Any> & args)151*b1cdbd2cSJim Jagielski ScriptStorage::initialize( const Sequence <Any> & args )
152*b1cdbd2cSJim Jagielski throw ( RuntimeException, Exception )
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski     OSL_TRACE( "Entering ScriptStorage::initialize\n" );
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     // Should not be renitialised
157*b1cdbd2cSJim Jagielski     if ( m_bInitialised )
158*b1cdbd2cSJim Jagielski     {
159*b1cdbd2cSJim Jagielski         throw RuntimeException(
160*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::initalize already initialized" ),
161*b1cdbd2cSJim Jagielski             Reference<XInterface> () );
162*b1cdbd2cSJim Jagielski     }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     {   // Protect member variable writes
165*b1cdbd2cSJim Jagielski         ::osl::Guard< osl::Mutex > aGuard( m_mutex );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski         // Check args
168*b1cdbd2cSJim Jagielski         if ( args.getLength() != NUMBER_STORAGE_INITIALIZE_ARGS )
169*b1cdbd2cSJim Jagielski         {
170*b1cdbd2cSJim Jagielski             OSL_TRACE( "ScriptStorage::initialize: got wrong number of args\n" );
171*b1cdbd2cSJim Jagielski             throw RuntimeException(
172*b1cdbd2cSJim Jagielski                 OUSTR( "Invalid number of arguments provided!" ),
173*b1cdbd2cSJim Jagielski                 Reference< XInterface >() );
174*b1cdbd2cSJim Jagielski         }
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski         if ( sal_False == ( args[ 0 ] >>= m_xSimpleFileAccess ) )
177*b1cdbd2cSJim Jagielski         {
178*b1cdbd2cSJim Jagielski             throw RuntimeException(
179*b1cdbd2cSJim Jagielski                 OUSTR( "Invalid XSimpleFileAccess argument provided!" ),
180*b1cdbd2cSJim Jagielski                 Reference< XInterface >() );
181*b1cdbd2cSJim Jagielski         }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski         if ( sal_False == ( args[ 1 ] >>= m_scriptStorageID ) )
184*b1cdbd2cSJim Jagielski         {
185*b1cdbd2cSJim Jagielski             throw RuntimeException(
186*b1cdbd2cSJim Jagielski                 OUSTR( "Invalid ScriptStorage ID argument provided!" ),
187*b1cdbd2cSJim Jagielski                 Reference< XInterface >() );
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski         }
190*b1cdbd2cSJim Jagielski         if ( sal_False == ( args[ 2 ] >>= m_stringUri ) )
191*b1cdbd2cSJim Jagielski         {
192*b1cdbd2cSJim Jagielski             throw RuntimeException(
193*b1cdbd2cSJim Jagielski                 OUSTR( "Invalid String Uri argument provided!" ),
194*b1cdbd2cSJim Jagielski                 Reference< XInterface >() );
195*b1cdbd2cSJim Jagielski         }
196*b1cdbd2cSJim Jagielski     } // End - Protect member variable writes
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     OSL_TRACE(  "uri: %s\n", ::rtl::OUStringToOString(
199*b1cdbd2cSJim Jagielski         m_stringUri, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     try
202*b1cdbd2cSJim Jagielski     {
203*b1cdbd2cSJim Jagielski         // need to check for what???
204*b1cdbd2cSJim Jagielski         // what we have is a URI for the filesystem or document
205*b1cdbd2cSJim Jagielski         // we need to check of the last element in the path has an
206*b1cdbd2cSJim Jagielski         // extension that is associated with a script (eg. .bsh, .js etc)
207*b1cdbd2cSJim Jagielski         OUString fileExtension = getFileExtension( m_stringUri );
208*b1cdbd2cSJim Jagielski         // and see if this is in our scripts map
209*b1cdbd2cSJim Jagielski         ScriptLanguages_hash::iterator h_it = mh_scriptLangs->find( fileExtension );
210*b1cdbd2cSJim Jagielski         if ( h_it != mh_scriptLangs->end() )
211*b1cdbd2cSJim Jagielski         {
212*b1cdbd2cSJim Jagielski             createForFilesystem( fileExtension );
213*b1cdbd2cSJim Jagielski         }
214*b1cdbd2cSJim Jagielski         else
215*b1cdbd2cSJim Jagielski         {
216*b1cdbd2cSJim Jagielski             create();
217*b1cdbd2cSJim Jagielski         }
218*b1cdbd2cSJim Jagielski     }
219*b1cdbd2cSJim Jagielski     catch ( RuntimeException & re )
220*b1cdbd2cSJim Jagielski     {
221*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::initialize" );
222*b1cdbd2cSJim Jagielski         throw RuntimeException(
223*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::initalize RuntimeException: " ).concat( re.Message ),
224*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
225*b1cdbd2cSJim Jagielski     }
226*b1cdbd2cSJim Jagielski     catch ( Exception & ue )
227*b1cdbd2cSJim Jagielski     {
228*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::Exception in ScriptStorage::initialize" );
229*b1cdbd2cSJim Jagielski         throw RuntimeException(
230*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::initalize Exception: " ).concat( ue.Message ),
231*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
232*b1cdbd2cSJim Jagielski     }
233*b1cdbd2cSJim Jagielski #ifdef _DEBUG
234*b1cdbd2cSJim Jagielski     catch ( ... )
235*b1cdbd2cSJim Jagielski     {
236*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught unknown Exception in ScriptStorage::initialize" );
237*b1cdbd2cSJim Jagielski         throw RuntimeException(
238*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::initalize unknown exception: " ),
239*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
240*b1cdbd2cSJim Jagielski     }
241*b1cdbd2cSJim Jagielski #endif
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski     OSL_TRACE( "Parsed the XML\n" );
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     m_bInitialised = true;
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski void
create()249*b1cdbd2cSJim Jagielski ScriptStorage::create()
250*b1cdbd2cSJim Jagielski throw ( RuntimeException, Exception )
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski     ::osl::Guard< osl::Mutex > aGuard( m_mutex );
253*b1cdbd2cSJim Jagielski     try
254*b1cdbd2cSJim Jagielski     {
255*b1cdbd2cSJim Jagielski         // clear existing hashmap - rebuilding from scratch to avoid having
256*b1cdbd2cSJim Jagielski         // to search for deleted elements on refresh
257*b1cdbd2cSJim Jagielski         mh_implementations.clear();
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         OUString xStringUri(m_stringUri);
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski         ScriptMetadataImporter* SMI = new ScriptMetadataImporter( m_xContext );
262*b1cdbd2cSJim Jagielski         Reference< xml::sax::XExtendedDocumentHandler > xSMI( SMI, UNO_SET_THROW );
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski         xStringUri = xStringUri.concat( ::rtl::OUString::createFromAscii(
265*b1cdbd2cSJim Jagielski             SCRIPT_DIR ) );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski        // No Scripts directory - just return
268*b1cdbd2cSJim Jagielski        if ( ! m_xSimpleFileAccess->isFolder( xStringUri ) )
269*b1cdbd2cSJim Jagielski        {
270*b1cdbd2cSJim Jagielski             OSL_TRACE( "ScriptStorage::initialize: no Scripts dir for this storage - install problem\n" );
271*b1cdbd2cSJim Jagielski            return;
272*b1cdbd2cSJim Jagielski        }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski         // get the list of language folders under the Scripts directory
275*b1cdbd2cSJim Jagielski         Sequence< ::rtl::OUString > languageDirs =
276*b1cdbd2cSJim Jagielski             m_xSimpleFileAccess->getFolderContents( xStringUri, true );
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski         Reference< io::XInputStream > xInput;
279*b1cdbd2cSJim Jagielski         sal_Int32 languageDirsLength = languageDirs.getLength();
280*b1cdbd2cSJim Jagielski         for ( sal_Int32 i = 0; i < languageDirsLength ; ++i )
281*b1cdbd2cSJim Jagielski         {
282*b1cdbd2cSJim Jagielski             OSL_TRACE(  "contains: %s\n", ::rtl::OUStringToOString(
283*b1cdbd2cSJim Jagielski                 languageDirs[ i ], RTL_TEXTENCODING_ASCII_US ).pData->buffer );
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski             if ( ! m_xSimpleFileAccess->isFolder( languageDirs[ i ] ) )
286*b1cdbd2cSJim Jagielski             {
287*b1cdbd2cSJim Jagielski                 continue;
288*b1cdbd2cSJim Jagielski             }
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski             //get the list of parcel folders for each language folder
291*b1cdbd2cSJim Jagielski             // under Scripts
292*b1cdbd2cSJim Jagielski             Sequence< ::rtl::OUString > parcelDirs =
293*b1cdbd2cSJim Jagielski                 m_xSimpleFileAccess->getFolderContents( languageDirs[ i ], true );
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski             sal_Int32 parcelDirsLength = parcelDirs.getLength();
296*b1cdbd2cSJim Jagielski             for ( sal_Int32 j = 0; j < parcelDirsLength ; ++j )
297*b1cdbd2cSJim Jagielski             {
298*b1cdbd2cSJim Jagielski                 OSL_TRACE(  "contains: %s\n",
299*b1cdbd2cSJim Jagielski                     ::rtl::OUStringToOString( parcelDirs[ j ],
300*b1cdbd2cSJim Jagielski                     RTL_TEXTENCODING_ASCII_US ).pData->buffer );
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski                 OUString parcelFile = parcelDirs[ j ].concat(
303*b1cdbd2cSJim Jagielski                     ::rtl::OUString::createFromAscii( SCRIPT_PARCEL ) );
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski                 // Do not have a valid parcel.xml
306*b1cdbd2cSJim Jagielski                 if ( !m_xSimpleFileAccess->exists( parcelFile ) ||
307*b1cdbd2cSJim Jagielski                         m_xSimpleFileAccess->isFolder( parcelFile ) )
308*b1cdbd2cSJim Jagielski                 {
309*b1cdbd2cSJim Jagielski                     continue;
310*b1cdbd2cSJim Jagielski                 }
311*b1cdbd2cSJim Jagielski                 OSL_TRACE(  "parcel file: %s\n",
312*b1cdbd2cSJim Jagielski                     ::rtl::OUStringToOString( parcelFile,
313*b1cdbd2cSJim Jagielski                     RTL_TEXTENCODING_ASCII_US ).pData->buffer );
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski                 xInput = m_xSimpleFileAccess->openFileRead( parcelFile );
316*b1cdbd2cSJim Jagielski                 // Failed to get input stream
317*b1cdbd2cSJim Jagielski                 if ( !xInput.is() )
318*b1cdbd2cSJim Jagielski                 {
319*b1cdbd2cSJim Jagielski                     continue;
320*b1cdbd2cSJim Jagielski                 }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski                 OSL_TRACE( "Parse the metadata \n" );
323*b1cdbd2cSJim Jagielski                 Datas_vec vScriptDatas;
324*b1cdbd2cSJim Jagielski                 try
325*b1cdbd2cSJim Jagielski                 {
326*b1cdbd2cSJim Jagielski                     SMI->parseMetaData( xInput, parcelDirs[ j ], vScriptDatas );
327*b1cdbd2cSJim Jagielski                 }
328*b1cdbd2cSJim Jagielski                 catch ( xml::sax::SAXException & saxe )
329*b1cdbd2cSJim Jagielski                 {
330*b1cdbd2cSJim Jagielski                     if ( xInput.is() )
331*b1cdbd2cSJim Jagielski                     {
332*b1cdbd2cSJim Jagielski                         xInput->closeInput();
333*b1cdbd2cSJim Jagielski                     }
334*b1cdbd2cSJim Jagielski                     OSL_TRACE(
335*b1cdbd2cSJim Jagielski                         "caught com::sun::star::xml::sax::SAXException in ScriptStorage::create %s",
336*b1cdbd2cSJim Jagielski                         ::rtl::OUStringToOString( saxe.Message,
337*b1cdbd2cSJim Jagielski                         RTL_TEXTENCODING_ASCII_US ).pData->buffer  );
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski                     continue;
340*b1cdbd2cSJim Jagielski                 }
341*b1cdbd2cSJim Jagielski                 catch ( io::IOException & ioe )
342*b1cdbd2cSJim Jagielski                 {
343*b1cdbd2cSJim Jagielski                     if ( xInput.is() )
344*b1cdbd2cSJim Jagielski                     {
345*b1cdbd2cSJim Jagielski                         xInput->closeInput();
346*b1cdbd2cSJim Jagielski                     }
347*b1cdbd2cSJim Jagielski                     OSL_TRACE(
348*b1cdbd2cSJim Jagielski                         "caught com::sun::star::io::IOException in ScriptStorage::create" );
349*b1cdbd2cSJim Jagielski                     continue;
350*b1cdbd2cSJim Jagielski                 }
351*b1cdbd2cSJim Jagielski                 xInput->closeInput();
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski                 updateMaps( vScriptDatas );
354*b1cdbd2cSJim Jagielski             }
355*b1cdbd2cSJim Jagielski         }
356*b1cdbd2cSJim Jagielski     }
357*b1cdbd2cSJim Jagielski     catch ( io::IOException & ioe )
358*b1cdbd2cSJim Jagielski     {
359*b1cdbd2cSJim Jagielski         //From ScriptMetadata Importer
360*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::io::IOException in ScriptStorage::create" );
361*b1cdbd2cSJim Jagielski         throw RuntimeException(
362*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::create IOException: " ).concat( ioe.Message ),
363*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     }
366*b1cdbd2cSJim Jagielski     catch ( ucb::CommandAbortedException & cae )
367*b1cdbd2cSJim Jagielski     {
368*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::ucb::CommandAbortedException in ScriptStorage::create" );
369*b1cdbd2cSJim Jagielski         throw RuntimeException(
370*b1cdbd2cSJim Jagielski             OUSTR(
371*b1cdbd2cSJim Jagielski                 "ScriptStorage::create CommandAbortedException: " ).concat( cae.Message ),
372*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
373*b1cdbd2cSJim Jagielski     }
374*b1cdbd2cSJim Jagielski     catch ( RuntimeException & re )
375*b1cdbd2cSJim Jagielski     {
376*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::create" );
377*b1cdbd2cSJim Jagielski         throw RuntimeException(
378*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::create RuntimeException: " ).concat( re.Message ),
379*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
380*b1cdbd2cSJim Jagielski     }
381*b1cdbd2cSJim Jagielski     catch ( Exception & ue )
382*b1cdbd2cSJim Jagielski     {
383*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::Exception in ScriptStorage::create" );
384*b1cdbd2cSJim Jagielski         throw RuntimeException(
385*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::create Exception: " ).concat( ue.Message ),
386*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
387*b1cdbd2cSJim Jagielski     }
388*b1cdbd2cSJim Jagielski #ifdef _DEBUG
389*b1cdbd2cSJim Jagielski     catch ( ... )
390*b1cdbd2cSJim Jagielski     {
391*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught unknown Exception in ScriptStorage::create" );
392*b1cdbd2cSJim Jagielski         throw RuntimeException(
393*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::initalize unknown exception: " ),
394*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
395*b1cdbd2cSJim Jagielski     }
396*b1cdbd2cSJim Jagielski #endif
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski     OSL_TRACE( "Parsed the XML\n" );
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski     m_bInitialised = true;
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski //*************************************************************************
404*b1cdbd2cSJim Jagielski // private method to create the usual data structures for scripts located
405*b1cdbd2cSJim Jagielski // on the filesystem.
406*b1cdbd2cSJim Jagielski // parcelURI = the path to the script
407*b1cdbd2cSJim Jagielski // functionName = the full filename with extension
408*b1cdbd2cSJim Jagielski // logicalName = the filename without the extension
409*b1cdbd2cSJim Jagielski void
createForFilesystem(const OUString & fileExtension)410*b1cdbd2cSJim Jagielski ScriptStorage::createForFilesystem( const OUString & fileExtension )
411*b1cdbd2cSJim Jagielski throw ( RuntimeException, Exception )
412*b1cdbd2cSJim Jagielski {
413*b1cdbd2cSJim Jagielski     // need to decode as file urls are encoded
414*b1cdbd2cSJim Jagielski     OUString xStringUri = ::rtl::Uri::decode( m_stringUri,
415*b1cdbd2cSJim Jagielski         rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ASCII_US );
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski     // no x-platform issues here as we are dealing with URLs
418*b1cdbd2cSJim Jagielski     sal_Int32 lastFileSep = xStringUri.lastIndexOf( '/' );
419*b1cdbd2cSJim Jagielski     // the char just after the filesep
420*b1cdbd2cSJim Jagielski     lastFileSep += 1;
421*b1cdbd2cSJim Jagielski     sal_Int32 lastFileExt = xStringUri.lastIndexOf( fileExtension );
422*b1cdbd2cSJim Jagielski     OUString searchString = OUString::createFromAscii( "://" );
423*b1cdbd2cSJim Jagielski     sal_Int32 searchStringLength = searchString.getLength();
424*b1cdbd2cSJim Jagielski     sal_Int32 startPath = xStringUri.indexOf( searchString );
425*b1cdbd2cSJim Jagielski     sal_Int32 uriLength = xStringUri.getLength();
426*b1cdbd2cSJim Jagielski     OUString fileNameNoExt = xStringUri.copy( lastFileSep ,
427*b1cdbd2cSJim Jagielski         lastFileExt - lastFileSep  - 1 );
428*b1cdbd2cSJim Jagielski     OUString fileName = xStringUri.copy( lastFileSep, uriLength - lastFileSep );
429*b1cdbd2cSJim Jagielski     OUString filePath = xStringUri.copy( startPath + searchStringLength,
430*b1cdbd2cSJim Jagielski         lastFileSep - startPath - searchStringLength );
431*b1cdbd2cSJim Jagielski     OUString filePathWithName = xStringUri.copy( startPath + searchStringLength,
432*b1cdbd2cSJim Jagielski         uriLength - startPath - searchStringLength );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski     ScriptData scriptData;
435*b1cdbd2cSJim Jagielski     scriptData.language = mh_scriptLangs->find( fileExtension )->second;
436*b1cdbd2cSJim Jagielski     OSL_TRACE( "\t language = %s", ::rtl::OUStringToOString(
437*b1cdbd2cSJim Jagielski         scriptData.language, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski     // do we need to encode this?
440*b1cdbd2cSJim Jagielski     scriptData.functionname = fileName;
441*b1cdbd2cSJim Jagielski     OSL_TRACE( "\t functionName = %s", ::rtl::OUStringToOString(
442*b1cdbd2cSJim Jagielski         scriptData.functionname, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
443*b1cdbd2cSJim Jagielski     //scriptData.functionname = ::rtl::Uri::encode( fileName,
444*b1cdbd2cSJim Jagielski         //rtl_UriCharClassUricNoSlash, rtl_UriEncodeCheckEscapes,
445*b1cdbd2cSJim Jagielski         //RTL_TEXTENCODING_ASCII_US );
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     scriptData.parcelURI = filePath;
448*b1cdbd2cSJim Jagielski     OSL_TRACE( "\t parcelURI = %s", ::rtl::OUStringToOString(
449*b1cdbd2cSJim Jagielski         scriptData.parcelURI, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
450*b1cdbd2cSJim Jagielski     scriptData.logicalname = fileNameNoExt;
451*b1cdbd2cSJim Jagielski     OSL_TRACE( "\t logicalName = %s", ::rtl::OUStringToOString(
452*b1cdbd2cSJim Jagielski         scriptData.logicalname, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski     // and now push onto the usual structures
455*b1cdbd2cSJim Jagielski     ScriptFunction_hash sfh;
456*b1cdbd2cSJim Jagielski     sfh[ scriptData.functionname ] = scriptData;
457*b1cdbd2cSJim Jagielski     mh_implementations[ scriptData.language ] = sfh;
458*b1cdbd2cSJim Jagielski     m_bInitialised = true;
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski //*************************************************************************
462*b1cdbd2cSJim Jagielski // private method to return the file extension, eg. bsh, js etc
463*b1cdbd2cSJim Jagielski OUString
getFileExtension(const OUString & stringUri)464*b1cdbd2cSJim Jagielski ScriptStorage::getFileExtension( const OUString & stringUri )
465*b1cdbd2cSJim Jagielski {
466*b1cdbd2cSJim Jagielski     OUString fileExtension;
467*b1cdbd2cSJim Jagielski     sal_Int32 lastDot = stringUri.lastIndexOf( '.' );
468*b1cdbd2cSJim Jagielski     if( lastDot > 0 ) {
469*b1cdbd2cSJim Jagielski         sal_Int32 stringUriLength = stringUri.getLength();
470*b1cdbd2cSJim Jagielski         fileExtension = stringUri.copy( lastDot +1 , stringUriLength - lastDot - 1 );
471*b1cdbd2cSJim Jagielski     }
472*b1cdbd2cSJim Jagielski     else
473*b1cdbd2cSJim Jagielski     {
474*b1cdbd2cSJim Jagielski         fileExtension = OUString::createFromAscii("");
475*b1cdbd2cSJim Jagielski     }
476*b1cdbd2cSJim Jagielski     return fileExtension;
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski //*************************************************************************
480*b1cdbd2cSJim Jagielski // private method for updating hashmaps
481*b1cdbd2cSJim Jagielski void
updateMaps(const Datas_vec & vScriptDatas)482*b1cdbd2cSJim Jagielski ScriptStorage::updateMaps( const Datas_vec & vScriptDatas )
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski     Datas_vec::const_iterator it_end = vScriptDatas.end();
486*b1cdbd2cSJim Jagielski     // step through the vector of ScripImplInfos returned from parse
487*b1cdbd2cSJim Jagielski     for ( Datas_vec::const_iterator it = vScriptDatas.begin() ; it != it_end; ++it )
488*b1cdbd2cSJim Jagielski     {
489*b1cdbd2cSJim Jagielski         //find the Datas_vec for this logical name
490*b1cdbd2cSJim Jagielski         ScriptData_hash::iterator h_it = mh_implementations.find( it->language );
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski         if ( h_it == mh_implementations.end() )
493*b1cdbd2cSJim Jagielski         {
494*b1cdbd2cSJim Jagielski             //if it's null, need to create a new Datas_vec
495*b1cdbd2cSJim Jagielski             OSL_TRACE(
496*b1cdbd2cSJim Jagielski                      "updateMaps: new language: %s\n", rtl::OUStringToOString(
497*b1cdbd2cSJim Jagielski                          it->language, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
498*b1cdbd2cSJim Jagielski             OSL_TRACE(
499*b1cdbd2cSJim Jagielski                      "updateMaps: adding functionname: %s\n", rtl::OUStringToOString(
500*b1cdbd2cSJim Jagielski                          it->functionname, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski             ScriptFunction_hash sfh;
503*b1cdbd2cSJim Jagielski             sfh[ it->functionname ] = *it;
504*b1cdbd2cSJim Jagielski             mh_implementations[ it->language ] = sfh;
505*b1cdbd2cSJim Jagielski         }
506*b1cdbd2cSJim Jagielski         else
507*b1cdbd2cSJim Jagielski         {
508*b1cdbd2cSJim Jagielski             OSL_TRACE(
509*b1cdbd2cSJim Jagielski                      "updateMaps: adding functionname: %s\n", rtl::OUStringToOString(
510*b1cdbd2cSJim Jagielski                          it->functionname, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
511*b1cdbd2cSJim Jagielski             OSL_TRACE(  "                    language name: %s\n",
512*b1cdbd2cSJim Jagielski                 rtl::OUStringToOString( it->functionname,
513*b1cdbd2cSJim Jagielski                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski             h_it->second[ it->functionname ] = *it;
516*b1cdbd2cSJim Jagielski         }
517*b1cdbd2cSJim Jagielski     }
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski //*************************************************************************
521*b1cdbd2cSJim Jagielski // XScriptStorageExport::save
522*b1cdbd2cSJim Jagielski void
save()523*b1cdbd2cSJim Jagielski ScriptStorage::save()
524*b1cdbd2cSJim Jagielski throw ( RuntimeException )
525*b1cdbd2cSJim Jagielski {
526*b1cdbd2cSJim Jagielski     ::osl::Guard< osl::Mutex > aGuard( m_mutex );
527*b1cdbd2cSJim Jagielski     Reference< io::XActiveDataSource > xSource;
528*b1cdbd2cSJim Jagielski     Reference< io::XOutputStream > xOS;
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski     // xScriptInvocation = Reference<XScriptInvocation>(xx, UNO_QUERY_THROW);
531*b1cdbd2cSJim Jagielski     Reference< xml::sax::XExtendedDocumentHandler > xHandler;
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski     OUString parcel_suffix = OUString::createFromAscii( SCRIPT_PARCEL );
534*b1cdbd2cSJim Jagielski     OUString ou_parcel = OUString(
535*b1cdbd2cSJim Jagielski         RTL_CONSTASCII_USTRINGPARAM( SCRIPT_PARCEL_NAME_ONLY ) );
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski     try
538*b1cdbd2cSJim Jagielski     {
539*b1cdbd2cSJim Jagielski         ScriptData_hash::iterator it_end = mh_implementations.end();
540*b1cdbd2cSJim Jagielski         for ( ScriptData_hash::iterator it = mh_implementations.begin() ; it != it_end; ++it )
541*b1cdbd2cSJim Jagielski         {
542*b1cdbd2cSJim Jagielski             ::rtl::OUString logName = it->first;
543*b1cdbd2cSJim Jagielski             ScriptFunction_hash::iterator it_sfh_end = it->second.end();
544*b1cdbd2cSJim Jagielski             for ( ScriptFunction_hash::iterator it_sfh = it->second.begin();
545*b1cdbd2cSJim Jagielski                     it_sfh != it_sfh_end ; ++it_sfh )
546*b1cdbd2cSJim Jagielski             {
547*b1cdbd2cSJim Jagielski                 ScriptOutput_hash::const_iterator it_parcels =
548*b1cdbd2cSJim Jagielski                     mh_parcels.find( it_sfh->second.parcelURI );
549*b1cdbd2cSJim Jagielski                 if ( it_parcels == mh_parcels.end() )
550*b1cdbd2cSJim Jagielski                 {
551*b1cdbd2cSJim Jagielski                     //create new outputstream
552*b1cdbd2cSJim Jagielski                     OUString parcel_xml_path = it_sfh->second.parcelURI.concat(
553*b1cdbd2cSJim Jagielski                         parcel_suffix );
554*b1cdbd2cSJim Jagielski                     m_xSimpleFileAccess->kill( parcel_xml_path );
555*b1cdbd2cSJim Jagielski                     xOS = m_xSimpleFileAccess->openFileWrite( parcel_xml_path );
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski                     OSL_TRACE(  "saving: %s\n", rtl::OUStringToOString(
558*b1cdbd2cSJim Jagielski                         it_sfh->second.parcelURI.concat( OUString::createFromAscii(
559*b1cdbd2cSJim Jagielski                         "/parcel.xml" ) ),
560*b1cdbd2cSJim Jagielski                         RTL_TEXTENCODING_ASCII_US ).pData->buffer );
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski                     xHandler.set(
563*b1cdbd2cSJim Jagielski                         m_xMgr->createInstanceWithContext(
564*b1cdbd2cSJim Jagielski                             OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ),
565*b1cdbd2cSJim Jagielski                             m_xContext
566*b1cdbd2cSJim Jagielski                         ),
567*b1cdbd2cSJim Jagielski                         UNO_QUERY_THROW
568*b1cdbd2cSJim Jagielski                     );
569*b1cdbd2cSJim Jagielski                     xSource.set( xHandler, UNO_QUERY_THROW );
570*b1cdbd2cSJim Jagielski                     xSource->setOutputStream( xOS );
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski                     writeMetadataHeader( xHandler );
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski                     mh_parcels[ it_sfh->second.parcelURI ] = xHandler;
575*b1cdbd2cSJim Jagielski                 }
576*b1cdbd2cSJim Jagielski                 else
577*b1cdbd2cSJim Jagielski                 {
578*b1cdbd2cSJim Jagielski                     xHandler = it_parcels->second;
579*b1cdbd2cSJim Jagielski                 }
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski                 ScriptElement* pSE = new ScriptElement( it_sfh->second );
582*b1cdbd2cSJim Jagielski                 // this is to get pSE released correctly
583*b1cdbd2cSJim Jagielski                 Reference < xml::sax::XAttributeList > xal( pSE );
584*b1cdbd2cSJim Jagielski                 pSE->dump( xHandler );
585*b1cdbd2cSJim Jagielski             }
586*b1cdbd2cSJim Jagielski         }
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski         ScriptOutput_hash::const_iterator out_it_end = mh_parcels.end();
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski         for ( ScriptOutput_hash::const_iterator out_it = mh_parcels.begin();
591*b1cdbd2cSJim Jagielski                 out_it != out_it_end; ++out_it )
592*b1cdbd2cSJim Jagielski         {
593*b1cdbd2cSJim Jagielski             out_it->second->ignorableWhitespace( ::rtl::OUString() );
594*b1cdbd2cSJim Jagielski             out_it->second->endDocument();
595*b1cdbd2cSJim Jagielski             xSource.set( out_it->second, UNO_QUERY );
596*b1cdbd2cSJim Jagielski             Reference< io::XOutputStream > xOS = xSource->getOutputStream();
597*b1cdbd2cSJim Jagielski             xOS->closeOutput();
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski         }
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski         // clear the hash map, as all output streams have been closed.
602*b1cdbd2cSJim Jagielski         // need to re-create on next save
603*b1cdbd2cSJim Jagielski         mh_parcels.clear();
604*b1cdbd2cSJim Jagielski     }
605*b1cdbd2cSJim Jagielski     // *** TODO - other exception handling IO etc.
606*b1cdbd2cSJim Jagielski     catch ( RuntimeException & re )
607*b1cdbd2cSJim Jagielski     {
608*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::save" );
609*b1cdbd2cSJim Jagielski         throw RuntimeException(
610*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::save RuntimeException: " ).concat(
611*b1cdbd2cSJim Jagielski             re.Message ),
612*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
613*b1cdbd2cSJim Jagielski     }
614*b1cdbd2cSJim Jagielski }
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski //*************************************************************************
617*b1cdbd2cSJim Jagielski void
refresh()618*b1cdbd2cSJim Jagielski ScriptStorage::refresh()
619*b1cdbd2cSJim Jagielski throw (RuntimeException)
620*b1cdbd2cSJim Jagielski {
621*b1cdbd2cSJim Jagielski     OSL_TRACE("** => ScriptStorage: in refresh()\n");
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski     // guard against concurrent refreshes
624*b1cdbd2cSJim Jagielski     ::osl::Guard< ::osl::Mutex > aGuard( m_mutex );
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski     try
627*b1cdbd2cSJim Jagielski     {
628*b1cdbd2cSJim Jagielski         create();
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski     }
631*b1cdbd2cSJim Jagielski     catch ( RuntimeException & re )
632*b1cdbd2cSJim Jagielski     {
633*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::RuntimeException in ScriptStorage::refresh" );
634*b1cdbd2cSJim Jagielski         throw RuntimeException(
635*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::refresh RuntimeException: " ).concat( re.Message ),
636*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
637*b1cdbd2cSJim Jagielski     }
638*b1cdbd2cSJim Jagielski     catch ( Exception & ue )
639*b1cdbd2cSJim Jagielski     {
640*b1cdbd2cSJim Jagielski         OSL_TRACE( "caught com::sun::star::uno::Exception in ScriptStorage::refresh" );
641*b1cdbd2cSJim Jagielski         throw RuntimeException(
642*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::refresh Exception: " ).concat( ue.Message ),
643*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
644*b1cdbd2cSJim Jagielski     }
645*b1cdbd2cSJim Jagielski }
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski //*************************************************************************
648*b1cdbd2cSJim Jagielski void
writeMetadataHeader(Reference<xml::sax::XExtendedDocumentHandler> & xHandler)649*b1cdbd2cSJim Jagielski ScriptStorage::writeMetadataHeader(
650*b1cdbd2cSJim Jagielski     Reference <xml::sax::XExtendedDocumentHandler> & xHandler )
651*b1cdbd2cSJim Jagielski {
652*b1cdbd2cSJim Jagielski     xHandler->startDocument();
653*b1cdbd2cSJim Jagielski     OUString aDocTypeStr( RTL_CONSTASCII_USTRINGPARAM(
654*b1cdbd2cSJim Jagielski         "<!DOCTYPE  parcel SYSTEM \"scripting.dtd\">" ) );
655*b1cdbd2cSJim Jagielski     xHandler->unknown( aDocTypeStr );
656*b1cdbd2cSJim Jagielski     xHandler->ignorableWhitespace( OUString() );
657*b1cdbd2cSJim Jagielski }
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski //*************************************************************************
661*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString >
getScriptLogicalNames()662*b1cdbd2cSJim Jagielski ScriptStorage::getScriptLogicalNames()
663*b1cdbd2cSJim Jagielski throw ( RuntimeException )
664*b1cdbd2cSJim Jagielski {
665*b1cdbd2cSJim Jagielski     Sequence< ::rtl::OUString  > results;
666*b1cdbd2cSJim Jagielski     // comment out the rest, and ultimately remove method
667*b1cdbd2cSJim Jagielski     /*ScriptInfo_hash::iterator h_it = mh_implementations.begin();
668*b1cdbd2cSJim Jagielski     ScriptInfo_hash::iterator h_itEnd =  mh_implementations.end();
669*b1cdbd2cSJim Jagielski     if ( h_it == h_itEnd  )
670*b1cdbd2cSJim Jagielski     {
671*b1cdbd2cSJim Jagielski         OSL_TRACE( "ScriptStorage::getImplementations: EMPTY STORAGE");
672*b1cdbd2cSJim Jagielski         return results;
673*b1cdbd2cSJim Jagielski     }
674*b1cdbd2cSJim Jagielski     results.realloc( mh_implementations.size() );
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski     //find the implementations for the given logical name
677*b1cdbd2cSJim Jagielski     try
678*b1cdbd2cSJim Jagielski     {
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski         ::osl::Guard< osl::Mutex > aGuard( m_mutex );
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski         for ( sal_Int32 count = 0; h_it != h_itEnd ; ++h_it )
683*b1cdbd2cSJim Jagielski         {
684*b1cdbd2cSJim Jagielski             ::rtl::OUString logicalName = h_it->first;
685*b1cdbd2cSJim Jagielski             OSL_TRACE( "Adding %s at index %d ", ::rtl::OUStringToOString(
686*b1cdbd2cSJim Jagielski                 logicalName, RTL_TEXTENCODING_ASCII_US ).pData->buffer, count);
687*b1cdbd2cSJim Jagielski             results[ count++ ] = logicalName;
688*b1cdbd2cSJim Jagielski         }
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski     }
691*b1cdbd2cSJim Jagielski     catch ( RuntimeException & re )
692*b1cdbd2cSJim Jagielski     {
693*b1cdbd2cSJim Jagielski         throw RuntimeException(
694*b1cdbd2cSJim Jagielski             OUSTR( "ScriptStorage::getScriptLogicalNames RuntimeException: " ).concat( re.Message ),
695*b1cdbd2cSJim Jagielski             Reference< XInterface > () );
696*b1cdbd2cSJim Jagielski     }
697*b1cdbd2cSJim Jagielski     catch ( Exception & e )
698*b1cdbd2cSJim Jagielski     {
699*b1cdbd2cSJim Jagielski         throw RuntimeException( OUSTR(
700*b1cdbd2cSJim Jagielski             "ScriptStorage::getScriptLogicalNames Exception: " ).concat(
701*b1cdbd2cSJim Jagielski             e.Message ), Reference< XInterface > () );
702*b1cdbd2cSJim Jagielski     } */
703*b1cdbd2cSJim Jagielski     return results;
704*b1cdbd2cSJim Jagielski }
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski //*************************************************************************
707*b1cdbd2cSJim Jagielski Sequence< Reference< storage::XScriptInfo > >
getImplementations(const::rtl::OUString & queryURI)708*b1cdbd2cSJim Jagielski ScriptStorage::getImplementations( const ::rtl::OUString & queryURI )
709*b1cdbd2cSJim Jagielski throw ( lang::IllegalArgumentException,
710*b1cdbd2cSJim Jagielski         RuntimeException )
711*b1cdbd2cSJim Jagielski {
712*b1cdbd2cSJim Jagielski     ::osl::Guard< osl::Mutex > aGuard( m_mutex );
713*b1cdbd2cSJim Jagielski // format is script:://[function_name]?language=[languge]&location=[location]
714*b1cdbd2cSJim Jagielski // LogicalName is now not used anymore, further more the ScriptURI class
715*b1cdbd2cSJim Jagielski // will be retired also and a new UNO service will be used. Additionally the
716*b1cdbd2cSJim Jagielski // parcel-description will also need to be modified to remove logical name
717*b1cdbd2cSJim Jagielski // ScriprtMetaDataImporter has been modified to ignore the Logical name
718*b1cdbd2cSJim Jagielski // definined in the parcel-desc.xml. As an interim temp solution the  Datas_vec
719*b1cdbd2cSJim Jagielski // structure that is returned from ScriptMetDataImporter sets the logicalname
720*b1cdbd2cSJim Jagielski // to the function name. ScriptURI class has been changed in the same way.
721*b1cdbd2cSJim Jagielski //
722*b1cdbd2cSJim Jagielski     Sequence< Reference< storage::XScriptInfo > > results;
723*b1cdbd2cSJim Jagielski     ScriptURI scriptURI( queryURI );
724*b1cdbd2cSJim Jagielski     OSL_TRACE( "getting impl for language %s, function name: %s",
725*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString( scriptURI.getLanguage(),
726*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_ASCII_US ).pData->buffer,
727*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString( scriptURI.getFunctionName(),
728*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_ASCII_US ).pData->buffer );
729*b1cdbd2cSJim Jagielski     ScriptData_hash::iterator h_itEnd =  mh_implementations.end();
730*b1cdbd2cSJim Jagielski     ScriptData_hash::iterator h_it = mh_implementations.begin();
731*b1cdbd2cSJim Jagielski     if ( h_it == h_itEnd )
732*b1cdbd2cSJim Jagielski     {
733*b1cdbd2cSJim Jagielski         OSL_TRACE( "ScriptStorage::getImplementations: EMPTY STORAGE" );
734*b1cdbd2cSJim Jagielski         return results;
735*b1cdbd2cSJim Jagielski     }
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski     //find the implementations for the given language
738*b1cdbd2cSJim Jagielski     h_it = mh_implementations.find( scriptURI.getLanguage() );
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski     if ( h_it == h_itEnd )
741*b1cdbd2cSJim Jagielski     {
742*b1cdbd2cSJim Jagielski         OSL_TRACE( "ScriptStorage::getImplementations: no impls found for %s",
743*b1cdbd2cSJim Jagielski             ::rtl::OUStringToOString( scriptURI.getLanguage(),
744*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_ASCII_US ).pData->buffer );
745*b1cdbd2cSJim Jagielski         return results;
746*b1cdbd2cSJim Jagielski     }
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski     //find the implementations for the given language
749*b1cdbd2cSJim Jagielski     ScriptFunction_hash::const_iterator it_datas = h_it->second.find(
750*b1cdbd2cSJim Jagielski         scriptURI.getLogicalName() );
751*b1cdbd2cSJim Jagielski     ScriptFunction_hash::const_iterator it_datas_end = h_it->second.end();
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski     if ( it_datas == it_datas_end )
754*b1cdbd2cSJim Jagielski     {
755*b1cdbd2cSJim Jagielski         OSL_TRACE( "ScriptStorage::getImplementations: no impls found for %s",
756*b1cdbd2cSJim Jagielski             ::rtl::OUStringToOString( scriptURI.getFunctionName(),
757*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_ASCII_US ).pData->buffer );
758*b1cdbd2cSJim Jagielski         return results;
759*b1cdbd2cSJim Jagielski     }
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski     results.realloc( 1 );
762*b1cdbd2cSJim Jagielski     ScriptData scriptData = it_datas->second;
763*b1cdbd2cSJim Jagielski     OSL_TRACE( "ScriptStorage::getImplementations: impls found for %s",
764*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString( scriptData.functionname,
765*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_ASCII_US ).pData->buffer );
766*b1cdbd2cSJim Jagielski     Reference< storage::XScriptInfo > xScriptInfo =
767*b1cdbd2cSJim Jagielski         new ScriptInfo ( scriptData, m_scriptStorageID );
768*b1cdbd2cSJim Jagielski     results[ 0 ] = xScriptInfo;
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski     return results;
771*b1cdbd2cSJim Jagielski }
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski //*************************************************************************
774*b1cdbd2cSJim Jagielski Sequence< Reference< storage::XScriptInfo > > SAL_CALL
getAllImplementations()775*b1cdbd2cSJim Jagielski ScriptStorage::getAllImplementations() throw ( RuntimeException )
776*b1cdbd2cSJim Jagielski {
777*b1cdbd2cSJim Jagielski     ::osl::Guard< osl::Mutex > aGuard( m_mutex );
778*b1cdbd2cSJim Jagielski     Sequence< Reference< storage::XScriptInfo > > results;
779*b1cdbd2cSJim Jagielski     ScriptData_hash::iterator h_itEnd =  mh_implementations.end();
780*b1cdbd2cSJim Jagielski     ScriptData_hash::iterator h_it = mh_implementations.begin();
781*b1cdbd2cSJim Jagielski     if ( h_it == h_itEnd )
782*b1cdbd2cSJim Jagielski     {
783*b1cdbd2cSJim Jagielski         OSL_TRACE( "ScriptStorage::getImplementations: EMPTY STORAGE" );
784*b1cdbd2cSJim Jagielski         return results;
785*b1cdbd2cSJim Jagielski     }
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski 
788*b1cdbd2cSJim Jagielski     //iterate through each logical name and gather each implementation
789*b1cdbd2cSJim Jagielski     //for that name
790*b1cdbd2cSJim Jagielski     for ( sal_Int32 count = 0; h_it !=  h_itEnd; ++h_it )
791*b1cdbd2cSJim Jagielski     {
792*b1cdbd2cSJim Jagielski         results.realloc( h_it->second.size() + count );
793*b1cdbd2cSJim Jagielski         OSL_TRACE( "Adding implementations for %s",
794*b1cdbd2cSJim Jagielski             ::rtl::OUStringToOString( h_it->first,
795*b1cdbd2cSJim Jagielski                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
796*b1cdbd2cSJim Jagielski         ScriptFunction_hash::const_iterator it_sfh = h_it->second.begin();
797*b1cdbd2cSJim Jagielski         ScriptFunction_hash::const_iterator it_sfh_end = h_it->second.end();
798*b1cdbd2cSJim Jagielski         OSL_TRACE( "Adding %d to sequence of impls ", h_it->second.size() );
799*b1cdbd2cSJim Jagielski         for ( ; it_sfh != it_sfh_end ; ++it_sfh )
800*b1cdbd2cSJim Jagielski         {
801*b1cdbd2cSJim Jagielski             Reference< storage::XScriptInfo > xScriptInfo = new ScriptInfo (
802*b1cdbd2cSJim Jagielski             it_sfh->second, m_scriptStorageID );
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski             results[ count++ ] = xScriptInfo;
805*b1cdbd2cSJim Jagielski         }
806*b1cdbd2cSJim Jagielski     }
807*b1cdbd2cSJim Jagielski     return results;
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski //*************************************************************************
getImplementationName()812*b1cdbd2cSJim Jagielski OUString SAL_CALL ScriptStorage::getImplementationName( )
813*b1cdbd2cSJim Jagielski throw( RuntimeException )
814*b1cdbd2cSJim Jagielski {
815*b1cdbd2cSJim Jagielski     return ss_implName;
816*b1cdbd2cSJim Jagielski }
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski //*************************************************************************
supportsService(const OUString & serviceName)819*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScriptStorage::supportsService( const OUString& serviceName )
820*b1cdbd2cSJim Jagielski throw( RuntimeException )
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski     OUString const * pNames = ss_serviceNames.getConstArray();
823*b1cdbd2cSJim Jagielski     for ( sal_Int32 nPos = ss_serviceNames.getLength(); nPos--; )
824*b1cdbd2cSJim Jagielski     {
825*b1cdbd2cSJim Jagielski         if ( serviceName.equals( pNames[ nPos ] ) )
826*b1cdbd2cSJim Jagielski         {
827*b1cdbd2cSJim Jagielski             return sal_True;
828*b1cdbd2cSJim Jagielski         }
829*b1cdbd2cSJim Jagielski     }
830*b1cdbd2cSJim Jagielski     return sal_False;
831*b1cdbd2cSJim Jagielski }
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski //*************************************************************************
getSupportedServiceNames()834*b1cdbd2cSJim Jagielski Sequence<OUString> SAL_CALL ScriptStorage::getSupportedServiceNames( )
835*b1cdbd2cSJim Jagielski throw( RuntimeException )
836*b1cdbd2cSJim Jagielski {
837*b1cdbd2cSJim Jagielski     return ss_serviceNames;
838*b1cdbd2cSJim Jagielski }
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski } // namespace scripting_impl
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski namespace scripting_runtimemgr
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski //*************************************************************************
ss_create(const Reference<XComponentContext> & xCompC)847*b1cdbd2cSJim Jagielski Reference<XInterface> SAL_CALL ss_create(
848*b1cdbd2cSJim Jagielski     const Reference< XComponentContext > & xCompC )
849*b1cdbd2cSJim Jagielski {
850*b1cdbd2cSJim Jagielski     return ( cppu::OWeakObject * ) new ::scripting_impl::ScriptStorage( xCompC );
851*b1cdbd2cSJim Jagielski }
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski //*************************************************************************
ss_getSupportedServiceNames()854*b1cdbd2cSJim Jagielski Sequence<OUString> ss_getSupportedServiceNames( )
855*b1cdbd2cSJim Jagielski SAL_THROW( () )
856*b1cdbd2cSJim Jagielski {
857*b1cdbd2cSJim Jagielski     return ::scripting_impl::ss_serviceNames;
858*b1cdbd2cSJim Jagielski }
859*b1cdbd2cSJim Jagielski 
860*b1cdbd2cSJim Jagielski //*************************************************************************
ss_getImplementationName()861*b1cdbd2cSJim Jagielski OUString ss_getImplementationName( )
862*b1cdbd2cSJim Jagielski SAL_THROW( () )
863*b1cdbd2cSJim Jagielski {
864*b1cdbd2cSJim Jagielski     return ::scripting_impl::ss_implName;
865*b1cdbd2cSJim Jagielski }
866*b1cdbd2cSJim Jagielski }//end namespace
867