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