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