diff options
-rw-r--r-- | src/tasktree.cc | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/tasktree.cc b/src/tasktree.cc index c463177..39cee98 100644 --- a/src/tasktree.cc +++ b/src/tasktree.cc @@ -173,6 +173,17 @@ TaskIdList TaskTree::remove(taskid_t id) return affectedNodes; } +static bool findNode(node_t *needle, node_t *haystack) +{ + if(needle == haystack) return true; + NodeList::iterator i = haystack->children.begin(); + while(i != haystack->children.end()) { + if(findNode(needle, *i)) return true; + i++; + } + return false; +} + TaskIdList TaskTree::move(taskid_t id, taskid_t toid) throw (std::exception) { @@ -183,6 +194,9 @@ TaskIdList TaskTree::move(taskid_t id, taskid_t toid) node_t* child = id2node.at(id); node_t* newparent = id2node.at(toid); + // Test if new parent is a child of the node itself... + if(findNode(newparent, child)) throw std::exception(); + if(!child->parent) { throw std::exception(); } |