#!/usr/bin/python3 # -*- coding: utf-8 -*- # # module CFileContainer # # Copyright (C) 2019 AleaJactaEst # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import os from tools import CFileList class CFileContainer(): def __init__(self): self.log = logging.getLogger('myLogger') self.list = [] def addSearchPath(self, path): if not path: return self.log.debug("read path:" + str(path)) onlyfiles = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))] self.log.debug("read files:" + ','.join(onlyfiles)) for filename in onlyfiles: extension = os.path.splitext(filename)[1] if extension == '.bnp': # Container for multi file fullpath = os.path.join(path, filename) size = os.path.getsize(fullpath) data = CFileList.CFileList(filename, fullpath) with open(fullpath, 'rb') as fp: fp.seek(size-4) nOffsetFromBeginning = int.from_bytes(fp.read(4), byteorder='little', signed=False) self.log.debug("[%s] nOffsetFromBeginning:%u" % (filename, nOffsetFromBeginning)) fp.seek(nOffsetFromBeginning) nNbFile = int.from_bytes(fp.read(4), byteorder='little', signed=False) self.log.debug("[%s] nNbFile:%u" % (filename, nNbFile)) for i in range(0, nNbFile): nStringSize = int.from_bytes(fp.read(1), byteorder='little', signed=False) FileName = fp.read(nStringSize).decode() nFileSize2 = int.from_bytes(fp.read(4), byteorder='little', signed=False) nFilePos = int.from_bytes(fp.read(4), byteorder='little', signed=False) self.log.debug("[%s] (%d) sizestring:%d file:%s size2:%d pos:%d" % (filename, i, nStringSize, FileName, nFileSize2, nFilePos)) data.addchild(FileName, nFilePos, nFileSize2) fp.close() self.list.append(data) def search(self, name): for x in self.list: for y in x.child: if y.name == name: self.log.debug("file:%s child:%s pos:%d size:%d", x.name, y.name, y.pos, y.size) return x.fullpath, y.pos, y.size self.log.debug('-'*80) return None, None, None def getdata(self, name): fullpath, pos, size = self.search(name) self.log.debug("file:%s pos:%d size:%d", fullpath, pos, size) data = None with open(fullpath, 'rb') as fp: fp.seek(pos) data = fp.read(size) fp.close() return data