diff options
author | Lars Langhans <lla@openoffice.org> | 2001-05-04 08:50:14 +0000 |
---|---|---|
committer | Lars Langhans <lla@openoffice.org> | 2001-05-04 08:50:14 +0000 |
commit | b19d2cfbdddfd4f264cbdfaeaf2f629dc1230bb2 (patch) | |
tree | 14610837244976e358d66bbab119afdf4beff44c /configmgr | |
parent | ca8b9e43d689938f9df624d5899c50268dd4f74f (diff) |
Correct handling of Subtrees in AddNodes at merging
Diffstat (limited to 'configmgr')
-rw-r--r-- | configmgr/source/misc/mergechange.cxx | 83 |
1 files changed, 32 insertions, 51 deletions
diff --git a/configmgr/source/misc/mergechange.cxx b/configmgr/source/misc/mergechange.cxx index b63f1cedad9b..4fd89ef815a2 100644 --- a/configmgr/source/misc/mergechange.cxx +++ b/configmgr/source/misc/mergechange.cxx @@ -2,9 +2,9 @@ * * $RCSfile: mergechange.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: jb $ $Date: 2001-04-11 05:58:48 $ + * last change: $Author: lla $ $Date: 2001-05-04 09:50:14 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -101,13 +101,14 @@ namespace configmgr rtl::OUString ONameCreator::createName(const rtl::OUString &aPlusName) { // create a name + static rtl::OUString aNameDelimiter = OUString::createFromAscii("/"); OUString aName; for (vector<OUString>::const_iterator it = m_aNameList.begin(); it != m_aNameList.end(); it++) { aName += *it; - aName += OUString::createFromAscii("/"); + aName += aNameDelimiter; } if (aPlusName.getLength() == 0) { @@ -117,6 +118,10 @@ namespace configmgr { aName += aPlusName; } + if (aName[0] == sal_Unicode('/')) + { + aName = aName.copy(1); + } return aName; } @@ -538,6 +543,10 @@ namespace configmgr break; } } +// ----------------------------------------------------------------------------- + // in localsession.cxx + void apply(TreeChangeList & _aTreeChangeList, ISubtree& _aSubtree); +// ----------------------------------------------------------------------------- void OMergeTreeChangeList::handle(SubtreeChange const& _rSubtree) { @@ -550,34 +559,13 @@ namespace configmgr rtl::OUString aSearchName = createName(_rSubtree.getNodeName()); OMergeSearchChange a(aSearchName); Change *pChange = a.searchForChange(m_aTreeChangeList.root); - /* - if (pChange) - { - // Value found, merge content - OMergeSubtreeChange a(_rSubtree); - a.handleChange(*pChange); - } - else - { - // Value not found, create a new SubtreeChange - auto_ptr<SubtreeChange> pNewChange(new SubtreeChange(_rSubtree, SubtreeChange::NoChildCopy())); - // add the new SubtreeChange in m_aTreeChangeList - m_pCurrentParent->addChange(auto_ptr<Change>(pNewChange.release())); - } - */ - - // const sal_Char* pType = pChange ? pChange->getType() : NULL; + + // const sal_Char* pType = pChange ? pChange->getType() : NULL; SubtreeChange* pSubtreeChange = NULL; if (pChange == NULL || pChange->ISA(SubtreeChange)) { - // hard cast(!) to SubtreeChange because we are a SubtreeChange - pSubtreeChange = SAL_STATIC_CAST(SubtreeChange*, pChange); - if (pSubtreeChange) - { - // Value found, nothing to be done, because we are a SubtreeChange - // we only must go downstairs - } - else + // need to create a new Subtreechange + if (!pChange) { // create a new SubtreeChange auto_ptr<SubtreeChange> pNewChange(new SubtreeChange(_rSubtree, SubtreeChange::NoChildCopy())); @@ -585,8 +573,10 @@ namespace configmgr m_pCurrentParent->addChange(auto_ptr<Change>(pNewChange.release())); // check list and get this new SubtreeChange pChange = a.searchForChange(m_aTreeChangeList.root); - pSubtreeChange = SAL_STATIC_CAST(SubtreeChange*, pChange); } + // hard cast(!) to SubtreeChange because we are a SubtreeChange + pSubtreeChange = SAL_STATIC_CAST(SubtreeChange*, pChange); + // save this SubtreeChange so we allways have the last Subtree pushTree(pSubtreeChange); // remember the SubtreeChange Pointer pushName(_rSubtree.getNodeName()); // pathstack @@ -596,45 +586,36 @@ namespace configmgr } else if (pChange->ISA(AddNode)) { + // in this AddNode should be a subtree, NOT a subtreechange + AddNode* pAddNode = SAL_STATIC_CAST(AddNode*, pChange); INode* pNode = pAddNode->getAddedNode(); ISubtree* pSubtree = pNode ? pNode->asISubtree() : 0; - - OSL_ENSURE(pSubtree, "BLA"); if (pSubtree) { - OSL_ENSURE(false, "DANGER, THIS CODE IS WRONG!"); - // because, the important Node is the _rSubtree, which will not insert anywhere - - // Merge _rSubtree into pSubtree using a TreeUpdate object - TreeUpdate aTreeUpdate(pSubtree); - TreeChangeList aMergeChangeList(m_aTreeChangeList, SubtreeChange::NoChildCopy()); - OMergeTreeAction aChangeHandler(aMergeChangeList.root, pSubtree); - m_aTreeChangeList.root.forEachChange(aChangeHandler); - // now check the real modifications - OChangeActionCounter aChangeCounter; - aChangeCounter.handle(aMergeChangeList.root); - CFG_TRACE_INFO("cache manager: counted changes from notification : additions: %i , removes: %i, value changes: %i", aChangeCounter.nAdds, aChangeCounter.nRemoves, aChangeCounter.nValues); - if (aChangeCounter.hasChanges()) - { - // aTree.updateTree(aMergeChangeList); - aMergeChangeList.root.forEachChange(aTreeUpdate); - } + // pSubtree = pSubtree + _rSubtree; + + // Now apply _rSubtree to the subtree + TreeChangeList aChangeList(m_aTreeChangeList.m_xOptions, aSearchName, _rSubtree); // expensive! + apply(aChangeList, *pSubtree); + + // This isn't correct today because _rSubtree is const and this construct require that _rSubtree isn't const + // TreeUpdate aTreeUpdate(pSubtree); + // _rSubtree.applyToChildren(aTreeUpdate); } else { + OSL_ENSURE(false, "OMergeTreeChangeList: There is a wrong subtree type node found."); /* wrong type of node found: bse ASSERTEN/WERFEN */; } - } else { + OSL_ENSURE(false, "OMergeTreeChangeList: There is a wrong type node found."); /* wrong type of node found: bse ASSERTEN/WERFEN */; } } - - // ----------------------------------------------------------------------------- // ------- Helper for Path stack ------- |