xref: /trunk/main/scripting/source/provider/URIHelper.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scripting.hxx"
26 
27 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
28 #include <rtl/ustrbuf.hxx>
29 #include "URIHelper.hxx"
30 
31 #define PRTSTR(x) ::rtl::OUStringToOString(x, RTL_TEXTENCODING_ASCII_US).pData->buffer
32 
33 namespace func_provider
34 {
35 
36 using ::rtl::OUString;
37 namespace uno = ::com::sun::star::uno;
38 namespace ucb = ::com::sun::star::ucb;
39 namespace lang = ::com::sun::star::lang;
40 namespace uri = ::com::sun::star::uri;
41 namespace script = ::com::sun::star::script;
42 
43 static const char SHARE[] = "share";
44 static const char SHARE_URI[] =
45     "vnd.sun.star.expand:$$OOO_BASE_DIR";
46 //    "vnd.sun.star.expand:${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap") "::BaseInstallation}";
47 
48 static const char SHARE_UNO_PACKAGES[] = "share:uno_packages";
49 static const char SHARE_UNO_PACKAGES_URI[] =
50     "vnd.sun.star.expand:$UNO_SHARED_PACKAGES_CACHE";
51 
52 static const char USER[] = "user";
53 static const char USER_URI[] =
54     "vnd.sun.star.expand:${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap") "::UserInstallation}";
55 
56 static const char USER_UNO_PACKAGES[] = "user:uno_packages";
57 static const char USER_UNO_PACKAGES_DIR[] =
58     "/user/uno_packages/cache";
59 
60 static const char DOCUMENT[] = "document";
61 static const char TDOC_SCHEME[] = "vnd.sun.star.tdoc";
62 
ScriptingFrameworkURIHelper(const uno::Reference<uno::XComponentContext> & xContext)63 ScriptingFrameworkURIHelper::ScriptingFrameworkURIHelper(
64     const uno::Reference< uno::XComponentContext >& xContext)
65 {
66     try
67     {
68         m_xSimpleFileAccess = uno::Reference< ucb::XSimpleFileAccess >(
69             xContext->getServiceManager()->createInstanceWithContext(
70                 OUString::createFromAscii(
71                     "com.sun.star.ucb.SimpleFileAccess"),
72                 xContext), uno::UNO_QUERY_THROW);
73     }
74     catch (uno::Exception&)
75     {
76         OSL_ENSURE(false,
77             "Scripting Framework error initialising XSimpleFileAccess");
78     }
79 
80     try
81     {
82         m_xUriReferenceFactory = uno::Reference< uri::XUriReferenceFactory >(
83             xContext->getServiceManager()->createInstanceWithContext(
84                 OUString::createFromAscii(
85                     "com.sun.star.uri.UriReferenceFactory"),
86             xContext ), uno::UNO_QUERY_THROW );
87     }
88     catch (uno::Exception&)
89     {
90         OSL_ENSURE(false,
91             "Scripting Framework error initialising XUriReferenceFactory");
92     }
93 }
94 
~ScriptingFrameworkURIHelper()95 ScriptingFrameworkURIHelper::~ScriptingFrameworkURIHelper()
96 {
97     // currently does nothing
98 }
99 
100 void SAL_CALL
initialize(const uno::Sequence<uno::Any> & args)101 ScriptingFrameworkURIHelper::initialize(
102     const uno::Sequence < uno::Any >& args )
103 {
104     if ( args.getLength() != 2 ||
105          args[0].getValueType() != ::getCppuType((const OUString*)NULL) ||
106          args[1].getValueType() != ::getCppuType((const OUString*)NULL) )
107     {
108         throw uno::RuntimeException( OUString::createFromAscii(
109             "ScriptingFrameworkURIHelper got invalid argument list" ),
110                 uno::Reference< uno::XInterface >() );
111     }
112 
113     if ( (args[0] >>= m_sLanguage) == sal_False ||
114          (args[1] >>= m_sLocation) == sal_False )
115     {
116         throw uno::RuntimeException( OUString::createFromAscii(
117             "ScriptingFrameworkURIHelper error parsing args" ),
118                 uno::Reference< uno::XInterface >() );
119     }
120 
121     SCRIPTS_PART = OUString::createFromAscii( "/Scripts/" );
122     SCRIPTS_PART = SCRIPTS_PART.concat( m_sLanguage.toAsciiLowerCase() );
123 
124     if ( !initBaseURI() )
125     {
126         throw uno::RuntimeException( OUString::createFromAscii(
127             "ScriptingFrameworkURIHelper cannot find script directory"),
128                 uno::Reference< uno::XInterface >() );
129     }
130 }
131 
132 bool
initBaseURI()133 ScriptingFrameworkURIHelper::initBaseURI()
134 {
135     OUString uri, test;
136     bool bAppendScriptsPart = false;
137 
138     if ( m_sLocation.equalsAscii(USER))
139     {
140         test = OUString::createFromAscii(USER);
141         uri = OUString::createFromAscii(USER_URI);
142         bAppendScriptsPart = true;
143     }
144     else if ( m_sLocation.equalsAscii(USER_UNO_PACKAGES))
145     {
146         test = OUString::createFromAscii("uno_packages");
147         uri = OUString::createFromAscii(USER_URI);
148         uri = uri.concat(OUString::createFromAscii(USER_UNO_PACKAGES_DIR));
149     }
150     else if (m_sLocation.equalsAscii(SHARE))
151     {
152         test = OUString::createFromAscii(SHARE);
153         uri = OUString::createFromAscii(SHARE_URI);
154         bAppendScriptsPart = true;
155     }
156     else if (m_sLocation.equalsAscii(SHARE_UNO_PACKAGES))
157     {
158         test = OUString::createFromAscii("uno_packages");
159         uri = OUString::createFromAscii(SHARE_UNO_PACKAGES_URI);
160     }
161     else if (m_sLocation.indexOf(OUString::createFromAscii(TDOC_SCHEME)) == 0)
162     {
163         m_sBaseURI = m_sLocation.concat( SCRIPTS_PART );
164         m_sLocation = OUString::createFromAscii( DOCUMENT );
165         return true;
166     }
167     else
168     {
169         return false;
170     }
171 
172     if ( !m_xSimpleFileAccess->exists( uri ) ||
173          !m_xSimpleFileAccess->isFolder( uri ) )
174     {
175         return false;
176     }
177 
178     uno::Sequence< OUString > children =
179         m_xSimpleFileAccess->getFolderContents( uri, true );
180 
181     for ( sal_Int32 i = 0; i < children.getLength(); i++ )
182     {
183         OUString child = children[i];
184         sal_Int32 idx = child.lastIndexOf(test);
185 
186         // OSL_TRACE("Trying: %s", PRTSTR(child));
187         // OSL_TRACE("idx=%d, testlen=%d, children=%d",
188         //     idx, test.getLength(), child.getLength());
189 
190         if ( idx != -1 && (idx + test.getLength()) == child.getLength() )
191         {
192             // OSL_TRACE("FOUND PATH: %s", PRTSTR(child));
193             if ( bAppendScriptsPart )
194             {
195                 m_sBaseURI = child.concat( SCRIPTS_PART );
196             }
197             else
198             {
199                 m_sBaseURI = child;
200             }
201             return true;
202         }
203     }
204     return false;
205 }
206 
207 OUString
getLanguagePart(const OUString & rStorageURI)208 ScriptingFrameworkURIHelper::getLanguagePart(const OUString& rStorageURI)
209 {
210     OUString result;
211 
212     sal_Int32 idx = rStorageURI.indexOf(m_sBaseURI);
213     sal_Int32 len = m_sBaseURI.getLength() + 1;
214 
215     if ( idx != -1 )
216     {
217         result = rStorageURI.copy(idx + len);
218         result = result.replace('/', '|');
219     }
220     return result;
221 }
222 
223 OUString
getLanguagePath(const OUString & rLanguagePart)224 ScriptingFrameworkURIHelper::getLanguagePath(const OUString& rLanguagePart)
225 {
226     OUString result;
227     result = rLanguagePart.replace('|', '/');
228     return result;
229 }
230 
231 OUString SAL_CALL
getScriptURI(const OUString & rStorageURI)232 ScriptingFrameworkURIHelper::getScriptURI(const OUString& rStorageURI)
233 {
234     ::rtl::OUStringBuffer buf(120);
235 
236     buf.appendAscii("vnd.sun.star.script:");
237     buf.append(getLanguagePart(rStorageURI));
238     buf.appendAscii("?language=");
239     buf.append(m_sLanguage);
240     buf.appendAscii("&location=");
241     buf.append(m_sLocation);
242 
243     return buf.makeStringAndClear();
244 }
245 
246 OUString SAL_CALL
getStorageURI(const OUString & rScriptURI)247 ScriptingFrameworkURIHelper::getStorageURI(const OUString& rScriptURI)
248 {
249     OUString sLanguagePart;
250     try
251     {
252         uno::Reference < uri::XVndSunStarScriptUrl > xURI(
253             m_xUriReferenceFactory->parse( rScriptURI ), uno::UNO_QUERY_THROW );
254         sLanguagePart = xURI->getName();
255     }
256     catch ( uno::Exception& )
257     {
258         throw lang::IllegalArgumentException(
259             OUString::createFromAscii( "Script URI not valid" ),
260                 uno::Reference< uno::XInterface >(), 1 );
261     }
262 
263     ::rtl::OUStringBuffer buf(120);
264     buf.append(m_sBaseURI);
265     buf.append(OUString::createFromAscii("/"));
266     buf.append(getLanguagePath(sLanguagePart));
267 
268     OUString result = buf.makeStringAndClear();
269 
270     return result;
271 }
272 
273 OUString SAL_CALL
getRootStorageURI()274 ScriptingFrameworkURIHelper::getRootStorageURI()
275 {
276     return m_sBaseURI;
277 }
278 
279 OUString SAL_CALL
getImplementationName()280 ScriptingFrameworkURIHelper::getImplementationName()
281 {
282     return OUString::createFromAscii(
283         "com.sun.star.script.provider.ScriptURIHelper" );
284 }
285 
286 sal_Bool SAL_CALL
supportsService(const OUString & serviceName)287 ScriptingFrameworkURIHelper::supportsService( const OUString& serviceName )
288 {
289     OUString m_sServiceName = OUString::createFromAscii(
290         "com.sun.star.script.provider.ScriptURIHelper" );
291 
292     if ( serviceName.equals( m_sServiceName ) )
293     {
294         return sal_True;
295     }
296     return sal_False;
297 }
298 
299 uno::Sequence< ::rtl::OUString > SAL_CALL
getSupportedServiceNames()300 ScriptingFrameworkURIHelper::getSupportedServiceNames()
301 {
302     ::rtl::OUString serviceNameList[] = {
303         ::rtl::OUString::createFromAscii(
304             "com.sun.star.script.provider.ScriptURIHelper" ) };
305 
306     uno::Sequence< ::rtl::OUString > serviceNames = uno::Sequence <
307         ::rtl::OUString > ( serviceNameList, 1 );
308 
309     return serviceNames;
310 }
311 }
312