123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #include "StdInc.h"
- #include "ResourceID.h"
- #include "FileInfo.h"
- // trivial to_upper that completely ignores localization and only work with ASCII
- // Technically not a problem since
- // 1) Right now VCMI does not supports unicode in filenames on Win
- // 2) Filesystem case-sensivity is only problem for H3 data which uses ASCII-only symbols
- // for me (Ivan) this define gives notable decrease in loading times
- // #define ENABLE_TRIVIAL_TOUPPER
- #ifdef ENABLE_TRIVIAL_TOUPPER
- static inline void toUpper(char & symbol)
- {
- static const int diff = 'a' - 'A';
- if (symbol >= 'a' && symbol <= 'z')
- symbol -= diff;
- }
- 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{readType(name_)},
- name{readName(std::move(name_))}
- {
- }
- ResourceID::ResourceID(std::string name_, EResType::Type type_)
- :type{type_},
- name{readName(std::move(name_))}
- {
- }
- std::string ResourceID::getName() const
- {
- return name;
- }
- EResType::Type ResourceID::getType() const
- {
- return type;
- }
- #if 0
- void ResourceID::setName(std::string name)
- {
- // setName shouldn't be used if type is UNDEFINED
- assert(type != EResType::UNDEFINED);
- this->name = std::move(name);
- size_t dotPos = this->name.find_last_of("/.");
- if(dotPos != std::string::npos && this->name[dotPos] == '.'
- && this->type == EResTypeHelper::getTypeFromExtension(this->name.substr(dotPos)))
- {
- this->name.erase(dotPos);
- }
- toUpper(this->name);
- }
- void ResourceID::setType(EResType::Type type)
- {
- this->type = type;
- }
- #endif
- EResType::Type EResTypeHelper::getTypeFromExtension(std::string extension)
- {
- toUpper(extension);
- static const std::map<std::string, EResType::Type> stringToRes =
- {
- {".TXT", EResType::TEXT},
- {".JSON", EResType::TEXT},
- {".DEF", EResType::ANIMATION},
- {".MSK", EResType::MASK},
- {".MSG", EResType::MASK},
- {".H3C", EResType::CAMPAIGN},
- {".H3M", EResType::MAP},
- {".FNT", EResType::BMP_FONT},
- {".TTF", EResType::TTF_FONT},
- {".BMP", EResType::IMAGE},
- {".JPG", EResType::IMAGE},
- {".PCX", EResType::IMAGE},
- {".PNG", EResType::IMAGE},
- {".TGA", EResType::IMAGE},
- {".WAV", EResType::SOUND},
- {".82M", EResType::SOUND},
- {".SMK", EResType::VIDEO},
- {".BIK", EResType::VIDEO},
- {".MJPG", EResType::VIDEO},
- {".MPG", EResType::VIDEO},
- {".AVI", EResType::VIDEO},
- {".MP3", EResType::MUSIC},
- {".OGG", EResType::MUSIC},
- {".FLAC", EResType::MUSIC},
- {".ZIP", EResType::ARCHIVE_ZIP},
- {".LOD", EResType::ARCHIVE_LOD},
- {".PAC", EResType::ARCHIVE_LOD},
- {".VID", EResType::ARCHIVE_VID},
- {".SND", EResType::ARCHIVE_SND},
- {".PAL", EResType::PALETTE},
- {".VCGM1", EResType::CLIENT_SAVEGAME},
- {".VSGM1", EResType::SERVER_SAVEGAME},
- {".ERM", EResType::ERM},
- {".ERT", EResType::ERT},
- {".ERS", EResType::ERS}
- };
- auto iter = stringToRes.find(extension);
- if (iter == stringToRes.end())
- return EResType::OTHER;
- return iter->second;
- }
- std::string EResTypeHelper::getEResTypeAsString(EResType::Type type)
- {
- #define MAP_ENUM(value) {EResType::value, #value},
- static const std::map<EResType::Type, std::string> stringToRes =
- {
- MAP_ENUM(TEXT)
- MAP_ENUM(ANIMATION)
- MAP_ENUM(MASK)
- MAP_ENUM(CAMPAIGN)
- MAP_ENUM(MAP)
- MAP_ENUM(BMP_FONT)
- MAP_ENUM(TTF_FONT)
- MAP_ENUM(IMAGE)
- MAP_ENUM(VIDEO)
- MAP_ENUM(SOUND)
- MAP_ENUM(MUSIC)
- MAP_ENUM(ARCHIVE_ZIP)
- MAP_ENUM(ARCHIVE_LOD)
- MAP_ENUM(ARCHIVE_SND)
- MAP_ENUM(ARCHIVE_VID)
- MAP_ENUM(PALETTE)
- MAP_ENUM(CLIENT_SAVEGAME)
- MAP_ENUM(SERVER_SAVEGAME)
- MAP_ENUM(DIRECTORY)
- MAP_ENUM(ERM)
- MAP_ENUM(ERT)
- MAP_ENUM(ERS)
- MAP_ENUM(OTHER)
- };
- #undef MAP_ENUM
- auto iter = stringToRes.find(type);
- assert(iter != stringToRes.end());
- return iter->second;
- }
|