1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#############################################################
1919
20+ from __future__ import annotations
21+ from typing import TYPE_CHECKING
2022from ubireader .debug import error , log , verbose_log
2123from ubireader .ubi .block import sort
2224from ubireader .ubi .defines import UBI_VID_STATIC
2325
26+ if TYPE_CHECKING :
27+ from typing import Self # In TYPE_CHECKING block because it's only available after python 3.11
28+ from collections .abc import Iterator , Mapping
29+ from ubireader .ubi import ubi as Ubi
30+ from ubireader .ubi .block import description as Block
31+
2432class ubi_file (object ):
2533 """UBI image file object
2634
@@ -50,7 +58,7 @@ class ubi_file(object):
5058 extract blocks, etc.
5159 """
5260
53- def __init__ (self , path , block_size , start_offset = 0 , end_offset = None ):
61+ def __init__ (self , path : str , block_size : int , start_offset : int = 0 , end_offset : int | None = None ) -> None :
5462 self .__name__ = 'UBI_File'
5563 self .is_valid = False
5664 try :
@@ -89,54 +97,54 @@ def __init__(self, path, block_size, start_offset=0, end_offset=None):
8997 self ._last_read_addr = self ._fhandle .tell ()
9098 self .is_valid = True
9199
92- def __enter__ (self ):
100+ def __enter__ (self ) -> Self :
93101 return self
94102
95- def __exit__ (self , exc_type , exc_value , traceback ):
103+ def __exit__ (self , exc_type , exc_value , traceback ) -> None :
96104 self .close ()
97105
98- def _set_start (self , i ) :
106+ def _set_start (self , i : int ) -> None :
99107 self ._start_offset = i
100- def _get_start (self ):
108+ def _get_start (self ) -> int :
101109 return self ._start_offset
102110 start_offset = property (_get_start , _set_start )
103111
104112
105- def _get_end (self ):
113+ def _get_end (self ) -> int :
106114 return self ._end_offset
107115 end_offset = property (_get_end )
108116
109117
110- def _get_block_size (self ):
118+ def _get_block_size (self ) -> int :
111119 return self ._block_size
112120 block_size = property (_get_block_size )
113121
114- def close (self ):
122+ def close (self ) -> None :
115123 self ._fhandle .close ()
116124
117- def seek (self , offset ) :
125+ def seek (self , offset : int ) -> None :
118126 self ._fhandle .seek (offset )
119127
120128
121- def read (self , size ) :
129+ def read (self , size : int ) -> bytes :
122130 self ._last_read_addr = self .tell ()
123131 verbose_log (self , 'read loc: %s, size: %s' % (self ._last_read_addr , size ))
124132 return self ._fhandle .read (size )
125133
126134
127- def tell (self ):
135+ def tell (self ) -> int :
128136 return self ._fhandle .tell ()
129137
130138
131- def last_read_addr (self ):
139+ def last_read_addr (self ) -> int :
132140 return self ._last_read_addr
133141
134142
135- def reset (self ):
143+ def reset (self ) -> None :
136144 self ._fhandle .seek (self .start_offset )
137145
138146
139- def reader (self ):
147+ def reader (self ) -> Iterator [ bytes ] :
140148 self .reset ()
141149 while True :
142150 cur_loc = self ._fhandle .tell ()
@@ -154,7 +162,7 @@ def reader(self):
154162 yield buf
155163
156164
157- def read_block (self , block ) :
165+ def read_block (self , block : Block ) -> bytes :
158166 """Read complete PEB data from file.
159167
160168 Argument:
@@ -164,7 +172,7 @@ def read_block(self, block):
164172 return self ._fhandle .read (block .size )
165173
166174
167- def read_block_data (self , block ) :
175+ def read_block_data (self , block : Block ) -> bytes :
168176 """Read LEB data from file
169177
170178 Argument:
@@ -180,7 +188,7 @@ def read_block_data(self, block):
180188
181189
182190class leb_virtual_file ():
183- def __init__ (self , ubi , block_list ) :
191+ def __init__ (self , ubi : Ubi , block_list : Mapping [ int , Block ]) -> None :
184192 self .__name__ = 'leb_virtual_file'
185193 self .is_valid = False
186194 self ._ubi = ubi
@@ -196,7 +204,7 @@ def __init__(self, ubi, block_list):
196204 self .is_valid = True
197205
198206
199- def read (self , size ) :
207+ def read (self , size : int ) -> bytes :
200208 buf = ''
201209 leb = int (self .tell () / self ._ubi .leb_size )
202210 offset = self .tell () % self ._ubi .leb_size
@@ -227,24 +235,24 @@ def read(self, size):
227235 error (self , 'Fatal' , 'read loc: %s, size: %s, LEB: %s, offset: %s, error: %s' % (self ._last_read_addr , size , leb , offset , e ))
228236
229237
230- def reset (self ):
238+ def reset (self ) -> None :
231239 self .seek (0 )
232240
233241
234- def seek (self , offset ) :
242+ def seek (self , offset : int ) -> None :
235243 self ._seek = offset
236244
237245
238- def tell (self ):
246+ def tell (self ) -> int :
239247 return self ._seek
240248
241249
242- def last_read_addr (self ):
250+ def last_read_addr (self ) -> int :
243251 """Start address of last physical file read"""
244252 return self ._last_read_addr
245253
246254
247- def reader (self ):
255+ def reader (self ) -> Iterator [ bytes ] :
248256 last_leb = 0
249257 for block in self ._blocks :
250258 while 0 != (self ._ubi .blocks [block ].leb_num - last_leb ):
0 commit comments