Fix issue #134
This commit is contained in:
		
							parent
							
								
									c7890e7a49
								
							
						
					
					
						commit
						8bb115d6d4
					
				
							
								
								
									
										3
									
								
								init.lua
								
								
								
								
							
							
						
						
									
										3
									
								
								init.lua
								
								
								
								
							|  | @ -7,9 +7,6 @@ g_logger.setLogFile(g_resources.getWorkDir() .. g_app.getCompactName() .. ".log" | |||
| -- print first terminal message | ||||
| g_logger.info(g_app.getName() .. ' ' .. g_app.getVersion() .. ' rev ' .. g_app.getBuildRevision() .. ' (' .. g_app.getBuildCommit() .. ') built on ' .. g_app.getBuildDate() .. ' for arch ' .. g_app.getBuildArch()) | ||||
| 
 | ||||
| --add base folder to search path | ||||
| g_resources.addSearchPath(g_resources.getWorkDir()) | ||||
| 
 | ||||
| -- add modules directory to the search path | ||||
| if not g_resources.addSearchPath(g_resources.getWorkDir() .. "modules", true) then | ||||
|   g_logger.fatal("Unable to add modules directory to the search path.") | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ void Logger::fireOldMessages() | |||
| 
 | ||||
| void Logger::setLogFile(const std::string& file) | ||||
| { | ||||
|     m_outFile.open(file.c_str(), std::ios::out | std::ios::app); | ||||
|     m_outFile.open(stdext::utf8_to_latin1(file.c_str()).c_str(), std::ios::out | std::ios::app); | ||||
|     if(!m_outFile.is_open() || !m_outFile.good()) { | ||||
|         g_logger.error(stdext::format("Unable to save log to '%s'", file)); | ||||
|         return; | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ ResourceManager g_resources; | |||
| void ResourceManager::init(const char *argv0) | ||||
| { | ||||
|     PHYSFS_init(argv0); | ||||
|     PHYSFS_permitSymbolicLinks(1); | ||||
| } | ||||
| 
 | ||||
| void ResourceManager::terminate() | ||||
|  | @ -44,21 +45,23 @@ void ResourceManager::terminate() | |||
| void ResourceManager::discoverWorkDir(const std::string& appName, const std::string& existentFile) | ||||
| { | ||||
|     // search for modules directory
 | ||||
|     std::string sep = PHYSFS_getDirSeparator(); | ||||
|     std::string possiblePaths[] = { boost::filesystem::current_path().generic_string() + sep, | ||||
|                                     g_resources.getBaseDir() + ".." + sep, | ||||
|                                     g_resources.getBaseDir() + ".." + sep + "share" + sep + appName + sep, | ||||
|                                     g_resources.getBaseDir() + appName + sep }; | ||||
|     std::string possiblePaths[] = { g_resources.getCurrentDir(), | ||||
|                                     g_resources.getBaseDir() + "../", | ||||
|                                     g_resources.getBaseDir() + "../share/" + appName + "/", | ||||
|                                     g_resources.getBaseDir() + appName + "/" }; | ||||
| 
 | ||||
|     bool found = false; | ||||
|     for(const std::string& dir : possiblePaths) { | ||||
|         // try to directory to modules path to see if it exists
 | ||||
|         std::ifstream fin(dir + existentFile); | ||||
|         if(fin) { | ||||
|         if(!PHYSFS_addToSearchPath(dir.c_str(), 0)) | ||||
|             continue; | ||||
| 
 | ||||
|         if(PHYSFS_exists(existentFile.c_str())) { | ||||
|             g_logger.debug(stdext::format("Found work dir at '%s'", dir.c_str())); | ||||
|             m_workDir = dir; | ||||
|             found = true; | ||||
|             break; | ||||
|         } | ||||
|         PHYSFS_removeFromSearchPath(dir.c_str()); | ||||
|     } | ||||
| 
 | ||||
|     if(!found) | ||||
|  | @ -75,13 +78,18 @@ bool ResourceManager::setupUserWriteDir(const std::string& appWriteDirName) | |||
|     dirName = appWriteDirName; | ||||
| #endif | ||||
|     std::string writeDir = userDir + dirName; | ||||
|      | ||||
|     if(!PHYSFS_setWriteDir(writeDir.c_str())) { | ||||
|         if(!PHYSFS_setWriteDir(userDir.c_str()) || !PHYSFS_mkdir(dirName.c_str())) { | ||||
|             g_logger.error(stdext::format("Unable to create write directory '%s': %s", writeDir, PHYSFS_getLastError())); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     return setWriteDir(writeDir); | ||||
| } | ||||
| 
 | ||||
| bool ResourceManager::setWriteDir(const std::string& writeDir, bool create) | ||||
| { | ||||
|     boost::filesystem::create_directory(writeDir); | ||||
| 
 | ||||
|     if(!PHYSFS_setWriteDir(writeDir.c_str())) { | ||||
|         g_logger.error(stdext::format("Unable to set write directory '%s': %s", writeDir, PHYSFS_getLastError())); | ||||
|         return false; | ||||
|  | @ -113,7 +121,7 @@ bool ResourceManager::addSearchPath(const std::string& path, bool pushFront) | |||
|         } | ||||
| 
 | ||||
|         if(!found) { | ||||
|             g_logger.error(stdext::format("Could not add '%s' to directory search path. Reason %s", path, PHYSFS_getLastError())); | ||||
|             //g_logger.error(stdext::format("Could not add '%s' to directory search path. Reason %s", path, PHYSFS_getLastError()));
 | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | @ -121,7 +129,6 @@ bool ResourceManager::addSearchPath(const std::string& path, bool pushFront) | |||
|         m_searchPaths.push_front(savePath); | ||||
|     else | ||||
|         m_searchPaths.push_back(savePath); | ||||
|     m_hasSearchPath = true; | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
|  | @ -161,31 +168,21 @@ bool ResourceManager::directoryExists(const std::string& directoryName) | |||
| void ResourceManager::loadFile(const std::string& fileName, std::iostream& out) | ||||
| { | ||||
|     out.clear(std::ios::goodbit); | ||||
|     if(m_hasSearchPath) { | ||||
|         std::string fullPath = resolvePath(fileName); | ||||
|         PHYSFS_file* file = PHYSFS_openRead(fullPath.c_str()); | ||||
|         if(!file) { | ||||
|             out.clear(std::ios::failbit); | ||||
|             stdext::throw_exception(stdext::format("unable to load file '%s': %s", fullPath.c_str(), PHYSFS_getLastError())); | ||||
|         } else { | ||||
|             int fileSize = PHYSFS_fileLength(file); | ||||
|             if(fileSize > 0) { | ||||
|                 std::vector<char> buffer(fileSize); | ||||
|                 PHYSFS_read(file, (void*)&buffer[0], 1, fileSize); | ||||
|                 out.write(&buffer[0], fileSize); | ||||
|             } else | ||||
|                 out.clear(std::ios::eofbit); | ||||
|             PHYSFS_close(file); | ||||
|             out.seekg(0, std::ios::beg); | ||||
|         } | ||||
|     std::string fullPath = resolvePath(fileName); | ||||
|     PHYSFS_file* file = PHYSFS_openRead(fullPath.c_str()); | ||||
|     if(!file) { | ||||
|         out.clear(std::ios::failbit); | ||||
|         stdext::throw_exception(stdext::format("unable to load file '%s': %s", fullPath.c_str(), PHYSFS_getLastError())); | ||||
|     } else { | ||||
|         std::ifstream fin(fileName); | ||||
|         if(!fin) { | ||||
|             out.clear(std::ios::failbit); | ||||
|             stdext::throw_exception(stdext::format("unable to load file '%s': %s", fileName.c_str(), PHYSFS_getLastError())); | ||||
|         } else { | ||||
|             out << fin.rdbuf(); | ||||
|         } | ||||
|         int fileSize = PHYSFS_fileLength(file); | ||||
|         if(fileSize > 0) { | ||||
|             std::vector<char> buffer(fileSize); | ||||
|             PHYSFS_read(file, (void*)&buffer[0], 1, fileSize); | ||||
|             out.write(&buffer[0], fileSize); | ||||
|         } else | ||||
|             out.clear(std::ios::eofbit); | ||||
|         PHYSFS_close(file); | ||||
|         out.seekg(0, std::ios::beg); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -300,8 +297,17 @@ std::string ResourceManager::getRealDir(const std::string& path) | |||
|     return dir; | ||||
| } | ||||
| 
 | ||||
| std::string ResourceManager::getBaseDir() | ||||
| std::string ResourceManager::getCurrentDir() | ||||
| { | ||||
|     return PHYSFS_getBaseDir(); | ||||
|     char buffer[2048]; | ||||
|     PHYSFS_utf8FromLatin1((boost::filesystem::current_path().generic_string() + "/").c_str(), buffer, 2048); | ||||
|     return buffer; | ||||
| } | ||||
| 
 | ||||
| std::string ResourceManager::getBaseDir() | ||||
| { | ||||
|     char buffer[2048]; | ||||
|     PHYSFS_utf8FromLatin1(PHYSFS_getBaseDir(), buffer, 2048); | ||||
|     return buffer; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -64,6 +64,7 @@ public: | |||
| 
 | ||||
|     std::string resolvePath(const std::string& path); | ||||
|     std::string getRealDir(const std::string& path); | ||||
|     std::string getCurrentDir(); | ||||
|     std::string getBaseDir(); | ||||
|     std::string getWriteDir() { return m_writeDir; } | ||||
|     std::string getWorkDir() { return m_workDir; } | ||||
|  | @ -72,7 +73,6 @@ public: | |||
| private: | ||||
|     std::string m_workDir; | ||||
|     std::string m_writeDir; | ||||
|     stdext::boolean<false> m_hasSearchPath; | ||||
|     std::deque<std::string> m_searchPaths; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -946,7 +946,7 @@ std::string WIN32Window::getClipboardText() | |||
|     if(hglb) { | ||||
|         LPTSTR lptstr = (LPTSTR)GlobalLock(hglb); | ||||
|         if(lptstr) { | ||||
|             text = stdext::utf8_to_latin1((uchar*)lptstr); | ||||
|             text = stdext::utf8_to_latin1(lptstr); | ||||
|             GlobalUnlock(hglb); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -1056,7 +1056,7 @@ std::string X11Window::getClipboardText() | |||
|                             &bytesLeft, | ||||
|                             &data); | ||||
|         if(len > 0) { | ||||
|             clipboardText = stdext::utf8_to_latin1(data); | ||||
|             clipboardText = stdext::utf8_to_latin1((char*)data); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -67,9 +67,9 @@ uint64_t hex_to_dec(const std::string& str) | |||
|     return num; | ||||
| } | ||||
| 
 | ||||
| std::string utf8_to_latin1(uchar *utf8) | ||||
| std::string utf8_to_latin1(const std::string& src) | ||||
| { | ||||
|     auto utf8CharToLatin1 = [](uchar *utf8, int *read) -> char { | ||||
|     auto utf8CharToLatin1 = [](const uchar *utf8, int *read) -> char { | ||||
|         char c = '?'; | ||||
|         uchar opt1 = utf8[0]; | ||||
|         *read = 1; | ||||
|  | @ -89,10 +89,10 @@ std::string utf8_to_latin1(uchar *utf8) | |||
|     }; | ||||
| 
 | ||||
|     std::string out; | ||||
|     int len = strlen((char*)utf8); | ||||
|     int len = src.length(); | ||||
|     for(int i=0; i<len;) { | ||||
|         int read = 0; | ||||
|         uchar *utf8char = &utf8[i]; | ||||
|         uchar *utf8char = (uchar*)&src[i]; | ||||
|         out += utf8CharToLatin1(utf8char, &read); | ||||
|         i += read; | ||||
|     } | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ std::string date_time_string(); | |||
| 
 | ||||
| std::string dec_to_hex(uint64_t num); | ||||
| uint64_t hex_to_dec(const std::string& str); | ||||
| std::string utf8_to_latin1(uchar *utf8); | ||||
| std::string utf8_to_latin1(const std::string& src); | ||||
| void tolower(std::string& str); | ||||
| void toupper(std::string& str); | ||||
| void trim(std::string& str); | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ int main(int argc, const char* argv[]) | |||
| 
 | ||||
|     // find script init.lua and run it
 | ||||
|     g_resources.discoverWorkDir(g_app.getCompactName(), "init.lua"); | ||||
|     if(!g_lua.safeRunScript(g_resources.getWorkDir() + "init.lua")) | ||||
|     if(!g_lua.safeRunScript("init.lua")) | ||||
|         g_logger.fatal("Unable to run script init.lua!"); | ||||
| 
 | ||||
|     // the run application main loop
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eduardo Bart
						Eduardo Bart