legendary/legendary/models/downloading.py

161 lines
3.4 KiB
Python

# coding: utf-8
from enum import Flag, auto
from dataclasses import dataclass
from typing import Optional
from .manifest import ManifestComparison
@dataclass
class SharedMemorySegment:
"""
Segment of the shared memory used for one Chunk
"""
offset: int
end: int
@property
def size(self):
return self.end - self.offset
@dataclass
class DownloaderTask:
"""
Task submitted to the download worker
"""
url: str
chunk_guid: int
shm: SharedMemorySegment
@dataclass
class DownloaderTaskResult(DownloaderTask):
"""
Result of DownloaderTask provided by download workers
"""
success: bool
size_downloaded: Optional[int] = None
size_decompressed: Optional[int] = None
@dataclass
class ChunkTask:
"""
A task describing a single read of a (partial) chunk from memory or an existing file
"""
chunk_guid: int
chunk_offset: int = 0
chunk_size: int = 0
# Whether this chunk can be removed from memory/disk after having been written
cleanup: bool = False
# Path to the file the chunk is read from (if not from memory)
chunk_file: Optional[str] = None
class TaskFlags(Flag):
NONE = 0
OPEN_FILE = auto()
CLOSE_FILE = auto()
DELETE_FILE = auto()
CREATE_EMPTY_FILE = auto()
RENAME_FILE = auto()
RELEASE_MEMORY = auto()
MAKE_EXECUTABLE = auto()
SILENT = auto()
@dataclass
class FileTask:
"""
A task describing some operation on the filesystem
"""
filename: str
flags: TaskFlags
# If rename is true, this is the name of the file to be renamed
old_file: Optional[str] = None
@dataclass
class WriterTask:
"""
Task for FileWriter worker process, describing an operation on the filesystem
"""
filename: str
flags: TaskFlags
chunk_offset: int = 0
chunk_size: int = 0
chunk_guid: Optional[int] = None
# Whether shared memory segment shall be released back to the pool on completion
shared_memory: Optional[SharedMemorySegment] = None
# File to read old chunk from, disk chunk cache or old game file
old_file: Optional[str] = None
cache_file: Optional[str] = None
@dataclass
class WriterTaskResult(WriterTask):
"""
Result from the FileWriter worker
"""
success: bool = False
size: int = 0
@dataclass
class UIUpdate:
"""
Status update object sent from the manager to the CLI/GUI to update status indicators
"""
progress: float
download_speed: float
write_speed: float
read_speed: float
memory_usage: float
current_filename: Optional[str] = None
@dataclass
class AnalysisResult:
"""
Result of processing a manifest for downloading
"""
dl_size: int = 0
uncompressed_dl_size: int = 0
install_size: int = 0
disk_space_delta: int = 0
reuse_size: int = 0
biggest_file_size: int = 0
unchanged_size: int = 0
biggest_chunk: int = 0
min_memory: int = 0
num_chunks: int = 0
num_chunks_cache: int = 0
num_files: int = 0
removed: int = 0
added: int = 0
changed: int = 0
unchanged: int = 0
manifest_comparison: Optional[ManifestComparison] = None
@dataclass
class ConditionCheckResult:
"""
Result of install condition checks
"""
failures: Optional[set] = None
warnings: Optional[set] = None
class TerminateWorkerTask:
"""
Universal task to signal a worker to exit
"""
pass