2019-11-29 13:46:04 +00:00
|
|
|
#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>
|
2019-11-29 13:46:04 +00:00
|
|
|
|
|
|
|
class CDImage;
|
2020-01-08 03:37:43 +00:00
|
|
|
class ByteStream;
|
2019-11-29 13:46:04 +00:00
|
|
|
|
2019-12-31 06:17:17 +00:00
|
|
|
class SettingsInterface;
|
|
|
|
|
2019-11-29 13:46:04 +00:00
|
|
|
class GameList
|
|
|
|
{
|
|
|
|
public:
|
2019-11-30 13:55:05 +00:00
|
|
|
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
|
|
|
|
};
|
|
|
|
|
2019-11-30 13:55:05 +00:00
|
|
|
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;
|
2019-11-30 13:55:05 +00:00
|
|
|
ConsoleRegion region;
|
2019-12-04 11:12:50 +00:00
|
|
|
EntryType type;
|
2019-11-30 13:55:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
using EntryList = std::vector<GameListEntry>;
|
2020-01-08 03:37:43 +00:00
|
|
|
using CacheMap = std::unordered_map<std::string, GameListEntry>;
|
2019-11-30 13:55:05 +00:00
|
|
|
|
2019-11-29 13:46:04 +00:00
|
|
|
GameList();
|
|
|
|
~GameList();
|
|
|
|
|
2019-12-04 11:54:14 +00:00
|
|
|
static const char* EntryTypeToString(EntryType type);
|
|
|
|
|
2019-11-29 13:46:04 +00:00
|
|
|
static std::string GetGameCodeForImage(CDImage* cdi);
|
|
|
|
static std::string GetGameCodeForPath(const char* image_path);
|
|
|
|
static std::optional<ConsoleRegion> GetRegionForCode(std::string_view code);
|
2019-12-13 06:51:36 +00:00
|
|
|
static std::optional<ConsoleRegion> GetRegionFromSystemArea(CDImage* cdi);
|
2019-12-05 07:09:10 +00:00
|
|
|
static std::optional<ConsoleRegion> GetRegionForImage(CDImage* cdi);
|
|
|
|
static std::optional<ConsoleRegion> GetRegionForPath(const char* image_path);
|
2019-11-29 13:46:04 +00:00
|
|
|
|
2019-11-30 13:55:05 +00:00
|
|
|
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()); }
|
2019-11-30 13:55:05 +00:00
|
|
|
|
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);
|
2019-11-30 13:55:05 +00:00
|
|
|
|
2019-11-29 13:46:04 +00:00
|
|
|
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);
|
2019-11-29 13:46:04 +00:00
|
|
|
|
2020-01-08 03:37:43 +00:00
|
|
|
bool GetGameListEntry(const std::string& path, GameListEntry* entry);
|
|
|
|
bool GetGameListEntryFromCache(const std::string& path, GameListEntry* entry);
|
2019-11-29 13:46:04 +00:00
|
|
|
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();
|
|
|
|
|
2019-11-30 13:55:05 +00:00
|
|
|
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;
|
2019-11-29 13:46:04 +00:00
|
|
|
};
|