summaryrefslogtreecommitdiff
path: root/configmgr/source/components.cxx
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2012-01-28 20:55:39 +0100
committerMichael Stahl <mstahl@redhat.com>2012-01-28 20:55:39 +0100
commit371976860088a3c5c3df9840dcdfd632d9d6f1f5 (patch)
tree9e9f67205cd5b72f1031721273e1534a3a1e5b0f /configmgr/source/components.cxx
parent651568afad1a585c485384ab6d7b65780fb02256 (diff)
replace obsolete "master" branch with README that points at new repoHEADmaster-deletedmaster
Diffstat (limited to 'configmgr/source/components.cxx')
-rw-r--r--configmgr/source/components.cxx882
1 files changed, 0 insertions, 882 deletions
diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx
deleted file mode 100644
index d4b3130ca9..0000000000
--- a/configmgr/source/components.cxx
+++ /dev/null
@@ -1,882 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
-*
-* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-*
-* Copyright 2000, 2010 Oracle and/or its affiliates.
-*
-* OpenOffice.org - a multi-platform office productivity suite
-*
-* This file is part of OpenOffice.org.
-*
-* OpenOffice.org is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License version 3
-* only, as published by the Free Software Foundation.
-*
-* OpenOffice.org is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Lesser General Public License version 3 for more details
-* (a copy is included in the LICENSE file that accompanied this code).
-*
-* You should have received a copy of the GNU Lesser General Public License
-* version 3 along with OpenOffice.org. If not, see
-* <http://www.openoffice.org/license.html>
-* for a copy of the LGPLv3 License.
-*
-************************************************************************/
-
-#include "precompiled_configmgr.hxx"
-#include "sal/config.h"
-
-#include <algorithm>
-#include <cstddef>
-#include <list>
-
-#include "com/sun/star/beans/Optional.hpp"
-#include "com/sun/star/beans/UnknownPropertyException.hpp"
-#include "com/sun/star/beans/XPropertySet.hpp"
-#include "com/sun/star/container/NoSuchElementException.hpp"
-#include "com/sun/star/lang/WrappedTargetException.hpp"
-#include "com/sun/star/lang/XMultiComponentFactory.hpp"
-#include "com/sun/star/uno/Any.hxx"
-#include "com/sun/star/uno/Exception.hpp"
-#include "com/sun/star/uno/Reference.hxx"
-#include "com/sun/star/uno/RuntimeException.hpp"
-#include "com/sun/star/uno/XComponentContext.hpp"
-#include "com/sun/star/uno/XInterface.hpp"
-#include "osl/conditn.hxx"
-#include "osl/diagnose.h"
-#include "osl/file.hxx"
-#include "osl/mutex.hxx"
-#include "osl/thread.hxx"
-#include "rtl/bootstrap.hxx"
-#include "rtl/logfile.h"
-#include "rtl/ref.hxx"
-#include "rtl/string.h"
-#include "rtl/textenc.h"
-#include "rtl/ustring.h"
-#include "rtl/ustring.hxx"
-#include "rtl/instance.hxx"
-#include "sal/types.h"
-#include "salhelper/simplereferenceobject.hxx"
-
-#include "additions.hxx"
-#include "components.hxx"
-#include "data.hxx"
-#include "lock.hxx"
-#include "modifications.hxx"
-#include "node.hxx"
-#include "nodemap.hxx"
-#include "parsemanager.hxx"
-#include "partial.hxx"
-#include "rootaccess.hxx"
-#include "writemodfile.hxx"
-#include "xcdparser.hxx"
-#include "xcuparser.hxx"
-#include "xcsparser.hxx"
-
-namespace configmgr {
-
-namespace {
-
-namespace css = com::sun::star;
-
-struct UnresolvedListItem {
- rtl::OUString name;
- rtl::Reference< ParseManager > manager;
-
- UnresolvedListItem(
- rtl::OUString const & theName,
- rtl::Reference< ParseManager > theManager):
- name(theName), manager(theManager) {}
-};
-
-typedef std::list< UnresolvedListItem > UnresolvedList;
-
-void parseXcsFile(
- rtl::OUString const & url, int layer, Data & data, Partial const * partial,
- Modifications * modifications, Additions * additions)
- SAL_THROW((
- css::container::NoSuchElementException, css::uno::RuntimeException))
-{
- OSL_ASSERT(partial == 0 && modifications == 0 && additions == 0);
- (void) partial; (void) modifications; (void) additions;
- OSL_VERIFY(
- rtl::Reference< ParseManager >(
- new ParseManager(url, new XcsParser(layer, data)))->parse());
-}
-
-void parseXcuFile(
- rtl::OUString const & url, int layer, Data & data, Partial const * partial,
- Modifications * modifications, Additions * additions)
- SAL_THROW((
- css::container::NoSuchElementException, css::uno::RuntimeException))
-{
- OSL_VERIFY(
- rtl::Reference< ParseManager >(
- new ParseManager(
- url,
- new XcuParser(
- layer, data, partial, modifications, additions)))->
- parse());
-}
-
-rtl::OUString expand(rtl::OUString const & str) {
- rtl::OUString s(str);
- rtl::Bootstrap::expandMacros(s); //TODO: detect failure
- return s;
-}
-
-bool canRemoveFromLayer(int layer, rtl::Reference< Node > const & node) {
- OSL_ASSERT(node.is());
- if (node->getLayer() > layer && node->getLayer() < Data::NO_LAYER) {
- return false;
- }
- switch (node->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- case Node::KIND_GROUP:
- for (NodeMap::iterator i(node->getMembers().begin());
- i != node->getMembers().end(); ++i)
- {
- if (!canRemoveFromLayer(layer, i->second)) {
- return false;
- }
- }
- return true;
- case Node::KIND_SET:
- return node->getMembers().empty();
- default: // Node::KIND_PROPERTY, Node::KIND_LOCALIZED_VALUE
- return true;
- }
-}
-
-}
-
-class Components::WriteThread:
- public osl::Thread, public salhelper::SimpleReferenceObject
-{
-public:
- static void * operator new(std::size_t size)
- { return Thread::operator new(size); }
-
- static void operator delete(void * pointer)
- { Thread::operator delete(pointer); }
-
- WriteThread(
- rtl::Reference< WriteThread > * reference, Components & components,
- rtl::OUString const & url, Data const & data);
-
- void flush() { delay_.set(); }
-
-private:
- virtual ~WriteThread() {}
-
- virtual void SAL_CALL run();
-
- virtual void SAL_CALL onTerminated() { release(); }
-
- rtl::Reference< WriteThread > * reference_;
- Components & components_;
- rtl::OUString url_;
- Data const & data_;
- osl::Condition delay_;
- boost::shared_ptr<osl::Mutex> lock_;
-};
-
-Components::WriteThread::WriteThread(
- rtl::Reference< WriteThread > * reference, Components & components,
- rtl::OUString const & url, Data const & data):
- reference_(reference), components_(components), url_(url), data_(data)
-{
- lock_ = lock();
- OSL_ASSERT(reference != 0);
- acquire();
-}
-
-void Components::WriteThread::run() {
- TimeValue t = { 1, 0 }; // 1 sec
- delay_.wait(&t); // must not throw; result_error is harmless and ignored
- osl::MutexGuard g(*lock_); // must not throw
- try {
- try {
- writeModFile(components_, url_, data_);
- } catch (css::uno::RuntimeException & e) {
- // Silently ignore write errors, instead of aborting:
- OSL_TRACE(
- "configmgr error writing modifications: %s",
- rtl::OUStringToOString(
- e.Message, RTL_TEXTENCODING_UTF8).getStr());
- }
- } catch (...) {
- reference_->clear();
- throw;
- }
- reference_->clear();
-}
-
-class theComponentsSingleton :
- public rtl::StaticWithArg<
- Components,
- css::uno::Reference< css::uno::XComponentContext >,
- theComponentsSingleton>
-{
-};
-
-Components & Components::getSingleton(
- css::uno::Reference< css::uno::XComponentContext > const & context)
-{
- OSL_ASSERT(context.is());
- return theComponentsSingleton::get(context);
-}
-
-bool Components::allLocales(rtl::OUString const & locale) {
- return locale.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("*"));
-}
-
-rtl::Reference< Node > Components::resolvePathRepresentation(
- rtl::OUString const & pathRepresentation,
- rtl::OUString * canonicRepresentation, Path * path, int * finalizedLayer)
- const
-{
- return data_.resolvePathRepresentation(
- pathRepresentation, canonicRepresentation, path, finalizedLayer);
-}
-
-rtl::Reference< Node > Components::getTemplate(
- int layer, rtl::OUString const & fullName) const
-{
- return data_.getTemplate(layer, fullName);
-}
-
-void Components::addRootAccess(rtl::Reference< RootAccess > const & access) {
- roots_.insert(access.get());
-}
-
-void Components::removeRootAccess(RootAccess * access) {
- roots_.erase(access);
-}
-
-void Components::initGlobalBroadcaster(
- Modifications const & modifications,
- rtl::Reference< RootAccess > const & exclude, Broadcaster * broadcaster)
-{
- //TODO: Iterate only over roots w/ listeners:
- for (WeakRootSet::iterator i(roots_.begin()); i != roots_.end(); ++i) {
- rtl::Reference< RootAccess > root;
- if ((*i)->acquireCounting() > 1) {
- root.set(*i); // must not throw
- }
- (*i)->releaseNondeleting();
- if (root.is()) {
- if (root != exclude) {
- Path path(root->getAbsolutePath());
- Modifications::Node const * mods = &modifications.getRoot();
- for (Path::iterator j(path.begin()); j != path.end(); ++j) {
- Modifications::Node::Children::const_iterator k(
- mods->children.find(*j));
- if (k == mods->children.end()) {
- mods = 0;
- break;
- }
- mods = &k->second;
- }
- //TODO: If the complete tree of which root is a part is deleted,
- // or replaced, mods will be null, but some of the listeners
- // from within root should probably fire nonetheless:
- if (mods != 0) {
- root->initBroadcaster(*mods, broadcaster);
- }
- }
- }
- }
-}
-
-void Components::addModification(Path const & path) {
- data_.modifications.add(path);
-}
-
-bool Components::hasModifications() const
-{
- return data_.modifications.getRoot().children.begin() !=
- data_.modifications.getRoot().children.end();
-}
-
-void Components::writeModifications() {
-
- if (!hasModifications())
- return;
-
- if (!writeThread_.is()) {
- writeThread_ = new WriteThread(
- &writeThread_, *this, getModificationFileUrl(), data_);
- writeThread_->create();
- }
-}
-
-void Components::flushModifications() {
- rtl::Reference< WriteThread > thread;
- {
- osl::MutexGuard g(*lock_);
- thread = writeThread_;
- }
- if (thread.is()) {
- thread->flush();
- thread->join();
- }
-}
-
-void Components::insertExtensionXcsFile(
- bool shared, rtl::OUString const & fileUri)
-{
- try {
- parseXcsFile(fileUri, shared ? 9 : 13, data_, 0, 0, 0);
- } catch (css::container::NoSuchElementException & e) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "insertExtensionXcsFile does not exist: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >());
- }
-}
-
-void Components::insertExtensionXcuFile(
- bool shared, rtl::OUString const & fileUri, Modifications * modifications)
-{
- OSL_ASSERT(modifications != 0);
- int layer = shared ? 10 : 14;
- Additions * adds = data_.addExtensionXcuAdditions(fileUri, layer);
- try {
- parseXcuFile(fileUri, layer, data_, 0, modifications, adds);
- } catch (css::container::NoSuchElementException & e) {
- data_.removeExtensionXcuAdditions(fileUri);
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "insertExtensionXcuFile does not exist: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >());
- }
-}
-
-void Components::removeExtensionXcuFile(
- rtl::OUString const & fileUri, Modifications * modifications)
-{
- //TODO: Ideally, exactly the data coming from the specified xcu file would
- // be removed. However, not enough information is recorded in the in-memory
- // data structures to do so. So, as a workaround, all those set elements
- // that were freshly added by the xcu and have afterwards been left
- // unchanged or have only had their properties changed in the user layer are
- // removed (and nothing else). The heuristic to determine
- // whether a node has been left unchanged is to check the layer ID (as
- // usual) and additionally to check that the node does not recursively
- // contain any non-empty sets (multiple extension xcu files are merged into
- // one layer, so checking layer ID alone is not enough). Since
- // item->additions records all additions of set members in textual order,
- // the latter check works well when iterating through item->additions in
- // reverse order.
- OSL_ASSERT(modifications != 0);
- rtl::Reference< Data::ExtensionXcu > item(
- data_.removeExtensionXcuAdditions(fileUri));
- if (item.is()) {
- for (Additions::reverse_iterator i(item->additions.rbegin());
- i != item->additions.rend(); ++i)
- {
- rtl::Reference< Node > parent;
- NodeMap const * map = &data_.components;
- rtl::Reference< Node > node;
- for (Path::const_iterator j(i->begin()); j != i->end(); ++j) {
- parent = node;
- node = Data::findNode(Data::NO_LAYER, *map, *j);
- if (!node.is()) {
- break;
- }
- map = &node->getMembers();
- }
- if (node.is()) {
- OSL_ASSERT(parent.is());
- if (parent->kind() == Node::KIND_SET) {
- OSL_ASSERT(
- node->kind() == Node::KIND_GROUP ||
- node->kind() == Node::KIND_SET);
- if (canRemoveFromLayer(item->layer, node)) {
- parent->getMembers().erase(i->back());
- data_.modifications.remove(*i);
- modifications->add(*i);
- }
- }
- }
- }
- writeModifications();
- }
-}
-
-void Components::insertModificationXcuFile(
- rtl::OUString const & fileUri,
- std::set< rtl::OUString > const & includedPaths,
- std::set< rtl::OUString > const & excludedPaths,
- Modifications * modifications)
-{
- OSL_ASSERT(modifications != 0);
- Partial part(includedPaths, excludedPaths);
- try {
- parseFileLeniently(
- &parseXcuFile, fileUri, Data::NO_LAYER, data_, &part, modifications,
- 0);
- } catch (css::container::NoSuchElementException & e) {
- OSL_TRACE(
- "configmgr error inserting non-existing %s: %s",
- rtl::OUStringToOString(fileUri, RTL_TEXTENCODING_UTF8).getStr(),
- rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
- }
-}
-
-css::beans::Optional< css::uno::Any > Components::getExternalValue(
- rtl::OUString const & descriptor)
-{
- sal_Int32 i = descriptor.indexOf(' ');
- if (i <= 0) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("bad external value descriptor ")) +
- descriptor),
- css::uno::Reference< css::uno::XInterface >());
- }
- //TODO: Do not make calls with mutex locked:
- rtl::OUString name(descriptor.copy(0, i));
- ExternalServices::iterator j(externalServices_.find(name));
- if (j == externalServices_.end()) {
- css::uno::Reference< css::uno::XInterface > service;
- try {
- service = css::uno::Reference< css::lang::XMultiComponentFactory >(
- context_->getServiceManager(), css::uno::UNO_SET_THROW)->
- createInstanceWithContext(name, context_);
- } catch (css::uno::RuntimeException &) {
- // Assuming these exceptions are real errors:
- throw;
- } catch (css::uno::Exception & e) {
- // Assuming these exceptions indicate that the service is not
- // installed:
- OSL_TRACE(
- "createInstance(%s) failed with %s",
- rtl::OUStringToOString(name, RTL_TEXTENCODING_UTF8).getStr(),
- rtl::OUStringToOString(
- e.Message, RTL_TEXTENCODING_UTF8).getStr());
- }
- css::uno::Reference< css::beans::XPropertySet > propset;
- if (service.is()) {
- propset = css::uno::Reference< css::beans::XPropertySet >(
- service, css::uno::UNO_QUERY_THROW);
- }
- j = externalServices_.insert(
- ExternalServices::value_type(name, propset)).first;
- }
- css::beans::Optional< css::uno::Any > value;
- if (j->second.is()) {
- try {
- if (!(j->second->getPropertyValue(descriptor.copy(i + 1)) >>=
- value))
- {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "cannot obtain external value through ")) +
- descriptor),
- css::uno::Reference< css::uno::XInterface >());
- }
- } catch (css::beans::UnknownPropertyException & e) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "unknwon external value descriptor ID: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >());
- } catch (css::lang::WrappedTargetException & e) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "cannot obtain external value: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >());
- }
- }
- return value;
-}
-
-int tempHACK = 0;
-
-Components::Components(
- css::uno::Reference< css::uno::XComponentContext > const & context):
- context_(context)
-{
- lock_ = lock();
-
- tempHACK = 1;
-
- OSL_ASSERT(context.is());
- RTL_LOGFILE_TRACE_AUTHOR("configmgr", "sb", "begin parsing");
- parseXcsXcuLayer(
- 0,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/share/registry"))));
- parseModuleLayer(
- 2,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "$OOO_BASE_DIR/share/registry/modules"))));
- parseResLayer(
- 3,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/share/registry"))));
- parseXcsXcuLayer(
- 4,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "$BRAND_BASE_DIR/share/registry"))));
- parseModuleLayer(
- 6,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "$BRAND_BASE_DIR/share/registry/modules"))));
- parseXcsXcuIniLayer(
- 7,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("uno")
- ":BUNDLED_EXTENSIONS_USER}/registry/"
- "com.sun.star.comp.deployment.configuration."
- "PackageRegistryBackend/configmgr.ini"))),
- false);
- parseXcsXcuIniLayer(
- 9,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("uno")
- ":SHARED_EXTENSIONS_USER}/registry/"
- "com.sun.star.comp.deployment.configuration."
- "PackageRegistryBackend/configmgr.ini"))),
- true);
- parseXcsXcuLayer(
- 11,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("uno")
- ":UNO_USER_PACKAGES_CACHE}/registry/"
- "com.sun.star.comp.deployment.configuration."
- "PackageRegistryBackend/registry"))));
- // can be dropped once old UserInstallation format can no longer exist
- // (probably OOo 4)
- parseXcsXcuIniLayer(
- 13,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("uno")
- ":UNO_USER_PACKAGES_CACHE}/registry/"
- "com.sun.star.comp.deployment.configuration."
- "PackageRegistryBackend/configmgr.ini"))),
- true);
- parseModificationLayer();
- RTL_LOGFILE_TRACE_AUTHOR("configmgr", "sb", "end parsing");
-}
-
-Components::~Components()
-{
- flushModifications();
- tempHACK = 0;
-}
-
-void Components::parseFileLeniently(
- FileParser * parseFile, rtl::OUString const & url, int layer, Data & data,
- Partial const * partial, Modifications * modifications,
- Additions * additions)
-{
- OSL_ASSERT(parseFile != 0);
- try {
- (*parseFile)(url, layer, data, partial, modifications, additions);
- } catch (css::container::NoSuchElementException &) {
- throw;
- } catch (css::uno::Exception & e) { //TODO: more specific exception catching
- // Silently ignore invalid XML files, instead of completely preventing
- // OOo from starting:
- OSL_TRACE(
- "configmgr error reading %s: %s",
- rtl::OUStringToOString(url, RTL_TEXTENCODING_UTF8).getStr(),
- rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
- }
-}
-
-void Components::parseFiles(
- int layer, rtl::OUString const & extension, FileParser * parseFile,
- rtl::OUString const & url, bool recursive)
-{
- osl::Directory dir(url);
- switch (dir.open()) {
- case osl::FileBase::E_None:
- break;
- case osl::FileBase::E_NOENT:
- if (!recursive) {
- return;
- }
- // fall through
- default:
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("cannot open directory ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- for (;;) {
- osl::DirectoryItem i;
- osl::FileBase::RC rc = dir.getNextItem(i, SAL_MAX_UINT32);
- if (rc == osl::FileBase::E_NOENT) {
- break;
- }
- if (rc != osl::FileBase::E_None) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("cannot iterate directory ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- osl::FileStatus stat(
- osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName |
- osl_FileStatus_Mask_FileURL);
- if (i.getFileStatus(stat) != osl::FileBase::E_None) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("cannot stat in directory ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- if (stat.getFileType() == osl::FileStatus::Directory) { //TODO: symlinks
- parseFiles(layer, extension, parseFile, stat.getFileURL(), true);
- } else {
- rtl::OUString file(stat.getFileName());
- if (file.getLength() >= extension.getLength() &&
- file.match(extension, file.getLength() - extension.getLength()))
- {
- try {
- parseFileLeniently(
- parseFile, stat.getFileURL(), layer, data_, 0, 0, 0);
- } catch (css::container::NoSuchElementException & e) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "stat'ed file does not exist: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >());
- }
- }
- }
- }
-}
-
-void Components::parseFileList(
- int layer, FileParser * parseFile, rtl::OUString const & urls,
- rtl::Bootstrap const & ini, bool recordAdditions)
-{
- for (sal_Int32 i = 0;;) {
- rtl::OUString url(urls.getToken(0, ' ', i));
- if (url.getLength() != 0) {
- ini.expandMacrosFrom(url); //TODO: detect failure
- Additions * adds = 0;
- if (recordAdditions) {
- adds = data_.addExtensionXcuAdditions(url, layer);
- }
- try {
- parseFileLeniently(parseFile, url, layer, data_, 0, 0, adds);
- } catch (css::container::NoSuchElementException & e) {
- OSL_TRACE(
- "configmgr file does not exist: %s",
- rtl::OUStringToOString(
- e.Message, RTL_TEXTENCODING_UTF8).getStr());
- if (adds != 0) {
- data_.removeExtensionXcuAdditions(url);
- }
- }
- }
- if (i == -1) {
- break;
- }
- }
-}
-
-void Components::parseXcdFiles(int layer, rtl::OUString const & url) {
- osl::Directory dir(url);
- switch (dir.open()) {
- case osl::FileBase::E_None:
- break;
- case osl::FileBase::E_NOENT:
- return;
- default:
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("cannot open directory ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- UnresolvedList unres;
- XcdParser::Dependencies deps;
- for (;;) {
- osl::DirectoryItem i;
- osl::FileBase::RC rc = dir.getNextItem(i, SAL_MAX_UINT32);
- if (rc == osl::FileBase::E_NOENT) {
- break;
- }
- if (rc != osl::FileBase::E_None) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("cannot iterate directory ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- osl::FileStatus stat(
- osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName |
- osl_FileStatus_Mask_FileURL);
- if (i.getFileStatus(stat) != osl::FileBase::E_None) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("cannot stat in directory ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- if (stat.getFileType() != osl::FileStatus::Directory) { //TODO: symlinks
- rtl::OUString file(stat.getFileName());
- if (file.getLength() >= RTL_CONSTASCII_LENGTH(".xcd") &&
- file.matchAsciiL(
- RTL_CONSTASCII_STRINGPARAM(".xcd"),
- file.getLength() - RTL_CONSTASCII_LENGTH(".xcd")))
- {
- rtl::OUString name(
- file.copy(
- 0, file.getLength() - RTL_CONSTASCII_LENGTH(".xcd")));
- rtl::Reference< ParseManager > manager;
- try {
- manager = new ParseManager(
- stat.getFileURL(), new XcdParser(layer, deps, data_));
- } catch (css::container::NoSuchElementException & e) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "stat'ed file does not exist: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >());
- }
- if (manager->parse()) {
- deps.insert(name);
- } else {
- unres.push_back(UnresolvedListItem(name, manager));
- }
- }
- }
- }
- while (!unres.empty()) {
- bool resolved = false;
- for (UnresolvedList::iterator i(unres.begin()); i != unres.end();) {
- if (i->manager->parse()) {
- deps.insert(i->name);
- unres.erase(i++);
- resolved = true;
- } else {
- ++i;
- }
- }
- if (!resolved) {
- throw css::uno::RuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "xcd: unresolved dependencies in ")) +
- url),
- css::uno::Reference< css::uno::XInterface >());
- }
- }
-}
-
-void Components::parseXcsXcuLayer(int layer, rtl::OUString const & url) {
- parseXcdFiles(layer, url);
- parseFiles(
- layer, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".xcs")),
- &parseXcsFile,
- url + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/schema")), false);
- parseFiles(
- layer + 1, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".xcu")),
- &parseXcuFile,
- url + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/data")), false);
-}
-
-void Components::parseXcsXcuIniLayer(
- int layer, rtl::OUString const & url, bool recordAdditions)
-{
- //TODO: rtl::Bootstrap::getFrom "first trie[s] to retrieve the value via the
- // global function"
- rtl::Bootstrap ini(url);
- rtl::OUString urls;
- if (ini.getFrom(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SCHEMA")), urls))
- {
- parseFileList(layer, &parseXcsFile, urls, ini, false);
- }
- if (ini.getFrom(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATA")), urls))
- {
- parseFileList(layer + 1, &parseXcuFile, urls, ini, recordAdditions);
- }
-}
-
-void Components::parseModuleLayer(int layer, rtl::OUString const & url) {
- parseFiles(
- layer, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".xcu")),
- &parseXcuFile, url, false);
-}
-
-void Components::parseResLayer(int layer, rtl::OUString const & url) {
- rtl::OUString resUrl(
- url + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/res")));
- parseXcdFiles(layer, resUrl);
- parseFiles(
- layer, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".xcu")),
- &parseXcuFile, resUrl, false);
-}
-
-rtl::OUString Components::getModificationFileUrl() const {
- return expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap")
- ":UserInstallation}/user/registrymodifications.xcu")));
-}
-
-void Components::parseModificationLayer() {
- try {
- parseFileLeniently(
- &parseXcuFile, getModificationFileUrl(), Data::NO_LAYER, data_, 0,
- 0, 0);
- } catch (css::container::NoSuchElementException &) {
- OSL_TRACE(
- "configmgr user registrymodifications.xcu does not (yet) exist");
- // Migrate old user layer data (can be removed once migration is no
- // longer relevant, probably OOo 4; also see hack for xsi namespace in
- // xmlreader::XmlReader::registerNamespaceIri):
- parseFiles(
- Data::NO_LAYER, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".xcu")),
- &parseXcuFile,
- expand(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap")
- ":UserInstallation}/user/registry/data"))),
- false);
- }
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */