#pragma once #include "IAssetDumper.h" #include #include #include template class AbstractFileDumper : public IAssetDumper { protected: virtual bool ShouldDump(XAssetInfo* asset) = 0; virtual std::string GetFileNameForAsset(Zone* zone, XAssetInfo* asset) = 0; virtual void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset, std::ostream& stream) = 0; public: void DumpPool(AssetDumpingContext& context, AssetPool* pool) override { for(auto assetInfo : *pool) { if(assetInfo->m_name[0] == ',' || !ShouldDump(assetInfo)) { continue; } std::filesystem::path assetFilePath(context.m_base_path); assetFilePath.append(GetFileNameForAsset(context.m_zone, assetInfo)); auto assetFileFolder(assetFilePath); assetFileFolder.replace_filename(""); create_directories(assetFileFolder); std::ofstream file(assetFilePath, std::fstream::out | std::fstream::binary); if(file.is_open()) { DumpAsset(context, assetInfo, file); file.close(); } else { std::cout << "Failed to open file '" << assetFilePath.string() << "' to dump asset '" << assetInfo->m_name.c_str() << "'\n"; } } } };