summaryrefslogtreecommitdiff
path: root/configmgr/source/tree/node.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/tree/node.cxx')
-rw-r--r--configmgr/source/tree/node.cxx271
1 files changed, 179 insertions, 92 deletions
diff --git a/configmgr/source/tree/node.cxx b/configmgr/source/tree/node.cxx
index c292cec937..3ba3a0b9a6 100644
--- a/configmgr/source/tree/node.cxx
+++ b/configmgr/source/tree/node.cxx
@@ -31,11 +31,11 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_configmgr.hxx"
-#include "types.hxx"
#include "node.hxx"
#include "anydata.hxx"
#include "treefragment.hxx"
#include "attributes.hxx"
+#include "utility.hxx"
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Any.hxx>
@@ -51,14 +51,9 @@ namespace configmgr
{
//-----------------------------------------------------------------------------
-// Name name;
- // Offset parent; // always counts backwards
- // Flags::Field flags;
- // Type ::Field type; // contains discriminator for union
-
rtl::OUString NodeInfo::getName() const
{
- return readName(this->name);
+ return rtl::OUString(this->name);
}
//-----------------------------------------------------------------------------
@@ -66,15 +61,15 @@ configmgr::node::Attributes NodeInfo::getNodeInfoAttributes() const
{
configmgr::node::Attributes aResult;
- bool help = !!(flags & Flags::readonly);
- aResult.setAccess( help,!!(flags & Flags::finalized) );
-// aResult.setAccess( !!(flags & Flags::readonly),!!(flags & Flags::finalized) );
+ bool help = !!(flags & data::Flags::readonly);
+ aResult.setAccess( help,!!(flags & data::Flags::finalized) );
+// aResult.setAccess( !!(flags & data::Flags::readonly),!!(flags & data::Flags::finalized) );
- aResult.setNullable(!!(flags & Flags::nullable));
- aResult.setLocalized(!!(flags & Flags::localized));
+ aResult.setNullable(!!(flags & data::Flags::nullable));
+ aResult.setLocalized(!!(flags & data::Flags::localized));
- configmgr::node::State state = (flags & Flags::defaulted) ? configmgr::node::isDefault :
- (flags & Flags::defaultable) ? configmgr::node::isMerged :
+ configmgr::node::State state = (flags & data::Flags::defaulted) ? configmgr::node::isDefault :
+ (flags & data::Flags::defaultable) ? configmgr::node::isMerged :
configmgr::node::isReplaced;
aResult.setState(state);
@@ -84,13 +79,13 @@ configmgr::node::Attributes NodeInfo::getNodeInfoAttributes() const
bool NodeInfo::isDefault() const
{
- return !!(this->flags & Flags::defaulted);
+ return !!(this->flags & data::Flags::defaulted);
}
//-----------------------------------------------------------------------------
bool NodeInfo::isLocalized() const
{
- return !!(this->flags & Flags::localized);
+ return !!(this->flags & data::Flags::localized);
}
//-----------------------------------------------------------------------------
@@ -98,11 +93,11 @@ void NodeInfo::markAsDefault(bool bDefault)
{
if (bDefault)
{
- OSL_ENSURE(flags & Flags::defaultable,"Marking a non-defaultable node as default");
- this->flags |= Flags::defaulted;
+ OSL_ENSURE(flags & data::Flags::defaultable,"Marking a non-defaultable node as default");
+ this->flags |= data::Flags::defaulted;
}
else
- this->flags &= ~Flags::defaulted;
+ this->flags &= ~data::Flags::defaulted;
}
//-----------------------------------------------------------------------------
@@ -126,22 +121,15 @@ bool GroupNode::hasDefaultsAvailable() const
}
//-----------------------------------------------------------------------------
-Node * GroupNode::getFirstChild()
-{
- OSL_ENSURE(numDescendants, "Groups MUST have at least one child");
- return node(this) + 1;
-}
-//-----------------------------------------------------------------------------
-
-Node const * GroupNode::getFirstChild() const
+Node * GroupNode::getFirstChild() const
{
OSL_ENSURE(numDescendants, "Groups MUST have at least one child");
- return node(this) + 1;
+ return const_cast< Node * >(node(this) + 1);
}
//-----------------------------------------------------------------------------
static
-Offset implGetNextChildOffset(GroupNode const * _pParent, Node const * _pChild)
+sal_uInt16 implGetNextChildOffset(GroupNode const * _pParent, Node const * _pChild)
{
OSL_PRECOND(_pChild, "getNextChild: previous child must not be NULL");
OSL_PRECOND(_pChild->getParentNode() == node(_pParent), "getNextChild: not a child of this node");
@@ -151,15 +139,15 @@ Offset implGetNextChildOffset(GroupNode const * _pParent, Node const * _pChild)
"getNextChild: child out of descendants range");
// offset to child's next sibling
- Offset next = 1;
+ sal_uInt16 next = 1;
if ( _pChild->isGroup())
{
next = next + _pChild->group.numDescendants;
}
- if (_pChild->node.info.parent + next > _pParent->numDescendants)
+ if (_pChild->info.parent + next > _pParent->numDescendants)
{
- OSL_ENSURE(_pChild->node.info.parent + next == _pParent->numDescendants+1, "Next child candidate should match next sibling here");
+ OSL_ENSURE(_pChild->info.parent + next == _pParent->numDescendants+1, "Next child candidate should match next sibling here");
return 0;
}
@@ -168,71 +156,67 @@ Offset implGetNextChildOffset(GroupNode const * _pParent, Node const * _pChild)
}
//-----------------------------------------------------------------------------
-Node * GroupNode::getNextChild(Node * _pChild)
+Node * GroupNode::getNextChild(Node * _pChild) const
{
- if (Offset next = implGetNextChildOffset(this, _pChild))
+ if (sal_uInt16 next = implGetNextChildOffset(this, _pChild))
return _pChild + next;
else
return NULL;
}
-//-----------------------------------------------------------------------------
-
-Node const * GroupNode::getNextChild(Node const * _pChild) const
-{
- if (Offset next = implGetNextChildOffset(this, _pChild))
- return _pChild + next;
- else
- return NULL;
+Node * GroupNode::getChild(rtl::OUString const & name) const {
+ for (Node * child = getFirstChild(); child != 0;
+ child = getNextChild(child))
+ {
+ if (child->isNamed(name)) {
+ return child;
+ }
+ }
+ return 0;
}
-//-----------------------------------------------------------------------------
-bool SetNode::isLocalizedValue() const
-{
- return info.isLocalized();
-}
//-----------------------------------------------------------------------------
// TODO: optimize this - keep a list of such structs ....
struct SetNodeTemplateData
{
- Name name;
- Name module;
+ rtl_uString * name;
+ rtl_uString * module;
};
//-----------------------------------------------------------------------------
static inline
-SetNodeTemplateData * readTemplateData(SetElementAddress _aTemplateData)
+SetNodeTemplateData * readTemplateData(sal_uInt8 * _aTemplateData)
{
return reinterpret_cast<SetNodeTemplateData *>( _aTemplateData );
}
//-----------------------------------------------------------------------------
-SetElementAddress SetNode::allocTemplateData(const rtl::OUString &rName,
+sal_uInt8 * SetNode::allocTemplateData(const rtl::OUString &rName,
const rtl::OUString &rModule)
{
SetNodeTemplateData * pData = new SetNodeTemplateData();
OSL_ENSURE(pData, "Creating template data: unexpected NULL data");
- pData->name = allocName(rName);
- pData->module = allocName(rModule);
+ pData->name = acquireString(rName);
+ pData->module = acquireString(rModule);
- return reinterpret_cast<SetElementAddress>( pData );
+ return reinterpret_cast<sal_uInt8 *>( pData );
}
-SetElementAddress SetNode::copyTemplateData(SetElementAddress _aTemplateData)
+sal_uInt8 * SetNode::copyTemplateData(sal_uInt8 * _aTemplateData)
{
SetNodeTemplateData const * pData = readTemplateData(_aTemplateData);
OSL_ENSURE(pData, "Copying template data: unexpected NULL data");
- return allocTemplateData(readName(pData->name), readName(pData->module));
+ return allocTemplateData(rtl::OUString(pData->name), rtl::OUString(pData->module));
}
//-----------------------------------------------------------------------------
-void SetNode::releaseTemplateData(SetElementAddress _aTemplateData)
+void SetNode::releaseTemplateData(sal_uInt8 * _aTemplateData)
{
if (!_aTemplateData) return;
@@ -240,8 +224,8 @@ void SetNode::releaseTemplateData(SetElementAddress _aTemplateData)
OSL_ENSURE(pData, "Freeing template data: unexpected NULL data");
- freeName(pData->name);
- freeName(pData->module);
+ rtl_uString_release(pData->name);
+ rtl_uString_release(pData->module);
delete pData;
}
@@ -254,7 +238,7 @@ rtl::OUString SetNode::getElementTemplateName() const
OSL_ENSURE(pData, "ERROR: No template data found for set");
- return readName(pData->name);
+ return rtl::OUString(pData->name);
}
//-----------------------------------------------------------------------------
@@ -264,24 +248,24 @@ rtl::OUString SetNode::getElementTemplateModule() const
OSL_ENSURE(pData, "ERROR: No template data found for set");
- return readName(pData->module);
+ return rtl::OUString(pData->module);
}
//-----------------------------------------------------------------------------
static inline
-TreeFragment const * implGetFragmentFromList(List _aListEntry)
+TreeFragment * implGetFragmentFromList(TreeFragment * _aListEntry)
{
- return reinterpret_cast<TreeFragment const *>(_aListEntry);
+ return reinterpret_cast<TreeFragment *>(_aListEntry);
}
//-----------------------------------------------------------------------------
-TreeFragment const * SetNode::getFirstElement() const
+TreeFragment * SetNode::getFirstElement() const
{
return implGetFragmentFromList(this->elements);
}
//-----------------------------------------------------------------------------
-TreeFragment const * SetNode::getNextElement(TreeFragment const * _pElement) const
+TreeFragment * SetNode::getNextElement(TreeFragment * _pElement) const
{
OSL_PRECOND(_pElement, "getNextElement: previous element must not be NULL");
OSL_PRECOND(_pElement->header.parent == (Node *)this,
@@ -289,13 +273,47 @@ TreeFragment const * SetNode::getNextElement(TreeFragment const * _pElement) co
return implGetFragmentFromList(_pElement->header.next);
}
+
+TreeFragment * SetNode::getElement(rtl::OUString const & name) const {
+ for (TreeFragment * element = getFirstElement(); element != 0;
+ element = getNextElement(element))
+ {
+ if (element->isNamed(name)) {
+ return element;
+ }
+ }
+ return 0;
+}
+
+void SetNode::addElement(TreeFragment * newElement) {
+ OSL_ASSERT(newElement != 0);
+ newElement->header.next = elements;
+ newElement->header.parent = node(this);
+ elements = newElement;
+}
+
+TreeFragment * SetNode::removeElement(rtl::OUString const & name) {
+ for (TreeFragment ** link = &elements; *link != 0;
+ link = &(*link)->header.next)
+ {
+ if ((*link)->isNamed(name)) {
+ TreeFragment * removed = *link;
+ *link = removed->header.next;
+ removed->header.next = 0;
+ removed->header.parent = 0;
+ return removed;
+ }
+ }
+ return 0;
+}
+
//-----------------------------------------------------------------------------
bool ValueNode::isNull() const
{
- Flags::Type availmask = (info.flags & Flags::defaulted) ?
- Flags::defaultAvailable :
- Flags::valueAvailable;
+ data::Flags::Type availmask = (info.flags & data::Flags::defaulted) ?
+ data::Flags::defaultAvailable :
+ data::Flags::valueAvailable;
return !(info.flags & availmask);
}
@@ -303,22 +321,22 @@ bool ValueNode::isNull() const
bool ValueNode::hasUsableDefault() const
{
- return (info.flags & Flags::defaultable) &&
- (info.flags & (Flags::defaultAvailable| Flags::nullable));
+ return (info.flags & data::Flags::defaultable) &&
+ (info.flags & (data::Flags::defaultAvailable| data::Flags::nullable));
}
//-----------------------------------------------------------------------------
-uno::Type ValueNode::getValueType() const
+com::sun::star::uno::Type ValueNode::getValueType() const
{
- AnyData::TypeCode aType = AnyData::TypeCode( info.type & Type::mask_valuetype );
+ sal_uInt8 aType = sal_uInt8( info.type & data::Type::mask_valuetype );
return getUnoType(aType);
}
//-----------------------------------------------------------------------------
-uno::Any ValueNode::getValue() const
+com::sun::star::uno::Any ValueNode::getValue() const
{
- if (info.flags & Flags::defaulted)
+ if (info.flags & data::Flags::defaulted)
return getDefaultValue();
else
@@ -326,36 +344,93 @@ uno::Any ValueNode::getValue() const
}
//-----------------------------------------------------------------------------
-uno::Any ValueNode::getUserValue() const
+com::sun::star::uno::Any ValueNode::getUserValue() const
{
- if (info.flags & Flags::valueAvailable)
+ if (info.flags & data::Flags::valueAvailable)
{
- AnyData::TypeCode aType = AnyData::TypeCode( info.type & Type::mask_valuetype );
+ sal_uInt8 aType = sal_uInt8( info.type & data::Type::mask_valuetype );
return readData(aType,this->value);
}
else
- return uno::Any();
+ return com::sun::star::uno::Any();
}
//-----------------------------------------------------------------------------
-uno::Any ValueNode::getDefaultValue() const
+com::sun::star::uno::Any ValueNode::getDefaultValue() const
{
- if (info.flags & Flags::defaultAvailable)
+ if (info.flags & data::Flags::defaultAvailable)
{
- AnyData::TypeCode aType = AnyData::TypeCode( info.type & Type::mask_valuetype );
+ sal_uInt8 aType = sal_uInt8( info.type & data::Type::mask_valuetype );
return readData(aType,this->defaultValue);
}
else
- return uno::Any();
+ return com::sun::star::uno::Any();
+}
+
+void ValueNode::setValue(com::sun::star::uno::Any const & newValue) {
+ releaseValue();
+ if (newValue.hasValue()) {
+ sal_uInt8 type = adaptType(newValue);
+ value = allocData(type, newValue);
+ info.flags |= data::Flags::valueAvailable;
+ }
+ info.flags &= ~data::Flags::defaulted;
+}
+
+void ValueNode::setToDefault() {
+ OSL_ASSERT(hasUsableDefault());
+ releaseValue();
+ info.flags |= data::Flags::defaulted;
+}
+
+void ValueNode::changeDefault(com::sun::star::uno::Any const & newDefault) {
+ sal_uInt8 type = static_cast< sal_uInt8 >(
+ info.type & data::Type::mask_valuetype);
+ if (info.flags & data::Flags::defaultAvailable) {
+ OSL_ASSERT(type != data::Type::value_any);
+ freeData(type, defaultValue);
+ defaultValue.data = 0;
+ info.flags &= ~data::Flags::defaultAvailable;
+ }
+ if (newDefault.hasValue()) {
+ type = adaptType(newDefault);
+ defaultValue = allocData(type, newDefault);
+ info.flags |= data::Flags::defaultAvailable;
+ }
+}
+
+void ValueNode::releaseValue() {
+ if ((info.flags & data::Flags::valueAvailable) != 0) {
+ sal_uInt8 type = static_cast< sal_uInt8 >(
+ info.type & data::Type::mask_valuetype);
+ OSL_ASSERT(type != data::Type::value_any);
+ freeData(type, value);
+ value.data = 0;
+ info.flags &= ~data::Flags::valueAvailable;
+ }
+}
+
+sal_uInt8 ValueNode::adaptType(com::sun::star::uno::Any const & newValue) {
+ sal_uInt8 newType = getTypeCode(newValue.getValueType());
+ OSL_ASSERT(newType != data::Type::value_any);
+ sal_uInt8 type = static_cast< sal_uInt8 >(
+ info.type & data::Type::mask_valuetype);
+ if (type == data::Type::value_any) {
+ type = static_cast< sal_uInt8 >(newType & data::Type::mask_valuetype);
+ info.type = (info.type & ~data::Type::mask_valuetype) | type;
+ }
+ OSL_ASSERT(newType == type);
+ return type;
}
+
//-----------------------------------------------------------------------------
bool Node::isNamed(rtl::OUString const & _aName) const
{
rtl_uString *pCmpData = _aName.pData;
- rtl_uString *pNodeData = node.info.name;
+ rtl_uString *pNodeData = info.name;
// Creating an OUString does rather expensive interlocking here.
if (pCmpData == pNodeData)
@@ -371,7 +446,7 @@ bool Node::isNamed(rtl::OUString const & _aName) const
rtl::OUString Node::getName() const
{
- return node.info.getName();
+ return info.getName();
}
//-----------------------------------------------------------------------------
@@ -383,39 +458,39 @@ configmgr::node::Attributes Node::getAttributes() const
}
else
{
- return node.info.getNodeInfoAttributes();
+ return info.getNodeInfoAttributes();
}
}
//-----------------------------------------------------------------------------
bool Node::isDefault() const
{
- return node.info.isDefault();
+ return info.isDefault();
}
//-----------------------------------------------------------------------------
bool Node::isFragmentRoot() const
{
- return ! node.info.parent;
+ return !info.parent;
}
#if OSL_DEBUG_LEVEL > 0
//-----------------------------------------------------------------------------
Node * Node::getParentNode()
{
- return node.info.parent ? this - node.info.parent : NULL;
+ return info.parent ? this - info.parent : NULL;
}
//-----------------------------------------------------------------------------
Node const * Node::getParentNode() const
{
- return node.info.parent ? this - node.info.parent : NULL;
+ return info.parent ? this - info.parent : NULL;
}
#endif
//-----------------------------------------------------------------------------
-static Offset getFragmentIndex(Node const * pNode)
+static sal_uInt16 getFragmentIndex(Node const * pNode)
{
- Offset result = 0;
- while (Offset step = pNode->node.info.parent)
+ sal_uInt16 result = 0;
+ while (sal_uInt16 step = pNode->info.parent)
{
result = result + step;
pNode -= step;
@@ -443,6 +518,18 @@ TreeFragment const * Node::getTreeFragment() const
return static_cast<TreeFragment const *>(pFrag);
}
+Node * Node::getSubnode(rtl::OUString const & name) {
+ if (isGroup()) {
+ return group.getChild(name);
+ } else if (isSet()) {
+ TreeFragment * element = set.getElement(name);
+ return element == 0 ? 0 : element->getRootNode();
+ } else {
+ OSL_ASSERT(false);
+ return 0;
+ }
+}
+
//-----------------------------------------------------------------------------
} // namespace sharable
//-----------------------------------------------------------------------------