215 def __init__(self, path, blobScanner=None):
216 """Parse DAT file named by path and matching aux files.
217Apply blobScanner to each blob.
218
219If blobScanner is not supplied, the entire data file gets loaded into memory
220and the list self.blobs gets populated. This temporarily requires memory
221size at least 2*(the DAT file size).
222
223If blobScanner is supplied, individual blobs are loaded, scanned, and dropped.
224"""
225 if sys.byteorder != 'little':
226 raise ValueError("this script does not work on bigendian platforms")
227 self.filepath_name = path
228 self.filetime = '0'
229 self.filesuff = None
230 self.time_least = 0 ;
231 self.time_minexp = 0 ;
232 self.blobs = []
233 try:
234 parts = path.split(".")
235 self.filetime = parts[-1]
236 self.time_minexp = int(self.filetime) - 70 ;
237 self.filesuff = parts[-2]
238 self.fileprefix = ".".join(parts[0:len(parts)-2]) ;
239
240 self.filetiming_name = ".".join([self.fileprefix, "noTIMING", self.filetime])
241 self.filetiming_always__name = ".".join([self.fileprefix, "TIMING", self.filetime])
242 self.filestype_name = ".".join([self.fileprefix, "TYPE", self.filetime])
243 self.fileoffset_name = ".".join([self.fileprefix, "OFFSET", self.filetime])
244 except:
245 raise ValueError("bad path for BlobReader: %s. expecting *.DAT.$timestamp format" % path)
246
247 self.datfile = open(self.filepath_name, "rb")
248 self.stypefile = None
249 try:
250 self.stypefile = open(self.filestype_name, "rb")
251 except:
252 pass
253 try:
254 self.timingfile = open(self.filetiming_name, "rb")
255 except:
256 self.timingfile = None
257 try:
258 self.offsetfile = open(self.fileoffset_name, "rb")
259 except:
260 self.offsetfile = None
261 self.stype = None
262 self.timing = None
263 self.offset = None
264 if self.stypefile:
265 self.stype = self.stypefile.read()
266 self.stype_fsize = os.path.getsize(self.filestype_name)
267
268 magic = str(self.stype[0:7], 'utf-8')
269 if magic != "blobtyp":
270 raise ValueError("non-type data in %s." % self.filestype_name)
271 self.stype = str(self.stype[8:], 'utf-8').strip()
272 if self.timingfile:
273 self.timing = array.array('Q')
274 self.timing_fsize = os.path.getsize(self.filetiming_name)
275 if (self.timing_fsize % 16) != 8:
276 raise ValueError("timing data in %s is not a multiple of 16 bytes + 8." % self.filetiming_name)
277 self.timing.fromfile(self.timingfile, self.timing_fsize//8)
278 magic = self.timing[0] ;
279 if magic != 0x6d6974626f6c62:
280 raise ValueError("non-timing data in %s %x." % (self.filetiming_name , magic))
281 self.timing.pop(0)
282 if self.offsetfile:
283 self.offset = array.array('Q')
284 self.offset_fsize = os.path.getsize(self.fileoffset_name)
285 if (self.offset_fsize % 8) != 0:
286 raise ValueError("offset data in %s is not a multiple of 8 bytes." % self.fileoffset_name)
287 self.offset.fromfile(self.offsetfile, self.offset_fsize//8)
288 magic = self.offset[0] ;
289 if magic != 0x66666f626f6c62:
290 raise ValueError("non-offset data in %s." % self.fileoffset_name)
291 self.offset.pop(0)
292 if blobScanner:
293 pass
294 else:
295 if not self.offset:
296 self.blobs = self.datfile.read().split(b'\x00')[1:-1] ;
297 blen = len(self.blobs)
298 while i > 0:
299 i -= 1
300 inp = self.blobs[i].decode('utf-8').rstrip()
301 if len(inp) < 2:
302 self.blobs.pop[i]
303
304
305
306
307 else:
308 for i in readline0(self.datfile):
309 inp = i.decode('utf-8').rstrip()
310 if len(inp) >= 2:
311 self.blobs.append(inp)
312 self.blobs.pop(0) ;
313
314
315
316
317