#pragma once #include "IEngine.h" #include "IFileSystem.h" #include #include #include #include class CFileLoader { public: CFileLoader(IEngine* ar_Engine_) : m_Engine(ar_Engine_),m_CurrentLineOfCode(0), m_File(NULL),m_EndSectionMarker("}") {} virtual ~CFileLoader(); bool LoadFile(string16 argFilename); const std::string& get_CurrentSection() const { return m_CurrentSection; } virtual bool OnSectionBegin(const std::string& argContentName, const std::vector& argContentToken) { return true; } virtual bool OnContentReceived(const std::vector& argContentToken, const std::string& argContentData) { return true; } virtual bool OnSectionEnd(const std::string& argContentName) { return true; } unsigned int get_CurrentLineNumber() const { return m_CurrentLineOfCode; } protected: std::vector SplitString(const std::string & argString, const std::string & argDelimiters=", \t\r") { // Skip delims at beginning, find start of first token std::string::size_type lastPos = argString.find_first_not_of(argDelimiters, 0); // Find next delimiter @ end of token std::string::size_type pos = argString.find_first_of(argDelimiters, lastPos); // output vector std::vector tokens; while (std::string::npos != pos || std::string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(argString.substr(lastPos, pos - lastPos)); // Skip delims. Note the "not_of". this is beginning of token lastPos = argString.find_first_not_of(argDelimiters, pos); // Find next delimiter at end of token. pos = argString.find_first_of(argDelimiters, lastPos); } return tokens; } std::wstring ConvertToString16(const std::string& argString) const { int codePage = 0; if (argString.size() == 0) return std::wstring(); int length = ::MultiByteToWideChar(codePage, 0, argString.c_str(), argString.size() + 1, NULL, 0); if (length == 0) return std::wstring(); wchar_t* newString = new wchar_t[length]; ::MultiByteToWideChar(codePage, 0, argString.c_str(), argString.size() + 1, newString, length); return std::wstring(newString); } IEngine* m_Engine; void FreeFile(); private: std::string m_CurrentSection; IFile* m_File; std::string m_EndSectionMarker; unsigned int m_CurrentLineOfCode; };