update ResourceCache & ResourceLoader

This commit is contained in:
Nomango 2020-07-26 18:51:02 +08:00
parent 696de0326d
commit 2285449eef
5 changed files with 73 additions and 62 deletions

View File

@ -26,10 +26,10 @@
#include <kiwano/render/DirectX/RendererImpl.h> #include <kiwano/render/DirectX/RendererImpl.h>
#include <kiwano/render/DirectX/NativePtr.h> #include <kiwano/render/DirectX/NativePtr.h>
#define KGE_SET_STATUS_IF_FAILED(ERRCODE, OBJ, MESSAGE) \ #define KGE_SET_STATUS_IF_FAILED(ERRCODE, OBJ, MESSAGE) \
if (FAILED(ERRCODE)) \ if (FAILED(ERRCODE)) \
{ \ { \
OBJ.Fail(strings::Format("An exception occurred (%#x): %s", ERRCODE, MESSAGE)); \ OBJ.Fail(strings::Format("%s failed (%#x): %s", __FUNCTION__, ERRCODE, MESSAGE)); \
} }
namespace kiwano namespace kiwano

View File

@ -19,6 +19,7 @@
// THE SOFTWARE. // THE SOFTWARE.
#include <kiwano/utils/ResourceCache.h> #include <kiwano/utils/ResourceCache.h>
#include <kiwano/utils/ResourceLoader.h>
namespace kiwano namespace kiwano
{ {
@ -30,6 +31,20 @@ ResourceCache::~ResourceCache()
Clear(); Clear();
} }
bool ResourceCache::LoadFromJsonFile(const String& file_path)
{
ResourceLoader loader(*this);
loader.LoadFromJsonFile(file_path);
return IsValid();
}
bool ResourceCache::LoadFromXmlFile(const String& file_path)
{
ResourceLoader loader(*this);
loader.LoadFromXmlFile(file_path);
return IsValid();
}
void ResourceCache::AddObject(const String& id, ObjectBasePtr obj) void ResourceCache::AddObject(const String& id, ObjectBasePtr obj)
{ {
object_cache_.insert(std::make_pair(id, obj)); object_cache_.insert(std::make_pair(id, obj));

View File

@ -37,6 +37,18 @@ class KGE_API ResourceCache final : public ObjectBase
public: public:
ResourceCache(); ResourceCache();
virtual ~ResourceCache();
/// \~chinese
/// @brief 从 JSON 文件加载资源信息
/// @param file_path JSON文件路径
bool LoadFromJsonFile(const String& file_path);
/// \~chinese
/// @brief 从 XML 文件加载资源信息
/// @param file_path XML文件路径
bool LoadFromXmlFile(const String& file_path);
/// \~chinese /// \~chinese
/// @brief 获取资源 /// @brief 获取资源
/// @param id 对象ID /// @param id 对象ID
@ -68,8 +80,6 @@ public:
/// @brief 清空所有资源 /// @brief 清空所有资源
void Clear(); void Clear();
virtual ~ResourceCache();
private: private:
UnorderedMap<String, ObjectBasePtr> object_cache_; UnorderedMap<String, ObjectBasePtr> object_cache_;
}; };

View File

@ -22,6 +22,7 @@
#include <kiwano/platform/FileSystem.h> #include <kiwano/platform/FileSystem.h>
#include <kiwano/utils/Logger.h> #include <kiwano/utils/Logger.h>
#include <kiwano/utils/ResourceLoader.h> #include <kiwano/utils/ResourceLoader.h>
#include <kiwano/utils/ResourceCache.h>
namespace kiwano namespace kiwano
{ {
@ -48,19 +49,17 @@ Map<String, Function<void(ResourceCache*, const XmlNode&)>> load_xml_funcs = {
} // namespace } // namespace
bool ResourceLoader::LoadFromJsonFile(ResourceCachePtr cache, const String& file_path) ResourceLoader::ResourceLoader(ResourceCache& cache)
: cache_(cache)
{ {
if (!cache) }
{
KGE_ERROR("ResourceLoader::LoadFromJsonFile failed, cache is nullptr");
return false;
}
void ResourceLoader::LoadFromJsonFile(const String& file_path)
{
if (!FileSystem::GetInstance().IsFileExists(file_path)) if (!FileSystem::GetInstance().IsFileExists(file_path))
{ {
cache->Fail( cache_.Fail(strings::Format("ResourceLoader::LoadFromJsonFile failed: [%s] file not found.", file_path.c_str()));
strings::Format("ResourceLoader::LoadFromJsonFile failed: [%s] file not found.", file_path.c_str())); return;
return false;
} }
Json json_data; Json json_data;
@ -77,27 +76,22 @@ bool ResourceLoader::LoadFromJsonFile(ResourceCachePtr cache, const String& file
} }
catch (std::ios_base::failure& e) catch (std::ios_base::failure& e)
{ {
cache->Fail(strings::Format("ResourceLoader::LoadFromJsonFile failed: cannot open file [%s]. %s", cache_.Fail(strings::Format("ResourceLoader::LoadFromJsonFile failed: cannot open file [%s]. %s",
file_path.c_str(), e.what())); file_path.c_str(), e.what()));
return false; return;
} }
catch (Json::exception& e) catch (Json::exception& e)
{ {
cache->Fail(strings::Format("ResourceLoader::LoadFromJsonFile failed: Json file [%s] parsed with errors: %s", cache_.Fail(strings::Format("ResourceLoader::LoadFromJsonFile failed: Json file [%s] parsed with errors: %s",
file_path.c_str(), e.what())); file_path.c_str(), e.what()));
return false; return;
} }
return LoadFromJson(cache, json_data);
LoadFromJson(json_data);
} }
bool ResourceLoader::LoadFromJson(ResourceCachePtr cache, const Json& json_data) void ResourceLoader::LoadFromJson(const Json& json_data)
{ {
if (!cache)
{
KGE_ERROR("ResourceLoader::LoadFromJson failed, cache is nullptr");
return false;
}
try try
{ {
String version = json_data["version"]; String version = json_data["version"];
@ -105,36 +99,29 @@ bool ResourceLoader::LoadFromJson(ResourceCachePtr cache, const Json& json_data)
auto load = load_json_funcs.find(version); auto load = load_json_funcs.find(version);
if (load != load_json_funcs.end()) if (load != load_json_funcs.end())
{ {
load->second(cache.Get(), json_data); load->second(&cache_, json_data);
} }
else if (version.empty()) else if (version.empty())
{ {
load_json_funcs["latest"](cache.Get(), json_data); load_json_funcs["latest"](&cache_, json_data);
} }
else else
{ {
cache->Fail("ResourceLoader::LoadFromJson failed: unknown resource data version"); cache_.Fail("ResourceLoader::LoadFromJson failed: unknown resource data version");
} }
} }
catch (Json::exception& e) catch (Json::exception& e)
{ {
cache->Fail(String("ResourceLoader::LoadFromJson failed: ") + e.what()); cache_.Fail(String("ResourceLoader::LoadFromJson failed: ") + e.what());
} }
return cache->IsValid();
} }
bool ResourceLoader::LoadFromXmlFile(ResourceCachePtr cache, const String& file_path) void ResourceLoader::LoadFromXmlFile(const String& file_path)
{ {
if (!cache)
{
KGE_ERROR("ResourceLoader::LoadFromXmlFile failed, cache is nullptr");
return false;
}
if (!FileSystem::GetInstance().IsFileExists(file_path)) if (!FileSystem::GetInstance().IsFileExists(file_path))
{ {
cache->Fail(strings::Format("ResourceLoader::LoadFromXmlFile failed: [%s] file not found.", file_path.c_str())); cache_.Fail(strings::Format("ResourceLoader::LoadFromXmlFile failed: [%s] file not found.", file_path.c_str()));
return false; return;
} }
String full_path = FileSystem::GetInstance().GetFullPathForFile(file_path); String full_path = FileSystem::GetInstance().GetFullPathForFile(file_path);
@ -144,24 +131,17 @@ bool ResourceLoader::LoadFromXmlFile(ResourceCachePtr cache, const String& file_
auto result = doc.load_file(full_path.c_str()); auto result = doc.load_file(full_path.c_str());
if (result) if (result)
{ {
return LoadFromXml(cache, doc); LoadFromXml(doc);
} }
else else
{ {
cache->Fail(strings::Format("ResourceLoader::LoadFromXmlFile failed: XML file [%s] parsed with errors: %s", cache_.Fail(strings::Format("ResourceLoader::LoadFromXmlFile failed: XML file [%s] parsed with errors: %s",
file_path.c_str(), result.description())); file_path.c_str(), result.description()));
return false;
} }
} }
bool ResourceLoader::LoadFromXml(ResourceCachePtr cache, const XmlDocument& doc) void ResourceLoader::LoadFromXml(const XmlDocument& doc)
{ {
if (!cache)
{
KGE_ERROR("ResourceLoader::LoadFromXml failed, cache is nullptr");
return false;
}
if (XmlNode root = doc.child("resources")) if (XmlNode root = doc.child("resources"))
{ {
String version; String version;
@ -171,22 +151,21 @@ bool ResourceLoader::LoadFromXml(ResourceCachePtr cache, const XmlDocument& doc)
auto load = load_xml_funcs.find(version); auto load = load_xml_funcs.find(version);
if (load != load_xml_funcs.end()) if (load != load_xml_funcs.end())
{ {
load->second(cache.Get(), root); load->second(&cache_, root);
} }
else if (version.empty()) else if (version.empty())
{ {
load_xml_funcs["latest"](cache.Get(), root); load_xml_funcs["latest"](&cache_, root);
} }
else else
{ {
cache->Fail("ResourceLoader::LoadFromXml failed: unknown resource data version"); cache_.Fail("ResourceLoader::LoadFromXml failed: unknown resource data version");
} }
} }
else else
{ {
cache->Fail("ResourceLoader::LoadFromXml failed: unknown file format"); cache_.Fail("ResourceLoader::LoadFromXml failed: unknown file format");
} }
return cache->IsValid();
} }
} // namespace kiwano } // namespace kiwano

View File

@ -19,37 +19,44 @@
// THE SOFTWARE. // THE SOFTWARE.
#pragma once #pragma once
#include <kiwano/utils/ResourceCache.h> #include <kiwano/core/Common.h>
#include <kiwano/utils/Json.h> #include <kiwano/utils/Json.h>
#include <kiwano/utils/Xml.h> #include <kiwano/utils/Xml.h>
namespace kiwano namespace kiwano
{ {
class ResourceCache;
/// \~chinese /// \~chinese
/// @brief 资源加载器 /// @brief 资源加载器
class KGE_API ResourceLoader final : Noncopyable class KGE_API ResourceLoader final
{ {
public: public:
ResourceLoader(ResourceCache& cache);
/// \~chinese /// \~chinese
/// @brief 从 JSON 文件加载资源信息 /// @brief 从 JSON 文件加载资源信息
/// @param file_path JSON文件路径 /// @param file_path JSON文件路径
static bool LoadFromJsonFile(ResourceCachePtr cache, const String& file_path); void LoadFromJsonFile(const String& file_path);
/// \~chinese /// \~chinese
/// @brief 从 JSON 加载资源信息 /// @brief 从 JSON 加载资源信息
/// @param json_data JSON对象 /// @param json_data JSON对象
static bool LoadFromJson(ResourceCachePtr cache, const Json& json_data); void LoadFromJson(const Json& json_data);
/// \~chinese /// \~chinese
/// @brief 从 XML 文件加载资源信息 /// @brief 从 XML 文件加载资源信息
/// @param file_path XML文件路径 /// @param file_path XML文件路径
static bool LoadFromXmlFile(ResourceCachePtr cache, const String& file_path); void LoadFromXmlFile(const String& file_path);
/// \~chinese /// \~chinese
/// @brief 从 XML 文档对象加载资源信息 /// @brief 从 XML 文档对象加载资源信息
/// @param doc XML文档对象 /// @param doc XML文档对象
static bool LoadFromXml(ResourceCachePtr cache, const XmlDocument& doc); void LoadFromXml(const XmlDocument& doc);
private:
ResourceCache& cache_;
}; };
} // namespace kiwano } // namespace kiwano