Parse-Win32Registry
view release on metacpan or search on metacpan
bin/gtkregview.pl view on Meta::CPAN
### WINDOW
my $window = Gtk2::Window->new;
$window->set_default_size($window_width, $window_height);
$window->set_position('center');
$window->signal_connect(destroy => sub { Gtk2->main_quit });
$window->add($main_vbox);
$window->add_accel_group($accel_group);
$window->set_title($script_name);
$window->show_all;
### GLOBALS
my $search_keys = TRUE;
my $search_values = TRUE;
my $search_selected = 0;
my $find_param = '';
my $find_iter;
my $last_dir;
my $filename = shift;
if (defined $filename && -r $filename) {
$filename = File::Spec->rel2abs($filename);
load_file($filename);
}
Gtk2->main;
###############################################################################
sub key_selected {
my ($model, $iter) = $tree_selection->get_selected;
if (!defined $model || !defined $iter) {
return;
}
my $key = $model->get($iter, 3);
# Fill list with the values of this key
$list_store->clear;
my @values = $key->get_list_of_values;
foreach my $value (@values) {
my $name = $value->get_name;
$name = '(Default)' if $name eq '';
$name =~ s/\0/[NUL]/g;
my $type = $value->get_type_as_string;
my $data = $value->get_data_as_string;
$data =~ s/\0/[NUL]/g;
# Abbreviate very long data to avoid a performance hit
# from loading large strings into the model
$data = substr($data, 0, 500);
my $iter = $list_store->append;
$list_store->set($iter,
0, $name,
1, $type,
2, $data,
3, $value);
}
my $clipboard = Gtk2::Clipboard->get(Gtk2::Gdk->SELECTION_PRIMARY);
$clipboard->set_text($key->get_path);
# Display key information:
my $str = '';
my $security = $key->get_security;
if (defined $security) {
my $sd = $security->get_security_descriptor;
$str .= $sd->as_stanza;
}
my $text_buffer = $text_view->get_buffer;
$text_buffer->set_text($str);
$statusbar->pop(0);
my $key_path = $key->get_path;
$key_path =~ s/\0/[NUL]/g;
$statusbar->push(0, $key_path);
}
sub value_selected {
my ($model, $iter) = $list_selection->get_selected;
if (!defined $model || !defined $iter) {
return;
}
my $value = $model->get($iter, 3);
my $name = $value->get_name;
$name = '(Default)' if $name eq '';
my $type = $value->get_type_as_string;
my $clipboard = Gtk2::Clipboard->get(Gtk2::Gdk->SELECTION_PRIMARY);
$clipboard->set_text($name);
# Display value information:
my $str = hexdump($value->get_raw_data);
my $text_buffer = $text_view->get_buffer;
$text_buffer->set_text($str);
}
sub add_root {
my ($key, $model, undef) = @_;
my $iter = $model->append(undef);
my $name = $key->get_name;
$name =~ s/\0/[NUL]/g;
my $timestamp = defined($key->get_timestamp)
? $key->get_timestamp_as_string
: '';
my $class_name = defined($key->get_class_name)
? $key->get_class_name
: '';
$class_name =~ s/\0/[NUL]/g;
$model->set($iter,
0, $name,
1, $timestamp,
2, $class_name,
3, $key,
);
my $dummy = $model->append($iter);
}
sub add_children {
my ($key, $model, $iter) = @_;
# my @subkeys = defined $iter ? $key->get_list_of_subkeys : ($key);
my @subkeys = $key->get_list_of_subkeys;
foreach my $subkey (@subkeys) {
my $child_iter = $model->append($iter);
my $name = $subkey->get_name;
$name =~ s/\0/[NUL]/g;
my $timestamp = defined($subkey->get_timestamp)
? $subkey->get_timestamp_as_string
: '';
my $class_name = defined($subkey->get_class_name)
? $subkey->get_class_name
: '';
$class_name =~ s/\0/[NUL]/g;
$model->set($child_iter,
0, $name,
1, $timestamp,
2, $class_name,
3, $subkey,
);
my $dummy = $model->append($child_iter); ### load gradually
#add_children($subkey, $model, $child_iter); ### load everything
}
}
sub expand_row {
my ($view, $iter, $path) = @_;
my $model = $view->get_model;
my $key = $model->get($iter, 3);
bin/gtkregview.pl view on Meta::CPAN
if ($response eq 'ok') {
$filename = $file_chooser->get_filename;
}
$last_dir = $file_chooser->get_current_folder;
$file_chooser->destroy;
return $filename;
}
sub open_file {
my $filename = choose_file('Select Registry File', 'open');
if ($filename) {
load_file($filename);
}
}
sub close_file {
$tree_store->clear;
$list_store->clear;
$text_buffer->set_text('');
$find_param = '';
$find_iter = undef;
$statusbar->pop(0);
}
sub quit {
$window->destroy;
}
sub about {
Gtk2->show_about_dialog(undef,
'program-name' => $script_name,
'version' => $Parse::Win32Registry::VERSION,
'copyright' => 'Copyright (c) 2008-2012 James Macfarlane',
'comments' => 'GTK2 Registry Viewer for the Parse::Win32Registry module',
);
}
sub show_message {
my $type = shift;
my $message = shift;
my $dialog = Gtk2::MessageDialog->new(
$window,
'destroy-with-parent',
$type,
'ok',
$message,
);
$dialog->set_title(ucfirst $type);
$dialog->run;
$dialog->destroy;
}
sub copy_key_path {
my $tree_iter = $tree_selection->get_selected;
my $clip = '';
if (defined $tree_iter) {
my $key = $tree_store->get($tree_iter, 3);
$clip = $key->get_path;
}
my $clipboard = Gtk2::Clipboard->get(Gtk2::Gdk->SELECTION_CLIPBOARD);
$clipboard->set_text($clip);
}
sub go_to_value {
my $value_name = shift;
my $iter = $list_store->get_iter_first;
while (defined $iter) {
my $name = $list_store->get($iter, 0);
my $value = $list_store->get($iter, 3);
if ($value_name eq $value->get_name) {
my $tree_path = $list_store->get_path($iter);
$list_view->expand_to_path($tree_path);
$list_view->scroll_to_cell($tree_path);
$list_view->set_cursor($tree_path);
$window->set_focus($list_view);
return;
}
$iter = $list_store->iter_next($iter);
}
}
sub find_matching_child_iter {
my ($iter, $subkey_name) = @_;
my $child_iter = $tree_store->iter_nth_child($iter, 0);
if (!defined $child_iter) {
# iter has already been expanded and has no children
return;
}
# Check iter's children are real
if (!defined $tree_store->get($child_iter, 0)) {
my $key = $tree_store->get($iter, 3);
add_children($key, $tree_store, $iter);
$tree_store->remove($child_iter);
# (Need to refetch the first child iter after removing it.)
$child_iter = $tree_store->iter_nth_child($iter, 0);
}
while (defined $child_iter) {
my $child_key = $tree_store->get($child_iter, 3);
# $tree_store->get($child_iter, 0) contains the displayed name,
# $child_key->get_name is the actual name
if ($child_key->get_name eq $subkey_name) {
return $child_iter; # match found
}
$child_iter = $tree_store->iter_next($child_iter);
}
return; # no match found
}
sub go_to_subkey {
my $subkey_path = shift;
my @path_components = index($subkey_path, "\\") == -1
? ($subkey_path)
: split(/\\/, $subkey_path, -1);
( run in 0.381 second using v1.01-cache-2.11-cpan-81fc1098f69 )