diff options
Diffstat (limited to 'source3/python')
-rwxr-xr-x | source3/python/gtdbtool | 115 |
1 files changed, 111 insertions, 4 deletions
diff --git a/source3/python/gtdbtool b/source3/python/gtdbtool index cb88792acc..670fca9973 100755 --- a/source3/python/gtdbtool +++ b/source3/python/gtdbtool @@ -20,6 +20,8 @@ class gtdbtool: def __init__(self, dict): self.dict = dict + self.value_display_fns = [] + self.filter_regex = "" # Create and configure user interface widgets. A string argument is # used to set the window title. @@ -70,7 +72,7 @@ class gtdbtool: scrolled_win = GtkScrolledWindow() scrolled_win.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) hpaned.add2(scrolled_win) - scrolled_win.set_usize(350,400) + scrolled_win.set_usize(500,400) scrolled_win.show() self.text = GtkText() @@ -83,7 +85,7 @@ class gtdbtool: self.menu = GtkMenu() self.menu.show() - self.filter_regex = "" + self.font = load_font("fixed") self.update_keylist() @@ -107,14 +109,30 @@ class gtdbtool: def set_value_text(self, text): self.text.delete_text(0, self.text.get_length()) - self.text.insert_defaults(text) + + # The text widget has trouble inserting text containing NULL + # characters. + + text = string.replace(text, "\x00", ".") + + self.text.insert(self.font, None, None, text) # This function is called when a key is selected in the left hand side # of the user interface. def key_selected(self, list, list_item): key = list_item.children()[0].get() - self.set_value_text(t[list_item.get_data("raw_key")]) + + # Look for a match in the value display function list + + text = t[list_item.get_data("raw_key")] + + for entry in self.value_display_fns: + if re.match(entry[0], key): + text = entry[1](text) + break + + self.set_value_text(text) # Refresh the key list by removing all items and re-inserting them. # Items are only inserted if they pass through the filter regexp. @@ -143,8 +161,90 @@ class gtdbtool: def set_display_key_fn(self, fn): self.display_key = fn + # Register a value display function for a key. The first argument is a + # regex that matches key values, and the second argument is a function + # to call to convert the raw value data to a string to display in the + # right hand side of the UI. + + def register_display_value_fn(self, key_regexp, fn): + self.value_display_fns.append((key_regexp, fn)) + + def display_value_hex(self, value): + return "foo" + +def convert_to_hex(data): + """Return a hex dump of a string as a string. + + The output produced is in the standard 16 characters per line hex + + ascii format: + + 00000000: 40 00 00 00 00 00 00 00 40 00 00 00 01 00 04 80 @....... @....... + 00000010: 01 01 00 00 00 00 00 01 00 00 00 00 ........ .... + """ + + pos = 0 # Position in data + line = 0 # Line of data + + hex = "" # Hex display + ascii = "" # ASCII display + + result = "" + + while pos < len(data): + + # Start with header + + if pos % 16 == 0: + hex = "%08x: " % (line * 16) + ascii = "" + + # Add character + + hex = hex + "%02x " % (ord(data[pos])) + + if ord(data[pos]) < 32 or ord(data[pos]) > 176: + ascii = ascii + '.' + else: + ascii = ascii + data[pos] + + pos = pos + 1 + + # Add separator if half way + + if pos % 16 == 8: + hex = hex + " " + ascii = ascii + " " + + # End of line + + if pos % 16 == 0: + result = result + "%s %s\n" % (hex, ascii) + line = line + 1 + + # Leftover bits + + if pos % 16 != 0: + + # Pad hex string + + for i in range(0, (16 - (pos % 16))): + hex = hex + " " + + # Half way separator + + if (pos % 16) < 8: + hex = hex + " " + + result = result + "%s %s\n" % (hex, ascii) + + return result + # Open handle on tdb +if len(sys.argv) != 2: + print "Usage: gdbtool <tdbfile>" + sys.exit(1) + t = tdb.open(sys.argv[1]) # Create user interface @@ -159,6 +259,13 @@ def display_key_x00(key): w.set_display_key_fn(display_key_x00) +def display_value_hex(value): + return value; + +w.register_display_value_fn("DRIVERS/", convert_to_hex) +w.register_display_value_fn("SECDESC/", convert_to_hex) +w.register_display_value_fn("PRINTERS/", convert_to_hex) + # Show user interface w.build_ui("gtdbtool: %s" % sys.argv[1]) |