void TreeKeyIdx::remove() { TreeNode node; bool done = false; if (currentNode.offset) { getTreeNodeFromIdxOffset(currentNode.offset, &node); if (node.parent > -1) { TreeNode parent; getTreeNodeFromIdxOffset(node.parent, &parent); if (parent.firstChild == node.offset) { parent.firstChild = node.next; saveTreeNodeOffsets(&parent); getTreeNodeFromIdxOffset(parent.offset, ¤tNode); done = true; } } if (!done) { TreeNode iterator; __s32 target = currentNode.offset; if (currentNode.parent > -1) { getTreeNodeFromIdxOffset(currentNode.parent, &iterator); getTreeNodeFromIdxOffset(iterator.firstChild, &iterator); if (iterator.offset != target) { while ((iterator.next != target) && (iterator.next > -1)) { getTreeNodeFromIdxOffset(iterator.next, &iterator); } if (iterator.next > -1) { TreeNode prev; getTreeNodeFromIdxOffset(iterator.offset, &prev); prev.next = node.next; saveTreeNodeOffsets(&prev); getTreeNodeFromIdxOffset(prev.offset, ¤tNode); } } } } positionChanged(); } }
void TreeKeyIdx::appendChild() { if (firstChild()) { append(); } else { __u32 idxOffset = idxfd->seek(0, SEEK_END); currentNode.firstChild = idxOffset; saveTreeNodeOffsets(¤tNode); __u32 parent = currentNode.offset; currentNode.clear(); currentNode.offset = idxOffset; currentNode.parent = parent; } positionChanged(); }
void TreeKeyIdx::append() { TreeNode lastSib; if (currentNode.offset) { getTreeNodeFromIdxOffset(currentNode.offset, &lastSib); while (lastSib.next > -1) { getTreeNodeFromIdxOffset(lastSib.next, &lastSib); } __u32 idxOffset = idxfd->seek(0, SEEK_END); lastSib.next = idxOffset; saveTreeNodeOffsets(&lastSib); __u32 parent = currentNode.parent; currentNode.clear(); currentNode.offset = idxOffset; currentNode.parent = parent; positionChanged(); } }
void TreeKeyIdx::saveTreeNode(TreeNode *node) { long datOffset = 0; __s32 tmp; if (idxfd > 0) { idxfd->seek(node->offset, SEEK_SET); datOffset = datfd->seek(0, SEEK_END); tmp = archtosword32(datOffset); idxfd->write(&tmp, 4); saveTreeNodeOffsets(node); datfd->write(node->name, strlen(node->name)); char null = 0; datfd->write(&null, 1); __u16 tmp2 = archtosword16(node->dsize); datfd->write(&tmp2, 2); if (node->dsize) { datfd->write(node->userData, node->dsize); } } }