def open(file: File) -> None:
        if file.is_opened():
            return

        file.file_object = open(file.path, "rb")

        FileController.set_name(file)
        FileController.set_file_size(file)
        FileController.set_file_checksum(file)
    def set_file_checksum(file: File) -> None:
        if file.is_opened() and file.current_chunk == 0:
            checksum_function = hashlib.md5()

            for chunk in iter(lambda: file.file_object.read(file.chunk_size),
                              b""):
                checksum_function.update(chunk)

            file.checksum = checksum_function.hexdigest()
            FileController.go_to_byte(file, 0)
    def read(file: File) -> None:
        if not file.is_opened():
            FileController.open(file)

        if file.current_chunk == -1:
            raise EndOfFile

        file.current_chunk_data = file.file_object.read(file.chunk_size)

        if file.current_chunk_data == b"":
            file.current_chunk = -1
            raise EndOfFile

        current_chunk_size = len(file.current_chunk_data)

        FileController.set_chunk_checksum(file)
        file.total_bytes_sent += current_chunk_size
        file.current_chunk_size = current_chunk_size
        file.current_chunk += 1
 def go_to_byte(file: File, byte_number: int) -> None:
     if file.is_opened() and byte_number <= file.size:
         file.file_object.seek(byte_number)
 def close(file: File) -> None:
     if file.is_opened():
         file.file_object.close()