diff --git a/sgbackup/archiver/_archiver.py b/sgbackup/archiver/_archiver.py index c2d30d3..9d3417e 100644 --- a/sgbackup/archiver/_archiver.py +++ b/sgbackup/archiver/_archiver.py @@ -32,6 +32,7 @@ import time from ..game import Game,SavegameType,VALID_SAVEGAME_TYPES,SAVEGAME_TYPE_ICONS from ..settings import settings from ..utility import sanitize_path,sanitize_windows_path +from ..error import NotAnArchiveError import logging logger = logging.getLogger(__name__) @@ -85,6 +86,9 @@ class Archiver(GObject): game=game.key,filename=filename)) return self.emit('backup',game,filename) + def restore(self,filename:str): + self.emit('restore',filename) + def generate_new_backup_filename(self,game:Game)->str: dt = datetime.datetime.now() @@ -138,7 +142,7 @@ class ArchiverManager(GObject): @staticmethod - def get_global(): + def get_global()->"ArchiverManager": if ArchiverManager.__global_archiver_manager is None: ArchiverManager.__global_archiver_manager = ArchiverManager() @@ -307,14 +311,35 @@ class ArchiverManager(GObject): flags=SignalFlags.RUN_FIRST) def do_backup(self,archiver,game,filename): return True + + def restore(self,filename:str): + archiver = self.get_archiver_for_file(filename) + return self.emit('restore',archiver,filename) + + @Signal(name="restore",return_type=bool,arg_types=(Archiver,str), + flags=SignalFlags.RUN_LAST) + def do_restore(self,archiver:Archiver,filename:str): + archiver.restore(filename) + return True - def is_archive(self,filename)->bool: + def is_archive(self,filename:str)->bool: if self.standard_archiver.is_archive(filename): return True for i in self.archivers.values(): if i.is_archive(filename): return True return False + + def get_archiver_for_file(self,filename:str)->Archiver: + if self.standard_archiver.is_archive(filename): + return self.standard_archiver + + for archiver in self.archivers.values(): + if archiver.is_archive(filename): + return archiver + + raise NotAnArchiveError(f"\"{filename}\" seems not to be a valid archive!") + def get_live_backups(self,game:Game): ret = [] diff --git a/sgbackup/archiver/zipfilearchiver.py b/sgbackup/archiver/zipfilearchiver.py index 7558f0e..40caa06 100644 --- a/sgbackup/archiver/zipfilearchiver.py +++ b/sgbackup/archiver/zipfilearchiver.py @@ -63,7 +63,7 @@ class ZipfileArchiver(Archiver): raise RuntimeError("\"{filename}\" is not a valid sgbackup zipfile archive!") with zipfile.ZipFile(filename,"r") as zf: - zip_game = Game.new_from_dict(json.loads(zf.read('game.conf').decode("utf-8"))) + zip_game = Game.new_from_dict(json.loads(zf.read('gameconf.json').decode("utf-8"))) try: game = GameManager.get_global().games[zip_game.key] except: @@ -71,8 +71,9 @@ class ZipfileArchiver(Archiver): if not os.path.isdir(game.savegame_root): os.makedirs(game.savegame_root) - - extract_files = [i for i in zf.filelist if i.startswith(zip_game.savegame_dir + "/")] + + print("\n".join([i.filename for i in zf.filelist])) + extract_files = [i for i in zf.filelist if i.filename.startswith(zip_game.savegame_dir + "/")] for file in extract_files: zf.extract(file,game.savegame_root) diff --git a/sgbackup/error.py b/sgbackup/error.py new file mode 100644 index 0000000..cb9a4bc --- /dev/null +++ b/sgbackup/error.py @@ -0,0 +1,3 @@ + +class NotAnArchiveError(LookupError): + pass diff --git a/sgbackup/gui/_app.py b/sgbackup/gui/_app.py index d6c5ce5..1a0f740 100644 --- a/sgbackup/gui/_app.py +++ b/sgbackup/gui/_app.py @@ -1196,7 +1196,8 @@ class BackupView(Gtk.Box): def _on_restore_button_clicked(self,button,data:BackupViewData): - pass + am = ArchiverManager.get_global() + am.restore(data.filename) def _on_delete_button_clicked(self,button,data:BackupViewData): am = ArchiverManager.get_global()