} else {
/* Reopen the parent key to make sure the
new subkey will be noticed. */
- tree_node_reopen_key(parent);
+ tree_node_reopen_key(regedit->registry_context,
+ parent);
}
list = tree_node_first(node);
rv = reg_key_del(node, parent->key, node->name);
if (W_ERROR_IS_OK(rv)) {
- tree_node_reopen_key(parent);
+ tree_node_reopen_key(regedit->registry_context,
+ parent);
tree_view_clear(regedit->keys);
pop = tree_node_pop(&node);
talloc_free(pop);
dialog_notice(regedit, DIA_ALERT, "Error",
"Error editing value:\n%s", msg);
} else if (sel == DIALOG_OK) {
- tree_node_reopen_key(node);
+ tree_node_reopen_key(regedit->registry_context,
+ node);
value_list_load(regedit->vl, node->key);
value_list_set_current_item_by_name(regedit->vl,
name);
dialog_notice(regedit, DIA_ALERT, "Error",
"Error creating value:\n%s", msg);
} else if (sel == DIALOG_OK) {
- tree_node_reopen_key(node);
+ tree_node_reopen_key(regedit->registry_context,
+ node);
value_list_load(regedit->vl, node->key);
value_list_set_current_item_by_name(regedit->vl,
name);
node = tree_view_get_current_node(regedit->keys);
reg_del_value(regedit, node->key,
vitem->value_name);
- tree_node_reopen_key(node);
+ tree_node_reopen_key(regedit->registry_context,
+ node);
value_list_load(regedit->vl, node->key);
}
}
return 0;
}
-WERROR tree_node_reopen_key(struct tree_node *node)
+WERROR tree_node_reopen_key(struct registry_context *ctx,
+ struct tree_node *node)
{
SMB_ASSERT(node->parent != NULL);
SMB_ASSERT(node->name != NULL);
TALLOC_FREE(node->key);
- return reg_open_key(node->parent, node->parent->key, node->name,
- &node->key);
+
+ if (tree_node_is_top_level(node)) {
+ WERROR rv;
+ struct registry_key *key;
+ rv = reg_get_predefined_key_by_name(ctx, node->name, &key);
+ if (W_ERROR_IS_OK(rv)) {
+ node->key = talloc_steal(node, key);
+ }
+ return rv;
+ }
+
+ return reg_open_key(node, node->parent->key, node->name, &node->key);
}
bool tree_node_has_children(struct tree_node *node)
WERROR tree_view_set_root(struct tree_view *view, struct tree_node *root);
WERROR tree_view_set_path(struct tree_view *view, const char **path);
WERROR tree_view_update(struct tree_view *view, struct tree_node *list);
-WERROR tree_node_reopen_key(struct tree_node *node);
+WERROR tree_node_reopen_key(struct registry_context *ctx,
+ struct tree_node *node);
bool tree_node_has_children(struct tree_node *node);
WERROR tree_node_load_children(struct tree_node *node);
void tree_node_insert_sorted(struct tree_node *list, struct tree_node *node);