mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Replaced CFileInfo with more correct and efficient alternative
This commit is contained in:
		| @@ -1,7 +1,6 @@ | ||||
| #include "StdInc.h" | ||||
|  | ||||
| #include "../lib/filesystem/Filesystem.h" | ||||
| #include "../lib/filesystem/CFileInfo.h" | ||||
| #include "SDL.h" | ||||
| #include "SDL_image.h" | ||||
| #include "CBitmapHandler.h" | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
| #include "CPreGame.h" | ||||
|  | ||||
| #include "../lib/filesystem/Filesystem.h" | ||||
| #include "../lib/filesystem/CFileInfo.h" | ||||
| #include "../lib/filesystem/CCompressedStream.h" | ||||
|  | ||||
| #include "../lib/CStopWatch.h" | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| #include "../lib/NetPacks.h" | ||||
|  | ||||
| #include "../lib/filesystem/Filesystem.h" | ||||
| #include "../lib/filesystem/CFileInfo.h" | ||||
| #include "../lib/filesystem/FileInfo.h" | ||||
| #include "../CCallback.h" | ||||
| #include "Client.h" | ||||
| #include "CPlayerInterface.h" | ||||
| @@ -636,8 +636,8 @@ void BattleSetActiveStack::applyCl( CClient *cl ) | ||||
| 	PlayerColor playerToCall; //player that will move activated stack | ||||
| 	if( activated->hasBonusOfType(Bonus::HYPNOTIZED) ) | ||||
| 	{ | ||||
| 		playerToCall = ( GS(cl)->curB->sides[0].color == activated->owner  | ||||
| 			? GS(cl)->curB->sides[1].color  | ||||
| 		playerToCall = ( GS(cl)->curB->sides[0].color == activated->owner | ||||
| 			? GS(cl)->curB->sides[1].color | ||||
| 			: GS(cl)->curB->sides[0].color ); | ||||
| 	} | ||||
| 	else | ||||
| @@ -803,12 +803,12 @@ void YourTurn::applyCl( CClient *cl ) | ||||
|  | ||||
| void SaveGame::applyCl(CClient *cl) | ||||
| { | ||||
| 	CFileInfo info(fname); | ||||
| 	CResourceHandler::get("local")->createResource(info.getStem() + ".vcgm1"); | ||||
| 	const auto stem = FileInfo::GetPathStem(fname); | ||||
| 	CResourceHandler::get("local")->createResource(stem.to_string() + ".vcgm1"); | ||||
|  | ||||
| 	try | ||||
| 	{ | ||||
| 		CSaveFile save(*CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::CLIENT_SAVEGAME))); | ||||
| 		CSaveFile save(*CResourceHandler::get()->getResourceName(ResourceID(stem.to_string(), EResType::CLIENT_SAVEGAME))); | ||||
| 		cl->saveCommonState(save); | ||||
| 		save << *cl; | ||||
| 	} | ||||
|   | ||||
| @@ -31,7 +31,7 @@ void IVCMIDirs::init() | ||||
|  | ||||
| 	#ifndef CSIDL_MYDOCUMENTS | ||||
| 	#define CSIDL_MYDOCUMENTS CSIDL_PERSONAL | ||||
| 	#endif     | ||||
| 	#endif | ||||
| #endif // __MINGW32__ | ||||
|  | ||||
| #include <windows.h> | ||||
| @@ -87,7 +87,7 @@ bool StartBatchCopyDataProgram( | ||||
| 		"%5%"													"\n" | ||||
| 		"del \"%%~f0\"&exit"									"\n" // Script deletes itself | ||||
| 		; | ||||
| 	 | ||||
|  | ||||
| 	const auto startGameString = | ||||
| 		bfs::equivalent(currentPath, from) ? | ||||
| 		(boost::format("start \"\" %1%") % (to / exeName)) :						// Start game in new path. | ||||
| @@ -107,7 +107,7 @@ bool StartBatchCopyDataProgram( | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| class VCMIDirsWIN32 : public IVCMIDirs | ||||
| class VCMIDirsWIN32 final : public IVCMIDirs | ||||
| { | ||||
| 	public: | ||||
| 		boost::filesystem::path userDataPath() const override; | ||||
| @@ -166,7 +166,7 @@ void VCMIDirsWIN32::init() | ||||
| 		{ | ||||
| 			const std::wstring& pathStr = path.native(); | ||||
| 			std::unique_ptr<wchar_t[]> result(new wchar_t[pathStr.length() + 2]); | ||||
| 			 | ||||
|  | ||||
| 			size_t i = 0; | ||||
| 			for (const wchar_t ch : pathStr) | ||||
| 				result[i++] = ch; | ||||
| @@ -195,7 +195,7 @@ void VCMIDirsWIN32::init() | ||||
| 			return false; | ||||
| 		else if (!bfs::is_empty(from)) // TODO: Log warn. Some files not moved. User should try to move files. | ||||
| 			return false; | ||||
| 		 | ||||
|  | ||||
| 		if (bfs::current_path() == from) | ||||
| 			bfs::current_path(to); | ||||
|  | ||||
| @@ -203,7 +203,7 @@ void VCMIDirsWIN32::init() | ||||
| 		bfs::remove(from); | ||||
| 		return true; | ||||
| 	}; | ||||
| 	 | ||||
|  | ||||
| 	// Retrieves the fully qualified path for the file that contains the specified module. | ||||
| 	// The module must have been loaded by the current process. | ||||
| 	// If this parameter is nullptr, retrieves the path of the executable file of the current process. | ||||
| @@ -247,7 +247,7 @@ void VCMIDirsWIN32::init() | ||||
| 		// Start copying script and exit program. | ||||
| 		if (StartBatchCopyDataProgram(from, to, executableName)) | ||||
| 			exit(ERROR_SUCCESS); | ||||
| 		 | ||||
|  | ||||
| 		// Everything failed :C | ||||
| 		return false; | ||||
| 	}; | ||||
| @@ -262,14 +262,14 @@ bfs::path VCMIDirsWIN32::userDataPath() const | ||||
|  | ||||
| 	if (SHGetSpecialFolderPathW(nullptr, profileDir, CSIDL_MYDOCUMENTS, FALSE) != FALSE) | ||||
| 		return bfs::path(profileDir) / "My Games\\vcmi"; | ||||
| 	 | ||||
|  | ||||
| 	return "."; | ||||
| } | ||||
|  | ||||
| bfs::path VCMIDirsWIN32::oldUserDataPath() const | ||||
| { | ||||
| 	wchar_t profileDir[MAX_PATH]; | ||||
| 	 | ||||
|  | ||||
| 	if (SHGetSpecialFolderPathW(nullptr, profileDir, CSIDL_PROFILE, FALSE) == FALSE) // WinAPI way failed | ||||
| 	{ | ||||
| #if defined(_MSC_VER) && _MSC_VER >= 1700 | ||||
| @@ -284,7 +284,7 @@ bfs::path VCMIDirsWIN32::oldUserDataPath() const | ||||
| 		} | ||||
| #else | ||||
| 		const char* profileDirA; | ||||
| 		if (profileDirA = std::getenv("userprofile")) // STL way succeed | ||||
| 		if ((profileDirA = std::getenv("userprofile"))) // STL way succeed | ||||
| 			return bfs::path(profileDirA) / "vcmi"; | ||||
| #endif | ||||
| 		else | ||||
| @@ -365,7 +365,7 @@ std::string IVCMIDirsUNIX::genHelpString() const | ||||
| } | ||||
|  | ||||
| #ifdef VCMI_APPLE | ||||
| class VCMIDirsOSX : public IVCMIDirsUNIX | ||||
| class VCMIDirsOSX final : public IVCMIDirsUNIX | ||||
| { | ||||
| 	public: | ||||
| 		boost::filesystem::path userDataPath() const override; | ||||
|   | ||||
| @@ -229,6 +229,8 @@ | ||||
| 		<Unit filename="filesystem/CMemoryStream.h" /> | ||||
| 		<Unit filename="filesystem/CZipLoader.cpp" /> | ||||
| 		<Unit filename="filesystem/CZipLoader.h" /> | ||||
| 		<Unit filename="filesystem/FileInfo.cpp" /> | ||||
| 		<Unit filename="filesystem/FileInfo.h" /> | ||||
| 		<Unit filename="filesystem/FileStream.cpp" /> | ||||
| 		<Unit filename="filesystem/FileStream.h" /> | ||||
| 		<Unit filename="filesystem/Filesystem.cpp" /> | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
| #include "ISimpleResourceLoader.h" | ||||
| #include "ResourceID.h" | ||||
|  | ||||
| class CFileInfo; | ||||
| class CInputStream; | ||||
| class JsonNode; | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
| #include "CCompressedStream.h" | ||||
|  | ||||
| #include "CBinaryReader.h" | ||||
| #include "CFileInfo.h" | ||||
|  | ||||
| ArchiveEntry::ArchiveEntry() | ||||
| 	: offset(0), fullSize(0), compressedSize(0) | ||||
| @@ -140,13 +139,13 @@ std::unique_ptr<CInputStream> CArchiveLoader::load(const ResourceID & resourceNa | ||||
|  | ||||
| 	if (entry.compressedSize != 0) //compressed data | ||||
| 	{ | ||||
| 		std::unique_ptr<CInputStream> fileStream(new CFileInputStream(archive, entry.offset, entry.compressedSize)); | ||||
| 		auto fileStream = make_unique<CFileInputStream>(archive, entry.offset, entry.compressedSize); | ||||
|  | ||||
| 		return std::unique_ptr<CInputStream>(new CCompressedStream(std::move(fileStream), false, entry.fullSize)); | ||||
| 		return make_unique<CCompressedStream>(std::move(fileStream), false, entry.fullSize); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		return std::unique_ptr<CInputStream>(new CFileInputStream(archive, entry.offset, entry.fullSize)); | ||||
| 		return make_unique<CFileInputStream>(archive, entry.offset, entry.fullSize); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
| #include "ISimpleResourceLoader.h" | ||||
| #include "ResourceID.h" | ||||
|  | ||||
| class CFileInfo; | ||||
| class CFileInputStream; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,8 +1,6 @@ | ||||
| #include "StdInc.h" | ||||
| #include "CFileInputStream.h" | ||||
|  | ||||
| #include "CFileInfo.h" | ||||
|  | ||||
| CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 start, si64 size) | ||||
|   : dataStart{start}, | ||||
| 	dataSize{size}, | ||||
| @@ -20,9 +18,6 @@ CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 st | ||||
| 	fileStream.seekg(dataStart, std::ios::beg); | ||||
| } | ||||
|  | ||||
| CFileInputStream::CFileInputStream(const CFileInfo & file, si64 start, si64 size) | ||||
| 	: CFileInputStream{file.getName(), start, size} {} | ||||
|  | ||||
| si64 CFileInputStream::read(ui8 * data, si64 size) | ||||
| { | ||||
| 	si64 origin = tell(); | ||||
|   | ||||
| @@ -13,8 +13,6 @@ | ||||
| #include "CInputStream.h" | ||||
| #include "FileStream.h" | ||||
|  | ||||
| class CFileInfo; | ||||
|  | ||||
| /** | ||||
|  * A class which provides method definitions for reading a file from the filesystem. | ||||
|  */ | ||||
| @@ -32,13 +30,6 @@ public: | ||||
| 	 */ | ||||
| 	CFileInputStream(const boost::filesystem::path & file, si64 start = 0, si64 size = 0); | ||||
|  | ||||
| 	/** | ||||
| 	 * C-tor. Opens the specified file. | ||||
| 	 * | ||||
| 	 * @see CFileInputStream::CFileInputStream(const boost::filesystem::path &, si64, si64) | ||||
| 	 */ | ||||
| 	CFileInputStream(const CFileInfo & file, si64 start=0, si64 size=0); | ||||
|  | ||||
| 	/** | ||||
| 	 * Reads n bytes from the stream into the data buffer. | ||||
| 	 * | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| #include "StdInc.h" | ||||
| #include "CFilesystemLoader.h" | ||||
|  | ||||
| #include "CFileInfo.h" | ||||
| #include "CFileInputStream.h" | ||||
| #include "FileStream.h" | ||||
|  | ||||
| @@ -19,8 +18,7 @@ std::unique_ptr<CInputStream> CFilesystemLoader::load(const ResourceID & resourc | ||||
| { | ||||
| 	assert(fileList.count(resourceName)); | ||||
|  | ||||
| 	std::unique_ptr<CInputStream> stream(new CFileInputStream(baseDirectory / fileList.at(resourceName))); | ||||
| 	return stream; | ||||
| 	return make_unique<CFileInputStream>(baseDirectory / fileList.at(resourceName)); | ||||
| } | ||||
|  | ||||
| bool CFilesystemLoader::existsResource(const ResourceID & resourceName) const | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
| #include "ISimpleResourceLoader.h" | ||||
| #include "ResourceID.h" | ||||
|  | ||||
| class CFileInfo; | ||||
| class CInputStream; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -86,7 +86,7 @@ std::unordered_map<ResourceID, unz64_file_pos> CZipLoader::listFiles(const std:: | ||||
|  | ||||
| std::unique_ptr<CInputStream> CZipLoader::load(const ResourceID & resourceName) const | ||||
| { | ||||
| 	return std::unique_ptr<CInputStream>(new CZipStream(archiveName, files.at(resourceName))); | ||||
| 	return make_unique<CZipStream>(archiveName, files.at(resourceName)); | ||||
| } | ||||
|  | ||||
| bool CZipLoader::existsResource(const ResourceID & resourceName) const | ||||
|   | ||||
| @@ -1,8 +1,6 @@ | ||||
| #include "StdInc.h" | ||||
| #include "Filesystem.h" | ||||
|  | ||||
| #include "CFileInfo.h" | ||||
|  | ||||
| #include "CArchiveLoader.h" | ||||
| #include "CFilesystemLoader.h" | ||||
| #include "AdapterLoaders.h" | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| #include "StdInc.h" | ||||
| #include "ResourceID.h" | ||||
|  | ||||
| #include "CFileInfo.h" | ||||
| #include "FileInfo.h" | ||||
|  | ||||
| // trivial to_upper that completely ignores localization and only work with ASCII | ||||
| // Technically not a problem since | ||||
| @@ -23,28 +22,45 @@ static inline void toUpper(std::string & string) | ||||
| 	for (char & symbol : string) | ||||
| 		toUpper(symbol); | ||||
| } | ||||
|  | ||||
| #else | ||||
| static inline void toUpper(std::string & string) | ||||
| { | ||||
| 	boost::to_upper(string); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static inline EResType::Type readType(const std::string& name) | ||||
| { | ||||
| 	return EResTypeHelper::getTypeFromExtension(FileInfo::GetExtension(name).to_string()); | ||||
| } | ||||
|  | ||||
| static inline std::string readName(std::string name) | ||||
| { | ||||
| 	const auto dotPos = name.find_last_of('.'); | ||||
|  | ||||
| 	if (dotPos != std::string::npos) | ||||
| 		name.resize(dotPos); | ||||
|  | ||||
| 	toUpper(name); | ||||
|  | ||||
| 	return name; | ||||
| } | ||||
|  | ||||
| ResourceID::ResourceID() | ||||
| 	:type(EResType::OTHER) | ||||
| { | ||||
| } | ||||
|  | ||||
| ResourceID::ResourceID(std::string name) | ||||
| 	:type(EResType::UNDEFINED) | ||||
| ResourceID::ResourceID(std::string name_) | ||||
| 	:type{readType(name_)}, | ||||
| 	name{readName(std::move(name_))} | ||||
| { | ||||
| 	CFileInfo info(std::move(name)); | ||||
| 	setType(info.getType()); | ||||
| 	setName(info.getStem()); | ||||
| } | ||||
|  | ||||
| ResourceID::ResourceID(std::string name, EResType::Type type) | ||||
| 	:type(EResType::UNDEFINED) | ||||
| ResourceID::ResourceID(std::string name_, EResType::Type type_) | ||||
| 	:type{type_}, | ||||
| 	name{readName(std::move(name_))} | ||||
| { | ||||
| 	setType(type); | ||||
| 	setName(std::move(name)); | ||||
| } | ||||
|  | ||||
| std::string ResourceID::getName() const | ||||
| @@ -56,7 +72,7 @@ EResType::Type ResourceID::getType() const | ||||
| { | ||||
| 	return type; | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| void ResourceID::setName(std::string name) | ||||
| { | ||||
| 	// setName shouldn't be used if type is UNDEFINED | ||||
| @@ -72,26 +88,17 @@ void ResourceID::setName(std::string name) | ||||
| 		this->name.erase(dotPos); | ||||
| 	} | ||||
|  | ||||
| #ifdef ENABLE_TRIVIAL_TOUPPER | ||||
| 	toUpper(this->name); | ||||
| #else | ||||
| 	// strangely enough but this line takes 40-50% of filesystem loading time | ||||
| 	boost::to_upper(this->name); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void ResourceID::setType(EResType::Type type) | ||||
| { | ||||
| 	this->type = type; | ||||
| } | ||||
|  | ||||
| #endif | ||||
| EResType::Type EResTypeHelper::getTypeFromExtension(std::string extension) | ||||
| { | ||||
| #ifdef ENABLE_TRIVIAL_TOUPPER | ||||
| 	toUpper(extension); | ||||
| #else | ||||
| 	boost::to_upper(extension); | ||||
| #endif | ||||
|  | ||||
| 	static const std::map<std::string, EResType::Type> stringToRes = | ||||
| 	{ | ||||
|   | ||||
| @@ -100,18 +100,18 @@ public: | ||||
|  | ||||
| 	std::string getName() const; | ||||
| 	EResType::Type getType() const; | ||||
| 	void setName(std::string name); | ||||
| 	void setType(EResType::Type type); | ||||
| 	//void setName(std::string name); | ||||
| 	//void setType(EResType::Type type); | ||||
|  | ||||
| private: | ||||
| 	/** Specifies the resource name. No extension so .pcx and .png can override each other, always in upper case. **/ | ||||
| 	std::string name; | ||||
|  | ||||
| 	/** | ||||
| 	 * Specifies the resource type. EResType::OTHER if not initialized. | ||||
| 	 * Required to prevent conflicts if files with different types (e.g. text and image) have the same name. | ||||
| 	 */ | ||||
| 	EResType::Type type; | ||||
|  | ||||
| 	/** Specifies the resource name. No extension so .pcx and .png can override each other, always in upper case. **/ | ||||
| 	std::string name; | ||||
| }; | ||||
|  | ||||
| namespace std | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #include "StdInc.h" | ||||
|  | ||||
| #include "../lib/filesystem/Filesystem.h" | ||||
| #include "../lib/filesystem/CFileInfo.h" | ||||
| #include "../lib/filesystem/FileInfo.h" | ||||
| #include "../lib/int3.h" | ||||
| #include "../lib/mapping/CCampaignHandler.h" | ||||
| #include "../lib/StartInfo.h" | ||||
| @@ -2362,13 +2362,13 @@ void CGameHandler::sendAndApply( NewStructures * info ) | ||||
| void CGameHandler::save(const std::string & filename ) | ||||
| { | ||||
|     logGlobal->infoStream() << "Saving to " << filename; | ||||
| 	CFileInfo info(filename); | ||||
| 	//CResourceHandler::get("local")->createResource(info.getStem() + ".vlgm1"); | ||||
| 	CResourceHandler::get("local")->createResource(info.getStem() + ".vsgm1"); | ||||
| 	const auto stem	= FileInfo::GetPathStem(filename); | ||||
| 	const auto savefname = stem.to_string() + ".vsgm1"; | ||||
| 	CResourceHandler::get("local")->createResource(savefname); | ||||
|  | ||||
| 	{ | ||||
|         logGlobal->infoStream() << "Ordering clients to serialize..."; | ||||
| 		SaveGame sg(info.getStem() + ".vcgm1"); | ||||
| 		SaveGame sg(savefname); | ||||
| 		sendToAllClients(&sg); | ||||
| 	} | ||||
|  | ||||
| @@ -2383,7 +2383,7 @@ void CGameHandler::save(const std::string & filename ) | ||||
| // 		} | ||||
|  | ||||
| 		{ | ||||
| 			CSaveFile save(*CResourceHandler::get("local")->getResourceName(ResourceID(info.getStem(), EResType::SERVER_SAVEGAME))); | ||||
| 			CSaveFile save(*CResourceHandler::get("local")->getResourceName(ResourceID(stem.to_string(), EResType::SERVER_SAVEGAME))); | ||||
| 			saveCommonState(save); | ||||
|             logGlobal->infoStream() << "Saving server state"; | ||||
| 			save << *this; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user