Commit Graph
54 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5.5 1b60f76e58 Translate error messages once, from keys the source names
GameManager translated install errors when storing them, and the install
screens then looked the translated text up again as a key. It now stores the
category and key, and translates when asked. The raw ISO install error gets
the existing "Installation failed" string.

Some other errors went around as strings that were then used as keys:
- A missing savestate file now has its own error code, ERROR_FILE_MISSING,
  instead of a key in the failure reason.
- The PKG reader's reasons are technical English, so they're now shown
  untranslated under the translated "This PKG file isn't a PSP game update".
- The netconf dialog looked up the channel number. Only "Auto" is translated
  now, using the WLAN Channel setting's string.
- Adds the missing "Failed to read old directory" for memstick moves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-26 17:04:20 +01:00
Henrik RydgårdandClaude Opus 5.5 34a0090a18 Install PS1 discs from zip and 7z archives, and show them as playable only with a firmware that runs them
A zip or 7z with a PS1 disc in it (a cue sheet and the files it names, a
.ccd with its .img and .sub, or a lone raw .bin or .img) is now installed
like a zipped ISO. A disc of several files goes into a folder of its own,
named after the cue sheet or .ccd. An ISO in the archive still takes
priority, and a lone .bin or .img only counts when nothing else does.

The game screen offers Play for a PS1 disc image only when the installed
firmware's POPS can run it: 3.95 to 6.61, with popsman.prx.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-23 15:01:22 +02:00
Henrik RydgårdandClaude Opus 5 3a70c6b149 Install PKG game updates, and boot them
Opening a .pkg now offers to install it, the way a .zip does - see the new
InstallPkgScreen, which shows what the update patches, what it'll take up
on disk (exact, since package contents aren't compressed) and where it's
going. The package's PS3-style USRDIR/CONTENT wrapping is stripped so the
files land where the PSP expects them, in PSP/GAME/<DISC_ID>.

Booting a disc then looks for PSP/GAME/<DISC_ID>/PBOOT.PBP and boots that
instead of the disc's own EBOOT, leaving the disc mounted - so the update
overrides the files it ships and the disc supplies the rest. The update's
DISC_ID has to match; a DISC_VERSION mismatch only warns, since updates do
get used with slightly different dumps in practice.

Verified against the whole corpus: every one installs, and the
digital NP* update/base-image pairs that could be assembled all boot the
patch rather than the disc's executable. That includes Super Robot Taisen
Operation Extend from a real NPUMDIMG EBOOT.PBP, which settles that
ISO.BIN.EDAT does not re-key the PBOOT - a digital title's patched EBOOT is
encrypted exactly like a UMD one. On the UMD side, the patched
LittleBigPlanet reads PATCH.ARC out of the install alongside the disc's own
archive.

The DISC_VERSION warning turns out to be load-bearing: many of the pairs
mismatch, because the dumps in circulation are later disc revisions than the
updates were built against. docs/pkg_notes.md has the numbers, and the one
thing that doesn't work - PGD-wrapped .sprx modules, which
sceKernelLoadModuleNpDrm can't load.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 11:15:15 -06:00
Henrik Rydgård 68ec34ad54 Build and warning fixes 2026-08-03 19:11:07 +02:00
Henrik Rydgård 55eee26c52 Assorted warning fixes 2026-08-03 18:55:35 +02:00
Henrik Rydgård 725cd691b3 Limit total extracted size when installing zips (zip bomb protection)
ExtractZipContents wrote every entry's declared size with no ceiling, so
a small high-ratio zip could decompress to fill the storage device.

- Add a maxTotalSize parameter to ExtractZipContents (default 4GB) and
  ExtractFile.
- Bail out in the size-summation pass when the total declared size
  exceeds the limit, and again per write chunk in case declared sizes
  are inaccurate.
2026-08-01 13:16:21 +02:00
Henrik Rydgård f3d7d8bc0c Fix Zip Slip in zip extraction and add unit test
A crafted zip with a parent-directory ("..") entry name could escape the
destination directory during extraction, writing arbitrary files on the
host (e.g. into startup/autostart folders). ExtractZipContents built the
output path by concatenating the raw zip entry name onto the destination
with no traversal check.

Changes:
- Add HasParentDirComponent() utility in Core/Util/PathUtil and use it in
  GameManager::ExtractZipContents to reject entries with a ".." component.
  Guard both the directory-creation and file-writing passes.
- Expose ExtractZipContents as public for testing.
- Add unittest/TestZipSlip which crafts a zip with a "../evil.txt" entry
  and verifies it is not written outside the destination directory.
2026-07-31 20:35:12 +02:00
Henrik Rydgård bfe6debcfd Support auto-installing plugins from ZIPs with a deeper directory structure 2026-04-14 11:55:13 -06:00
Henrik Rydgård c74e21243d Add support for installing plugins directly from zip files 2026-02-25 14:28:57 +01:00
刘皓 51e3eb69af Remove all calls to zip_close() from Core/Util/GameManager.cpp
The zip file will be closed automatically when the `ZipContainer` goes
out of scope, or when `.close()` is called on the `ZipContainer`.
2026-01-08 11:49:05 -05:00
Henrik Rydgård 71533ac2b7 Trash handling is too high level for FileUtil, move it up. 2025-04-15 17:42:24 +02:00
Henrik Rydgård 70c341ab35 Buildfix 2025-04-13 01:12:38 +02:00
Henrik Rydgård 1babbca72a Move the zip file content checker into Loaders.cpp, should fix the libretro build 2025-04-12 23:38:59 +02:00
Henrik Rydgård fffbed53bc Add a ZipFileLoader, which can let us load any single-file file type from a zip.
Useful for loading framedumps from github without manually having to
unzip each one, for example.
2025-04-12 22:23:23 +02:00
Henrik Rydgård 10d3b253a4 More InstallZip refactoring, add options for install directory where applicable 2024-09-10 13:55:12 +02:00
Henrik Rydgård 8186f14a57 Much more UI work on savedata import
fix
2024-09-07 15:28:57 +02:00
Henrik Rydgård 3a047369fd Add ability to install savedata from GameFAQs-style ZIP files 2024-09-05 17:12:10 +02:00
Henrik Rydgård db550fc433 More refactoring of installzip code 2024-09-04 17:08:26 +02:00
Henrik Rydgård 795c4c4262 Zip install: Minor refactoring, putting the content identifier in ZipFileInfo. 2024-09-04 12:53:45 +02:00
Henrik Rydgård c5791764d8 Make the i18n T function use std::string_view
Buildfixes, crashfixes

One more

Android buildfix

Buildfix Qt
2024-02-12 18:44:39 +01:00
Herman Semenov af41281761 [Core/Dialog/ELF/FileSystems/HLE/HW/Util] Added const reference for function params 2023-12-14 14:22:24 +03:00
Henrik Rydgård d234fa24e6 Add progress bar (without %) to install/uninstall. Other fixes. 2023-12-08 16:16:28 +01:00
Henrik Rydgård 888b32e243 Store: Perform uninstalls on a background thread, to avoid hanging the UI 2023-12-08 16:16:26 +01:00
Henrik Rydgård a929eb6c6d Store: Remove unnecessary std::shared_ptr around the install thread 2023-12-08 12:49:15 +01:00
Henrik Rydgård 93bb113009 Common: Rename Download to Request, and the old Request to ServerRequest. 2023-07-21 22:12:00 +02:00
Unknown W. Brackets 40cab56bb9 UI: Prevent crash installing second game quickly. 2023-01-04 22:42:12 -08:00
Unknown W. Brackets 6105688c32 UI: Install textures as a zip if supported. 2022-10-31 20:14:38 -07:00
Unknown W. Brackets b0dbdb4dda UI: Reset ZIP install errors for new ZIPs. 2022-01-17 09:15:39 -08:00
Unknown W. Brackets 2a9170a2ea http: Use Path for the download file. 2021-05-14 22:46:03 -07:00
Henrik Rydgård 5cd565d327 Fix path bug installing homebrew 2021-05-13 11:08:27 +02:00
Henrik Rydgård 2e16e83159 It never ends... 2021-05-13 10:39:16 +02:00
Henrik Rydgård 025bcb1673 Introduce Path, start using it all over the place.
Still lots left to convert!

Convert GetSysDirectory to return Path.

More buildfixing

Remove unnecessary Path( constructors
2021-05-13 10:39:16 +02:00
Unknown W. Brackets 20443571bd Store: Retain cancel/speed on resize or switch. 2021-05-01 11:20:05 -07:00
Unknown W. Brackets 2f08fb6583 Store: Show a rough speed indicator.
Some of the homebrew are a bit larger, it's nice to see a speed and not
just the progress bar.
2021-05-01 11:20:05 -07:00
Henrik Rydgård 4f43cff5ca Move fileutil, net, image loaders, ui to Common. (#13506)
* Move and rename file_util/fd_util to Common/File/FileUtil and DirListing

Let's also move net while we're at it.

Move the ZIM/PNG loaders over to Common.

Move the UI framework into Common

iOS buildfix

* Buildfix

* Buildfixes

* Apple buildfix

* This typo again..

* UWP buildfix

* Fix build of PPSSPPQt, such as it is (it's not in good condition...)

* Guess what? Another buildfix.
2020-10-04 20:48:47 +02:00
Unknown W. Brackets 1307273dd7 UI: Cleanup install threads from UI thread. 2019-09-28 11:39:58 -07:00
Unknown W. Brackets 8aed212952 UI: Allow installing texture packs from zips.
Requires the textures.ini to have a [games] section.
2019-07-14 17:43:51 -07:00
Henrik Rydgård 274a8d7538 Address review feedback, thanks unknownbrackets 2019-07-14 11:32:32 +02:00
Henrik Rydgård 66c3f31ff9 More GameManager improvements. 2019-07-13 18:19:44 +02:00
Henrik Rydgård 0e978ba2e3 Pre-check the contents of ZIP files before allowing install. 2019-07-13 18:19:43 +02:00
Henrik Rydgård 663f10d08b GameManager: Actually allow installing ISOs from zip files. Refactor. 2019-07-13 18:19:43 +02:00
Henrik Rydgård 4d30a8d04e Start refactoring GameManager zip handling to easier support ISOs in zips 2019-07-13 18:19:43 +02:00
Henrik Rydgård 85c8d9b806 Homebrew Store: Add support for cancelling downloads, fix progress bar. Fixes #9374 2017-03-06 16:03:05 +01:00
Henrik Rydgard 50be4e72b2 Get rid of our own silly reimplementation of std::thread 2017-02-27 20:51:36 +01:00
Unknown W. Brackets adb2ebe87f Refresh buttons after installing homebrew. 2015-07-04 08:41:24 -07:00
Henrik Rydgård c262e47bdc Error handling on disk full when installing zip files 2013-12-06 12:49:57 +01:00
Henrik Rydgård 3ab1aeb9ef Install zip file screen: Add working progress bar for install. 2013-12-05 17:49:37 +01:00
Sacha 31af63adf4 Buildfix: Another string::back() and including a .cpp? 2013-12-06 01:04:50 +10:00
Henrik Rydgård 160cafdb34 Game installer: Handle zip files without directory entries 2013-12-05 14:21:07 +01:00
Henrik Rydgård 8e658d628f GameManager: Add functions to query progress 2013-12-05 13:01:00 +01:00