def parse_blocks_v0(self, data, obj_id): '''binray format''' blocks = [] fmt = '!iq' mode, size = struct.unpack_from(fmt, data, offset=0) if mode != SEAF_METADATA_TYPE_FILE: raise ObjectFormatError('corrupt file object ' + obj_id) off = struct.calcsize(fmt) while True: fmt = "!20s" bid, = struct.unpack_from(fmt, data, offset = off) hexs = [] for d in bid: x = binascii.b2a_hex(d) hexs.append(x) blk_id = ''.join(hexs) blocks.append(blk_id) off += struct.calcsize(fmt) if off > len(data) - 20: break return blocks, size
def parse_dirents_v0(self, data, dir_id): '''binary format''' mode, = struct.unpack_from("!i", data, offset = 0) if mode != SEAF_METADATA_TYPE_DIR: raise ObjectFormatError('corrupt dir object ' + dir_id) dirents = {} off = 4 while True: fmt = "!i40si" mode, eid, name_len = struct.unpack_from(fmt, data, offset=off) off += struct.calcsize(fmt) fmt = "!%ds" % name_len name, = struct.unpack_from(fmt, data, offset = off) off += struct.calcsize(fmt) if stat.S_ISREG(mode): dirents[name] = SeafDirent.fromV0(name, SeafDirent.FILE, eid) elif stat.S_ISDIR(mode): dirents[name] = SeafDirent.fromV0(name, SeafDirent.DIR, eid) else: logger.warning('Error: unknown object mode %s', mode) if off > len(data) - 48: break return dirents