Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include "rtl/ustring.hxx"
21 : : #include "rtl/ustrbuf.hxx"
22 : : #include "rtl/uri.hxx"
23 : : #include "osl/thread.hxx"
24 : : #include "osl/process.h"
25 : : #include "libxml/xpathInternals.h"
26 : : #include "osl/file.hxx"
27 : : #include "osl/module.hxx"
28 : : #include "framework.hxx"
29 : : #include "fwkutil.hxx"
30 : : #include "elements.hxx"
31 : : #include "fwkbase.hxx"
32 : :
33 : : using namespace osl;
34 : :
35 : : using ::rtl::OUString;
36 : : using ::rtl::OUStringBuffer;
37 : : using ::rtl::OString;
38 : : using ::rtl::OUStringToOString;
39 : : using ::rtl::OStringToOUString;
40 : : #define JAVASETTINGS "javasettings"
41 : : #define JAVASETTINGS_XML "javasettings.xml"
42 : : #define VENDORSETTINGS "javavendors.xml"
43 : :
44 : : #define UNO_JAVA_JFW_PARAMETER "UNO_JAVA_JFW_PARAMETER_"
45 : : #define UNO_JAVA_JFW_JREHOME "UNO_JAVA_JFW_JREHOME"
46 : : #define UNO_JAVA_JFW_ENV_JREHOME "UNO_JAVA_JFW_ENV_JREHOME"
47 : : #define UNO_JAVA_JFW_CLASSPATH "UNO_JAVA_JFW_CLASSPATH"
48 : : #define UNO_JAVA_JFW_ENV_CLASSPATH "UNO_JAVA_JFW_ENV_CLASSPATH"
49 : : #define UNO_JAVA_JFW_CLASSPATH_URLS "UNO_JAVA_JFW_CLASSPATH_URLS"
50 : : #define UNO_JAVA_JFW_PARAMETERS "UNO_JAVA_JFW_PARAMETERS"
51 : : #define UNO_JAVA_JFW_VENDOR_SETTINGS "UNO_JAVA_JFW_VENDOR_SETTINGS"
52 : : #define UNO_JAVA_JFW_USER_DATA "UNO_JAVA_JFW_USER_DATA"
53 : : #define UNO_JAVA_JFW_SHARED_DATA "UNO_JAVA_JFW_SHARED_DATA"
54 : :
55 : : namespace jfw
56 : : {
57 : : bool g_bJavaSet = false;
58 : :
59 : : namespace {
60 : :
61 : 315 : rtl::OString getVendorSettingsPath(rtl::OUString const & sURL)
62 : : {
63 [ - + ]: 315 : if (sURL.isEmpty())
64 : 0 : return rtl::OString();
65 : 315 : rtl::OUString sSystemPathSettings;
66 [ - + ]: 315 : if (osl_getSystemPathFromFileURL(sURL.pData,
67 [ + - ]: 315 : & sSystemPathSettings.pData) != osl_File_E_None)
68 : : throw FrameworkException(
69 : : JFW_E_ERROR,
70 : : rtl::OString("[Java framework] Error in function "
71 : 0 : "getVendorSettingsPath (fwkbase.cxx) "));
72 : : rtl::OString osSystemPathSettings =
73 [ + - ][ + - ]: 315 : rtl::OUStringToOString(sSystemPathSettings,osl_getThreadTextEncoding());
74 : 315 : return osSystemPathSettings;
75 : : }
76 : :
77 : 990 : rtl::OUString getParam(const char * name)
78 : : {
79 : 990 : rtl::OUString retVal;
80 [ + - ]: 990 : if (Bootstrap::get()->getFrom(rtl::OUString::createFromAscii(name), retVal))
81 : : {
82 : : #if OSL_DEBUG_LEVEL >=2
83 : : rtl::OString sValue = rtl::OUStringToOString(retVal, osl_getThreadTextEncoding());
84 : : fprintf(stderr,"[Java framework] Using bootstrap parameter %s = %s.\n",
85 : : name, sValue.getStr());
86 : : #endif
87 : : }
88 : 990 : return retVal;
89 : : }
90 : :
91 : 990 : rtl::OUString getParamFirstUrl(const char * name)
92 : : {
93 : : // Some parameters can consist of multiple URLs (separated by space
94 : : // characters, although trim() harmlessly also removes other white-space),
95 : : // of which only the first is used:
96 : 990 : sal_Int32 i = 0;
97 [ + - ]: 990 : return getParam(name).trim().getToken(0, ' ', i);
98 : : }
99 : :
100 : : }//blind namespace
101 : :
102 : :
103 : 111 : VendorSettings::VendorSettings():
104 [ + - ][ + - ]: 111 : m_xmlDocVendorSettingsFileUrl(BootParams::getVendorSettings())
105 : : {
106 : : OString sMsgExc("[Java framework] Error in constructor "
107 : 111 : "VendorSettings::VendorSettings() (fwkbase.cxx)");
108 : : //Prepare the xml document and context
109 [ + - ]: 111 : OString sSettingsPath = getVendorSettingsPath(m_xmlDocVendorSettingsFileUrl);
110 [ - + ]: 111 : if (sSettingsPath.isEmpty())
111 : : {
112 : : OString sMsg("[Java framework] A vendor settings file was not specified."
113 : 0 : "Check the bootstrap parameter " UNO_JAVA_JFW_VENDOR_SETTINGS ".");
114 : : OSL_FAIL(sMsg.getStr());
115 : 0 : throw FrameworkException(JFW_E_CONFIGURATION, sMsg);
116 : : }
117 [ + - ]: 111 : if (!sSettingsPath.isEmpty())
118 : : {
119 [ + - ][ + - ]: 111 : m_xmlDocVendorSettings = xmlParseFile(sSettingsPath.getStr());
120 [ + - ][ - + ]: 111 : if (m_xmlDocVendorSettings == NULL)
121 : : throw FrameworkException(
122 : : JFW_E_ERROR,
123 : : OString("[Java framework] Error while parsing file: ")
124 : 0 : + sSettingsPath + OString("."));
125 : :
126 [ + - ][ + - ]: 111 : m_xmlPathContextVendorSettings = xmlXPathNewContext(m_xmlDocVendorSettings);
[ + - ]
127 : : int res = xmlXPathRegisterNs(
128 : : m_xmlPathContextVendorSettings, (xmlChar*) "jf",
129 [ + - ][ + - ]: 111 : (xmlChar*) NS_JAVA_FRAMEWORK);
130 [ - + ]: 111 : if (res == -1)
131 : 0 : throw FrameworkException(JFW_E_ERROR, sMsgExc);
132 : 111 : }
133 : 111 : }
134 : :
135 : 6 : std::vector<PluginLibrary> VendorSettings::getPluginData()
136 : : {
137 : : OString sExcMsg("[Java framework] Error in function VendorSettings::getVendorPluginURLs "
138 : 6 : "(fwkbase.cxx).");
139 [ + - ]: 6 : std::vector<PluginLibrary> vecPlugins;
140 : : CXPathObjectPtr result(xmlXPathEvalExpression(
141 : : (xmlChar*)"/jf:javaSelection/jf:plugins/jf:library",
142 [ + - ][ + - ]: 6 : m_xmlPathContextVendorSettings));
[ + - ]
143 [ + - ][ + - ]: 6 : if (xmlXPathNodeSetIsEmpty(result->nodesetval))
[ + - ][ + - ]
[ + - ][ - + ]
[ - + ]
144 : 0 : throw FrameworkException(JFW_E_ERROR, sExcMsg);
145 : :
146 : : //get the values of the library elements + vendor attribute
147 [ + - ]: 6 : xmlNode* cur = result->nodesetval->nodeTab[0];
148 : :
149 [ + + ]: 78 : while (cur != NULL)
150 : : {
151 : : //between library elements are also text elements
152 [ + + ]: 72 : if (cur->type == XML_ELEMENT_NODE)
153 : : {
154 [ + - ][ + - ]: 36 : CXmlCharPtr sAttrVendor(xmlGetProp(cur, (xmlChar*) "vendor"));
155 : : CXmlCharPtr sTextLibrary(
156 : : xmlNodeListGetString(m_xmlDocVendorSettings,
157 [ + - ][ + - ]: 36 : cur->xmlChildrenNode, 1));
[ + - ]
158 : 36 : PluginLibrary plugin;
159 [ + - ]: 36 : OString osVendor((sal_Char*)(xmlChar*) sAttrVendor);
160 [ + - ]: 36 : plugin.sVendor = OStringToOUString(osVendor, RTL_TEXTENCODING_UTF8);
161 : :
162 : : //create the file URL to the library
163 : : OUString sUrl = findPlugin(
164 [ + - ][ + - ]: 36 : m_xmlDocVendorSettingsFileUrl, sTextLibrary);
165 [ - + ]: 36 : if (sUrl.isEmpty())
166 : : {
167 : : OString sPlugin = OUStringToOString(
168 [ # # ][ # # ]: 0 : sTextLibrary, osl_getThreadTextEncoding());
[ # # ]
169 : : throw FrameworkException(
170 : : JFW_E_CONFIGURATION,
171 : 0 : "[Java framework] The file: " + sPlugin + " does not exist.");
172 : : }
173 : 36 : plugin.sPath = sUrl;
174 : :
175 [ + - ][ + - ]: 36 : vecPlugins.push_back(plugin);
[ + - ]
176 : : }
177 : 72 : cur = cur->next;
178 : : }
179 [ + - ]: 6 : return vecPlugins;
180 : : }
181 : :
182 : 12 : VersionInfo VendorSettings::getVersionInformation(const rtl::OUString & sVendor)
183 : : {
184 : : OSL_ASSERT(!sVendor.isEmpty());
185 [ + - ]: 12 : VersionInfo aVersionInfo;
186 [ + - ]: 12 : OString osVendor = OUStringToOString(sVendor, RTL_TEXTENCODING_UTF8);
187 : : //Get minVersion
188 : : OString sExpresion = OString(
189 : : "/jf:javaSelection/jf:vendorInfos/jf:vendor[@name=\"") +
190 : 12 : osVendor + OString("\"]/jf:minVersion");
191 : :
192 [ + - ]: 12 : CXPathObjectPtr xPathObjectMin;
193 : : xPathObjectMin =
194 : 12 : xmlXPathEvalExpression((xmlChar*) sExpresion.getStr(),
195 [ + - + - ]: 24 : m_xmlPathContextVendorSettings);
[ + - ]
196 [ + - ][ + - ]: 12 : if (xmlXPathNodeSetIsEmpty(xPathObjectMin->nodesetval))
[ + - ][ + - ]
[ + - ][ - + ]
[ - + ]
197 : : {
198 : 0 : aVersionInfo.sMinVersion = OUString();
199 : : }
200 : : else
201 : : {
202 [ + - ]: 12 : CXmlCharPtr sVersion;
203 : : sVersion = xmlNodeListGetString(
204 : : m_xmlDocVendorSettings,
205 [ + - ][ + - ]: 12 : xPathObjectMin->nodesetval->nodeTab[0]->xmlChildrenNode, 1);
[ + - ][ + - ]
206 [ + - ]: 12 : OString osVersion((sal_Char*)(xmlChar*) sVersion);
207 : : aVersionInfo.sMinVersion = OStringToOUString(
208 [ + - ][ + - ]: 12 : osVersion, RTL_TEXTENCODING_UTF8);
209 : : }
210 : :
211 : : //Get maxVersion
212 : : sExpresion = OString("/jf:javaSelection/jf:vendorInfos/jf:vendor[@name=\"") +
213 : 12 : osVendor + OString("\"]/jf:maxVersion");
214 [ + - ]: 12 : CXPathObjectPtr xPathObjectMax;
215 : : xPathObjectMax = xmlXPathEvalExpression(
216 : 12 : (xmlChar*) sExpresion.getStr(),
217 [ + - + - ]: 24 : m_xmlPathContextVendorSettings);
[ + - ]
218 [ + - ][ + - ]: 12 : if (xmlXPathNodeSetIsEmpty(xPathObjectMax->nodesetval))
[ + - ][ - + ]
[ # # ][ # # ]
[ + - ]
219 : : {
220 : 12 : aVersionInfo.sMaxVersion = OUString();
221 : : }
222 : : else
223 : : {
224 [ # # ]: 0 : CXmlCharPtr sVersion;
225 : : sVersion = xmlNodeListGetString(
226 : : m_xmlDocVendorSettings,
227 [ # # ][ # # ]: 0 : xPathObjectMax->nodesetval->nodeTab[0]->xmlChildrenNode, 1);
[ # # ][ # # ]
228 [ # # ]: 0 : OString osVersion((sal_Char*) (xmlChar*) sVersion);
229 : : aVersionInfo.sMaxVersion = OStringToOUString(
230 [ # # ][ # # ]: 0 : osVersion, RTL_TEXTENCODING_UTF8);
231 : : }
232 : :
233 : : //Get excludeVersions
234 : : sExpresion = OString("/jf:javaSelection/jf:vendorInfos/jf:vendor[@name=\"") +
235 : 12 : osVendor + OString("\"]/jf:excludeVersions/jf:version");
236 [ + - ]: 12 : CXPathObjectPtr xPathObjectVersions;
237 : : xPathObjectVersions =
238 : 12 : xmlXPathEvalExpression((xmlChar*) sExpresion.getStr(),
239 [ + - + - ]: 24 : m_xmlPathContextVendorSettings);
[ + - ]
240 [ + - ][ - + ]: 12 : if (!xmlXPathNodeSetIsEmpty(xPathObjectVersions->nodesetval))
[ # # ][ # # ]
[ # # ][ # # ]
[ - + ]
241 : : {
242 [ # # ]: 0 : xmlNode* cur = xPathObjectVersions->nodesetval->nodeTab[0];
243 [ # # ]: 0 : while (cur != NULL)
244 : : {
245 [ # # ]: 0 : if (cur->type == XML_ELEMENT_NODE )
246 : : {
247 [ # # ][ # # ]: 0 : if (xmlStrcmp(cur->name, (xmlChar*) "version") == 0)
248 : : {
249 [ # # ]: 0 : CXmlCharPtr sVersion;
250 : : sVersion = xmlNodeListGetString(
251 [ # # ][ # # ]: 0 : m_xmlDocVendorSettings, cur->xmlChildrenNode, 1);
[ # # ]
252 [ # # ]: 0 : OString osVersion((sal_Char*)(xmlChar*) sVersion);
253 : : OUString usVersion = OStringToOUString(
254 [ # # ]: 0 : osVersion, RTL_TEXTENCODING_UTF8);
255 [ # # ][ # # ]: 0 : aVersionInfo.addExcludeVersion(usVersion);
256 : : }
257 : : }
258 : 0 : cur = cur->next;
259 : : }
260 : : }
261 [ + - ][ + - ]: 12 : return aVersionInfo;
[ + - ]
262 : : }
263 : :
264 : 6 : std::vector<OUString> VendorSettings::getSupportedVendors()
265 : : {
266 [ + - ]: 6 : std::vector<rtl::OUString> vecVendors;
267 : : //get the nodeset for the library elements
268 [ + - ]: 6 : jfw::CXPathObjectPtr result;
269 : : result = xmlXPathEvalExpression(
270 : : (xmlChar*)"/jf:javaSelection/jf:plugins/jf:library",
271 [ + - ][ + - ]: 6 : m_xmlPathContextVendorSettings);
[ + - ]
272 [ + - ][ + - ]: 6 : if (xmlXPathNodeSetIsEmpty(result->nodesetval))
[ + - ][ + - ]
[ + - ][ - + ]
[ - + ]
273 : : throw FrameworkException(
274 : : JFW_E_ERROR,
275 : 0 : rtl::OString("[Java framework] Error in function getSupportedVendors (fwkbase.cxx)."));
276 : :
277 : : //get the values of the library elements + vendor attribute
278 [ + - ]: 6 : xmlNode* cur = result->nodesetval->nodeTab[0];
279 [ + + ]: 78 : while (cur != NULL)
280 : : {
281 : : //between library elements are also text elements
282 [ + + ]: 72 : if (cur->type == XML_ELEMENT_NODE)
283 : : {
284 [ + - ][ + - ]: 36 : jfw::CXmlCharPtr sAttrVendor(xmlGetProp(cur, (xmlChar*) "vendor"));
285 [ + - ][ + - ]: 36 : vecVendors.push_back(sAttrVendor);
[ + - ]
286 : : }
287 : 72 : cur = cur->next;
288 : : }
289 [ + - ]: 6 : return vecVendors;
290 : : }
291 : :
292 : 105 : OUString VendorSettings::getPluginLibrary(const OUString& sVendor)
293 : : {
294 : : OSL_ASSERT(!sVendor.isEmpty());
295 : :
296 : 105 : OString sExcMsg("[Java framework] Error in function getPluginLibrary (fwkbase.cxx).");
297 [ + - ]: 105 : OString sVendorsPath = getVendorSettingsPath(m_xmlDocVendorSettingsFileUrl);
298 : 105 : OUStringBuffer usBuffer(256);
299 [ + - ]: 105 : usBuffer.appendAscii("/jf:javaSelection/jf:plugins/jf:library[@vendor=\"");
300 [ + - ]: 105 : usBuffer.append(sVendor);
301 [ + - ]: 105 : usBuffer.appendAscii("\"]/text()");
302 [ + - ]: 105 : OUString ouExpr = usBuffer.makeStringAndClear();
303 : : OString sExpression =
304 [ + - ][ + - ]: 105 : OUStringToOString(ouExpr, osl_getThreadTextEncoding());
305 [ + - ]: 105 : CXPathObjectPtr pathObjVendor;
306 : : pathObjVendor = xmlXPathEvalExpression(
307 [ + - ][ + - ]: 105 : (xmlChar*) sExpression.getStr(), m_xmlPathContextVendorSettings);
[ + - ]
308 [ + - ][ + - ]: 105 : if (xmlXPathNodeSetIsEmpty(pathObjVendor->nodesetval))
[ + - ][ + - ]
[ + - ][ - + ]
[ - + ]
309 : 0 : throw FrameworkException(JFW_E_ERROR, sExcMsg);
310 : :
311 [ + - ]: 105 : CXmlCharPtr xmlCharPlugin;
312 : : xmlCharPlugin =
313 : : xmlNodeListGetString(
314 [ + - ][ + - ]: 105 : m_xmlDocVendorSettings,pathObjVendor->nodesetval->nodeTab[0], 1);
[ + - ][ + - ]
315 : :
316 : : //make an absolute file url from the relative plugin URL
317 [ + - ][ + - ]: 105 : OUString sUrl = findPlugin(m_xmlDocVendorSettingsFileUrl, xmlCharPlugin);
318 [ - + ]: 105 : if (sUrl.isEmpty())
319 : : {
320 : : OString sPlugin = OUStringToOString(
321 [ # # ][ # # ]: 0 : xmlCharPlugin, osl_getThreadTextEncoding());
[ # # ]
322 : : throw FrameworkException(
323 : : JFW_E_CONFIGURATION,
324 : 0 : "[Java framework] The file: " + sPlugin + " does not exist.");
325 : : }
326 [ + - ][ + - ]: 105 : return sUrl;
327 : : }
328 : :
329 : 4 : ::std::vector<OString> BootParams::getVMParameters()
330 : : {
331 : 4 : ::std::vector<OString> vecParams;
332 : :
333 : 4 : for (sal_Int32 i = 1; ; i++)
334 : : {
335 : : OUString sName =
336 : : OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_PARAMETER)) +
337 [ + - ]: 4 : OUString::valueOf(i);
338 : 4 : OUString sValue;
339 [ - + ][ + - ]: 4 : if (Bootstrap::get()->getFrom(sName, sValue) == sal_True)
340 : : {
341 : : OString sParam =
342 [ # # ][ # # ]: 0 : OUStringToOString(sValue, osl_getThreadTextEncoding());
343 [ # # ]: 4 : vecParams.push_back(sParam);
344 : : #if OSL_DEBUG_LEVEL >=2
345 : : rtl::OString sParamName = rtl::OUStringToOString(sName, osl_getThreadTextEncoding());
346 : : fprintf(stderr,"[Java framework] Using bootstrap parameter %s"
347 : : " = %s.\n", sParamName.getStr(), sParam.getStr());
348 : : #endif
349 : : }
350 : : else
351 : : break;
352 [ + - ][ - + ]: 4 : }
353 : 4 : return vecParams;
354 : : }
355 : :
356 : 792 : rtl::OUString BootParams::getUserData()
357 : : {
358 : 792 : return getParamFirstUrl(UNO_JAVA_JFW_USER_DATA);
359 : : }
360 : :
361 : 198 : rtl::OUString BootParams::getSharedData()
362 : : {
363 : 198 : return getParamFirstUrl(UNO_JAVA_JFW_SHARED_DATA);
364 : : }
365 : :
366 : 4 : rtl::OString BootParams::getClasspath()
367 : : {
368 : 4 : rtl::OString sClassPath;
369 : 4 : rtl::OUString sCP;
370 : 4 : char szSep[] = {SAL_PATHSEPARATOR,0};
371 [ + - - + ]: 8 : if (Bootstrap::get()->getFrom(
372 : : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_CLASSPATH)),
373 [ + - ]: 8 : sCP) == sal_True)
374 : : {
375 : : sClassPath = rtl::OUStringToOString(
376 [ # # ][ # # ]: 0 : sCP, osl_getThreadTextEncoding());
377 : : #if OSL_DEBUG_LEVEL >=2
378 : : fprintf(stderr,"[Java framework] Using bootstrap parameter "
379 : : UNO_JAVA_JFW_CLASSPATH " = %s.\n", sClassPath.getStr());
380 : : #endif
381 : : }
382 : :
383 : 4 : rtl::OUString sEnvCP;
384 [ + - + - ]: 8 : if (Bootstrap::get()->getFrom(
385 : : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_ENV_CLASSPATH)),
386 [ + - ]: 8 : sEnvCP) == sal_True)
387 : : {
388 : 4 : char * pCp = getenv("CLASSPATH");
389 [ + - ]: 4 : if (pCp)
390 : : {
391 : 4 : sClassPath += rtl::OString(szSep) + rtl::OString(pCp);
392 : : }
393 : : #if OSL_DEBUG_LEVEL >=2
394 : : fprintf(stderr,"[Java framework] Using bootstrap parameter "
395 : : UNO_JAVA_JFW_ENV_CLASSPATH " and class path is:\n %s.\n", pCp ? pCp : "");
396 : : #endif
397 : : }
398 : :
399 : 4 : return sClassPath;
400 : : }
401 : :
402 : 210 : rtl::OUString BootParams::getVendorSettings()
403 : : {
404 : 210 : rtl::OUString sVendor;
405 : : rtl::OUString sName(
406 [ + - ]: 210 : RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_VENDOR_SETTINGS));
407 [ + - ][ + - ]: 210 : if (Bootstrap::get()->getFrom(sName ,sVendor) == sal_True)
408 : : {
409 : : //check the value of the bootstrap variable
410 [ + - ]: 210 : jfw::FileStatus s = checkFileURL(sVendor);
411 [ - + ]: 210 : if (s != FILE_OK)
412 : : {
413 : : //This bootstrap parameter can contain a relative URL
414 : 0 : rtl::OUString sAbsoluteUrl;
415 [ # # ]: 0 : rtl::OUString sBaseDir = getLibraryLocation();
416 [ # # ][ # # ]: 0 : if (File::getAbsoluteFileURL(sBaseDir, sVendor, sAbsoluteUrl)
417 : : != File::E_None)
418 : : throw FrameworkException(
419 : : JFW_E_CONFIGURATION,
420 : : rtl::OString("[Java framework] Invalid value for bootstrap variable: "
421 : 0 : UNO_JAVA_JFW_VENDOR_SETTINGS));
422 : 0 : sVendor = sAbsoluteUrl;
423 [ # # ]: 0 : s = checkFileURL(sVendor);
424 [ # # ][ # # ]: 0 : if (s == jfw::FILE_INVALID || s == jfw::FILE_DOES_NOT_EXIST)
425 : : {
426 : : throw FrameworkException(
427 : : JFW_E_CONFIGURATION,
428 : : rtl::OString("[Java framework] Invalid value for bootstrap variable: "
429 : 0 : UNO_JAVA_JFW_VENDOR_SETTINGS));
430 : 0 : }
431 : : }
432 : : #if OSL_DEBUG_LEVEL >=2
433 : : rtl::OString sValue = rtl::OUStringToOString(sVendor, osl_getThreadTextEncoding());
434 : : fprintf(stderr,"[Java framework] Using bootstrap parameter "
435 : : UNO_JAVA_JFW_VENDOR_SETTINGS" = %s.\n", sValue.getStr());
436 : : #endif
437 : : }
438 : 210 : return sVendor;
439 : : }
440 : :
441 : 6 : rtl::OUString BootParams::getJREHome()
442 : : {
443 : 6 : rtl::OUString sJRE;
444 : 6 : rtl::OUString sEnvJRE;
445 [ + - ]: 6 : sal_Bool bJRE = Bootstrap::get()->getFrom(
446 [ + - ]: 12 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_JREHOME)) ,sJRE);
447 [ + - ]: 6 : sal_Bool bEnvJRE = Bootstrap::get()->getFrom(
448 [ + - ]: 12 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_ENV_JREHOME)) ,sEnvJRE);
449 : :
450 [ # # ][ - + ]: 6 : if (bJRE == sal_True && bEnvJRE == sal_True)
451 : : {
452 : : throw FrameworkException(
453 : : JFW_E_CONFIGURATION,
454 : : rtl::OString("[Java framework] Both bootstrap parameter "
455 : : UNO_JAVA_JFW_JREHOME" and "
456 : : UNO_JAVA_JFW_ENV_JREHOME" are set. However only one of them can be set."
457 : : "Check bootstrap parameters: environment variables, command line "
458 : 0 : "arguments, rc/ini files for executable and java framework library."));
459 : : }
460 [ + - ]: 6 : else if (bEnvJRE == sal_True)
461 : : {
462 : 6 : const char * pJRE = getenv("JAVA_HOME");
463 [ - + ]: 6 : if (pJRE == NULL)
464 : : {
465 : : throw FrameworkException(
466 : : JFW_E_CONFIGURATION,
467 : : rtl::OString("[Java framework] Both bootstrap parameter "
468 : : UNO_JAVA_JFW_ENV_JREHOME" is set, but the environment variable "
469 : 0 : "JAVA_HOME is not set."));
470 : : }
471 : 6 : rtl::OString osJRE(pJRE);
472 [ + - ][ + - ]: 6 : rtl::OUString usJRE = rtl::OStringToOUString(osJRE, osl_getThreadTextEncoding());
473 [ + - ][ - + ]: 6 : if (File::getFileURLFromSystemPath(usJRE, sJRE) != File::E_None)
474 : : throw FrameworkException(
475 : : JFW_E_ERROR,
476 : : rtl::OString("[Java framework] Error in function BootParams::getJREHome() "
477 : 6 : "(fwkbase.cxx)."));
478 : : #if OSL_DEBUG_LEVEL >=2
479 : : fprintf(stderr,"[Java framework] Using bootstrap parameter "
480 : : UNO_JAVA_JFW_ENV_JREHOME" with JAVA_HOME = %s.\n", pJRE);
481 : : #endif
482 : : }
483 [ # # ][ # # ]: 0 : else if (getMode() == JFW_MODE_DIRECT
[ # # ][ # # ]
[ # # ]
484 : : && bEnvJRE == sal_False
485 : : && bJRE == sal_False)
486 : : {
487 : : throw FrameworkException(
488 : : JFW_E_CONFIGURATION,
489 : : rtl::OString("[Java framework] The bootstrap parameter "
490 : : UNO_JAVA_JFW_ENV_JREHOME" or " UNO_JAVA_JFW_JREHOME
491 : 0 : " must be set in direct mode."));
492 : : }
493 : :
494 : : #if OSL_DEBUG_LEVEL >=2
495 : : if (bJRE == sal_True)
496 : : {
497 : : rtl::OString sValue = rtl::OUStringToOString(sJRE, osl_getThreadTextEncoding());
498 : : fprintf(stderr,"[Java framework] Using bootstrap parameter "
499 : : UNO_JAVA_JFW_JREHOME" = %s.\n", sValue.getStr());
500 : : }
501 : : #endif
502 : 6 : return sJRE;
503 : : }
504 : :
505 : 0 : rtl::OUString BootParams::getClasspathUrls()
506 : : {
507 : 0 : rtl::OUString sParams;
508 [ # # ]: 0 : Bootstrap::get()->getFrom(
509 : : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_CLASSPATH_URLS)),
510 [ # # ]: 0 : sParams);
511 : : #if OSL_DEBUG_LEVEL >=2
512 : : rtl::OString sValue = rtl::OUStringToOString(sParams, osl_getThreadTextEncoding());
513 : : fprintf(stderr,"[Java framework] Using bootstrap parameter "
514 : : UNO_JAVA_JFW_CLASSPATH_URLS " = %s.\n", sValue.getStr());
515 : : #endif
516 : 0 : return sParams;
517 : : }
518 : :
519 : 606 : JFW_MODE getMode()
520 : : {
521 : : static bool g_bMode = false;
522 : : static JFW_MODE g_mode = JFW_MODE_APPLICATION;
523 : :
524 [ + + ]: 606 : if (g_bMode == false)
525 : : {
526 : : //check if either of the "direct mode" bootstrap variables is set
527 : 105 : bool bDirectMode = true;
528 : 105 : rtl::OUString sValue;
529 [ + - ]: 105 : const rtl::Bootstrap * aBoot = Bootstrap::get();
530 : : rtl::OUString sJREHome(
531 [ + - ]: 105 : RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_JREHOME));
532 [ + - ]: 105 : if (aBoot->getFrom(sJREHome, sValue) == sal_False)
533 : : {
534 : : rtl::OUString sEnvJRE(
535 [ + - ]: 105 : RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_ENV_JREHOME));
536 [ + + ]: 105 : if (aBoot->getFrom(sEnvJRE, sValue) == sal_False)
537 : : {
538 : : rtl::OUString sClasspath(
539 [ + - ]: 99 : RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_CLASSPATH));
540 [ + - ]: 99 : if (aBoot->getFrom(sClasspath, sValue) == sal_False)
541 : : {
542 : : rtl::OUString sEnvClasspath(
543 [ + - ]: 99 : RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_ENV_CLASSPATH));
544 [ + - ]: 99 : if (aBoot->getFrom(sEnvClasspath, sValue) == sal_False)
545 : : {
546 : : rtl::OUString sParams = rtl::OUString(
547 : : RTL_CONSTASCII_USTRINGPARAM(UNO_JAVA_JFW_PARAMETER)) +
548 [ + - ]: 99 : rtl::OUString::valueOf((sal_Int32)1);
549 [ + - ]: 99 : if (aBoot->getFrom(sParams, sValue) == sal_False)
550 : : {
551 : 99 : bDirectMode = false;
552 : 99 : }
553 : 99 : }
554 : 99 : }
555 : 105 : }
556 : : }
557 : :
558 [ + + ]: 105 : if (bDirectMode)
559 : 6 : g_mode = JFW_MODE_DIRECT;
560 : : else
561 : 99 : g_mode = JFW_MODE_APPLICATION;
562 : 105 : g_bMode = true;
563 : : }
564 : :
565 : 606 : return g_mode;
566 : : }
567 : :
568 : 0 : rtl::OUString getApplicationClassPath()
569 : : {
570 : : OSL_ASSERT(getMode() == JFW_MODE_APPLICATION);
571 : 0 : rtl::OUString retVal;
572 [ # # ]: 0 : rtl::OUString sParams = BootParams::getClasspathUrls();
573 [ # # ]: 0 : if (sParams.isEmpty())
574 : 0 : return retVal;
575 : :
576 : 0 : rtl::OUStringBuffer buf;
577 : 0 : sal_Int32 index = 0;
578 : 0 : char szClassPathSep[] = {SAL_PATHSEPARATOR,0};
579 [ # # ]: 0 : do
580 : : {
581 : 0 : ::rtl::OUString token( sParams.getToken( 0, ' ', index ).trim() );
582 [ # # ]: 0 : if (!token.isEmpty())
583 : : {
584 : 0 : ::rtl::OUString systemPathElement;
585 : : oslFileError rc = osl_getSystemPathFromFileURL(
586 [ # # ]: 0 : token.pData, &systemPathElement.pData );
587 : : OSL_ASSERT( rc == osl_File_E_None );
588 [ # # ][ # # ]: 0 : if (rc == osl_File_E_None && !systemPathElement.isEmpty())
[ # # ]
589 : : {
590 [ # # ]: 0 : if (buf.getLength() > 0)
591 : : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
592 [ # # ]: 0 : szClassPathSep) );
593 [ # # ]: 0 : buf.append( systemPathElement );
594 : 0 : }
595 : 0 : }
596 : : }
597 : : while (index >= 0);
598 [ # # ]: 0 : return buf.makeStringAndClear();
599 : : }
600 : :
601 : 0 : rtl::OString makeClassPathOption(OUString const & sUserClassPath)
602 : : {
603 : : //Compose the class path
604 : 0 : rtl::OString sPaths;
605 : 0 : rtl::OUStringBuffer sBufCP(4096);
606 : 0 : char szSep[] = {SAL_PATHSEPARATOR,0};
607 : :
608 : : // append all user selected jars to the class path
609 [ # # ]: 0 : if (!sUserClassPath.isEmpty())
610 [ # # ]: 0 : sBufCP.append(sUserClassPath);
611 : :
612 : : //append all jar libraries and components to the class path
613 [ # # ]: 0 : OUString sAppCP = getApplicationClassPath();
614 [ # # ]: 0 : if (!sAppCP.isEmpty())
615 : : {
616 [ # # ]: 0 : if (!sUserClassPath.isEmpty())
617 [ # # ]: 0 : sBufCP.appendAscii(szSep);
618 [ # # ]: 0 : sBufCP.append(sAppCP);
619 : : }
620 : :
621 : : sPaths = rtl::OUStringToOString(
622 [ # # ][ # # ]: 0 : sBufCP.makeStringAndClear(), osl_getThreadTextEncoding());
[ # # ]
623 : :
624 : 0 : rtl::OString sOptionClassPath("-Djava.class.path=");
625 : 0 : sOptionClassPath += sPaths;
626 : 0 : return sOptionClassPath;
627 : : }
628 : :
629 : 396 : rtl::OString getUserSettingsPath()
630 : : {
631 [ + - ]: 396 : return getSettingsPath(BootParams::getUserData());
632 : : }
633 : :
634 : 0 : rtl::OString getSharedSettingsPath()
635 : : {
636 [ # # ]: 0 : return getSettingsPath(BootParams::getSharedData());
637 : : }
638 : :
639 : 396 : rtl::OString getSettingsPath( const rtl::OUString & sURL)
640 : : {
641 [ - + ]: 396 : if (sURL.isEmpty())
642 : 0 : return rtl::OString();
643 : 396 : rtl::OUString sPath;
644 [ - + ]: 396 : if (osl_getSystemPathFromFileURL(sURL.pData,
645 [ + - ]: 396 : & sPath.pData) != osl_File_E_None)
646 : : throw FrameworkException(
647 : : JFW_E_ERROR, rtl::OString(
648 : 0 : "[Java framework] Error in function ::getSettingsPath (fwkbase.cxx)."));
649 [ + - ][ + - ]: 396 : return rtl::OUStringToOString(sPath,osl_getThreadTextEncoding());
650 : : }
651 : :
652 : 99 : rtl::OString getVendorSettingsPath()
653 : : {
654 [ + - ]: 99 : return getVendorSettingsPath(BootParams::getVendorSettings());
655 : : }
656 : :
657 : 0 : void setJavaSelected()
658 : : {
659 : 0 : g_bJavaSet = true;
660 : 0 : }
661 : :
662 : 0 : bool wasJavaSelectedInSameProcess()
663 : : {
664 : : //g_setJavaProcId not set means no Java selected
665 [ # # ]: 0 : if (g_bJavaSet == true)
666 : 0 : return true;
667 : 0 : return false;
668 : : }
669 : :
670 : :
671 : : }
672 : :
673 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|