mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-19 19:07:48 +02:00
91 lines
3.2 KiB
C++
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;
|
|
};
|