Duckstation/src/core/game_list.h

106 lines
2.7 KiB
C
Raw Normal View History

#pragma once
#include "types.h"
#include <optional>
#include <string>
#include <string_view>
#include <unordered_map>
2019-11-30 15:27:01 +00:00
#include <vector>
class CDImage;
2020-01-08 03:37:43 +00:00
class ByteStream;
2019-12-31 06:17:17 +00:00
class SettingsInterface;
class GameList
{
public:
struct GameDatabaseEntry
{
std::string code;
std::string title;
ConsoleRegion region;
};
using DatabaseMap = std::unordered_map<std::string, GameDatabaseEntry>;
2019-12-04 11:12:50 +00:00
enum class EntryType
{
Disc,
PSExe
};
struct GameListEntry
{
std::string path;
std::string code;
std::string title;
2019-11-30 15:27:01 +00:00
u64 total_size;
2020-01-08 03:37:43 +00:00
u64 last_modified_time;
ConsoleRegion region;
2019-12-04 11:12:50 +00:00
EntryType type;
};
using EntryList = std::vector<GameListEntry>;
2020-01-08 03:37:43 +00:00
using CacheMap = std::unordered_map<std::string, GameListEntry>;
GameList();
~GameList();
static const char* EntryTypeToString(EntryType type);
static std::string GetGameCodeForImage(CDImage* cdi);
static std::string GetGameCodeForPath(const char* image_path);
static std::optional<ConsoleRegion> GetRegionForCode(std::string_view code);
static std::optional<ConsoleRegion> GetRegionFromSystemArea(CDImage* cdi);
static std::optional<ConsoleRegion> GetRegionForImage(CDImage* cdi);
static std::optional<ConsoleRegion> GetRegionForPath(const char* image_path);
const DatabaseMap& GetDatabase() const { return m_database; }
const EntryList& GetEntries() const { return m_entries; }
2019-11-30 15:27:01 +00:00
const u32 GetEntryCount() const { return static_cast<u32>(m_entries.size()); }
2020-01-08 03:37:43 +00:00
void SetPathsFromSettings(SettingsInterface& si);
2019-12-31 06:17:17 +00:00
void AddDirectory(std::string path, bool recursive);
2020-01-08 03:37:43 +00:00
void Refresh(bool invalidate_cache, bool invalidate_database);
private:
2020-01-08 03:37:43 +00:00
enum : u32
{
GAME_LIST_CACHE_SIGNATURE = 0x45434C47,
GAME_LIST_CACHE_VERSION = 2
};
2019-12-31 06:17:17 +00:00
struct DirectoryEntry
{
std::string path;
bool recursive;
};
2019-12-04 11:12:50 +00:00
static bool IsExeFileName(const char* path);
static bool GetExeListEntry(const char* path, GameListEntry* entry);
2020-01-08 03:37:43 +00:00
bool GetGameListEntry(const std::string& path, GameListEntry* entry);
bool GetGameListEntryFromCache(const std::string& path, GameListEntry* entry);
void ScanDirectory(const char* path, bool recursive);
2020-01-08 03:37:43 +00:00
void LoadCache();
bool LoadEntriesFromCache(ByteStream* stream);
bool OpenCacheForWriting();
bool WriteEntryToCache(const GameListEntry* entry, ByteStream* stream);
void CloseCacheFileStream();
void DeleteCacheFile();
void LoadDatabase();
void ClearDatabase();
DatabaseMap m_database;
EntryList m_entries;
2020-01-08 03:37:43 +00:00
CacheMap m_cache_map;
ByteStream* m_cache_write_stream = nullptr;
2019-12-31 06:17:17 +00:00
std::vector<DirectoryEntry> m_search_directories;
2020-01-08 03:37:43 +00:00
std::string m_cache_filename;
std::string m_database_filename;
bool m_database_load_tried = false;
};