summaryrefslogtreecommitdiffstats
path: root/source/python/gtdbtool
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2002-05-27 07:47:58 +0000
committerTim Potter <tpot@samba.org>2002-05-27 07:47:58 +0000
commit7d10dc5f7bd12e25ea3e64b380a029c89929156f (patch)
tree5e5346f4b27deaf3f9f5951bada48a7f5cccd601 /source/python/gtdbtool
parent8e1a15a625b72711bcfab77403e6a6b91e434756 (diff)
downloadsamba-7d10dc5f7bd12e25ea3e64b380a029c89929156f.tar.gz
samba-7d10dc5f7bd12e25ea3e64b380a029c89929156f.tar.xz
samba-7d10dc5f7bd12e25ea3e64b380a029c89929156f.zip
Use a fixed size font for displaying tdb values.
Added a (regexp, function) pair to register display functions for keys matching regular expressions. Expand the size of the value scrolling window. Added hex dump function and some regexps to display DRIVERS, SECDESC and PRINTERS keys in hex instead of ascii.
Diffstat (limited to 'source/python/gtdbtool')
-rwxr-xr-xsource/python/gtdbtool115
1 files changed, 111 insertions, 4 deletions
diff --git a/source/python/gtdbtool b/source/python/gtdbtool
index cb88792acc5..670fca99730 100755
--- a/source/python/gtdbtool
+++ b/source/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])