diff --git a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h index 7bd84b4fe7..9714c16c2e 100644 --- a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h +++ b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h @@ -46,6 +46,9 @@ public: bool SetTo(Index* index, const Value& name, bool ignoreValue = false); + inline void NodeChangeBegin(Node* node); + inline void NodeChangeEnd(Node* node); + virtual void NodeRemoved(Node* node); protected: @@ -160,6 +163,47 @@ GenericIndexIterator::SetTo(Index* index, const Value& value, } +/*! Moves the iterator temporarily off the current node. + Called when the node the iterator currently points to has been modified and + the index is about to remove it from and reinsert it into the tree. After + having done that NodeChangeEnd() must be called. +*/ +template +void +GenericIndexIterator::NodeChangeBegin(Node* node) +{ + fNextTreeNode = Policy::GetNodeTree(fIndex)->Previous(fNextTreeNode); +} + + +/*! Brackets a NodeChangeBegin() call. +*/ +template +void +GenericIndexIterator::NodeChangeEnd(Node* node) +{ + if (fNextTreeNode != NULL) { + fNextTreeNode = Policy::GetNodeTree(fIndex)->Next(fNextTreeNode); + } else { + typename NodeTree::Iterator iterator; + Policy::GetNodeTree(fIndex)->GetIterator(&iterator); + fNextTreeNode = iterator.CurrentNode(); + } + + // If the node is no longer the one we originally pointed to, re-register + // the node listener. + if (fNextTreeNode == NULL) { + fIndex->GetVolume()->RemoveNodeListener(this); + } else { + Node* newNode = _ToNode(); + if (newNode != node) { + fIndex->GetVolume()->RemoveNodeListener(this); + fIndex->GetVolume()->AddNodeListener(this, newNode); + } + } +} + + template void GenericIndexIterator::NodeRemoved(Node* node)