Files
sphaira/tools/usb_export.py
AndrewSpangler 0a8bc01870 Clean up python (#212)
* Python cleanup
2025-08-31 03:48:37 +01:00

97 lines
2.8 KiB
Python

import crc32c
import sys
import os
from usb_common import Usb, USB_ENUM as UE, SPLASH
def get_file_name(usb: Usb, name_length: int) -> str:
return bytes(usb.read(name_length)).decode('utf-8')
def create_file_folder(root: os.PathLike, target: os.PathLike) -> bool, os.PathLike:
"""
Creates a recursive folder structure at a given location
Returns a boolean indicating if it already exists and the absolute path
"""
path = os.abspath(os.path.join(root, target))
parent = os.path.dirname(path)
if not (os.path.exists(parent)):
os.makedirs(path)
print(f"Created folder {path}")
else:
print(f"Parent folder already exists {path}")
exists_already = os.path.exists(path)
return exists_already, path
def wait_for_input(usb: Usb, path: os.PathLike) -> None:
print("now waiting for intput\n")
with open(path, "wb") as f:
print(f"Opened file {path}")
while True:
[off, size, crc32c_want] = usb.get_send_data_header()
# todo: this isn't needed really.
usb.send_result(UE.RESULT_OK)
# check if we should finish now.
if off == 0 and size == 0:
break
# read the buffer and calculate the crc32c.
buf = usb.read(size)
crc32c_got = crc32c.crc32c(buf)
# validate the crc32c matches.
if crc32c_want != crc32c_got:
usb.send_result(UE.RESULT_ERROR)
continue
try:
f.seek(off)
f.write(buf)
usb.send_result(UE.RESULT_OK)
except BlockingIOError as e:
print("Error: failed to write: {} at: {} size: {} error: {}".format(e.filename, off, size, str(e)))
usb.send_result(UE.RESULT_ERROR)
if __name__ == '__main__':
print(SPLASH)
if not len(args) == 2:
print("Pass root path as argument.")
sys.exit(1)
root_path = sys.argv[1]
if (not os.path.isdir(root_path)):
raise ValueError('')
usb = Usb()
try:
# get usb endpoints.
usb.wait_for_connect()
# wait for command.
while True:
[cmd, arg3, arg4] = usb.get_send_header()
if (cmd == UE.CMD_QUIT):
usb.send_result(UE.RESULT_OK)
break
elif (cmd == UE.CMD_EXPORT):
usb.send_result(UE.RESULT_OK)
# todo: handle and return errors here.
file_name = get_file_name(usb, arg3)
exists_already, full_path = create_file_folder(root_path, file_name)
usb.send_result(UE.RESULT_OK)
wait_for_input(usb, full_path)
else:
usb.send_result(UE.RESULT_ERROR)
break
except Exception as e:
print(f"An exception occurred - {e} ")