mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2024-11-23 03:09:55 +00:00
savedata: fix dir name search with wildcard (#1552)
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions
* savedata: fix dir name search with wildcard * psf: replace filesystem clock by system clock (utc) * savedatadialog_ui: macOS zoned_time formatting Signed-off-by: Vinicius Rangel <me@viniciusrangel.dev> --------- Signed-off-by: Vinicius Rangel <me@viniciusrangel.dev> Co-authored-by: squidbus <175574877+squidbus@users.noreply.github.com>
This commit is contained in:
parent
96cd79f272
commit
b41664ac61
@ -21,8 +21,13 @@ static inline u32 get_max_size(std::string_view key, u32 default_value) {
|
||||
}
|
||||
|
||||
bool PSF::Open(const std::filesystem::path& filepath) {
|
||||
using namespace std::chrono;
|
||||
if (std::filesystem::exists(filepath)) {
|
||||
last_write = std::filesystem::last_write_time(filepath);
|
||||
const auto t = std::filesystem::last_write_time(filepath);
|
||||
const auto rel =
|
||||
duration_cast<seconds>(t - std::filesystem::file_time_type::clock::now()).count();
|
||||
const auto tp = system_clock::to_time_t(system_clock::now() + seconds{rel});
|
||||
last_write = system_clock::from_time_t(tp);
|
||||
}
|
||||
|
||||
Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read);
|
||||
@ -99,7 +104,7 @@ bool PSF::Encode(const std::filesystem::path& filepath) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
last_write = std::filesystem::file_time_type::clock::now();
|
||||
last_write = std::chrono::system_clock::now();
|
||||
|
||||
const auto psf_buffer = Encode();
|
||||
const size_t written = file.Write(psf_buffer);
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <chrono>
|
||||
#include <filesystem>
|
||||
#include <span>
|
||||
#include <string>
|
||||
@ -71,7 +72,7 @@ public:
|
||||
void AddString(std::string key, std::string value, bool update = false);
|
||||
void AddInteger(std::string key, s32 value, bool update = false);
|
||||
|
||||
[[nodiscard]] std::filesystem::file_time_type GetLastWrite() const {
|
||||
[[nodiscard]] std::chrono::system_clock::time_point GetLastWrite() const {
|
||||
return last_write;
|
||||
}
|
||||
|
||||
@ -80,7 +81,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
mutable std::filesystem::file_time_type last_write;
|
||||
mutable std::chrono::system_clock::time_point last_write;
|
||||
|
||||
std::vector<Entry> entry_list;
|
||||
|
||||
|
@ -13,6 +13,33 @@
|
||||
#include "imgui/imgui_std.h"
|
||||
#include "savedatadialog_ui.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <date/tz.h>
|
||||
|
||||
// Need to make a copy of the formatter for std::chrono::local_time for use with date::local_time
|
||||
template <typename Duration, typename Char>
|
||||
struct fmt::formatter<date::local_time<Duration>, Char> : formatter<std::tm, Char> {
|
||||
FMT_CONSTEXPR formatter() {
|
||||
this->format_str_ = fmt::detail::string_literal<Char, '%', 'F', ' ', '%', 'T'>();
|
||||
}
|
||||
|
||||
template <typename FormatContext>
|
||||
auto format(date::local_time<Duration> val, FormatContext& ctx) const -> decltype(ctx.out()) {
|
||||
using period = typename Duration::period;
|
||||
if (period::num == 1 && period::den == 1 &&
|
||||
!std::is_floating_point<typename Duration::rep>::value) {
|
||||
return formatter<std::tm, Char>::format(
|
||||
localtime(fmt::detail::to_time_t(date::current_zone()->to_sys(val))), ctx);
|
||||
}
|
||||
auto epoch = val.time_since_epoch();
|
||||
auto subsecs = fmt::detail::duration_cast<Duration>(
|
||||
epoch - fmt::detail::duration_cast<std::chrono::seconds>(epoch));
|
||||
return formatter<std::tm, Char>::do_format(
|
||||
localtime(fmt::detail::to_time_t(date::current_zone()->to_sys(val))), ctx, &subsecs);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
using namespace ImGui;
|
||||
using namespace Libraries::CommonDialog;
|
||||
using Common::ElfInfo;
|
||||
@ -98,12 +125,12 @@ SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) {
|
||||
param_sfo.Open(param_sfo_path);
|
||||
|
||||
auto last_write = param_sfo.GetLastWrite();
|
||||
#if defined(_WIN32) && !defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__)
|
||||
auto utc_time = std::chrono::file_clock::to_utc(last_write);
|
||||
#ifdef __APPLE__
|
||||
auto t = date::zoned_time{date::current_zone(), last_write};
|
||||
#else
|
||||
auto utc_time = std::chrono::file_clock::to_sys(last_write);
|
||||
auto t = std::chrono::zoned_time{std::chrono::current_zone(), last_write};
|
||||
#endif
|
||||
std::string date_str = fmt::format("{:%d %b, %Y %R}", utc_time);
|
||||
std::string date_str = fmt::format("{:%d %b, %Y %R}", t.get_local_time());
|
||||
|
||||
size_t size = Common::FS::GetDirectorySize(dir_path);
|
||||
std::string size_str = SpaceSizeToString(size);
|
||||
@ -592,7 +619,7 @@ void SaveDialogUi::DrawList() {
|
||||
int idx = 0;
|
||||
int max_idx = 0;
|
||||
bool is_min = pos == FocusPos::DATAOLDEST;
|
||||
std::filesystem::file_time_type max_write{};
|
||||
std::chrono::system_clock::time_point max_write{};
|
||||
if (state->new_item.has_value()) {
|
||||
idx++;
|
||||
}
|
||||
|
@ -248,7 +248,7 @@ public:
|
||||
std::string date{};
|
||||
std::string size{};
|
||||
|
||||
std::filesystem::file_time_type last_write{};
|
||||
std::chrono::system_clock::time_point last_write{};
|
||||
PSF pfo{};
|
||||
bool is_corrupted{};
|
||||
};
|
||||
|
@ -149,7 +149,7 @@ struct OrbisSaveDataIcon {
|
||||
size_t dataSize;
|
||||
std::array<u8, 32> _reserved;
|
||||
|
||||
Error LoadIcon(const std::filesystem::path& icon_path) {
|
||||
Error LoadIcon(const fs::path& icon_path) {
|
||||
try {
|
||||
const Common::FS::IOFile file(icon_path, Common::FS::FileAccessMode::Read);
|
||||
dataSize = file.GetSize();
|
||||
@ -345,7 +345,9 @@ static bool match(std::string_view str, std::string_view pattern) {
|
||||
if (*pat_it == '_') { // 1 character wildcard
|
||||
++str_it;
|
||||
++pat_it;
|
||||
} else if (*pat_it != *str_it) {
|
||||
continue;
|
||||
}
|
||||
if (*pat_it != *str_it) {
|
||||
return false;
|
||||
}
|
||||
++str_it;
|
||||
@ -1230,7 +1232,7 @@ Error PS4_SYSV_ABI sceSaveDataLoadIcon(const OrbisSaveDataMountPoint* mountPoint
|
||||
return Error::PARAMETER;
|
||||
}
|
||||
LOG_DEBUG(Lib_SaveData, "called");
|
||||
std::filesystem::path path;
|
||||
fs::path path;
|
||||
const std::string_view mount_point_str{mountPoint->data};
|
||||
for (const auto& instance : g_mount_slots) {
|
||||
if (instance.has_value() && instance->GetMountPoint() == mount_point_str) {
|
||||
@ -1375,7 +1377,7 @@ Error PS4_SYSV_ABI sceSaveDataSaveIcon(const OrbisSaveDataMountPoint* mountPoint
|
||||
return Error::PARAMETER;
|
||||
}
|
||||
LOG_DEBUG(Lib_SaveData, "called");
|
||||
std::filesystem::path path;
|
||||
fs::path path;
|
||||
const std::string_view mount_point_str{mountPoint->data};
|
||||
for (const auto& instance : g_mount_slots) {
|
||||
if (instance.has_value() && instance->GetMountPoint() == mount_point_str) {
|
||||
|
Loading…
Reference in New Issue
Block a user