1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
from hachoir_core.error import HachoirError
from hachoir_core.field import joinPath, MissingField
class EditorError(HachoirError):
pass
class FakeField(object):
"""
This class have API looks similar to Field API, but objects don't contain
any value: all values are _computed_ by parent methods.
Example: FakeField(editor, "abc").size calls editor._getFieldSize("abc").
"""
is_field_set = False
def __init__(self, parent, name):
self._parent = parent
self._name = name
def _getPath(self):
return joinPath(self._parent.path, self._name)
path = property(_getPath)
def _getName(self):
return self._name
name = property(_getName)
def _getAddress(self):
return self._parent._getFieldAddress(self._name)
address = property(_getAddress)
def _getSize(self):
return self._parent.input[self._name].size
size = property(_getSize)
def _getValue(self):
return self._parent.input[self._name].value
value = property(_getValue)
def createDisplay(self):
# TODO: Returns new value if field is altered
return self._parent.input[self._name].display
display = property(createDisplay)
def _getParent(self):
return self._parent
parent = property(_getParent)
def hasValue(self):
return self._parent.input[self._name].hasValue()
def __getitem__(self, key):
# TODO: Implement this function!
raise MissingField(self, key)
def _isAltered(self):
return False
is_altered = property(_isAltered)
def writeInto(self, output):
size = self.size
addr = self._parent._getFieldInputAddress(self._name)
input = self._parent.input
stream = input.stream
if size % 8:
output.copyBitsFrom(stream, addr, size, input.endian)
else:
output.copyBytesFrom(stream, addr, size//8)
|