Files
ppsspp/UI/InstallUpdateScreen.h
T

91 lines
3.2 KiB
C++

// Copyright (c) 2012- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include <atomic>
#include <memory>
#include <string>
#include <string_view>
#include "Common/File/Path.h"
#include "Common/UI/Notice.h"
#include "Common/UI/UIScreen.h"
#include "Common/UI/View.h"
#include "Common/UI/ViewGroup.h"
#include "Core/Util/PSARUnpack.h"
#include "UI/BaseScreens.h"
#include "UI/SimpleDialogScreen.h"
// An official PSP firmware updater: a PSP/GAME/UPDATE/EBOOT.PBP (or the folder holding one), or
// a game disc, most of which carry one at PSP_GAME/SYSDIR/UPDATE/DATA.BIN. Running an updater
// isn't going to get anyone anywhere, but the firmware inside it is exactly what the emulated
// flash0/flash1 want, so offer to unpack it into the NAND directory instead.
class InstallUpdateScreen : public UITwoPaneBaseDialogScreen {
public:
// title is the updater's SFO title, which already carries the version ("PSP Update ver 6.61").
// allowRun offers to boot the updater instead of unpacking it - which makes sense when the
// user picked the updater to launch it, but not when they came here to install a firmware.
// archiveSize is how big the firmware itself is; pass it for a disc, where the size of the
// file we were handed is the game's and says nothing about what's being installed. Zero means
// "the file is the updater", which is the PBP case.
InstallUpdateScreen(const Path &path, std::string_view title, bool allowRun, u64 archiveSize = 0);
void CreateSettingsViews(UI::ViewGroup *parent) override;
void CreateContentViews(UI::ViewGroup *parent) override;
void update() override;
bool key(const KeyInput &key) override;
const char *tag() const override { return "InstallUpdate"; }
protected:
std::string_view GetTitle() const override;
private:
// The unpack runs on a worker thread, and the user can leave the screen while it's going, so
// the state it writes is shared with the task rather than owned by the screen.
struct InstallState {
std::atomic<float> progress{};
std::atomic<bool> done{};
// Only valid to read once done is set.
bool success = false;
PSARUnpackStats stats;
std::string error;
};
void StartInstall();
void RefreshStatus();
Path path_;
Path destination_;
std::string title_;
u64 fileSize_ = 0;
bool overwrites_ = false;
bool allowRun_ = false;
// What's in the NAND right now, for overwrite warnings.
InstalledFirmwareInfo installed_;
std::shared_ptr<InstallState> state_;
bool reportedDone_ = false;
UI::Choice *installChoice_ = nullptr;
UI::ProgressBar *progressBar_ = nullptr;
NoticeView *resultView_ = nullptr;
};