| 33 | return '%s : %s' % (self.name, val) |
| 34 | |
| 35 | class Key(object): |
| 36 | # Registry Key |
| 37 | def __init__(self, parent, name): |
| 38 | self.parent, self.name = parent, name |
| 39 | self.level=parent.level+1 |
| 40 | # ! ! ! opens keys in read/write mode ! ! ! |
| 41 | self.wrk=reg.OpenKey(parent.wrk, self.name, 0, reg.KEY_ALL_ACCESS) |
| 42 | self._keys = self._vals = None |
| 43 | @property |
| 44 | def keys(self): |
| 45 | # returns a dict of subkeys |
| 46 | if not self._keys: |
| 47 | self._keys={} |
| 48 | for i in xrange(reg.QueryInfoKey(self.wrk)[0]): |
| 49 | name=reg.EnumKey(self.wrk, i).lower() |
| 50 | try: |
| 51 | self._keys[name]=Key(self, name) |
| 52 | except WindowsError: pass |
| 53 | return self._keys |
| 54 | @property |
| 55 | def vals(self): |
| 56 | # returns the list of values |
| 57 | if not self._vals: |
| 58 | self._vals=[] |
| 59 | for i in xrange(reg.QueryInfoKey(self.wrk)[1]): |
| 60 | try: |
| 61 | self._vals.append(Val(self, *reg.EnumValue(self.wrk, i))) |
| 62 | except WindowsError: pass |
| 63 | return self._vals |
| 64 | def __call__(self, path): |
| 65 | # access to a key |
| 66 | path=path.lower() |
| 67 | key=self |
| 68 | for p in path.split('/'): |
| 69 | key=key.keys[p] |
| 70 | return key |
| 71 | def __str__(self): |
| 72 | return '%s%s/' % (self.parent.__str__(), self.name) |
| 73 | @property |
| 74 | def indented(self): |
| 75 | return '%s%s' % (indent*self.level, self.name) |
| 76 | def walk(self): |
| 77 | # walk thru the subkeys tree |
| 78 | for key in self.keys.itervalues(): |
| 79 | yield key |
| 80 | for k in key.walk(): |
| 81 | yield k |
| 82 | def grep(self, text, kv='both', typ=(rTyp['STR'],)): |
| 83 | # searching keys and/or values for some text |
| 84 | for k in self.walk(): |
| 85 | if kv in ('keys', 'both') and text in k.name: |
| 86 | yield k, None |
| 87 | if kv in ('vals', 'both'): |
| 88 | for v in k.vals: |
| 89 | if (v.typ in typ) and (text in v.val): |
| 90 | yield k, v |
| 91 | def grep2(self, text, kv='both', typ=(rTyp['STR'],)): |
| 92 | # a grep variant, might be more convinient in some cases |