summaryrefslogtreecommitdiff
path: root/configmgr/source/access.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/access.cxx')
-rw-r--r--configmgr/source/access.cxx2248
1 files changed, 0 insertions, 2248 deletions
diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx
deleted file mode 100644
index c8cb793003..0000000000
--- a/configmgr/source/access.cxx
+++ /dev/null
@@ -1,2248 +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 <vector>
-
-#include "com/sun/star/beans/Property.hpp"
-#include "com/sun/star/beans/PropertyAttribute.hpp"
-#include "com/sun/star/beans/PropertyChangeEvent.hpp"
-#include "com/sun/star/beans/PropertyVetoException.hpp"
-#include "com/sun/star/beans/UnknownPropertyException.hpp"
-#include "com/sun/star/beans/XExactName.hpp"
-#include "com/sun/star/beans/XHierarchicalPropertySet.hpp"
-#include "com/sun/star/beans/XHierarchicalPropertySetInfo.hpp"
-#include "com/sun/star/beans/XMultiHierarchicalPropertySet.hpp"
-#include "com/sun/star/beans/XMultiPropertySet.hpp"
-#include "com/sun/star/beans/XPropertiesChangeListener.hpp"
-#include "com/sun/star/beans/XProperty.hpp"
-#include "com/sun/star/beans/XPropertyChangeListener.hpp"
-#include "com/sun/star/beans/XPropertySet.hpp"
-#include "com/sun/star/beans/XPropertySetInfo.hpp"
-#include "com/sun/star/beans/XVetoableChangeListener.hpp"
-#include "com/sun/star/container/ContainerEvent.hpp"
-#include "com/sun/star/container/NoSuchElementException.hpp"
-#include "com/sun/star/container/XContainer.hpp"
-#include "com/sun/star/container/XContainerListener.hpp"
-#include "com/sun/star/container/XElementAccess.hpp"
-#include "com/sun/star/container/XHierarchicalName.hpp"
-#include "com/sun/star/container/XHierarchicalNameAccess.hpp"
-#include "com/sun/star/container/XNameAccess.hpp"
-#include "com/sun/star/container/XNameContainer.hpp"
-#include "com/sun/star/container/XNamed.hpp"
-#include "com/sun/star/lang/DisposedException.hpp"
-#include "com/sun/star/lang/EventObject.hpp"
-#include "com/sun/star/lang/IllegalArgumentException.hpp"
-#include "com/sun/star/lang/NoSupportException.hpp"
-#include "com/sun/star/lang/WrappedTargetException.hpp"
-#include "com/sun/star/lang/XComponent.hpp"
-#include "com/sun/star/lang/XEventListener.hpp"
-#include "com/sun/star/lang/XServiceInfo.hpp"
-#include "com/sun/star/lang/XSingleServiceFactory.hpp"
-#include "com/sun/star/lang/XTypeProvider.hpp"
-#include "com/sun/star/lang/XUnoTunnel.hpp"
-#include "com/sun/star/uno/Any.hxx"
-#include "com/sun/star/uno/Reference.hxx"
-#include "com/sun/star/uno/RuntimeException.hpp"
-#include "com/sun/star/uno/Sequence.hxx"
-#include "com/sun/star/uno/Type.hxx"
-#include "com/sun/star/uno/TypeClass.hpp"
-#include "com/sun/star/uno/XInterface.hpp"
-#include "com/sun/star/uno/XWeak.hpp"
-#include "com/sun/star/util/ElementChange.hpp"
-#include "comphelper/sequenceasvector.hxx"
-#include "cppu/unotype.hxx"
-#include "cppuhelper/queryinterface.hxx"
-#include "cppuhelper/weak.hxx"
-#include "osl/diagnose.h"
-#include "osl/interlck.h"
-#include "osl/mutex.hxx"
-#include "rtl/ref.hxx"
-#include "rtl/ustrbuf.hxx"
-#include "rtl/ustring.h"
-#include "rtl/ustring.hxx"
-#include "sal/types.h"
-
-#include "access.hxx"
-#include "broadcaster.hxx"
-#include "childaccess.hxx"
-#include "components.hxx"
-#include "data.hxx"
-#include "groupnode.hxx"
-#include "localizedpropertynode.hxx"
-#include "localizedvaluenode.hxx"
-#include "lock.hxx"
-#include "modifications.hxx"
-#include "node.hxx"
-#include "nodemap.hxx"
-#include "path.hxx"
-#include "propertynode.hxx"
-#include "rootaccess.hxx"
-#include "setnode.hxx"
-#include "type.hxx"
-
-namespace configmgr {
-
-namespace {
-
-namespace css = com::sun::star;
-
-}
-
-oslInterlockedCount Access::acquireCounting() {
- return osl_incrementInterlockedCount(&m_refCount);
-}
-
-void Access::releaseNondeleting() {
- osl_decrementInterlockedCount(&m_refCount);
-}
-
-bool Access::isValue() {
- rtl::Reference< Node > p(getNode());
- switch (p->kind()) {
- case Node::KIND_PROPERTY:
- case Node::KIND_LOCALIZED_VALUE:
- return true;
- case Node::KIND_LOCALIZED_PROPERTY:
- return !Components::allLocales(getRootAccess()->getLocale());
- default:
- return false;
- }
-}
-
-void Access::markChildAsModified(rtl::Reference< ChildAccess > const & child) {
- OSL_ASSERT(child.is() && child->getParentAccess() == this);
- modifiedChildren_[child->getNameInternal()] = ModifiedChild(child, true);
- for (rtl::Reference< Access > p(this);;) {
- rtl::Reference< Access > parent(p->getParentAccess());
- if (!parent.is()) {
- break;
- }
- OSL_ASSERT(dynamic_cast< ChildAccess * >(p.get()) != 0);
- parent->modifiedChildren_.insert(
- ModifiedChildren::value_type(
- p->getNameInternal(),
- ModifiedChild(dynamic_cast< ChildAccess * >(p.get()), false)));
- p = parent;
- }
-}
-
-void Access::releaseChild(rtl::OUString const & name) {
- cachedChildren_.erase(name);
-}
-
-void Access::initBroadcaster(
- Modifications::Node const & modifications, Broadcaster * broadcaster)
-{
- initBroadcasterAndChanges(modifications, broadcaster, 0);
-}
-
-Access::Access(Components & components):
- components_(components), disposed_(false)
-{
- lock_ = lock();
-}
-
-Access::~Access() {}
-
-void Access::initDisposeBroadcaster(Broadcaster * broadcaster) {
- OSL_ASSERT(broadcaster != 0);
- for (DisposeListeners::iterator i(disposeListeners_.begin());
- i != disposeListeners_.end(); ++i)
- {
- broadcaster->addDisposeNotification(
- *i,
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- }
- for (ContainerListeners::iterator i(containerListeners_.begin());
- i != containerListeners_.end(); ++i)
- {
- broadcaster->addDisposeNotification(
- i->get(),
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- }
- for (PropertyChangeListeners::iterator i(propertyChangeListeners_.begin());
- i != propertyChangeListeners_.end(); ++i)
- {
- for (PropertyChangeListenersElement::iterator j(i->second.begin());
- j != i->second.end(); ++j)
- {
- broadcaster->addDisposeNotification(
- j->get(),
- css::lang::EventObject(
- static_cast< cppu::OWeakObject * >(this)));
- }
- }
- for (VetoableChangeListeners::iterator i(vetoableChangeListeners_.begin());
- i != vetoableChangeListeners_.end(); ++i)
- {
- for (VetoableChangeListenersElement::iterator j(i->second.begin());
- j != i->second.end(); ++j)
- {
- broadcaster->addDisposeNotification(
- j->get(),
- css::lang::EventObject(
- static_cast< cppu::OWeakObject * >(this)));
- }
- }
- for (PropertiesChangeListeners::iterator i(
- propertiesChangeListeners_.begin());
- i != propertiesChangeListeners_.end(); ++i)
- {
- broadcaster->addDisposeNotification(
- i->get(),
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- }
- //TODO: iterate over children w/ listeners (incl. unmodified ones):
- for (ModifiedChildren::iterator i(modifiedChildren_.begin());
- i != modifiedChildren_.end(); ++i)
- {
- rtl::Reference< ChildAccess > child(getModifiedChild(i));
- if (child.is()) {
- child->initDisposeBroadcaster(broadcaster);
- }
- }
-}
-
-void Access::clearListeners() throw() {
- disposeListeners_.clear();
- containerListeners_.clear();
- propertyChangeListeners_.clear();
- vetoableChangeListeners_.clear();
- propertiesChangeListeners_.clear();
- //TODO: iterate over children w/ listeners (incl. unmodified ones):
- for (ModifiedChildren::iterator i(modifiedChildren_.begin());
- i != modifiedChildren_.end(); ++i)
- {
- rtl::Reference< ChildAccess > child(getModifiedChild(i));
- if (child.is()) {
- child->clearListeners();
- }
- }
-}
-
-css::uno::Any Access::queryInterface(css::uno::Type const & aType)
- throw (css::uno::RuntimeException)
-{
- css::uno::Any res(OWeakObject::queryInterface(aType));
- if (res.hasValue()) {
- return res;
- }
- res = cppu::queryInterface(
- aType, static_cast< css::lang::XTypeProvider * >(this),
- static_cast< css::lang::XServiceInfo * >(this),
- static_cast< css::lang::XComponent * >(this),
- static_cast< css::container::XHierarchicalNameAccess * >(this),
- static_cast< css::container::XContainer * >(this),
- static_cast< css::beans::XExactName * >(this),
- static_cast< css::container::XHierarchicalName * >(this),
- static_cast< css::container::XNamed * >(this),
- static_cast< css::beans::XProperty * >(this),
- static_cast< css::container::XElementAccess * >(this),
- static_cast< css::container::XNameAccess * >(this));
- if (res.hasValue()) {
- return res;
- }
- if (getNode()->kind() == Node::KIND_GROUP) {
- res = cppu::queryInterface(
- aType, static_cast< css::beans::XPropertySetInfo * >(this),
- static_cast< css::beans::XPropertySet * >(this),
- static_cast< css::beans::XMultiPropertySet * >(this),
- static_cast< css::beans::XHierarchicalPropertySet * >(this),
- static_cast< css::beans::XMultiHierarchicalPropertySet * >(this),
- static_cast< css::beans::XHierarchicalPropertySetInfo * >(this));
- if (res.hasValue()) {
- return res;
- }
- }
- if (getRootAccess()->isUpdate()) {
- res = cppu::queryInterface(
- aType, static_cast< css::container::XNameReplace * >(this));
- if (res.hasValue()) {
- return res;
- }
- if (getNode()->kind() != Node::KIND_GROUP ||
- dynamic_cast< GroupNode * >(getNode().get())->isExtensible())
- {
- res = cppu::queryInterface(
- aType, static_cast< css::container::XNameContainer * >(this));
- if (res.hasValue()) {
- return res;
- }
- }
- if (getNode()->kind() == Node::KIND_SET) {
- res = cppu::queryInterface(
- aType, static_cast< css::lang::XSingleServiceFactory * >(this));
- }
- }
- return res;
-}
-
-Components & Access::getComponents() const {
- return components_;
-}
-
-void Access::checkLocalizedPropertyAccess() {
- if (getNode()->kind() == Node::KIND_LOCALIZED_PROPERTY &&
- !Components::allLocales(getRootAccess()->getLocale()))
- {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr Access to specialized LocalizedPropertyNode")),
- static_cast< cppu::OWeakObject * >(this));
- }
-}
-
-rtl::Reference< Node > Access::getParentNode() {
- rtl::Reference< Access > parent(getParentAccess());
- return parent.is() ? parent->getNode() : rtl::Reference< Node >();
-}
-
-rtl::Reference< ChildAccess > Access::getChild(rtl::OUString const & name) {
- ModifiedChildren::iterator i(modifiedChildren_.find(name));
- return i == modifiedChildren_.end()
- ? getUnmodifiedChild(name) : getModifiedChild(i);
-}
-
-std::vector< rtl::Reference< ChildAccess > > Access::getAllChildren() {
- std::vector< rtl::Reference< ChildAccess > > vec;
- NodeMap & members = getNode()->getMembers();
- for (NodeMap::iterator i(members.begin()); i != members.end(); ++i) {
- if (modifiedChildren_.find(i->first) == modifiedChildren_.end()) {
- vec.push_back(getUnmodifiedChild(i->first));
- OSL_ASSERT(vec.back().is());
- }
- }
- for (ModifiedChildren::iterator i(modifiedChildren_.begin());
- i != modifiedChildren_.end(); ++i)
- {
- rtl::Reference< ChildAccess > child(getModifiedChild(i));
- if (child.is()) {
- vec.push_back(child);
- }
- }
- return vec;
-}
-
-void Access::checkValue(css::uno::Any const & value, Type type, bool nillable) {
- bool ok;
- switch (type) {
- case TYPE_NIL:
- OSL_ASSERT(false);
- // fall through (cannot happen)
- case TYPE_ERROR:
- ok = false;
- break;
- case TYPE_ANY:
- switch (getDynamicType(value)) {
- case TYPE_ANY:
- OSL_ASSERT(false);
- // fall through (cannot happen)
- case TYPE_ERROR:
- ok = false;
- break;
- case TYPE_NIL:
- ok = nillable;
- break;
- default:
- ok = true;
- break;
- }
- break;
- default:
- ok = value.hasValue() ? value.isExtractableTo(mapType(type)) : nillable;
- break;
- }
- if (!ok) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr inappropriate property value")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
-}
-
-void Access::insertLocalizedValueChild(
- rtl::OUString const & name, css::uno::Any const & value,
- Modifications * localModifications)
-{
- OSL_ASSERT(localModifications != 0);
- LocalizedPropertyNode * locprop = dynamic_cast< LocalizedPropertyNode * >(
- getNode().get());
- checkValue(value, locprop->getStaticType(), locprop->isNillable());
- rtl::Reference< ChildAccess > child(
- new ChildAccess(
- components_, getRootAccess(), this, name,
- new LocalizedValueNode(Data::NO_LAYER, value)));
- markChildAsModified(child);
- localModifications->add(child->getRelativePath());
-}
-
-void Access::reportChildChanges(
- std::vector< css::util::ElementChange > * changes)
-{
- OSL_ASSERT(changes != 0);
- for (ModifiedChildren::iterator i(modifiedChildren_.begin());
- i != modifiedChildren_.end(); ++i)
- {
- rtl::Reference< ChildAccess > child(getModifiedChild(i));
- if (child.is()) {
- child->reportChildChanges(changes);
- changes->push_back(css::util::ElementChange());
- //TODO: changed value and/or inserted node
- } else {
- changes->push_back(css::util::ElementChange()); //TODO: removed node
- }
- }
-}
-
-void Access::commitChildChanges(
- bool valid, Modifications * globalModifications)
-{
- OSL_ASSERT(globalModifications != 0);
- while (!modifiedChildren_.empty()) {
- bool childValid = valid;
- ModifiedChildren::iterator i(modifiedChildren_.begin());
- rtl::Reference< ChildAccess > child(getModifiedChild(i));
- if (child.is()) {
- childValid = childValid && !child->isFinalized();
- child->commitChanges(childValid, globalModifications);
- //TODO: currently, this is called here for directly inserted
- // children as well as for children whose sub-children were
- // modified (and should never be called for directly removed
- // children); clarify what exactly should happen here for
- // directly inserted children
- }
- NodeMap & members = getNode()->getMembers();
- NodeMap::iterator j(members.find(i->first));
- if (child.is()) {
- // Inserted:
- if (j != members.end()) {
- childValid = childValid &&
- j->second->getFinalized() == Data::NO_LAYER;
- if (childValid) {
- child->getNode()->setMandatory(j->second->getMandatory());
- }
- }
- if (childValid) {
- members[i->first] = child->getNode();
- }
- } else {
- // Removed:
- childValid = childValid && j != members.end() &&
- j->second->getFinalized() == Data::NO_LAYER &&
- j->second->getMandatory() == Data::NO_LAYER;
- if (childValid) {
- members.erase(j);
- }
- }
- if (childValid && i->second.directlyModified) {
- Path path(getAbsolutePath());
- path.push_back(i->first);
- components_.addModification(path);
- globalModifications->add(path);
- }
- i->second.child->committed();
- modifiedChildren_.erase(i);
- }
-}
-
-void Access::initBroadcasterAndChanges(
- Modifications::Node const & modifications, Broadcaster * broadcaster,
- std::vector< css::util::ElementChange > * allChanges)
-{
- OSL_ASSERT(broadcaster != 0);
- comphelper::SequenceAsVector< css::beans::PropertyChangeEvent > propChanges;
- bool collectPropChanges = !propertiesChangeListeners_.empty();
- for (Modifications::Node::Children::const_iterator i(
- modifications.children.begin());
- i != modifications.children.end(); ++i)
- {
- rtl::Reference< ChildAccess > child(getChild(i->first));
- if (child.is()) {
- switch (child->getNode()->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- if (!i->second.children.empty()) {
- if (Components::allLocales(getRootAccess()->getLocale())) {
- child->initBroadcasterAndChanges(
- i->second, broadcaster, allChanges);
- //TODO: if allChanges==0, recurse only into children
- // w/ listeners
- } else {
- //TODO: filter child mods that are irrelevant for
- // locale:
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->
- addContainerElementReplacedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(
- this),
- css::uno::makeAny(i->first),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void Element, ReplacedElement
- }
- PropertyChangeListeners::iterator j(
- propertyChangeListeners_.find(i->first));
- if (j != propertyChangeListeners_.end()) {
- for (PropertyChangeListenersElement::iterator k(
- j->second.begin());
- k != j->second.end(); ++k)
- {
- broadcaster->addPropertyChangeNotification(
- *k,
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(
- this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- j = propertyChangeListeners_.find(rtl::OUString());
- if (j != propertyChangeListeners_.end()) {
- for (PropertyChangeListenersElement::iterator k(
- j->second.begin());
- k != j->second.end(); ++k)
- {
- broadcaster->addPropertyChangeNotification(
- *k,
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(
- this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- if (allChanges != 0) {
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(
- child->getRelativePathRepresentation()),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void Element, ReplacedElement
- }
- if (collectPropChanges) {
- propChanges.push_back(
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- }
- // else: spurious Modifications::Node not representing a change
- break;
- case Node::KIND_LOCALIZED_VALUE:
- OSL_ASSERT(
- Components::allLocales(getRootAccess()->getLocale()));
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->addContainerElementReplacedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(this),
- css::uno::makeAny(i->first), child->asValue(),
- css::uno::Any()));
- //TODO: distinguish add/modify; non-void ReplacedElement
- }
- if (allChanges != 0) {
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(
- child->getRelativePathRepresentation()),
- child->asValue(), css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- OSL_ASSERT(!collectPropChanges);
- break;
- case Node::KIND_PROPERTY:
- {
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->addContainerElementReplacedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(this),
- css::uno::makeAny(i->first), child->asValue(),
- css::uno::Any()));
- //TODO: distinguish add/remove/modify; non-void
- // ReplacedElement
- }
- PropertyChangeListeners::iterator j(
- propertyChangeListeners_.find(i->first));
- if (j != propertyChangeListeners_.end()) {
- for (PropertyChangeListenersElement::iterator k(
- j->second.begin());
- k != j->second.end(); ++k)
- {
- broadcaster->addPropertyChangeNotification(
- *k,
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- j = propertyChangeListeners_.find(rtl::OUString());
- if (j != propertyChangeListeners_.end()) {
- for (PropertyChangeListenersElement::iterator k(
- j->second.begin());
- k != j->second.end(); ++k)
- {
- broadcaster->addPropertyChangeNotification(
- *k,
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- if (allChanges != 0) {
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(
- child->getRelativePathRepresentation()),
- child->asValue(), css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- if (collectPropChanges) {
- propChanges.push_back(
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- break;
- case Node::KIND_GROUP:
- case Node::KIND_SET:
- if (i->second.children.empty()) {
- if (child->getNode()->getTemplateName().getLength() != 0) {
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->
- addContainerElementInsertedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(
- this),
- css::uno::makeAny(i->first),
- child->asValue(), css::uno::Any()));
- }
- if (allChanges != 0) {
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(
- child->getRelativePathRepresentation()),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void Element, ReplacedElement
- }
- }
- // else: spurious Modifications::Node not representing a
- // change
- } else {
- child->initBroadcasterAndChanges(
- i->second, broadcaster, allChanges);
- //TODO: if allChanges==0, recurse only into children w/
- // listeners
- }
- break;
- }
- } else {
- switch (getNode()->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- // Removed localized property value:
- OSL_ASSERT(
- Components::allLocales(getRootAccess()->getLocale()));
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->addContainerElementRemovedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(this),
- css::uno::makeAny(i->first), css::uno::Any(),
- css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- if (allChanges != 0) {
- rtl::OUStringBuffer path(getRelativePathRepresentation());
- if (path.getLength() != 0) {
- path.append(sal_Unicode('/'));
- }
- path.append(
- Data::createSegment(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")),
- i->first));
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(path.makeStringAndClear()),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- OSL_ASSERT(!collectPropChanges);
- break;
- case Node::KIND_GROUP:
- {
- // Removed (non-localized) extension property:
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->addContainerElementRemovedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(this),
- css::uno::makeAny(i->first), css::uno::Any(),
- css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- PropertyChangeListeners::iterator j(
- propertyChangeListeners_.find(i->first));
- if (j != propertyChangeListeners_.end()) {
- for (PropertyChangeListenersElement::iterator k(
- j->second.begin());
- k != j->second.end(); ++k)
- {
- broadcaster->addPropertyChangeNotification(
- *k,
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- j = propertyChangeListeners_.find(rtl::OUString());
- if (j != propertyChangeListeners_.end()) {
- for (PropertyChangeListenersElement::iterator k(
- j->second.begin());
- k != j->second.end(); ++k)
- {
- broadcaster->addPropertyChangeNotification(
- *k,
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- if (allChanges != 0) {
- rtl::OUStringBuffer path(
- getRelativePathRepresentation());
- if (path.getLength() != 0) {
- path.append(sal_Unicode('/'));
- }
- path.append(i->first);
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(path.makeStringAndClear()),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- if (collectPropChanges) {
- propChanges.push_back(
- css::beans::PropertyChangeEvent(
- static_cast< cppu::OWeakObject * >(this),
- i->first, false, -1, css::uno::Any(),
- css::uno::Any()));
- }
- }
- break;
- case Node::KIND_SET:
- // Removed set member:
- if (i->second.children.empty()) {
- for (ContainerListeners::iterator j(
- containerListeners_.begin());
- j != containerListeners_.end(); ++j)
- {
- broadcaster->addContainerElementRemovedNotification(
- *j,
- css::container::ContainerEvent(
- static_cast< cppu::OWeakObject * >(this),
- css::uno::makeAny(i->first),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- if (allChanges != 0) {
- rtl::OUStringBuffer path(
- getRelativePathRepresentation());
- if (path.getLength() != 0) {
- path.append(sal_Unicode('/'));
- }
- path.append(
- Data::createSegment(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")),
- i->first));
- allChanges->push_back(
- css::util::ElementChange(
- css::uno::makeAny(path.makeStringAndClear()),
- css::uno::Any(), css::uno::Any()));
- //TODO: non-void ReplacedElement
- }
- }
- // else: spurious Modifications::Node not representing a change
- break;
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- }
- }
- if (!propChanges.empty()) {
- css::uno::Sequence< css::beans::PropertyChangeEvent > seq(
- propChanges.getAsConstList());
- for (PropertiesChangeListeners::iterator i(
- propertiesChangeListeners_.begin());
- i != propertiesChangeListeners_.end(); ++i)
- {
- broadcaster->addPropertiesChangeNotification(*i, seq);
- }
- }
-}
-
-bool Access::isDisposed() const {
- return disposed_;
-}
-
-Access::ModifiedChild::ModifiedChild() {}
-
-Access::ModifiedChild::ModifiedChild(
- rtl::Reference< ChildAccess > const & theChild, bool theDirectlyModified):
- child(theChild), directlyModified(theDirectlyModified)
-{}
-
-css::uno::Sequence< css::uno::Type > Access::getTypes()
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- comphelper::SequenceAsVector< css::uno::Type > types;
- types.push_back(cppu::UnoType< css::uno::XInterface >::get());
- types.push_back(cppu::UnoType< css::uno::XWeak >::get());
- types.push_back(cppu::UnoType< css::lang::XTypeProvider >::get());
- types.push_back(cppu::UnoType< css::lang::XServiceInfo >::get());
- types.push_back(cppu::UnoType< css::lang::XComponent >::get());
- types.push_back(
- cppu::UnoType< css::container::XHierarchicalNameAccess >::get());
- types.push_back(cppu::UnoType< css::container::XContainer >::get());
- types.push_back(cppu::UnoType< css::beans::XExactName >::get());
- types.push_back(cppu::UnoType< css::container::XHierarchicalName >::get());
- types.push_back(cppu::UnoType< css::container::XNamed >::get());
- types.push_back(cppu::UnoType< css::beans::XProperty >::get());
- types.push_back(cppu::UnoType< css::container::XElementAccess >::get());
- types.push_back(cppu::UnoType< css::container::XNameAccess >::get());
- if (getNode()->kind() == Node::KIND_GROUP) {
- types.push_back(cppu::UnoType< css::beans::XPropertySetInfo >::get());
- types.push_back(cppu::UnoType< css::beans::XPropertySet >::get());
- types.push_back(cppu::UnoType< css::beans::XMultiPropertySet >::get());
- types.push_back(
- cppu::UnoType< css::beans::XHierarchicalPropertySet >::get());
- types.push_back(
- cppu::UnoType< css::beans::XMultiHierarchicalPropertySet >::get());
- types.push_back(
- cppu::UnoType< css::beans::XHierarchicalPropertySetInfo >::get());
- }
- if (getRootAccess()->isUpdate()) {
- types.push_back(cppu::UnoType< css::container::XNameReplace >::get());
- if (getNode()->kind() != Node::KIND_GROUP ||
- dynamic_cast< GroupNode * >(getNode().get())->isExtensible())
- {
- types.push_back(
- cppu::UnoType< css::container::XNameContainer >::get());
- }
- if (getNode()->kind() == Node::KIND_SET) {
- types.push_back(
- cppu::UnoType< css::lang::XSingleServiceFactory >::get());
- }
- }
- addTypes(&types);
- return types.getAsConstList();
-}
-
-css::uno::Sequence< sal_Int8 > Access::getImplementationId()
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return css::uno::Sequence< sal_Int8 >();
-}
-
-rtl::OUString Access::getImplementationName() throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("org.openoffice-configmgr::Access"));
-}
-
-sal_Bool Access::supportsService(rtl::OUString const & ServiceName)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- css::uno::Sequence< rtl::OUString > names(getSupportedServiceNames());
- for (sal_Int32 i = 0; i < names.getLength(); ++i) {
- if (names[i] == ServiceName) {
- return true;
- }
- }
- return false;
-}
-
-css::uno::Sequence< rtl::OUString > Access::getSupportedServiceNames()
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- comphelper::SequenceAsVector< rtl::OUString > services;
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.ConfigurationAccess")));
- if (getRootAccess()->isUpdate()) {
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.ConfigurationUpdateAccess")));
- }
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.HierarchyAccess")));
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.HierarchyElement")));
- if (getNode()->kind() == Node::KIND_GROUP) {
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.GroupAccess")));
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.PropertyHierarchy")));
- if (getRootAccess()->isUpdate()) {
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.GroupUpdate")));
- }
- } else {
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.SetAccess")));
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.SimpleSetAccess")));
- if (getRootAccess()->isUpdate()) {
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.SetUpdate")));
- services.push_back(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.SimpleSetUpdate")));
- }
- }
- addSupportedServiceNames(&services);
- return services.getAsConstList();
-}
-
-void Access::dispose() throw (css::uno::RuntimeException) {
- OSL_ASSERT(thisIs(IS_ANY));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- if (getParentAccess().is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr dispose inappropriate Access")),
- static_cast< cppu::OWeakObject * >(this));
- }
- if (disposed_) {
- return;
- }
- initDisposeBroadcaster(&bc);
- clearListeners();
- disposed_ = true;
- }
- bc.send();
-}
-
-void Access::addEventListener(
- css::uno::Reference< css::lang::XEventListener > const & xListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- if (!xListener.is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
- static_cast< cppu::OWeakObject * >(this));
- }
- if (!disposed_) {
- disposeListeners_.insert(xListener);
- return;
- }
- }
- try {
- xListener->disposing(
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- } catch (css::lang::DisposedException &) {}
-}
-
-void Access::removeEventListener(
- css::uno::Reference< css::lang::XEventListener > const & aListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- DisposeListeners::iterator i(disposeListeners_.find(aListener));
- if (i != disposeListeners_.end()) {
- disposeListeners_.erase(i);
- }
-}
-
-css::uno::Type Access::getElementType() throw (css::uno::RuntimeException) {
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- rtl::Reference< Node > p(getNode());
- switch (p->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- return mapType(
- dynamic_cast< LocalizedPropertyNode * >(p.get())->getStaticType());
- case Node::KIND_GROUP:
- //TODO: Should a specific type be returned for a non-extensible group
- // with homogeneous members or for an extensible group that currently
- // has only homegeneous members?
- return cppu::UnoType< cppu::UnoVoidType >::get();
- case Node::KIND_SET:
- return cppu::UnoType< cppu::UnoVoidType >::get(); //TODO: correct?
- default:
- OSL_ASSERT(false);
- throw css::uno::RuntimeException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("this cannot happen")),
- static_cast< cppu::OWeakObject * >(this));
- }
-}
-
-sal_Bool Access::hasElements() throw (css::uno::RuntimeException) {
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return !getAllChildren().empty(); //TODO: optimize
-}
-
-css::uno::Any Access::getByName(rtl::OUString const & aName)
- throw (
- css::container::NoSuchElementException,
- css::lang::WrappedTargetException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- rtl::Reference< ChildAccess > child(getChild(aName));
- if (!child.is()) {
- throw css::container::NoSuchElementException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- return child->asValue();
-}
-
-css::uno::Sequence< rtl::OUString > Access::getElementNames()
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- std::vector< rtl::Reference< ChildAccess > > children(getAllChildren());
- comphelper::SequenceAsVector< rtl::OUString > names;
- for (std::vector< rtl::Reference< ChildAccess > >::iterator i(
- children.begin());
- i != children.end(); ++i)
- {
- names.push_back((*i)->getNameInternal());
- }
- return names.getAsConstList();
-}
-
-sal_Bool Access::hasByName(rtl::OUString const & aName)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return getChild(aName).is();
-}
-
-css::uno::Any Access::getByHierarchicalName(rtl::OUString const & aName)
- throw (css::container::NoSuchElementException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- rtl::Reference< ChildAccess > child(getSubChild(aName));
- if (!child.is()) {
- throw css::container::NoSuchElementException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- return child->asValue();
-}
-
-sal_Bool Access::hasByHierarchicalName(rtl::OUString const & aName)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return getSubChild(aName).is();
-}
-
-void Access::addContainerListener(
- css::uno::Reference< css::container::XContainerListener > const & xListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- if (!xListener.is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
- static_cast< cppu::OWeakObject * >(this));
- }
- if (!disposed_) {
- containerListeners_.insert(xListener);
- return;
- }
- }
- try {
- xListener->disposing(
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- } catch (css::lang::DisposedException &) {}
-}
-
-void Access::removeContainerListener(
- css::uno::Reference< css::container::XContainerListener > const & xListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- ContainerListeners::iterator i(containerListeners_.find(xListener));
- if (i != containerListeners_.end()) {
- containerListeners_.erase(i);
- }
-}
-
-rtl::OUString Access::getExactName(rtl::OUString const & aApproximateName)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return aApproximateName;
-}
-
-css::uno::Sequence< css::beans::Property > Access::getProperties()
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- std::vector< rtl::Reference< ChildAccess > > children(getAllChildren());
- comphelper::SequenceAsVector< css::beans::Property > properties;
- for (std::vector< rtl::Reference< ChildAccess > >::iterator i(
- children.begin());
- i != children.end(); ++i)
- {
- properties.push_back((*i)->asProperty());
- }
- return properties.getAsConstList();
-}
-
-css::beans::Property Access::getPropertyByName(rtl::OUString const & aName)
- throw (css::beans::UnknownPropertyException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- rtl::Reference< ChildAccess > child(getChild(aName));
- if (!child.is()) {
- throw css::beans::UnknownPropertyException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- return child->asProperty();
-}
-
-sal_Bool Access::hasPropertyByName(rtl::OUString const & Name)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- return getChild(Name).is();
-}
-
-rtl::OUString Access::getHierarchicalName() throw (css::uno::RuntimeException) {
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- // For backwards compatibility, return an absolute path representation where
- // available:
- rtl::OUStringBuffer path;
- rtl::Reference< RootAccess > root(getRootAccess());
- if (root.is()) {
- path.append(root->getAbsolutePathRepresentation());
- }
- rtl::OUString rel(getRelativePathRepresentation());
- if (path.getLength() != 0 && rel.getLength() != 0) {
- path.append(sal_Unicode('/'));
- }
- path.append(rel);
- return path.makeStringAndClear();
-}
-
-rtl::OUString Access::composeHierarchicalName(
- rtl::OUString const & aRelativeName)
- throw (
- css::lang::IllegalArgumentException, css::lang::NoSupportException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- if (aRelativeName.getLength() == 0 || aRelativeName[0] == '/') {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr composeHierarchicalName inappropriate relative"
- " name")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
- rtl::OUStringBuffer path(getRelativePathRepresentation());
- if (path.getLength() != 0) {
- path.append(sal_Unicode('/'));
- }
- path.append(aRelativeName);
- return path.makeStringAndClear();
-}
-
-rtl::OUString Access::getName() throw (css::uno::RuntimeException) {
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return getNameInternal();
-}
-
-void Access::setName(rtl::OUString const & aName)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- checkFinalized();
- Modifications localMods;
- switch (getNode()->kind()) {
- case Node::KIND_GROUP:
- case Node::KIND_SET:
- {
- rtl::Reference< Access > parent(getParentAccess());
- if (parent.is()) {
- rtl::Reference< Node > node(getNode());
- if (node->getTemplateName().getLength() != 0) {
- rtl::Reference< ChildAccess > other(
- parent->getChild(aName));
- if (other.get() == this) {
- break;
- }
- if (node->getMandatory() == Data::NO_LAYER &&
- !(other.is() && other->isFinalized()))
- {
- rtl::Reference< RootAccess > root(getRootAccess());
- rtl::Reference< ChildAccess > childAccess(
- dynamic_cast< ChildAccess * >(this));
- localMods.add(getRelativePath());
- // unbind() modifies the parent chain that
- // markChildAsModified() walks, so order is
- // important:
- parent->markChildAsModified(childAccess);
- //TODO: must not throw
- childAccess->unbind(); // must not throw
- if (other.is()) {
- other->unbind(); // must not throw
- }
- childAccess->bind(root, parent, aName);
- // must not throw
- parent->markChildAsModified(childAccess);
- //TODO: must not throw
- localMods.add(getRelativePath());
- break;
- }
- }
- }
- }
- // fall through
- case Node::KIND_LOCALIZED_PROPERTY:
- // renaming a property could only work for an extension property,
- // but a localized property is never an extension property
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setName inappropriate node")),
- static_cast< cppu::OWeakObject * >(this));
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-css::beans::Property Access::getAsProperty() throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- return asProperty();
-}
-
-css::uno::Reference< css::beans::XPropertySetInfo > Access::getPropertySetInfo()
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- return this;
-}
-
-void Access::setPropertyValue(
- rtl::OUString const & aPropertyName, css::uno::Any const & aValue)
- throw (
- css::beans::UnknownPropertyException, css::beans::PropertyVetoException,
- css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- if (!getRootAccess()->isUpdate()) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setPropertyValue on non-update access")),
- static_cast< cppu::OWeakObject * >(this));
- }
- Modifications localMods;
- if (!setChildProperty(aPropertyName, aValue, &localMods)) {
- throw css::beans::UnknownPropertyException(
- aPropertyName, static_cast< cppu::OWeakObject * >(this));
- }
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-css::uno::Any Access::getPropertyValue(rtl::OUString const & PropertyName)
- throw (
- css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- rtl::Reference< ChildAccess > child(getChild(PropertyName));
- if (!child.is()) {
- throw css::beans::UnknownPropertyException(
- PropertyName, static_cast< cppu::OWeakObject * >(this));
- }
- return child->asValue();
-}
-
-void Access::addPropertyChangeListener(
- rtl::OUString const & aPropertyName,
- css::uno::Reference< css::beans::XPropertyChangeListener > const &
- xListener)
- throw (
- css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- {
- osl::MutexGuard g(*lock_);
- if (!xListener.is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
- static_cast< cppu::OWeakObject * >(this));
- }
- checkKnownProperty(aPropertyName);
- if (!disposed_) {
- propertyChangeListeners_[aPropertyName].insert(xListener);
- return;
- }
- }
- try {
- xListener->disposing(
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- } catch (css::lang::DisposedException &) {}
-}
-
-void Access::removePropertyChangeListener(
- rtl::OUString const & aPropertyName,
- css::uno::Reference< css::beans::XPropertyChangeListener > const &
- aListener)
- throw (
- css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- checkKnownProperty(aPropertyName);
- PropertyChangeListeners::iterator i(
- propertyChangeListeners_.find(aPropertyName));
- if (i != propertyChangeListeners_.end()) {
- PropertyChangeListenersElement::iterator j(i->second.find(aListener));
- if (j != i->second.end()) {
- i->second.erase(j);
- if (i->second.empty()) {
- propertyChangeListeners_.erase(i);
- }
- }
- }
-}
-
-void Access::addVetoableChangeListener(
- rtl::OUString const & PropertyName,
- css::uno::Reference< css::beans::XVetoableChangeListener > const &
- aListener)
- throw (
- css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- {
- osl::MutexGuard g(*lock_);
- if (!aListener.is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
- static_cast< cppu::OWeakObject * >(this));
- }
- checkKnownProperty(PropertyName);
- if (!disposed_) {
- vetoableChangeListeners_[PropertyName].insert(aListener);
- //TODO: actually call vetoableChangeListeners_
- return;
- }
- }
- try {
- aListener->disposing(
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- } catch (css::lang::DisposedException &) {}
-}
-
-void Access::removeVetoableChangeListener(
- rtl::OUString const & PropertyName,
- css::uno::Reference< css::beans::XVetoableChangeListener > const &
- aListener)
- throw (
- css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- checkKnownProperty(PropertyName);
- VetoableChangeListeners::iterator i(
- vetoableChangeListeners_.find(PropertyName));
- if (i != vetoableChangeListeners_.end()) {
- VetoableChangeListenersElement::iterator j(i->second.find(aListener));
- if (j != i->second.end()) {
- i->second.erase(j);
- if (i->second.empty()) {
- vetoableChangeListeners_.erase(i);
- }
- }
- }
-}
-
-void Access::setPropertyValues(
- css::uno::Sequence< rtl::OUString > const & aPropertyNames,
- css::uno::Sequence< css::uno::Any > const & aValues)
- throw (
- css::beans::PropertyVetoException, css::lang::IllegalArgumentException,
- css::lang::WrappedTargetException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- if (!getRootAccess()->isUpdate()) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setPropertyValues on non-update access")),
- static_cast< cppu::OWeakObject * >(this));
- }
- if (aPropertyNames.getLength() != aValues.getLength()) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setPropertyValues: aPropertyNames/aValues of"
- " different length")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
- Modifications localMods;
- for (sal_Int32 i = 0; i < aPropertyNames.getLength(); ++i) {
- if (!setChildProperty(aPropertyNames[i], aValues[i], &localMods)) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setPropertyValues inappropriate property"
- " name")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
- }
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-css::uno::Sequence< css::uno::Any > Access::getPropertyValues(
- css::uno::Sequence< rtl::OUString > const & aPropertyNames)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- css::uno::Sequence< css::uno::Any > vals(aPropertyNames.getLength());
- for (sal_Int32 i = 0; i < aPropertyNames.getLength(); ++i) {
- rtl::Reference< ChildAccess > child(getChild(aPropertyNames[i]));
- if (!child.is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr getPropertyValues inappropriate property"
- " name")),
- static_cast< cppu::OWeakObject * >(this));
- }
- vals[i] = child->asValue();
- }
- return vals;
-}
-
-void Access::addPropertiesChangeListener(
- css::uno::Sequence< rtl::OUString > const &,
- css::uno::Reference< css::beans::XPropertiesChangeListener > const &
- xListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- {
- osl::MutexGuard g(*lock_);
- if (!xListener.is()) {
- throw css::uno::RuntimeException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
- static_cast< cppu::OWeakObject * >(this));
- }
- if (!disposed_) {
- propertiesChangeListeners_.insert(xListener);
- return;
- }
- }
- try {
- xListener->disposing(
- css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
- } catch (css::lang::DisposedException &) {}
-}
-
-void Access::removePropertiesChangeListener(
- css::uno::Reference< css::beans::XPropertiesChangeListener > const &
- xListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- PropertiesChangeListeners::iterator i(
- propertiesChangeListeners_.find(xListener));
- if (i != propertiesChangeListeners_.end()) {
- propertiesChangeListeners_.erase(i);
- }
-}
-
-void Access::firePropertiesChangeEvent(
- css::uno::Sequence< rtl::OUString > const & aPropertyNames,
- css::uno::Reference< css::beans::XPropertiesChangeListener > const &
- xListener)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- css::uno::Sequence< css::beans::PropertyChangeEvent > events(
- aPropertyNames.getLength());
- for (sal_Int32 i = 0; i < events.getLength(); ++i) {
- events[i].Source = static_cast< cppu::OWeakObject * >(this);
- events[i].PropertyName = aPropertyNames[i];
- events[i].Further = false;
- events[i].PropertyHandle = -1;
- }
- xListener->propertiesChange(events);
-}
-
-css::uno::Reference< css::beans::XHierarchicalPropertySetInfo >
-Access::getHierarchicalPropertySetInfo() throw (css::uno::RuntimeException) {
- OSL_ASSERT(thisIs(IS_GROUP));
- return this;
-}
-
-void Access::setHierarchicalPropertyValue(
- rtl::OUString const & aHierarchicalPropertyName,
- css::uno::Any const & aValue)
- throw (
- css::beans::UnknownPropertyException, css::beans::PropertyVetoException,
- css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- if (!getRootAccess()->isUpdate()) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setHierarchicalPropertyName on non-update"
- " access")),
- static_cast< cppu::OWeakObject * >(this));
- }
- rtl::Reference< ChildAccess > child(
- getSubChild(aHierarchicalPropertyName));
- if (!child.is()) {
- throw css::beans::UnknownPropertyException(
- aHierarchicalPropertyName,
- static_cast< cppu::OWeakObject * >(this));
- }
- child->checkFinalized();
- Modifications localMods;
- child->setProperty(aValue, &localMods);
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-css::uno::Any Access::getHierarchicalPropertyValue(
- rtl::OUString const & aHierarchicalPropertyName)
- throw (
- css::beans::UnknownPropertyException,
- css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- rtl::Reference< ChildAccess > child(getSubChild(aHierarchicalPropertyName));
- if (!child.is()) {
- throw css::beans::UnknownPropertyException(
- aHierarchicalPropertyName,
- static_cast< cppu::OWeakObject * >(this));
- }
- return child->asValue();
-}
-
-void Access::setHierarchicalPropertyValues(
- css::uno::Sequence< rtl::OUString > const & aHierarchicalPropertyNames,
- css::uno::Sequence< css::uno::Any > const & Values)
- throw (
- css::beans::PropertyVetoException, css::lang::IllegalArgumentException,
- css::lang::WrappedTargetException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- if (!getRootAccess()->isUpdate()) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setPropertyValues on non-update access")),
- static_cast< cppu::OWeakObject * >(this));
- }
- if (aHierarchicalPropertyNames.getLength() != Values.getLength()) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setHierarchicalPropertyValues:"
- " aHierarchicalPropertyNames/Values of different"
- " length")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
- Modifications localMods;
- for (sal_Int32 i = 0; i < aHierarchicalPropertyNames.getLength(); ++i) {
- rtl::Reference< ChildAccess > child(
- getSubChild(aHierarchicalPropertyNames[i]));
- if (!child.is()) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr setHierarchicalPropertyValues"
- " inappropriate property name")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
- child->checkFinalized();
- child->setProperty(Values[i], &localMods);
- }
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-css::uno::Sequence< css::uno::Any > Access::getHierarchicalPropertyValues(
- css::uno::Sequence< rtl::OUString > const & aHierarchicalPropertyNames)
- throw (
- css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
- css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- css::uno::Sequence< css::uno::Any > vals(
- aHierarchicalPropertyNames.getLength());
- for (sal_Int32 i = 0; i < aHierarchicalPropertyNames.getLength(); ++i) {
- rtl::Reference< ChildAccess > child(
- getSubChild(aHierarchicalPropertyNames[i]));
- if (!child.is()) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr getHierarchicalPropertyValues inappropriate"
- " hierarchical property name")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
- vals[i] = child->asValue();
- }
- return vals;
-}
-
-css::beans::Property Access::getPropertyByHierarchicalName(
- rtl::OUString const & aHierarchicalName)
- throw (css::beans::UnknownPropertyException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- rtl::Reference< ChildAccess > child(getSubChild(aHierarchicalName));
- if (!child.is()) {
- throw css::beans::UnknownPropertyException(
- aHierarchicalName, static_cast< cppu::OWeakObject * >(this));
- }
- return child->asProperty();
-}
-
-sal_Bool Access::hasPropertyByHierarchicalName(
- rtl::OUString const & aHierarchicalName)
- throw (css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(*lock_);
- return getSubChild(aHierarchicalName).is();
-}
-
-void Access::replaceByName(
- rtl::OUString const & aName, css::uno::Any const & aElement)
- throw (
- css::lang::IllegalArgumentException,
- css::container::NoSuchElementException,
- css::lang::WrappedTargetException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_UPDATE));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- rtl::Reference< ChildAccess > child(getChild(aName));
- if (!child.is()) {
- throw css::container::NoSuchElementException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- child->checkFinalized();
- Modifications localMods;
- switch (getNode()->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- case Node::KIND_GROUP:
- child->setProperty(aElement, &localMods);
- break;
- case Node::KIND_SET:
- {
- rtl::Reference< ChildAccess > freeAcc(
- getFreeSetMember(aElement));
- rtl::Reference< RootAccess > root(getRootAccess());
- localMods.add(child->getRelativePath());
- child->unbind(); // must not throw
- freeAcc->bind(root, this, aName); // must not throw
- markChildAsModified(freeAcc); //TODO: must not throw
- }
- break;
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-void Access::insertByName(
- rtl::OUString const & aName, css::uno::Any const & aElement)
- throw (
- css::lang::IllegalArgumentException,
- css::container::ElementExistException,
- css::lang::WrappedTargetException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_EXTENSIBLE|IS_UPDATE));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- checkFinalized();
- if (getChild(aName).is()) {
- throw css::container::ElementExistException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- Modifications localMods;
- switch (getNode()->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- insertLocalizedValueChild(aName, aElement, &localMods);
- break;
- case Node::KIND_GROUP:
- {
- checkValue(aElement, TYPE_ANY, true);
- rtl::Reference< ChildAccess > child(
- new ChildAccess(
- components_, getRootAccess(), this, aName,
- new PropertyNode(
- Data::NO_LAYER, TYPE_ANY, true, aElement, true)));
- markChildAsModified(child);
- localMods.add(child->getRelativePath());
- }
- break;
- case Node::KIND_SET:
- {
- rtl::Reference< ChildAccess > freeAcc(
- getFreeSetMember(aElement));
- freeAcc->bind(getRootAccess(), this, aName); // must not throw
- markChildAsModified(freeAcc); //TODO: must not throw
- localMods.add(freeAcc->getRelativePath());
- }
- break;
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-void Access::removeByName(rtl::OUString const & aName)
- throw (
- css::container::NoSuchElementException,
- css::lang::WrappedTargetException, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_EXTENSIBLE|IS_UPDATE));
- Broadcaster bc;
- {
- osl::MutexGuard g(*lock_);
- checkLocalizedPropertyAccess();
- rtl::Reference< ChildAccess > child(getChild(aName));
- if (!child.is() || child->isFinalized() ||
- child->getNode()->getMandatory() != Data::NO_LAYER)
- {
- throw css::container::NoSuchElementException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- if (getNode()->kind() == Node::KIND_GROUP) {
- rtl::Reference< Node > p(child->getNode());
- if (p->kind() != Node::KIND_PROPERTY ||
- !dynamic_cast< PropertyNode * >(p.get())->isExtension())
- {
- throw css::container::NoSuchElementException(
- aName, static_cast< cppu::OWeakObject * >(this));
- }
- }
- Modifications localMods;
- localMods.add(child->getRelativePath());
- // unbind() modifies the parent chain that markChildAsModified() walks,
- // so order is important:
- markChildAsModified(child); //TODO: must not throw
- child->unbind();
- getNotificationRoot()->initBroadcaster(localMods.getRoot(), &bc);
- }
- bc.send();
-}
-
-css::uno::Reference< css::uno::XInterface > Access::createInstance()
- throw (css::uno::Exception, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_SET|IS_UPDATE));
- rtl::OUString tmplName(
- dynamic_cast< SetNode * >(getNode().get())->getDefaultTemplateName());
- rtl::Reference< Node > tmpl(
- components_.getTemplate(Data::NO_LAYER, tmplName));
- if (!tmpl.is()) {
- throw css::uno::Exception(
- (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("unknown template ")) +
- tmplName),
- static_cast< cppu::OWeakObject * >(this));
- }
- rtl::Reference< Node > node(tmpl->clone(true));
- node->setLayer(Data::NO_LAYER);
- return static_cast< cppu::OWeakObject * >(
- new ChildAccess(components_, getRootAccess(), node));
-}
-
-css::uno::Reference< css::uno::XInterface > Access::createInstanceWithArguments(
- css::uno::Sequence< css::uno::Any > const & aArguments)
- throw (css::uno::Exception, css::uno::RuntimeException)
-{
- OSL_ASSERT(thisIs(IS_SET|IS_UPDATE));
- if (aArguments.getLength() != 0) {
- throw css::uno::Exception(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configuration SimpleSetUpdate createInstanceWithArguments"
- " must not specify any arguments")),
- static_cast< cppu::OWeakObject * >(this));
- }
- return createInstance();
-}
-
-rtl::Reference< ChildAccess > Access::getModifiedChild(
- ModifiedChildren::iterator const & childIterator)
-{
- return (childIterator->second.child->getParentAccess() == this &&
- (childIterator->second.child->getNameInternal() ==
- childIterator->first))
- ? childIterator->second.child : rtl::Reference< ChildAccess >();
-}
-
-rtl::Reference< ChildAccess > Access::getUnmodifiedChild(
- rtl::OUString const & name)
-{
- OSL_ASSERT(modifiedChildren_.find(name) == modifiedChildren_.end());
- rtl::Reference< Node > node(getNode()->getMember(name));
- if (!node.is()) {
- return rtl::Reference< ChildAccess >();
- }
- WeakChildMap::iterator i(cachedChildren_.find(name));
- if (i != cachedChildren_.end()) {
- rtl::Reference< ChildAccess > child;
- if (i->second->acquireCounting() > 1) {
- child.set(i->second); // must not throw
- }
- i->second->releaseNondeleting();
- if (child.is()) {
- child->setNode(node);
- return child;
- }
- }
- rtl::Reference< ChildAccess > child(
- new ChildAccess(components_, getRootAccess(), this, name, node));
- cachedChildren_[name] = child.get();
- return child;
-}
-
-rtl::Reference< ChildAccess > Access::getSubChild(rtl::OUString const & path) {
- sal_Int32 i = 0;
- // For backwards compatibility, allow absolute paths where meaningful:
- if (path.getLength() != 0 && path[0] == '/') {
- ++i;
- if (!getRootAccess().is()) {
- return rtl::Reference< ChildAccess >();
- }
- Path abs(getAbsolutePath());
- for (Path::iterator j(abs.begin()); j != abs.end(); ++j) {
- rtl::OUString name1;
- bool setElement1;
- rtl::OUString templateName1;
- i = Data::parseSegment(
- path, i, &name1, &setElement1, &templateName1);
- if (i == -1 || (i != path.getLength() && path[i] != '/')) {
- return rtl::Reference< ChildAccess >();
- }
- rtl::OUString name2;
- bool setElement2;
- rtl::OUString templateName2;
- Data::parseSegment(*j, 0, &name2, &setElement2, &templateName2);
- if (name1 != name2 || setElement1 != setElement2 ||
- (setElement1 &&
- !Data::equalTemplateNames(templateName1, templateName2)))
- {
- return rtl::Reference< ChildAccess >();
- }
- if (i != path.getLength()) {
- ++i;
- }
- }
- }
- for (rtl::Reference< Access > parent(this);;) {
- rtl::OUString name;
- bool setElement;
- rtl::OUString templateName;
- i = Data::parseSegment(path, i, &name, &setElement, &templateName);
- if (i == -1 || (i != path.getLength() && path[i] != '/')) {
- return rtl::Reference< ChildAccess >();
- }
- rtl::Reference< ChildAccess > child(parent->getChild(name));
- if (!child.is()) {
- return rtl::Reference< ChildAccess >();
- }
- if (setElement) {
- rtl::Reference< Node > p(parent->getNode());
- switch (p->kind()) {
- case Node::KIND_LOCALIZED_PROPERTY:
- if (!Components::allLocales(getRootAccess()->getLocale()) ||
- templateName.getLength() != 0)
- {
- return rtl::Reference< ChildAccess >();
- }
- break;
- case Node::KIND_SET:
- if (templateName.getLength() != 0 &&
- !dynamic_cast< SetNode * >(p.get())->isValidTemplate(
- templateName))
- {
- return rtl::Reference< ChildAccess >();
- }
- break;
- default:
- return rtl::Reference< ChildAccess >();
- }
- }
- // For backwards compatibility, ignore a final slash after non-value
- // nodes:
- if (child->isValue()) {
- return i == path.getLength()
- ? child : rtl::Reference< ChildAccess >();
- } else if (i >= path.getLength() - 1) {
- return child;
- }
- ++i;
- parent = child.get();
- }
-}
-
-bool Access::setChildProperty(
- rtl::OUString const & name, css::uno::Any const & value,
- Modifications * localModifications)
-{
- OSL_ASSERT(localModifications != 0);
- rtl::Reference< ChildAccess > child(getChild(name));
- if (!child.is()) {
- return false;
- }
- child->checkFinalized();
- child->setProperty(value, localModifications);
- return true;
-}
-
-css::beans::Property Access::asProperty() {
- css::uno::Type type;
- bool nillable;
- bool removable;
- rtl::Reference< Node > p(getNode());
- switch (p->kind()) {
- case Node::KIND_PROPERTY:
- {
- PropertyNode * prop = dynamic_cast< PropertyNode * >(p.get());
- type = mapType(prop->getStaticType());
- nillable = prop->isNillable();
- removable = prop->isExtension();
- }
- break;
- case Node::KIND_LOCALIZED_PROPERTY:
- {
- LocalizedPropertyNode * locprop =
- dynamic_cast< LocalizedPropertyNode *>(p.get());
- if (Components::allLocales(getRootAccess()->getLocale())) {
- type = cppu::UnoType< css::uno::XInterface >::get();
- //TODO: correct?
- removable = false;
- } else {
- type = mapType(locprop->getStaticType());
- removable = false; //TODO ???
- }
- nillable = locprop->isNillable();
- }
- break;
- case Node::KIND_LOCALIZED_VALUE:
- {
- LocalizedPropertyNode * locprop =
- dynamic_cast< LocalizedPropertyNode * >(getParentNode().get());
- type = mapType(locprop->getStaticType());
- nillable = locprop->isNillable();
- removable = false; //TODO ???
- }
- break;
- default:
- type = cppu::UnoType< css::uno::XInterface >::get(); //TODO: correct?
- nillable = false;
- rtl::Reference< Node > parent(getParentNode());
- removable = parent.is() && parent->kind() == Node::KIND_SET;
- break;
- }
- return css::beans::Property(
- getNameInternal(), -1, type,
- (css::beans::PropertyAttribute::BOUND | //TODO: correct for group/set?
- css::beans::PropertyAttribute::CONSTRAINED |
- (nillable ? css::beans::PropertyAttribute::MAYBEVOID : 0) |
- (getRootAccess()->isUpdate()
- ? (removable ? css::beans::PropertyAttribute::REMOVEABLE : 0)
- : css::beans::PropertyAttribute::READONLY))); //TODO: MAYBEDEFAULT
-}
-
-void Access::checkFinalized() {
- if (isFinalized()) {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr modification of finalized item")),
- static_cast< cppu::OWeakObject * >(this), -1);
- }
-}
-
-void Access::checkKnownProperty(rtl::OUString const & descriptor) {
- if (descriptor.getLength() == 0) {
- return;
- }
- rtl::Reference< ChildAccess > child(getChild(descriptor));
- if (child.is()) {
- switch (child->getNode()->kind()) {
- case Node::KIND_PROPERTY:
- return;
- case Node::KIND_LOCALIZED_PROPERTY:
- if (!Components::allLocales(getRootAccess()->getLocale())) {
- return;
- }
- break;
- case Node::KIND_LOCALIZED_VALUE:
- if (Components::allLocales(getRootAccess()->getLocale())) {
- return;
- }
- break;
- default:
- break;
- }
- }
- throw css::beans::UnknownPropertyException(
- descriptor, static_cast< cppu::OWeakObject * >(this));
-}
-
-rtl::Reference< ChildAccess > Access::getFreeSetMember(
- css::uno::Any const & value)
-{
- rtl::Reference< ChildAccess > freeAcc;
- css::uno::Reference< css::lang::XUnoTunnel > tunnel;
- value >>= tunnel;
- if (tunnel.is()) {
- freeAcc.set(
- reinterpret_cast< ChildAccess * >(
- tunnel->getSomething(ChildAccess::getTunnelId())));
- }
- if (!freeAcc.is() || freeAcc->getParentAccess().is() ||
- (freeAcc->isInTransaction() &&
- freeAcc->getRootAccess() != getRootAccess()))
- {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr inappropriate set element")),
- static_cast< cppu::OWeakObject * >(this), 1);
- }
- OSL_ASSERT(dynamic_cast< SetNode * >(getNode().get()) != 0);
- if (!dynamic_cast< SetNode * >(getNode().get())->isValidTemplate(
- freeAcc->getNode()->getTemplateName()))
- {
- throw css::lang::IllegalArgumentException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "configmgr inappropriate set element")),
- static_cast< cppu::OWeakObject * >(this), 1);
- }
- return freeAcc;
-}
-
-rtl::Reference< Access > Access::getNotificationRoot() {
- for (rtl::Reference< Access > p(this);;) {
- rtl::Reference< Access > parent(p->getParentAccess());
- if (!parent.is()) {
- return p;
- }
- p = parent;
- }
-}
-
-#if OSL_DEBUG_LEVEL > 0
-bool Access::thisIs(int what) {
- osl::MutexGuard g(*lock_);
- rtl::Reference< Node > p(getNode());
- Node::Kind k(p->kind());
- return (k != Node::KIND_PROPERTY && k != Node::KIND_LOCALIZED_VALUE &&
- ((what & IS_GROUP) == 0 || k == Node::KIND_GROUP) &&
- ((what & IS_SET) == 0 || k == Node::KIND_SET) &&
- ((what & IS_EXTENSIBLE) == 0 || k != Node::KIND_GROUP ||
- dynamic_cast< GroupNode * >(p.get())->isExtensible()) &&
- ((what & IS_GROUP_MEMBER) == 0 ||
- getParentNode()->kind() == Node::KIND_GROUP)) ||
- ((what & IS_SET_MEMBER) == 0 ||
- getParentNode()->kind() == Node::KIND_SET) ||
- ((what & IS_UPDATE) == 0 || getRootAccess()->isUpdate());
-}
-#endif
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */