Ignore:
Timestamp:
03/31/11 13:20:05 (13 years ago)
Author:
tim
Message:

reorganized code
added remaining methods to iterator
added test case for new methods

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/pyregfi/__init__.py

    r219 r220  
    1212import ctypes
    1313import ctypes.util
    14 from ctypes import c_char,c_char_p,c_int,c_uint16,c_uint32,c_bool,POINTER
    15 
    16 regfi = ctypes.CDLL(ctypes.util.find_library('regfi'), use_errno=True)
    17 
    18 
    19 regfi.regfi_alloc.argtypes = [c_int, REGFI_ENCODING]
    20 regfi.regfi_alloc.restype = POINTER(REGFI_FILE)
    21 
    22 regfi.regfi_alloc_cb.argtypes = [POINTER(REGFI_RAW_FILE), REGFI_ENCODING]
    23 regfi.regfi_alloc_cb.restype = POINTER(REGFI_FILE)
    24 
    25 regfi.regfi_free.argtypes = [POINTER(REGFI_FILE)]
    26 regfi.regfi_free.restype = None
    27 
    28 regfi.regfi_log_get_str.argtypes = []
    29 regfi.regfi_log_get_str.restype = c_char_p
    30 
    31 regfi.regfi_log_set_mask.argtypes = [c_uint16]
    32 regfi.regfi_log_set_mask.restype = c_bool
    33 
    34 regfi.regfi_get_rootkey.argtypes = [POINTER(REGFI_FILE)]
    35 regfi.regfi_get_rootkey.restype = POINTER(REGFI_NK)
    36 
    37 regfi.regfi_free_record.argtypes = [c_void_p]
    38 regfi.regfi_free_record.restype = None
    39 
    40 regfi.regfi_fetch_num_subkeys.argtypes = [POINTER(REGFI_NK)]
    41 regfi.regfi_fetch_num_subkeys.restype = c_uint32
    42 
    43 regfi.regfi_fetch_num_values.argtypes = [POINTER(REGFI_NK)]
    44 regfi.regfi_fetch_num_values.restype = c_uint32
    45 
    46 regfi.regfi_fetch_classname.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK)]
    47 regfi.regfi_fetch_classname.restype = POINTER(REGFI_CLASSNAME)
    48 
    49 regfi.regfi_fetch_sk.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK)]
    50 regfi.regfi_fetch_sk.restype = POINTER(REGFI_SK)
    51 
    52 regfi.regfi_fetch_data.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_VK)]
    53 regfi.regfi_fetch_data.restype = POINTER(REGFI_DATA)
    54 
    55 regfi.regfi_find_subkey.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK),
    56                                     c_char_p, POINTER(c_uint32)]
    57 regfi.regfi_find_subkey.restype = c_bool
    58 
    59 regfi.regfi_find_value.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK),
    60                                     c_char_p, POINTER(c_uint32)]
    61 regfi.regfi_find_value.restype = c_bool
    62 
    63 regfi.regfi_get_subkey.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK),
    64                                    c_uint32]
    65 regfi.regfi_get_subkey.restype = POINTER(REGFI_NK)
    66 
    67 regfi.regfi_get_value.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK),
    68                                    c_uint32]
    69 regfi.regfi_get_value.restype = POINTER(REGFI_VK)
    70 
    71 regfi.regfi_get_parentkey.argtypes = [POINTER(REGFI_FILE), POINTER(REGFI_NK)]
    72 regfi.regfi_get_parentkey.restype = POINTER(REGFI_NK)
    73 
    74 regfi.regfi_nt2unix_time.argtypes = [POINTER(REGFI_NTTIME)]
    75 regfi.regfi_nt2unix_time.restype = c_double
    76 
    77 regfi.regfi_iterator_new.argtypes = [POINTER(REGFI_FILE), REGFI_ENCODING]
    78 regfi.regfi_iterator_new.restype = POINTER(REGFI_ITERATOR)
    79 
    80 regfi.regfi_iterator_free.argtypes = [POINTER(REGFI_ITERATOR)]
    81 regfi.regfi_iterator_free.restype = None
    82 
    83 regfi.regfi_iterator_down.argtypes = [POINTER(REGFI_ITERATOR)]
    84 regfi.regfi_iterator_down.restype = c_bool
    85 
    86 regfi.regfi_iterator_up.argtypes = [POINTER(REGFI_ITERATOR)]
    87 regfi.regfi_iterator_up.restype = c_bool
    88 
    89 regfi.regfi_iterator_to_root.argtypes = [POINTER(REGFI_ITERATOR)]
    90 regfi.regfi_iterator_to_root.restype = c_bool
    91 
    92 regfi.regfi_iterator_walk_path.argtypes = [POINTER(REGFI_ITERATOR)]
    93 regfi.regfi_iterator_walk_path.restype = c_bool
    94 
    95 regfi.regfi_iterator_cur_key.argtypes = [POINTER(REGFI_ITERATOR)]
    96 regfi.regfi_iterator_cur_key.restype = POINTER(REGFI_NK)
    97 
    98 regfi.regfi_iterator_first_subkey.argtypes = [POINTER(REGFI_ITERATOR)]
    99 regfi.regfi_iterator_first_subkey.restype = c_bool
    100 
    101 regfi.regfi_iterator_cur_subkey.argtypes = [POINTER(REGFI_ITERATOR)]
    102 regfi.regfi_iterator_cur_subkey.restype = POINTER(REGFI_NK)
    103 
    104 regfi.regfi_iterator_next_subkey.argtypes = [POINTER(REGFI_ITERATOR)]
    105 regfi.regfi_iterator_next_subkey.restype = c_bool
    106 
    107 regfi.regfi_iterator_find_subkey.argtypes = [POINTER(REGFI_ITERATOR), c_char_p]
    108 regfi.regfi_iterator_find_subkey.restype = c_bool
    109 
    110 regfi.regfi_iterator_first_value.argtypes = [POINTER(REGFI_ITERATOR)]
    111 regfi.regfi_iterator_first_value.restype = c_bool
    112 
    113 regfi.regfi_iterator_cur_value.argtypes = [POINTER(REGFI_ITERATOR)]
    114 regfi.regfi_iterator_cur_value.restype = POINTER(REGFI_VK)
    115 
    116 regfi.regfi_iterator_next_value.argtypes = [POINTER(REGFI_ITERATOR)]
    117 regfi.regfi_iterator_next_value.restype = c_bool
    118 
    119 regfi.regfi_iterator_find_value.argtypes = [POINTER(REGFI_ITERATOR), c_char_p]
    120 regfi.regfi_iterator_find_value.restype = c_bool
    121 
    122 
    123 regfi.regfi_init.argtypes = []
    124 regfi.regfi_init.restype = None
    125 regfi.regfi_init()
    12614
    12715
     
    15139        ret_val.append(s.encode('utf-8', 'replace'))
    15240
    153     ret_val = (c_char_p*(len(str_list)+1))(*ret_val)
     41    ret_val = (ctypes.c_char_p*(len(str_list)+1))(*ret_val)
    15442    # Terminate the char** with a NULL pointer
    15543    ret_val[-1] = 0
     
    246134
    247135    def __getitem__(self, name):
    248         index = c_uint32()
     136        index = ctypes.c_uint32()
    249137        if isinstance(name, str):
    250138            name = name.encode('utf-8')
     
    253141            name = create_string_buffer(bytes(name))
    254142
    255         if self._find_element(self._hive.file, self._key._base, name, byref(index)):
    256             return self._constructor(self._hive,
     143        if self._find_element(self._hive.file, self._key._base,
     144                              name, byref(index)):
     145            return self._constructor(self._hive,
    257146                                     self._get_element(self._hive.file,
    258147                                                       self._key._base,
     
    275164
    276165        elem = self._get_element(self._hive.file, self._key._base,
    277                                  c_uint32(self._current))
     166                                 ctypes.c_uint32(self._current))
    278167        self._current += 1
    279168        return self._constructor(self._hive, elem)
     
    493382# information.
    494383class HiveIterator():
    495     hive = None
    496     iter = None
    497     iteration_root = None
     384    _hive = None
     385    _iter = None
     386    _iteration_root = None
    498387
    499388    def __init__(self, hive):
    500         self.iter = regfi.regfi_iterator_new(hive.file, REGFI_ENCODING_UTF8)
    501         if self.iter == None:
     389        self._iter = regfi.regfi_iterator_new(hive.file, REGFI_ENCODING_UTF8)
     390        if self._iter == None:
    502391            raise Exception("Could not create iterator.  Current log:\n"
    503392                            + GetLogMessages())
     
    508397
    509398    def __del__(self):   
    510         regfi.regfi_iterator_free(self.iter)
     399        regfi.regfi_iterator_free(self._iter)
    511400
    512401    def __iter__(self):
    513         self.iteration_root = None
     402        self._iteration_root = None
    514403        return self
    515404
    516405    def __next__(self):
    517         if self.iteration_root == None:
    518             self.iteration_root = self.current_key()
    519         elif not regfi.regfi_iterator_down(self.iter):
    520             up_ret = regfi.regfi_iterator_up(self.iter)
     406        if self._iteration_root == None:
     407            self._iteration_root = self.current_key()
     408        elif not regfi.regfi_iterator_down(self._iter):
     409            up_ret = regfi.regfi_iterator_up(self._iter)
    521410            while (up_ret and
    522                    not regfi.regfi_iterator_next_subkey(self.iter)):
    523                 if self.iteration_root == self.current_key():
    524                     self.iteration_root = None
     411                   not regfi.regfi_iterator_next_subkey(self._iter)):
     412                if self._iteration_root == self.current_key():
     413                    self._iteration_root = None
    525414                    raise StopIteration('')
    526                 up_ret = regfi.regfi_iterator_up(self.iter)
     415                up_ret = regfi.regfi_iterator_up(self._iter)
    527416
    528417            if not up_ret:
     
    530419           
    531420            # XXX: Use non-generic exception
    532             if not regfi.regfi_iterator_down(self.iter):
     421            if not regfi.regfi_iterator_down(self._iter):
    533422                raise Exception('Error traversing iterator downward.'+
    534423                                ' Current log:\n'+ GetLogMessages())
    535424
    536         regfi.regfi_iterator_first_subkey(self.iter)
     425        regfi.regfi_iterator_first_subkey(self._iter)
    537426        return self.current_key()
    538427
     
    540429    next = __next__
    541430
    542     def down(self):
    543         pass
     431    def down(self, subkey_name=None):
     432        if subkey_name == None:
     433            return regfi.regfi_iterator_down(self._iter)
     434        else:
     435            if name != None:
     436                name = name.encode('utf-8')
     437            return (regfi.regfi_iterator_find_subkey(self._iter, name)
     438                    and regfi.regfi_iterator_down(self._iter))
    544439
    545440    def up(self):
    546         pass
     441        return regfi.regfi_iterator_up(self._iter)
     442
     443    def first_subkey(self):
     444        if regfi.regfi_iterator_first_subkey(self._iter):
     445            return self.current_subkey()
     446        return None
     447
     448    def first_value(self):
     449        if regfi.regfi_iterator_first_value(self._iter):
     450            return self.current_value()
     451        return None
     452
     453    def next_subkey(self):
     454        if regfi.regfi_iterator_next_subkey(self._iter):
     455            return self.current_subkey()
     456        return None
     457
     458    def next_value(self):
     459        if regfi.regfi_iterator_next_value(self._iter):
     460            return self.current_value()
     461        return None
     462
     463    def find_subkey(self, name):
     464        if name != None:
     465            name = name.encode('utf-8')
     466        if regfi.regfi_iterator_find_subkey(self._iter, name):
     467            return self.current_subkey()
     468        return None
     469
     470    def find_value(self, name):
     471        if name != None:
     472            name = name.encode('utf-8')
     473        if regfi.regfi_iterator_find_value(self._iter, name):
     474            return self.current_value()
     475        return None
     476
     477    def current_subkey(self):
     478        return Key(self._hive, regfi.regfi_iterator_cur_subkey(self._iter))
     479
     480    def current_value(self):
     481        return Value(self._hive, regfi.regfi_iterator_cur_value(self._iter))
     482
     483    def current_key(self):
     484        return Key(self._hive, regfi.regfi_iterator_cur_key(self._iter))
    547485
    548486    def descend(self, path):
     
    550488
    551489        # XXX: Use non-generic exception
    552         if not regfi.regfi_iterator_walk_path(self.iter, cpath):
     490        if not regfi.regfi_iterator_walk_path(self._iter, cpath):
    553491            raise Exception('Could not locate path.\n'+GetLogMessages())
    554 
    555     def current_key(self):
    556         return Key(self._hive, regfi.regfi_iterator_cur_key(self.iter))
    557 
    558     #XXX Add subkey/value search accessor functions (?)
Note: See TracChangeset for help on using the changeset viewer.