示例#1
0
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, &currentNode);
				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, &currentNode);
					}
				}
			}
		}
		positionChanged();
	}
}
示例#2
0
void TreeKeyIdx::appendChild() {
	if (firstChild()) {
		append();
	}
	else {
		__u32 idxOffset = idxfd->seek(0, SEEK_END);
		currentNode.firstChild = idxOffset;
		saveTreeNodeOffsets(&currentNode);
		__u32 parent = currentNode.offset;
		currentNode.clear();
		currentNode.offset = idxOffset;
		currentNode.parent = parent;
	}
	positionChanged();
}
示例#3
0
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();
	}
}
示例#4
0
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);
		}
	}
}