mirror of
https://port.numenaute.org/aleajactaest/clientbot.git
synced 2024-12-23 01:48:48 +00:00
79 lines
3.3 KiB
Python
79 lines
3.3 KiB
Python
#!/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 <http://www.gnu.org/licenses/>.
|
|
|
|
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
|