Files
ppsspp/Common/UI/IconCache.h
T
Henrik RydgårdandClaude Opus 5.5 00208d3d80 Achievements: Enable HTTPS on UWP, retry failed icon downloads
UWP compiled naett with the WinHTTP backend but never reported
SYSPROP_SUPPORTS_HTTPS, so achievement traffic and badge icons went over
plain http. When the media server redirected to https, icons failed.

A failed icon download also left the URL marked pending, so it was never
retried for the rest of the session. Mark it failed instead, and let
IconCache retry it after 30 seconds.

The set-completed badge also skipped RemoveHttpsIfNeeded.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-01 10:26:00 -06:00

79 lines
1.9 KiB
C++

#pragma once
#include <map>
#include <set>
#include <string_view>
#include <mutex>
#include <cstdint>
#include "Common/File/Path.h"
class UIContext;
enum class IconFormat : uint32_t {
PNG,
};
namespace Draw {
class Texture;
}
// TODO: Possibly make this smarter and use instead of ManagedTexture?
struct IconCacheStats {
size_t cachedCount;
size_t textureCount; // number of cached images that are "live" textures
size_t pending;
size_t dataSize;
};
class IconCache {
public:
// NOTE: Don't store the returned texture. Only use it to look up dimensions or other properties,
// instead call BindIconTexture every time you want to use it.
Draw::Texture *BindIconTexture(UIContext *context, std::string_view key);
// It's okay to call these from any thread.
bool MarkPending(std::string_view key); // returns false if already pending or loaded
void CancelPending(std::string_view key);
// Like CancelPending, but MarkPending refuses the key for a while, so a failing download isn't retried every frame.
void MarkFailed(std::string_view key);
bool InsertIcon(std::string_view key, IconFormat format, std::string &&pngData);
bool GetDimensions(std::string_view key, int *width, int *height);
bool Contains(std::string_view key);
void SaveToFile(FILE *file);
bool LoadFromFile(FILE *file);
void FrameUpdate();
void ClearTextures();
void ClearData();
IconCacheStats GetStats();
private:
void Decimate(int64_t maxSize);
struct Entry {
std::string data;
IconFormat format;
Draw::Texture *texture;
double insertedTimeStamp;
double usedTimeStamp;
bool badData;
};
std::map<std::string, Entry, std::less<>> cache_;
std::set<std::string, std::less<>> pending_;
std::map<std::string, double, std::less<>> failed_; // key -> time of failure
std::mutex lock_;
double lastUpdate_ = 0.0;
double lastDecimate_ = 0.0;
};
extern IconCache g_iconCache;