| File: | jvmfwk/source/elements.cxx |
| Location: | line 795, column 9 |
| Description: | Access to field 'children' results in a dereference of a null pointer (loaded from variable 'pJavaInfo') |
| 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) |
Access to field 'children' results in a dereference of a null pointer (loaded from variable 'pJavaInfo') | |
| 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: */ |