2019-08-22 19:19:10 +00:00
from . import dcmp0
from . import dcmp1
from . import dcmp2
2019-09-23 21:14:06 +00:00
from . common import DecompressError , CompressedApplicationHeaderInfo , CompressedHeaderInfo , CompressedSystemHeaderInfo
2019-08-22 19:19:10 +00:00
__all__ = [
" DecompressError " ,
" decompress " ,
]
2019-09-23 21:10:55 +00:00
def _decompress_application ( data : bytes , header_info : CompressedApplicationHeaderInfo , * , debug : bool = False ) - > bytes :
if header_info . dcmp_id == 0 :
2019-08-22 19:19:10 +00:00
decompress_func = dcmp0 . decompress
2019-09-23 21:10:55 +00:00
elif header_info . dcmp_id == 1 :
2019-08-22 19:19:10 +00:00
decompress_func = dcmp1 . decompress
else :
2019-09-23 21:10:55 +00:00
raise DecompressError ( f " Unsupported ' dcmp ' ID: { header_info . dcmp_id } , expected 0 or 1 " )
2019-08-22 19:19:10 +00:00
2019-09-23 21:19:20 +00:00
return decompress_func ( header_info , data , debug = debug )
2019-08-22 19:19:10 +00:00
2019-09-23 21:10:55 +00:00
def _decompress_system ( data : bytes , header_info : CompressedSystemHeaderInfo , * , debug : bool = False ) - > bytes :
if header_info . dcmp_id == 2 :
2019-08-22 19:19:10 +00:00
decompress_func = dcmp2 . decompress
else :
2019-09-23 21:10:55 +00:00
raise DecompressError ( f " Unsupported ' dcmp ' ID: { header_info . dcmp_id } , expected 2 " )
2019-08-22 19:19:10 +00:00
2019-09-23 21:19:20 +00:00
return decompress_func ( header_info , data , debug = debug )
2019-08-22 19:19:10 +00:00
def decompress ( data : bytes , * , debug : bool = False ) - > bytes :
""" Decompress the given compressed resource data. """
2019-09-23 21:10:55 +00:00
header_info = CompressedHeaderInfo . parse ( data )
2019-08-22 19:19:10 +00:00
2019-09-23 21:10:55 +00:00
if debug :
print ( f " Compressed resource data header: { header_info } " )
if isinstance ( header_info , CompressedApplicationHeaderInfo ) :
2019-08-22 19:19:10 +00:00
decompress_func = _decompress_application
2019-09-23 21:10:55 +00:00
elif isinstance ( header_info , CompressedSystemHeaderInfo ) :
2019-08-22 19:19:10 +00:00
decompress_func = _decompress_system
else :
2019-09-23 21:10:55 +00:00
raise DecompressError ( f " Unsupported compression type: 0x { header_info . compression_type : >04x } " )
2019-08-22 19:19:10 +00:00
2019-09-23 21:10:55 +00:00
decompressed = decompress_func ( data [ header_info . header_length : ] , header_info , debug = debug )
if len ( decompressed ) != header_info . decompressed_length :
raise DecompressError ( f " Actual length of decompressed data ( { len ( decompressed ) } ) does not match length stored in resource ( { header_info . decompressed_length } ) " )
2019-08-22 19:19:10 +00:00
return decompressed