2 * Samba Unix/Linux SMB client library
4 * Copyright (C) Christopher Davis 2012
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "popt_common.h"
22 #include "lib/util/data_blob.h"
23 #include "lib/registry/registry.h"
25 #include "regedit_treeview.h"
26 #include "regedit_valuelist.h"
27 #include "regedit_dialog.h"
38 struct value_list *vl;
39 struct tree_view *keys;
43 /* load all available hives */
44 static struct tree_node *load_hives(TALLOC_CTX *mem_ctx,
45 struct registry_context *ctx)
47 const char *hives[] = {
51 "HKEY_PERFORMANCE_DATA",
53 "HKEY_CURRENT_CONFIG",
55 "HKEY_PERFORMANCE_TEXT",
56 "HKEY_PERFORMANCE_NLSTEXT",
59 struct tree_node *root, *prev, *node;
60 struct registry_key *key;
67 for (i = 0; hives[i] != NULL; ++i) {
68 rv = reg_get_predefined_key_by_name(ctx, hives[i], &key);
69 if (!W_ERROR_IS_OK(rv)) {
73 node = tree_node_new(mem_ctx, NULL, hives[i], key);
82 tree_node_append(prev, node);
90 static void print_heading(WINDOW *win, bool selected, const char *str)
93 wattron(win, A_REVERSE);
95 wattroff(win, A_REVERSE);
104 static void handle_tree_input(struct regedit *regedit, int c)
106 struct tree_node *node;
110 menu_driver(regedit->keys->menu, REQ_DOWN_ITEM);
111 node = item_userptr(current_item(regedit->keys->menu));
112 value_list_load(regedit->vl, node->key);
115 menu_driver(regedit->keys->menu, REQ_UP_ITEM);
116 node = item_userptr(current_item(regedit->keys->menu));
117 value_list_load(regedit->vl, node->key);
122 node = item_userptr(current_item(regedit->keys->menu));
123 if (node && tree_node_has_children(node)) {
124 tree_node_load_children(node);
125 tree_node_print_path(regedit->path_label,
127 tree_view_update(regedit->keys, node->child_head);
128 value_list_load(regedit->vl, node->child_head->key);
132 node = item_userptr(current_item(regedit->keys->menu));
133 if (node && node->parent) {
134 tree_node_print_path(regedit->path_label, node->parent);
135 node = tree_node_first(node->parent);
136 tree_view_update(regedit->keys, node);
137 value_list_load(regedit->vl, node->key);
145 node = item_userptr(current_item(regedit->keys->menu));
146 dia = dialog_confirm_new(regedit, "Delete Key",
147 regedit->main_window,
148 "Really delete key \"%s\"?",
150 sel = dialog_modal_loop(dia);
151 mvwprintw(regedit->main_window, 1, 0, "Sel: %d", sel);
157 tree_view_show(regedit->keys);
158 value_list_show(regedit->vl);
161 static void handle_value_input(struct regedit *regedit, int c)
163 struct value_item *vitem;
167 menu_driver(regedit->vl->menu, REQ_DOWN_ITEM);
170 menu_driver(regedit->vl->menu, REQ_UP_ITEM);
174 vitem = item_userptr(current_item(regedit->vl->menu));
176 struct tree_node *node;
177 node = item_userptr(current_item(regedit->keys->menu));
178 dialog_edit_value(regedit, node->key, vitem->type,
179 vitem, regedit->main_window);
180 value_list_load(regedit->vl, node->key);
187 if (dialog_select_type(regedit, &new_type, regedit->main_window) == DIALOG_OK) {
188 mvwprintw(regedit->main_window, 1, 0, "Item: %s (%d)", str_regtype(new_type), new_type);
194 vitem = item_userptr(current_item(regedit->vl->menu));
199 dia = dialog_confirm_new(regedit, "Delete Value",
200 regedit->main_window,
201 "Really delete value \"%s\"?",
203 sel = dialog_modal_loop(dia);
204 mvwprintw(regedit->main_window, 1, 0, "Sel: %d", sel);
209 value_list_show(regedit->vl);
212 static void handle_main_input(struct regedit *regedit, int c)
216 regedit->tree_input = !regedit->tree_input;
217 print_heading(regedit->key_label, regedit->tree_input == true,
219 print_heading(regedit->value_label, regedit->tree_input == false,
223 if (regedit->tree_input) {
224 handle_tree_input(regedit, c);
226 handle_value_input(regedit, c);
231 /* test navigating available hives */
232 static void display_test_window(TALLOC_CTX *mem_ctx,
233 struct registry_context *ctx)
235 struct regedit *regedit;
236 struct tree_node *root;
243 keypad(stdscr, TRUE);
245 regedit = talloc_zero(mem_ctx, struct regedit);
246 SMB_ASSERT(regedit != NULL);
248 regedit->main_window = newwin(25, 80, 0, 0);
249 SMB_ASSERT(regedit->main_window != NULL);
251 keypad(regedit->main_window, TRUE);
253 mvwprintw(regedit->main_window, 0, 0, "Path: ");
254 regedit->path_label = derwin(regedit->main_window, 1, 65, 0, 6);
255 wprintw(regedit->path_label, "/");
257 root = load_hives(regedit, ctx);
258 SMB_ASSERT(root != NULL);
260 regedit->key_label = derwin(regedit->main_window, 1, 10, 2, 0);
261 regedit->value_label = derwin(regedit->main_window, 1, 10, 2, 25);
263 print_heading(regedit->key_label, true, "Keys");
264 regedit->keys = tree_view_new(regedit, root, regedit->main_window,
266 SMB_ASSERT(regedit->keys != NULL);
268 print_heading(regedit->value_label, false, "Values");
269 regedit->vl = value_list_new(regedit, regedit->main_window,
271 SMB_ASSERT(regedit->vl != NULL);
273 regedit->tree_input = true;
275 tree_view_show(regedit->keys);
276 value_list_show(regedit->vl);
278 regedit->main_panel = new_panel(regedit->main_window);
279 SMB_ASSERT(regedit->main_panel != NULL);
283 while ((c = wgetch(regedit->main_window)) != 'q') {
284 handle_main_input(regedit, c);
292 int main(int argc, char **argv)
294 struct poptOption long_options[] = {
298 POPT_COMMON_CONNECTION
299 POPT_COMMON_CREDENTIALS
304 struct user_auth_info *auth_info;
306 struct registry_context *ctx;
309 talloc_enable_leak_report_full();
311 frame = talloc_stackframe();
313 setup_logging("regedit", DEBUG_DEFAULT_STDERR);
314 lp_set_cmdline("log level", "0");
316 /* process options */
317 auth_info = user_auth_info_init(frame);
318 if (auth_info == NULL) {
321 popt_common_set_auth_info(auth_info);
322 pc = poptGetContext("regedit", argc, (const char **)argv, long_options, 0);
324 while ((opt = poptGetNextOpt(pc)) != -1) {
328 if (!lp_load_global(get_dyn_CONFIGFILE())) {
329 DEBUG(0, ("ERROR loading config file...\n"));
333 /* some simple tests */
335 rv = reg_open_samba3(frame, &ctx);
336 if (!W_ERROR_IS_OK(rv)) {
342 display_test_window(frame, ctx);
344 //talloc_report_full(frame, stdout);