import os from gi.repository import Gtk from pychrysalide.analysis import LoadedBinary from pychrysalide.gui import core from pychrysalide.gui import PanelItem from .converters import * class ConvPanel(PanelItem): def __init__(self): """Initialize the GUI panel.""" directory = os.path.dirname(os.path.realpath(__file__)) self._builder = Gtk.Builder() self._builder.add_from_file(os.path.join(directory, 'panel.ui')) params = { 'name' : 'Converter', 'widget' : self._builder.get_object('content'), 'personality' : PanelItem.PIP_SINGLETON, 'lname' : 'Data live converter', 'dock' : True, 'path' : 'MES' } super(ConvPanel, self).__init__(**params) self._conversions = { 'int8': lambda c, a, o: data_to_number(c, a, o, 'b'), 'uint8': lambda c, a, o: data_to_number(c, a, o, 'B'), 'int16': lambda c, a, o: data_to_number(c, a, o, 'h'), 'uint16': lambda c, a, o: data_to_number(c, a, o, 'H'), 'int32': lambda c, a, o: data_to_number(c, a, o, 'l'), 'uint32': lambda c, a, o: data_to_number(c, a, o, 'L'), 'int64': lambda c, a, o: data_to_number(c, a, o, 'q'), 'uint64': lambda c, a, o: data_to_number(c, a, o, 'Q'), 'half_float': lambda c, a, o: data_to_number(c, a, o, 'e'), 'float': lambda c, a, o: data_to_number(c, a, o, 'f'), 'double': lambda c, a, o: data_to_number(c, a, o, 'd'), 'time': lambda c, a, o: data_to_time(c, a, o, 'L'), 'time64': lambda c, a, o: data_to_time(c, a, o, 'Q'), 'filetime': data_to_filetime, 'dostime': data_to_dos_time, 'dosdate': data_to_dos_date, 'char': data_to_char, 'ansi': data_to_ansi, 'utf8': data_to_utf8, 'utf16': data_to_utf16, } self._order = '@' def _track_cursor(self, source, cursor): """Track moves from the current cursor.""" loaded = core.get_current_content() assert(loaded) for kind, func in self._conversions.items(): label = self._builder.get_object('%s_value' % kind) try: addr = cursor.retrieve() label.set_text(func(loaded.content, addr, self._order)) except Exception as e: label.set_text('-')