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_jvmfwk.hxx"
26 #include "elements.hxx"
27 #include "osl/mutex.hxx"
28 #include "osl/file.hxx"
29 #include "osl/time.h"
30 #include "fwkutil.hxx"
31 #include "fwkbase.hxx"
32 #include "framework.hxx"
33 #include "libxmlutil.hxx"
34 #include "osl/thread.hxx"
35 #include <algorithm>
36 #include "libxml/parser.h"
37 #include "libxml/xpath.h"
38 #include "libxml/xpathInternals.h"
39 #include "rtl/bootstrap.hxx"
40 #include "boost/optional.hpp"
41 #include <string.h>
42 // #define NS_JAVA_FRAMEWORK "http://openoffice.org/2004/java/framework/1.0"
43 // #define NS_SCHEMA_INSTANCE "http://www.w3.org/2001/XMLSchema-instance"
44
45
46 using namespace osl;
47 namespace jfw
48 {
49
getElement(::rtl::OString const & docPath,xmlChar const * pathExpression,bool bThrowIfEmpty)50 rtl::OString getElement(::rtl::OString const & docPath,
51 xmlChar const * pathExpression, bool bThrowIfEmpty)
52 {
53 //Prepare the xml document and context
54 OSL_ASSERT(docPath.getLength() > 0);
55 jfw::CXmlDocPtr doc(xmlParseFile(docPath.getStr()));
56 if (doc == NULL)
57 throw FrameworkException(
58 JFW_E_ERROR,
59 rtl::OString("[Java framework] Error in function getElement "
60 "(elements.cxx)"));
61
62 jfw::CXPathContextPtr context(xmlXPathNewContext(doc));
63 if (xmlXPathRegisterNs(context, (xmlChar*) "jf",
64 (xmlChar*) NS_JAVA_FRAMEWORK) == -1)
65 throw FrameworkException(
66 JFW_E_ERROR,
67 rtl::OString("[Java framework] Error in function getElement "
68 "(elements.cxx)"));
69
70 CXPathObjectPtr pathObj;
71 pathObj = xmlXPathEvalExpression(pathExpression, context);
72 rtl::OString sValue;
73 if (xmlXPathNodeSetIsEmpty(pathObj->nodesetval))
74 {
75 if (bThrowIfEmpty)
76 throw FrameworkException(
77 JFW_E_ERROR,
78 rtl::OString("[Java framework] Error in function getElement "
79 "(elements.cxx)"));
80 }
81 else
82 {
83 sValue = (sal_Char*) pathObj->nodesetval->nodeTab[0]->content;
84 }
85 return sValue;
86 }
87
getElementUpdated()88 rtl::OString getElementUpdated()
89 {
90 return getElement(jfw::getVendorSettingsPath(),
91 (xmlChar*)"/jf:javaSelection/jf:updated/text()", true);
92 }
93
94 // Use only in INSTALL mode !!!
getElementModified()95 rtl::OString getElementModified()
96 {
97 //The modified element is only written in INSTALL mode.
98 //That is NodeJava::m_layer = INSTALL
99 return getElement(jfw::getInstallSettingsPath(),
100 (xmlChar*)"/jf:java/jf:modified/text()", false);
101 }
102
103
createSettingsStructure(xmlDoc * document,bool * pbNeedsSave)104 void createSettingsStructure( xmlDoc* document, bool* pbNeedsSave)
105 {
106 rtl::OString sExcMsg("[Java framework] Error in function createSettingsStructure "
107 "(elements.cxx).");
108 xmlNode * root = xmlDocGetRootElement(document);
109 if (root == NULL)
110 throw FrameworkException(JFW_E_ERROR, sExcMsg);
111 bool bFound = false;
112 xmlNode * cur = root->children;
113 while (cur != NULL)
114 {
115 if (xmlStrcmp(cur->name, (xmlChar*) "enabled") == 0)
116 {
117 bFound = true;
118 break;
119 }
120 cur = cur->next;
121 }
122 if (bFound)
123 {
124 *pbNeedsSave = false;
125 return;
126 }
127 //We will modify this document
128 *pbNeedsSave = true;
129 // Now we create the child elements ------------------
130 //Get xsi:nil namespace
131 xmlNs* nsXsi = xmlSearchNsByHref(
132 document, root,(xmlChar*) NS_SCHEMA_INSTANCE);
133
134 //<enabled xsi:nil="true"
135 xmlNode * nodeEn = xmlNewTextChild(
136 root,NULL, (xmlChar*) "enabled", (xmlChar*) "");
137 if (nodeEn == NULL)
138 throw FrameworkException(JFW_E_ERROR, sExcMsg);
139 xmlSetNsProp(nodeEn,nsXsi,(xmlChar*) "nil",(xmlChar*) "true");
140 //add a new line
141 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
142 xmlAddChild(root, nodeCrLf);
143
144 //<userClassPath xsi:nil="true">
145 xmlNode * nodeUs = xmlNewTextChild(
146 root,NULL, (xmlChar*) "userClassPath", (xmlChar*) "");
147 if (nodeUs == NULL)
148 throw FrameworkException(JFW_E_ERROR, sExcMsg);
149 xmlSetNsProp(nodeUs,nsXsi,(xmlChar*) "nil",(xmlChar*) "true");
150 //add a new line
151 nodeCrLf = xmlNewText((xmlChar*) "\n");
152 xmlAddChild(root, nodeCrLf);
153
154 //<vmParameters xsi:nil="true">
155 xmlNode * nodeVm = xmlNewTextChild(
156 root,NULL, (xmlChar*) "vmParameters", (xmlChar*) "");
157 if (nodeVm == NULL)
158 throw FrameworkException(JFW_E_ERROR, sExcMsg);
159 xmlSetNsProp(nodeVm,nsXsi,(xmlChar*) "nil",(xmlChar*) "true");
160 //add a new line
161 nodeCrLf = xmlNewText((xmlChar*) "\n");
162 xmlAddChild(root, nodeCrLf);
163
164 //<jreLocations xsi:nil="true">
165 xmlNode * nodeJre = xmlNewTextChild(
166 root,NULL, (xmlChar*) "jreLocations", (xmlChar*) "");
167 if (nodeJre == NULL)
168 throw FrameworkException(JFW_E_ERROR, sExcMsg);
169 xmlSetNsProp(nodeJre,nsXsi,(xmlChar*) "nil",(xmlChar*) "true");
170 //add a new line
171 nodeCrLf = xmlNewText((xmlChar*) "\n");
172 xmlAddChild(root, nodeCrLf);
173
174 //<javaInfo xsi:nil="true" autoSelect="true">
175 xmlNode * nodeJava = xmlNewTextChild(
176 root,NULL, (xmlChar*) "javaInfo", (xmlChar*) "");
177 if (nodeJava == NULL)
178 throw FrameworkException(JFW_E_ERROR, sExcMsg);
179 xmlSetNsProp(nodeJava,nsXsi,(xmlChar*) "nil",(xmlChar*) "true");
180 // xmlSetProp(nodeJava,(xmlChar*) "autoSelect",(xmlChar*) "true");
181 //add a new line
182 nodeCrLf = xmlNewText((xmlChar*) "\n");
183 xmlAddChild(root, nodeCrLf);
184 }
185
186
187 //====================================================================
VersionInfo()188 VersionInfo::VersionInfo(): arVersions(NULL)
189 {
190 }
191
~VersionInfo()192 VersionInfo::~VersionInfo()
193 {
194 delete [] arVersions;
195 }
196
addExcludeVersion(const rtl::OUString & sVersion)197 void VersionInfo::addExcludeVersion(const rtl::OUString& sVersion)
198 {
199 vecExcludeVersions.push_back(sVersion);
200 }
201
getExcludeVersions()202 rtl_uString** VersionInfo::getExcludeVersions()
203 {
204 osl::MutexGuard guard(FwkMutex::get());
205 if (arVersions != NULL)
206 return arVersions;
207
208 arVersions = new rtl_uString*[vecExcludeVersions.size()];
209 int j=0;
210 typedef std::vector<rtl::OUString>::const_iterator it;
211 for (it i = vecExcludeVersions.begin(); i != vecExcludeVersions.end();
212 i++, j++)
213 {
214 arVersions[j] = vecExcludeVersions[j].pData;
215 }
216 return arVersions;
217 }
218
getExcludeVersionSize()219 sal_Int32 VersionInfo::getExcludeVersionSize()
220 {
221 return vecExcludeVersions.size();
222 }
223 //==================================================================
224
NodeJava(Layer layer)225 NodeJava::NodeJava(Layer layer):
226 m_layer(layer)
227 {
228 //This class reads and write to files which should only be done in
229 //application mode
230 if (getMode() == JFW_MODE_DIRECT)
231 throw FrameworkException(
232 JFW_E_DIRECT_MODE,
233 "[Java framework] Trying to access settings files in direct mode.");
234
235 if (USER_OR_INSTALL == m_layer)
236 {
237 if (BootParams::getInstallData().getLength() > 0)
238 m_layer = INSTALL;
239 else
240 m_layer = USER;
241 }
242 else
243 {
244 m_layer = layer;
245 }
246 }
247
248
load()249 void NodeJava::load()
250 {
251 const rtl::OString sExcMsg("[Java framework] Error in function NodeJava::load"
252 "(elements.cxx).");
253 if (SHARED == m_layer)
254 {
255 //we do not support yet to write into the shared installation
256
257 //check if shared settings exist at all.
258 jfw::FileStatus s = checkFileURL(BootParams::getSharedData());
259 if (s == FILE_INVALID)
260 throw FrameworkException(
261 JFW_E_ERROR,
262 "[Java framework] Invalid file for shared Java settings.");
263 else if (s == FILE_DOES_NOT_EXIST)
264 //Writing shared data is not supported yet.
265 return;
266 }
267 else if (USER == m_layer || INSTALL == m_layer)
268 {
269 prepareSettingsDocument();
270 }
271 else
272 {
273 OSL_ASSERT("[Java framework] Unknown enum used.");
274 }
275
276
277 //Read the user elements
278 rtl::OString sSettingsPath = getSettingsPath();
279 //There must not be a share settings file
280 CXmlDocPtr docUser(xmlParseFile(sSettingsPath.getStr()));
281 if (docUser == NULL)
282 throw FrameworkException(JFW_E_ERROR, sExcMsg);
283
284 xmlNode * cur = xmlDocGetRootElement(docUser);
285 if (cur == NULL || cur->children == NULL)
286 throw FrameworkException(JFW_E_ERROR, sExcMsg);
287
288 CXmlCharPtr sNil;
289 cur = cur->children;
290 while (cur != NULL)
291 {
292 if (xmlStrcmp(cur->name, (xmlChar*) "enabled") == 0)
293 {
294 //only overwrite share settings if xsi:nil="false"
295 sNil = xmlGetNsProp(
296 cur, (xmlChar*) "nil", (xmlChar*) NS_SCHEMA_INSTANCE);
297 if (sNil == NULL)
298 throw FrameworkException(JFW_E_ERROR, sExcMsg);;
299 if (xmlStrcmp(sNil, (xmlChar*) "false") == 0)
300 {
301 CXmlCharPtr sEnabled( xmlNodeListGetString(
302 docUser, cur->children, 1));
303 if (xmlStrcmp(sEnabled, (xmlChar*) "true") == 0)
304 m_enabled = boost::optional<sal_Bool>(sal_True);
305 else if (xmlStrcmp(sEnabled, (xmlChar*) "false") == 0)
306 m_enabled = boost::optional<sal_Bool>(sal_False);
307 }
308 }
309 else if (xmlStrcmp(cur->name, (xmlChar*) "userClassPath") == 0)
310 {
311 sNil = xmlGetNsProp(
312 cur, (xmlChar*) "nil", (xmlChar*) NS_SCHEMA_INSTANCE);
313 if (sNil == NULL)
314 throw FrameworkException(JFW_E_ERROR, sExcMsg);
315 if (xmlStrcmp(sNil, (xmlChar*) "false") == 0)
316 {
317 CXmlCharPtr sUser(xmlNodeListGetString(
318 docUser, cur->children, 1));
319 m_userClassPath = boost::optional<rtl::OUString>(rtl::OUString(sUser));
320 }
321 }
322 else if (xmlStrcmp(cur->name, (xmlChar*) "javaInfo") == 0)
323 {
324 sNil = xmlGetNsProp(
325 cur, (xmlChar*) "nil", (xmlChar*) NS_SCHEMA_INSTANCE);
326 if (sNil == NULL)
327 throw FrameworkException(JFW_E_ERROR, sExcMsg);
328
329 if (xmlStrcmp(sNil, (xmlChar*) "false") == 0)
330 {
331 if (! m_javaInfo)
332 m_javaInfo = boost::optional<CNodeJavaInfo>(CNodeJavaInfo());
333 m_javaInfo->loadFromNode(docUser, cur);
334 }
335 }
336 else if (xmlStrcmp(cur->name, (xmlChar*) "vmParameters") == 0)
337 {
338 sNil = xmlGetNsProp(
339 cur, (xmlChar*) "nil", (xmlChar*) NS_SCHEMA_INSTANCE);
340 if (sNil == NULL)
341 throw FrameworkException(JFW_E_ERROR, sExcMsg);
342 if (xmlStrcmp(sNil, (xmlChar*) "false") == 0)
343 {
344 if ( ! m_vmParameters)
345 m_vmParameters = boost::optional<std::vector<rtl::OUString> >(
346 std::vector<rtl::OUString> ());
347
348 xmlNode * pOpt = cur->children;
349 while (pOpt != NULL)
350 {
351 if (xmlStrcmp(pOpt->name, (xmlChar*) "param") == 0)
352 {
353 CXmlCharPtr sOpt;
354 sOpt = xmlNodeListGetString(
355 docUser, pOpt->children, 1);
356 m_vmParameters->push_back(sOpt);
357 }
358 pOpt = pOpt->next;
359 }
360 }
361 }
362 else if (xmlStrcmp(cur->name, (xmlChar*) "jreLocations") == 0)
363 {
364 sNil = xmlGetNsProp(
365 cur, (xmlChar*) "nil", (xmlChar*) NS_SCHEMA_INSTANCE);
366 if (sNil == NULL)
367 throw FrameworkException(JFW_E_ERROR, sExcMsg);
368 if (xmlStrcmp(sNil, (xmlChar*) "false") == 0)
369 {
370 if (! m_JRELocations)
371 m_JRELocations = boost::optional<std::vector<rtl::OUString> >(
372 std::vector<rtl::OUString>());
373
374 xmlNode * pLoc = cur->children;
375 while (pLoc != NULL)
376 {
377 if (xmlStrcmp(pLoc->name, (xmlChar*) "location") == 0)
378 {
379 CXmlCharPtr sLoc;
380 sLoc = xmlNodeListGetString(
381 docUser, pLoc->children, 1);
382 m_JRELocations->push_back(sLoc);
383 }
384 pLoc = pLoc->next;
385 }
386 }
387 }
388 cur = cur->next;
389 }
390 }
391
getSettingsPath() const392 ::rtl::OString NodeJava::getSettingsPath() const
393 {
394 ::rtl::OString ret;
395 switch (m_layer)
396 {
397 case USER: ret = getUserSettingsPath(); break;
398 case INSTALL: ret = getInstallSettingsPath(); break;
399 case SHARED: ret = getSharedSettingsPath(); break;
400 default:
401 OSL_ASSERT("[Java framework] NodeJava::getSettingsPath()");
402 }
403 return ret;
404 }
405
getSettingsURL() const406 ::rtl::OUString NodeJava::getSettingsURL() const
407 {
408 ::rtl::OUString ret;
409 switch (m_layer)
410 {
411 case USER: ret = BootParams::getUserData(); break;
412 case INSTALL: ret = BootParams::getInstallData(); break;
413 case SHARED: ret = BootParams::getSharedData(); break;
414 default:
415 OSL_ASSERT("[Java framework] NodeJava::getSettingsURL()");
416 }
417 return ret;
418 }
419
prepareSettingsDocument() const420 void NodeJava::prepareSettingsDocument() const
421 {
422 rtl::OString sExcMsg(
423 "[Java framework] Error in function prepareSettingsDocument"
424 " (elements.cxx).");
425 createSettingsDocument();
426 rtl::OString sSettings = getSettingsPath();
427 CXmlDocPtr doc(xmlParseFile(sSettings.getStr()));
428 if (!doc)
429 throw FrameworkException(JFW_E_ERROR, sExcMsg);
430
431 bool bNeedsSave = false;
432 createSettingsStructure(doc, & bNeedsSave);
433 if (bNeedsSave)
434 {
435 if (xmlSaveFormatFileEnc(
436 sSettings.getStr(), doc,"UTF-8", 1) == -1)
437 throw FrameworkException(JFW_E_ERROR, sExcMsg);
438 }
439 }
440
write() const441 void NodeJava::write() const
442 {
443 rtl::OString sExcMsg("[Java framework] Error in function NodeJava::writeSettings "
444 "(elements.cxx).");
445 CXmlDocPtr docUser;
446 CXPathContextPtr contextUser;
447 CXPathObjectPtr pathObj;
448
449 prepareSettingsDocument();
450
451 //Read the user elements
452 rtl::OString sSettingsPath = getSettingsPath();
453 docUser = xmlParseFile(sSettingsPath.getStr());
454 if (docUser == NULL)
455 throw FrameworkException(JFW_E_ERROR, sExcMsg);
456 contextUser = xmlXPathNewContext(docUser);
457 if (xmlXPathRegisterNs(contextUser, (xmlChar*) "jf",
458 (xmlChar*) NS_JAVA_FRAMEWORK) == -1)
459 throw FrameworkException(JFW_E_ERROR, sExcMsg);
460
461 xmlNode * root = xmlDocGetRootElement(docUser);
462 //Get xsi:nil namespace
463 xmlNs* nsXsi = xmlSearchNsByHref(docUser,
464 root,
465 (xmlChar*) NS_SCHEMA_INSTANCE);
466
467 //set the <enabled> element
468 //The element must exist
469 if (m_enabled)
470 {
471 rtl::OString sExpression= rtl::OString(
472 "/jf:java/jf:enabled");
473 pathObj = xmlXPathEvalExpression((xmlChar*) sExpression.getStr(),
474 contextUser);
475 if ( ! pathObj || xmlXPathNodeSetIsEmpty(pathObj->nodesetval))
476 throw FrameworkException(JFW_E_ERROR, sExcMsg);
477
478 xmlNode * nodeEnabled = pathObj->nodesetval->nodeTab[0];
479 xmlSetNsProp(nodeEnabled,
480 nsXsi,
481 (xmlChar*) "nil",
482 (xmlChar*) "false");
483
484 if (m_enabled == boost::optional<sal_Bool>(sal_True))
485 xmlNodeSetContent(nodeEnabled,(xmlChar*) "true");
486 else
487 xmlNodeSetContent(nodeEnabled,(xmlChar*) "false");
488 }
489
490 //set the <userClassPath> element
491 //The element must exist
492 if (m_userClassPath)
493 {
494 rtl::OString sExpression= rtl::OString(
495 "/jf:java/jf:userClassPath");
496 pathObj = xmlXPathEvalExpression((xmlChar*) sExpression.getStr(),
497 contextUser);
498 if ( ! pathObj || xmlXPathNodeSetIsEmpty(pathObj->nodesetval))
499 throw FrameworkException(JFW_E_ERROR, sExcMsg);
500
501 xmlNode * nodeEnabled = pathObj->nodesetval->nodeTab[0];
502 xmlSetNsProp(nodeEnabled, nsXsi, (xmlChar*) "nil",(xmlChar*) "false");
503 xmlNodeSetContent(nodeEnabled,(xmlChar*) CXmlCharPtr(*m_userClassPath));
504 }
505
506 //set <javaInfo> element
507 if (m_javaInfo)
508 {
509 rtl::OString sExpression= rtl::OString(
510 "/jf:java/jf:javaInfo");
511 pathObj = xmlXPathEvalExpression((xmlChar*) sExpression.getStr(),
512 contextUser);
513 if ( ! pathObj || xmlXPathNodeSetIsEmpty(pathObj->nodesetval))
514 throw FrameworkException(JFW_E_ERROR, sExcMsg);
515 m_javaInfo->writeToNode(
516 docUser, pathObj->nodesetval->nodeTab[0]);
517 }
518
519 //set <vmParameters> element
520 if (m_vmParameters)
521 {
522 rtl::OString sExpression= rtl::OString(
523 "/jf:java/jf:vmParameters");
524 pathObj = xmlXPathEvalExpression((xmlChar*) sExpression.getStr(),
525 contextUser);
526 if ( ! pathObj || xmlXPathNodeSetIsEmpty(pathObj->nodesetval))
527 throw FrameworkException(JFW_E_ERROR, sExcMsg);
528 xmlNode* vmParameters = pathObj->nodesetval->nodeTab[0];
529 //set xsi:nil = false;
530 xmlSetNsProp(vmParameters, nsXsi,(xmlChar*) "nil",
531 (xmlChar*) "false");
532
533 //remove option elements
534 xmlNode* cur = vmParameters->children;
535 while (cur != NULL)
536 {
537 xmlNode* lastNode = cur;
538 cur = cur->next;
539 xmlUnlinkNode(lastNode);
540 xmlFreeNode(lastNode);
541 }
542 //add a new line after <vmParameters>
543 if (m_vmParameters->size() > 0)
544 {
545 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
546 xmlAddChild(vmParameters, nodeCrLf);
547 }
548
549 typedef std::vector<rtl::OUString>::const_iterator cit;
550 for (cit i = m_vmParameters->begin(); i != m_vmParameters->end(); i++)
551 {
552 xmlNewTextChild(vmParameters, NULL, (xmlChar*) "param",
553 CXmlCharPtr(*i));
554 //add a new line
555 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
556 xmlAddChild(vmParameters, nodeCrLf);
557 }
558 }
559
560 //set <jreLocations> element
561 if (m_JRELocations)
562 {
563 rtl::OString sExpression= rtl::OString(
564 "/jf:java/jf:jreLocations");
565 pathObj = xmlXPathEvalExpression((xmlChar*) sExpression.getStr(),
566 contextUser);
567 if ( ! pathObj || xmlXPathNodeSetIsEmpty(pathObj->nodesetval))
568 throw FrameworkException(JFW_E_ERROR, sExcMsg);
569 xmlNode* jreLocationsNode = pathObj->nodesetval->nodeTab[0];
570 //set xsi:nil = false;
571 xmlSetNsProp(jreLocationsNode, nsXsi,(xmlChar*) "nil",
572 (xmlChar*) "false");
573
574 //remove option elements
575 xmlNode* cur = jreLocationsNode->children;
576 while (cur != NULL)
577 {
578 xmlNode* lastNode = cur;
579 cur = cur->next;
580 xmlUnlinkNode(lastNode);
581 xmlFreeNode(lastNode);
582 }
583 //add a new line after <vmParameters>
584 if (m_JRELocations->size() > 0)
585 {
586 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
587 xmlAddChild(jreLocationsNode, nodeCrLf);
588 }
589
590 typedef std::vector<rtl::OUString>::const_iterator cit;
591 for (cit i = m_JRELocations->begin(); i != m_JRELocations->end(); i++)
592 {
593 xmlNewTextChild(jreLocationsNode, NULL, (xmlChar*) "location",
594 CXmlCharPtr(*i));
595 //add a new line
596 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
597 xmlAddChild(jreLocationsNode, nodeCrLf);
598 }
599 }
600
601 if (INSTALL == m_layer)
602 {
603 //now write the current system time
604 ::TimeValue curTime = {0,0};
605 if (::osl_getSystemTime(& curTime))
606 {
607 rtl::OUString sSeconds =
608 rtl::OUString::valueOf((sal_Int64) curTime.Seconds);
609 xmlNewTextChild(
610 root,NULL, (xmlChar*) "modified", CXmlCharPtr(sSeconds));
611 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
612 xmlAddChild(root, nodeCrLf);
613 }
614 }
615 if (xmlSaveFormatFile(sSettingsPath.getStr(), docUser, 1) == -1)
616 throw FrameworkException(JFW_E_ERROR, sExcMsg);
617 }
618
setEnabled(sal_Bool bEnabled)619 void NodeJava::setEnabled(sal_Bool bEnabled)
620 {
621 m_enabled = boost::optional<sal_Bool>(bEnabled);
622 }
623
624
setUserClassPath(const rtl::OUString & sClassPath)625 void NodeJava::setUserClassPath(const rtl::OUString & sClassPath)
626 {
627 m_userClassPath = boost::optional<rtl::OUString>(sClassPath);
628 }
629
setJavaInfo(const JavaInfo * pInfo,bool bAutoSelect)630 void NodeJava::setJavaInfo(const JavaInfo * pInfo, bool bAutoSelect)
631 {
632 if (!m_javaInfo)
633 m_javaInfo = boost::optional<CNodeJavaInfo>(CNodeJavaInfo());
634 m_javaInfo->bAutoSelect = bAutoSelect;
635 m_javaInfo->bNil = false;
636
637 if (pInfo != NULL)
638 {
639 m_javaInfo->m_bEmptyNode = false;
640 m_javaInfo->sVendor = pInfo->sVendor;
641 m_javaInfo->sLocation = pInfo->sLocation;
642 m_javaInfo->sVersion = pInfo->sVersion;
643 m_javaInfo->nFeatures = pInfo->nFeatures;
644 m_javaInfo->nRequirements = pInfo->nRequirements;
645 m_javaInfo->arVendorData = pInfo->arVendorData;
646 }
647 else
648 {
649 m_javaInfo->m_bEmptyNode = true;
650 rtl::OUString sEmpty;
651 m_javaInfo->sVendor = sEmpty;
652 m_javaInfo->sLocation = sEmpty;
653 m_javaInfo->sVersion = sEmpty;
654 m_javaInfo->nFeatures = 0;
655 m_javaInfo->nRequirements = 0;
656 m_javaInfo->arVendorData = rtl::ByteSequence();
657 }
658 }
659
setVmParameters(rtl_uString ** arOptions,sal_Int32 size)660 void NodeJava::setVmParameters(rtl_uString * * arOptions, sal_Int32 size)
661 {
662 OSL_ASSERT( !(arOptions == 0 && size != 0));
663 if ( ! m_vmParameters)
664 m_vmParameters = boost::optional<std::vector<rtl::OUString> >(
665 std::vector<rtl::OUString>());
666 m_vmParameters->clear();
667 if (arOptions != NULL)
668 {
669 for (int i = 0; i < size; i++)
670 {
671 const rtl::OUString sOption(static_cast<rtl_uString*>(arOptions[i]));
672 m_vmParameters->push_back(sOption);
673 }
674 }
675 }
676
setJRELocations(rtl_uString ** arLocations,sal_Int32 size)677 void NodeJava::setJRELocations(rtl_uString * * arLocations, sal_Int32 size)
678 {
679 OSL_ASSERT( !(arLocations == 0 && size != 0));
680 if (! m_JRELocations)
681 m_JRELocations = boost::optional<std::vector<rtl::OUString> > (
682 std::vector<rtl::OUString>());
683 m_JRELocations->clear();
684 if (arLocations != NULL)
685 {
686 for (int i = 0; i < size; i++)
687 {
688 const rtl::OUString & sLocation = static_cast<rtl_uString*>(arLocations[i]);
689
690 //only add the path if not already present
691 std::vector<rtl::OUString>::const_iterator it =
692 std::find(m_JRELocations->begin(), m_JRELocations->end(),
693 sLocation);
694 if (it == m_JRELocations->end())
695 m_JRELocations->push_back(sLocation);
696 }
697 }
698 }
699
addJRELocation(rtl_uString * sLocation)700 void NodeJava::addJRELocation(rtl_uString * sLocation)
701 {
702 OSL_ASSERT( sLocation);
703 if (!m_JRELocations)
704 m_JRELocations = boost::optional<std::vector<rtl::OUString> >(
705 std::vector<rtl::OUString> ());
706 //only add the path if not already present
707 std::vector<rtl::OUString>::const_iterator it =
708 std::find(m_JRELocations->begin(), m_JRELocations->end(),
709 rtl::OUString(sLocation));
710 if (it == m_JRELocations->end())
711 m_JRELocations->push_back(rtl::OUString(sLocation));
712 }
713
getEnabled() const714 const boost::optional<sal_Bool> & NodeJava::getEnabled() const
715 {
716 return m_enabled;
717 }
718
719 const boost::optional<std::vector<rtl::OUString> >&
getJRELocations() const720 NodeJava::getJRELocations() const
721 {
722 return m_JRELocations;
723 }
724
getUserClassPath() const725 const boost::optional<rtl::OUString> & NodeJava::getUserClassPath() const
726 {
727 return m_userClassPath;
728 }
729
getVmParameters() const730 const boost::optional<std::vector<rtl::OUString> > & NodeJava::getVmParameters() const
731 {
732 return m_vmParameters;
733 }
734
getJavaInfo() const735 const boost::optional<CNodeJavaInfo> & NodeJava::getJavaInfo() const
736 {
737 return m_javaInfo;
738 }
739
checkSettingsFileStatus() const740 jfw::FileStatus NodeJava::checkSettingsFileStatus() const
741 {
742 jfw::FileStatus ret = FILE_DOES_NOT_EXIST;
743
744 const rtl::OUString sURL = getSettingsURL();
745 //check the file time
746 ::osl::DirectoryItem item;
747 File::RC rc = ::osl::DirectoryItem::get(sURL, item);
748 if (File::E_None == rc)
749 {
750 ::osl::FileStatus stat(
751 FileStatusMask_Validate
752 | FileStatusMask_CreationTime
753 | FileStatusMask_ModifyTime);
754 File::RC rc_stat = item.getFileStatus(stat);
755 if (File::E_None == rc_stat)
756 {
757 // This
758 //function may be called multiple times when a java is started.
759 //If the expiretime is too small then we may loop because every time
760 //the file is deleted and we need to search for a java again.
761 if (INSTALL == m_layer)
762 {
763 //file exists. Check if it is too old
764 //Do not use the creation time. On Windows 2003 server I noticed
765 //that after removing the file and shortly later creating it again
766 //did not change the creation time. That is the newly created file
767 //had the creation time of the former file.
768 // ::TimeValue modTime = stat.getModifyTime();
769 ::TimeValue curTime = {0,0};
770 ret = FILE_OK;
771 if (sal_True == ::osl_getSystemTime(& curTime))
772 {
773 //get the modified time recorded in the <modified> element
774 sal_uInt32 modified = getModifiedTime();
775 OSL_ASSERT(modified <= curTime.Seconds);
776 //Only if modified has a valued then NodeJava::write was called,
777 //then the xml structure was filled with data.
778
779 if ( modified && curTime.Seconds - modified >
780 BootParams::getInstallDataExpiration())
781 {
782 #if OSL_DEBUG_LEVEL >=2
783 fprintf(stderr, "[Java framework] Settings file is %d seconds old. \n",
784 (int)( curTime.Seconds - modified));
785 rtl::OString s = rtl::OUStringToOString(sURL, osl_getThreadTextEncoding());
786 fprintf(stderr, "[Java framework] Settings file is exspired. Deleting settings file at \n%s\n", s.getStr());
787 #endif
788 //delete file
789 File f(sURL);
790 if (File::E_None == f.open(OpenFlag_Write | OpenFlag_Read)
791 && File::E_None == f.setPos(0, 0)
792 && File::E_None == f.setSize(0))
793 ret = FILE_DOES_NOT_EXIST;
794 else
795 ret = FILE_INVALID;
796 }
797 else
798 {
799 ret = FILE_OK;
800 }
801 }
802 else // osl_getSystemTime
803 {
804 ret = FILE_INVALID;
805 }
806 }
807 else // INSTALL == m_layer
808 {
809 ret = FILE_OK;
810 }
811 }
812 else if (File::E_NOENT == rc_stat)
813 {
814 ret = FILE_DOES_NOT_EXIST;
815 }
816 else
817 {
818 ret = FILE_INVALID;
819 }
820 }
821 else if(File::E_NOENT == rc)
822 {
823 ret = FILE_DOES_NOT_EXIST;
824 }
825 else
826 {
827 ret = FILE_INVALID;
828 }
829 return ret;
830 }
831
createSettingsDocument() const832 void NodeJava::createSettingsDocument() const
833 {
834 const rtl::OUString sURL = getSettingsURL();
835 //make sure there is a user directory
836 rtl::OString sExcMsg("[Java framework] Error in function createSettingsDocument "
837 "(elements.cxx).");
838 // check if javasettings.xml already exist
839 if (FILE_OK == checkSettingsFileStatus())
840 return;
841
842 //make sure that the directories are created in case they do not exist
843 FileBase::RC rcFile = Directory::createPath(getDirFromFile(sURL));
844 if (rcFile != FileBase::E_EXIST && rcFile != FileBase::E_None)
845 throw FrameworkException(JFW_E_ERROR, sExcMsg);
846
847 //javasettings.xml does not exist yet
848 CXmlDocPtr doc(xmlNewDoc((xmlChar *)"1.0"));
849 if (! doc)
850 throw FrameworkException(JFW_E_ERROR, sExcMsg);
851 //Create a comment
852 xmlNewDocComment(
853 doc, (xmlChar *) "This is a generated file. Do not alter this file!");
854
855 //Create the root element and name spaces
856 xmlNodePtr root = xmlNewDocNode(
857 doc, NULL, (xmlChar *) "java", (xmlChar *) "\n");
858
859 if (root == NULL)
860 throw FrameworkException(JFW_E_ERROR, sExcMsg);
861
862 if (xmlNewNs(root, (xmlChar *) NS_JAVA_FRAMEWORK,NULL) == NULL)
863 throw FrameworkException(JFW_E_ERROR, sExcMsg);
864 if (xmlNewNs(root,(xmlChar*) NS_SCHEMA_INSTANCE,(xmlChar*)"xsi") == NULL)
865 throw FrameworkException(JFW_E_ERROR, sExcMsg);
866 xmlDocSetRootElement(doc, root);
867
868 //Create a comment
869 xmlNodePtr com = xmlNewComment(
870 (xmlChar *) "This is a generated file. Do not alter this file!");
871 if (com == NULL)
872 throw FrameworkException(JFW_E_ERROR, sExcMsg);
873
874 if (xmlAddPrevSibling(root, com) == NULL)
875 throw FrameworkException(JFW_E_ERROR, sExcMsg);
876
877 const rtl::OString path = getSettingsPath();
878 if (xmlSaveFormatFileEnc(path.getStr(), doc,"UTF-8", 1) == -1)
879 throw FrameworkException(JFW_E_ERROR, sExcMsg);
880 }
881
882 //=====================================================================
CNodeJavaInfo()883 CNodeJavaInfo::CNodeJavaInfo() :
884 m_bEmptyNode(false), bNil(true), bAutoSelect(true),
885 nFeatures(0), nRequirements(0)
886 {
887 }
888
~CNodeJavaInfo()889 CNodeJavaInfo::~CNodeJavaInfo()
890 {
891 }
892
loadFromNode(xmlDoc * pDoc,xmlNode * pJavaInfo)893 void CNodeJavaInfo::loadFromNode(xmlDoc * pDoc, xmlNode * pJavaInfo)
894 {
895 rtl::OString sExcMsg("[Java framework] Error in function NodeJavaInfo::loadFromNode "
896 "(elements.cxx).");
897
898 OSL_ASSERT(pJavaInfo && pDoc);
899 if (pJavaInfo->children == NULL)
900 return;
901 //Get the xsi:nil attribute;
902 CXmlCharPtr sNil;
903 sNil = xmlGetNsProp(
904 pJavaInfo, (xmlChar*) "nil", (xmlChar*) NS_SCHEMA_INSTANCE);
905 if ( ! sNil)
906 throw FrameworkException(JFW_E_ERROR, sExcMsg);
907
908 if (xmlStrcmp(sNil, (xmlChar*) "true") == 0)
909 bNil = true;
910 else if (xmlStrcmp(sNil, (xmlChar*) "false") == 0)
911 bNil = false;
912 else
913 throw FrameworkException(JFW_E_ERROR, sExcMsg);
914 if (bNil == true)
915 return;
916
917 //Get javaInfo@manuallySelected attribute
918 CXmlCharPtr sAutoSelect;
919 sAutoSelect = xmlGetProp(
920 pJavaInfo, (xmlChar*) "autoSelect");
921 if ( ! sAutoSelect)
922 throw FrameworkException(JFW_E_ERROR, sExcMsg);
923
924 if (xmlStrcmp(sAutoSelect, (xmlChar*) "true") == 0)
925 bAutoSelect = true;
926 else if (xmlStrcmp(sAutoSelect, (xmlChar*) "false") == 0)
927 bAutoSelect = false;
928 else
929 throw FrameworkException(JFW_E_ERROR, sExcMsg);
930
931 xmlNode * cur = pJavaInfo->children;
932
933 while (cur != NULL)
934 {
935 if (xmlStrcmp(cur->name, (xmlChar*) "vendor") == 0)
936 {
937 CXmlCharPtr xmlVendor;
938 xmlVendor = xmlNodeListGetString(
939 pDoc, cur->children, 1);
940 if (! xmlVendor)
941 return;
942 sVendor = xmlVendor;
943 }
944 else if (xmlStrcmp(cur->name, (xmlChar*) "location") == 0)
945 {
946 CXmlCharPtr xmlLocation;
947 xmlLocation = xmlNodeListGetString(
948 pDoc, cur->children, 1);
949 sLocation = xmlLocation;
950 }
951 else if (xmlStrcmp(cur->name, (xmlChar*) "version") == 0)
952 {
953 CXmlCharPtr xmlVersion;
954 xmlVersion = xmlNodeListGetString(
955 pDoc, cur->children, 1);
956 sVersion = xmlVersion;
957 }
958 else if (xmlStrcmp(cur->name, (xmlChar*) "features")== 0)
959 {
960 CXmlCharPtr xmlFeatures;
961 xmlFeatures = xmlNodeListGetString(
962 pDoc, cur->children, 1);
963 rtl::OUString sFeatures = xmlFeatures;
964 nFeatures = sFeatures.toInt64(16);
965 }
966 else if (xmlStrcmp(cur->name, (xmlChar*) "requirements") == 0)
967 {
968 CXmlCharPtr xmlRequire;
969 xmlRequire = xmlNodeListGetString(
970 pDoc, cur->children, 1);
971 rtl::OUString sRequire = xmlRequire;
972 nRequirements = sRequire.toInt64(16);
973 #ifdef MACOSX
974 //javaldx is not used anymore in the mac build. In case the Java
975 //corresponding to the saved settings does not exist anymore the
976 //javavm services will look for an existing Java after creation of
977 //the JVM failed. See stoc/source/javavm/javavm.cxx. Only if
978 //nRequirements does not have the flag JFW_REQUIRE_NEEDRESTART the
979 //jvm of the new selected JRE will be started. Old settings (before
980 //OOo 3.3) still contain the flag which can be safely ignored.
981 nRequirements &= ~JFW_REQUIRE_NEEDRESTART;
982 #endif
983 }
984 else if (xmlStrcmp(cur->name, (xmlChar*) "vendorData") == 0)
985 {
986 CXmlCharPtr xmlData;
987 xmlData = xmlNodeListGetString(
988 pDoc, cur->children, 1);
989 xmlChar* _data = (xmlChar*) xmlData;
990 if (_data)
991 {
992 rtl::ByteSequence seq((sal_Int8*) _data, strlen((char*)_data));
993 arVendorData = decodeBase16(seq);
994 }
995 }
996 cur = cur->next;
997 }
998
999 if (sVendor.getLength() == 0)
1000 m_bEmptyNode = true;
1001 //Get the javainfo attributes
1002 CXmlCharPtr sVendorUpdate;
1003 sVendorUpdate = xmlGetProp(pJavaInfo,
1004 (xmlChar*) "vendorUpdate");
1005 if ( ! sVendorUpdate)
1006 throw FrameworkException(JFW_E_ERROR, sExcMsg);
1007 sAttrVendorUpdate = sVendorUpdate;
1008 }
1009
1010
writeToNode(xmlDoc * pDoc,xmlNode * pJavaInfoNode) const1011 void CNodeJavaInfo::writeToNode(xmlDoc* pDoc,
1012 xmlNode* pJavaInfoNode) const
1013
1014 {
1015 OSL_ASSERT(pJavaInfoNode && pDoc);
1016 rtl::OString sExcMsg("[Java framework] Error in function NodeJavaInfo::writeToNode "
1017 "(elements.cxx).");
1018
1019 //write the attribute vendorSettings
1020
1021 //javaInfo@vendorUpdate
1022 //creates the attribute if necessary
1023 rtl::OString sUpdated = getElementUpdated();
1024
1025 xmlSetProp(pJavaInfoNode, (xmlChar*)"vendorUpdate",
1026 (xmlChar*) sUpdated.getStr());
1027
1028 //javaInfo@autoSelect
1029 xmlSetProp(pJavaInfoNode, (xmlChar*)"autoSelect",
1030 (xmlChar*) (bAutoSelect == true ? "true" : "false"));
1031
1032 //Set xsi:nil in javaInfo element to false
1033 //the xmlNs pointer must not be destroyed
1034 xmlNs* nsXsi = xmlSearchNsByHref((xmlDoc*) pDoc,
1035 pJavaInfoNode,
1036 (xmlChar*) NS_SCHEMA_INSTANCE);
1037
1038 xmlSetNsProp(pJavaInfoNode,
1039 nsXsi,
1040 (xmlChar*) "nil",
1041 (xmlChar*) "false");
1042
1043 //Delete the children of JavaInfo
1044 xmlNode* cur = pJavaInfoNode->children;
1045 while (cur != NULL)
1046 {
1047 xmlNode* lastNode = cur;
1048 cur = cur->next;
1049 xmlUnlinkNode(lastNode);
1050 xmlFreeNode(lastNode);
1051 }
1052
1053 //If the JavaInfo was set with an empty value,
1054 //then we are done.
1055 if (m_bEmptyNode)
1056 return;
1057
1058 //add a new line after <javaInfo>
1059 xmlNode * nodeCrLf = xmlNewText((xmlChar*) "\n");
1060 xmlAddChild(pJavaInfoNode, nodeCrLf);
1061
1062 //Create the vendor element
1063 xmlNewTextChild(pJavaInfoNode, NULL, (xmlChar*) "vendor",
1064 CXmlCharPtr(sVendor));
1065 //add a new line for better readability
1066 nodeCrLf = xmlNewText((xmlChar*) "\n");
1067 xmlAddChild(pJavaInfoNode, nodeCrLf);
1068
1069 //Create the location element
1070 xmlNewTextChild(pJavaInfoNode, NULL, (xmlChar*) "location",
1071 CXmlCharPtr(sLocation));
1072 //add a new line for better readability
1073 nodeCrLf = xmlNewText((xmlChar*) "\n");
1074 xmlAddChild(pJavaInfoNode, nodeCrLf);
1075
1076 //Create the version element
1077 xmlNewTextChild(pJavaInfoNode, NULL, (xmlChar*) "version",
1078 CXmlCharPtr(sVersion));
1079 //add a new line for better readability
1080 nodeCrLf = xmlNewText((xmlChar*) "\n");
1081 xmlAddChild(pJavaInfoNode, nodeCrLf);
1082
1083 //Create the features element
1084 rtl::OUString sFeatures = rtl::OUString::valueOf(
1085 (sal_Int64)nFeatures, 16);
1086 xmlNewTextChild(pJavaInfoNode, NULL, (xmlChar*) "features",
1087 CXmlCharPtr(sFeatures));
1088 //add a new line for better readability
1089 nodeCrLf = xmlNewText((xmlChar*) "\n");
1090 xmlAddChild(pJavaInfoNode, nodeCrLf);
1091
1092
1093 //Create the requirements element
1094 rtl::OUString sRequirements = rtl::OUString::valueOf(
1095 (sal_Int64) nRequirements, 16);
1096 xmlNewTextChild(pJavaInfoNode, NULL, (xmlChar*) "requirements",
1097 CXmlCharPtr(sRequirements));
1098 //add a new line for better readability
1099 nodeCrLf = xmlNewText((xmlChar*) "\n");
1100 xmlAddChild(pJavaInfoNode, nodeCrLf);
1101
1102
1103 //Create the features element
1104 rtl::ByteSequence data = encodeBase16(arVendorData);
1105 xmlNode* dataNode = xmlNewChild(pJavaInfoNode, NULL,
1106 (xmlChar*) "vendorData",
1107 (xmlChar*) "");
1108 xmlNodeSetContentLen(dataNode,
1109 (xmlChar*) data.getArray(), data.getLength());
1110 //add a new line for better readability
1111 nodeCrLf = xmlNewText((xmlChar*) "\n");
1112 xmlAddChild(pJavaInfoNode, nodeCrLf);
1113 }
1114
makeJavaInfo() const1115 JavaInfo * CNodeJavaInfo::makeJavaInfo() const
1116 {
1117 if (bNil == true || m_bEmptyNode == true)
1118 return NULL;
1119 JavaInfo * pInfo = (JavaInfo*) rtl_allocateMemory(sizeof(JavaInfo));
1120 if (pInfo == NULL)
1121 return NULL;
1122 memset(pInfo, 0, sizeof(JavaInfo));
1123 pInfo->sVendor = sVendor.pData;
1124 rtl_uString_acquire(pInfo->sVendor);
1125 pInfo->sLocation = sLocation.pData;
1126 rtl_uString_acquire(pInfo->sLocation);
1127 pInfo->sVersion = sVersion.pData;
1128 rtl_uString_acquire(pInfo->sVersion);
1129 pInfo->nFeatures = nFeatures;
1130 pInfo->nRequirements = nRequirements;
1131 pInfo->arVendorData = arVendorData.getHandle();
1132 rtl_byte_sequence_acquire(pInfo->arVendorData);
1133 return pInfo;
1134 }
1135
getModifiedTime() const1136 sal_uInt32 NodeJava::getModifiedTime() const
1137 {
1138 sal_uInt32 ret = 0;
1139 if (m_layer != INSTALL)
1140 {
1141 OSL_ASSERT(0);
1142 return ret;
1143 }
1144 rtl::OString modTimeSeconds = getElementModified();
1145 return (sal_uInt32) modTimeSeconds.toInt64();
1146 }
1147
1148 //================================================================================
MergedSettings()1149 MergedSettings::MergedSettings():
1150 m_bEnabled(sal_False),
1151 m_sClassPath(),
1152 m_vmParams(),
1153 m_JRELocations(),
1154 m_javaInfo()
1155 {
1156 NodeJava settings(NodeJava::USER_OR_INSTALL);
1157 settings.load();
1158
1159 //Check if UNO_JAVA_JFW_INSTALL_DATA is set. If so, then we need not use user and
1160 //shared data.
1161 const ::rtl::OUString sInstall = BootParams::getInstallData();
1162
1163 if (sInstall.getLength() == 0)
1164 {
1165 NodeJava sharedSettings(NodeJava::SHARED);
1166 sharedSettings.load();
1167 merge(sharedSettings, settings);
1168 }
1169 else
1170 {
1171 merge(NodeJava(), settings);
1172 }
1173 }
1174
~MergedSettings()1175 MergedSettings::~MergedSettings()
1176 {
1177 }
1178
merge(const NodeJava & share,const NodeJava & user)1179 void MergedSettings::merge(const NodeJava & share, const NodeJava & user)
1180 {
1181 if (user.getEnabled())
1182 m_bEnabled = * user.getEnabled();
1183 else if (share.getEnabled())
1184 m_bEnabled = * share.getEnabled();
1185 else
1186 m_bEnabled = sal_True;
1187
1188 if (user.getUserClassPath())
1189 m_sClassPath = * user.getUserClassPath();
1190 else if (share.getUserClassPath())
1191 m_sClassPath = * share.getUserClassPath();
1192
1193 if (user.getJavaInfo())
1194 m_javaInfo = * user.getJavaInfo();
1195 else if (share.getJavaInfo())
1196 m_javaInfo = * share.getJavaInfo();
1197
1198 if (user.getVmParameters())
1199 m_vmParams = * user.getVmParameters();
1200 else if (share.getVmParameters())
1201 m_vmParams = * share.getVmParameters();
1202
1203 if (user.getJRELocations())
1204 m_JRELocations = * user.getJRELocations();
1205 else if (share.getJRELocations())
1206 m_JRELocations = * share.getJRELocations();
1207 }
1208
getEnabled() const1209 sal_Bool MergedSettings::getEnabled() const
1210 {
1211 return m_bEnabled;
1212 }
getUserClassPath() const1213 const rtl::OUString& MergedSettings::getUserClassPath() const
1214 {
1215 return m_sClassPath;
1216 }
1217
getVmParametersUtf8() const1218 ::std::vector< ::rtl::OString> MergedSettings::getVmParametersUtf8() const
1219 {
1220 ::std::vector< ::rtl::OString> ret;
1221 typedef ::std::vector< ::rtl::OUString>::const_iterator cit;
1222 for (cit i = m_vmParams.begin(); i < m_vmParams.end(); i++)
1223 {
1224 ret.push_back( ::rtl::OUStringToOString(*i, RTL_TEXTENCODING_UTF8));
1225 }
1226 return ret;
1227 }
1228
getJavaInfoAttrVendorUpdate() const1229 const ::rtl::OString & MergedSettings::getJavaInfoAttrVendorUpdate() const
1230 {
1231 return m_javaInfo.sAttrVendorUpdate;
1232 }
1233
1234
createJavaInfo() const1235 JavaInfo * MergedSettings::createJavaInfo() const
1236 {
1237 return m_javaInfo.makeJavaInfo();
1238 }
1239 #ifdef WNT
getJavaInfoAttrAutoSelect() const1240 bool MergedSettings::getJavaInfoAttrAutoSelect() const
1241 {
1242 return m_javaInfo.bAutoSelect;
1243 }
1244 #endif
getVmParametersArray(rtl_uString *** parParams,sal_Int32 * size) const1245 void MergedSettings::getVmParametersArray(
1246 rtl_uString *** parParams, sal_Int32 * size) const
1247 {
1248 osl::MutexGuard guard(FwkMutex::get());
1249 OSL_ASSERT(parParams != NULL && size != NULL);
1250
1251 *parParams = (rtl_uString **)
1252 rtl_allocateMemory(sizeof(rtl_uString*) * m_vmParams.size());
1253 if (*parParams == NULL)
1254 return;
1255
1256 int j=0;
1257 typedef std::vector<rtl::OUString>::const_iterator it;
1258 for (it i = m_vmParams.begin(); i != m_vmParams.end();
1259 i++, j++)
1260 {
1261 (*parParams)[j] = i->pData;
1262 rtl_uString_acquire(i->pData);
1263 }
1264 *size = m_vmParams.size();
1265 }
1266
getJRELocations(rtl_uString *** parLocations,sal_Int32 * size) const1267 void MergedSettings::getJRELocations(
1268 rtl_uString *** parLocations, sal_Int32 * size) const
1269 {
1270 osl::MutexGuard guard(FwkMutex::get());
1271 OSL_ASSERT(parLocations != NULL && size != NULL);
1272
1273 *parLocations = (rtl_uString **)
1274 rtl_allocateMemory(sizeof(rtl_uString*) * m_JRELocations.size());
1275 if (*parLocations == NULL)
1276 return;
1277
1278 int j=0;
1279 typedef std::vector<rtl::OUString>::const_iterator it;
1280 for (it i = m_JRELocations.begin(); i != m_JRELocations.end();
1281 i++, j++)
1282 {
1283 (*parLocations)[j] = i->pData;
1284 rtl_uString_acquire(i->pData);
1285 }
1286 *size = m_JRELocations.size();
1287 }
getJRELocations() const1288 const std::vector<rtl::OUString> & MergedSettings::getJRELocations() const
1289 {
1290 return m_JRELocations;
1291 }
1292 }
1293