| File: | jvmfwk/source/elements.cxx |
| Location: | line 1123, column 5 |
| Description: | Dereference of null pointer (loaded from variable 'parParams') |
| 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: */ |