Changeset 6040 for sandbox_light/src/libraries/core/Core.cc
- Timestamp:
- Nov 5, 2009, 10:15:05 PM (15 years ago)
- Location:
- sandbox_light
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
sandbox_light
- Property svn:mergeinfo changed
-
sandbox_light/src/libraries/core/Core.cc
r5789 r6040 37 37 38 38 #include <cassert> 39 #include <fstream> 40 #include <cstdlib> 41 #include <cstdio> 42 #include <boost/version.hpp> 43 #include <boost/filesystem.hpp> 39 #include <ctime> 40 #include <vector> 44 41 45 42 #ifdef ORXONOX_PLATFORM_WINDOWS … … 50 47 # undef min 51 48 # undef max 52 #elif defined(ORXONOX_PLATFORM_APPLE) 53 # include <sys/param.h> 54 # include <mach-o/dyld.h> 55 #else /* Linux */ 56 # include <sys/types.h> 57 # include <unistd.h> 58 #endif 59 60 #include "SpecialConfig.h" 49 #endif 50 51 #include "util/Clock.h" 61 52 #include "util/Debug.h" 62 53 #include "util/Exception.h" 63 54 #include "util/SignalHandler.h" 64 #include " Clock.h"65 #include "CommandLine .h"55 #include "PathConfig.h" 56 #include "CommandLineParser.h" 66 57 #include "LuaState.h" 67 68 // Boost 1.36 has some issues with deprecated functions that have been omitted69 #if (BOOST_VERSION == 103600)70 # define BOOST_LEAF_FUNCTION filename71 #else72 # define BOOST_LEAF_FUNCTION leaf73 #endif74 58 75 59 namespace orxonox … … 78 62 Core* Core::singletonPtr_s = 0; 79 63 80 SetCommandLineOnlyArgument(writingPathSuffix, "").information("Additional subfolder for config and log files");81 64 SetCommandLineArgument(settingsFile, "orxonox.ini").information("THE configuration file"); 82 65 #ifdef ORXONOX_PLATFORM_WINDOWS … … 151 134 int softDebugLevelShell_; //!< The debug level for the ingame shell 152 135 bool bInitializeRandomNumberGenerator_; //!< If true, srand(time(0)) is called 153 154 //! Path to the parent directory of the ones above if program was installed with relativ pahts155 boost::filesystem::path rootPath_;156 boost::filesystem::path executablePath_; //!< Path to the executable157 boost::filesystem::path dataPath_; //!< Path to the data file folder158 boost::filesystem::path configPath_; //!< Path to the config file folder159 boost::filesystem::path logPath_; //!< Path to the log file folder160 136 }; 161 137 … … 164 140 // Cleanup guard for identifier destruction (incl. XMLPort, configValues, consoleCommands) 165 141 : configuration_(new CoreConfiguration()) // Don't yet create config values! 166 , bDevRun_(false)167 142 { 168 143 // Set the hard coded fixed paths 169 this-> setFixedPaths();144 this->pathConfig_.reset(new PathConfig()); 170 145 171 146 // Parse command line arguments AFTER the modules have been loaded (static code!) 172 CommandLine ::parseCommandLine(cmdLine);147 CommandLineParser::parseCommandLine(cmdLine); 173 148 174 149 // Set configurable paths like log, config and media 175 this-> setConfigurablePaths();150 this->pathConfig_->setConfigurablePaths(); 176 151 177 152 // create a signal handler (only active for linux) 178 153 // This call is placed as soon as possible, but after the directories are set 179 154 this->signalHandler_.reset(new SignalHandler()); 180 this->signalHandler_->doCatch( configuration_->executablePath_.string(), Core::getLogPathString() + "orxonox_crash.log");155 this->signalHandler_->doCatch(PathConfig::getExecutablePathString(), PathConfig::getLogPathString() + "orxonox_crash.log"); 181 156 182 157 // Set the correct log path. Before this call, /tmp (Unix) or %TEMP% was used 183 OutputHandler::getOutStream().setLogPath( Core::getLogPathString());158 OutputHandler::getOutStream().setLogPath(PathConfig::getLogPathString()); 184 159 185 160 // Parse additional options file now that we know its path 186 CommandLine ::parseFile();161 CommandLineParser::parseFile(); 187 162 188 163 #ifdef ORXONOX_PLATFORM_WINDOWS … … 190 165 // do this after ogre has initialised. Somehow Ogre changes the settings again (not through 191 166 // the timer though). 192 int limitToCPU = CommandLine ::getValue("limitToCPU");167 int limitToCPU = CommandLineParser::getValue("limitToCPU"); 193 168 if (limitToCPU > 0) 194 169 setThreadAffinity(static_cast<unsigned int>(limitToCPU)); … … 250 225 } 251 226 252 /*static*/ const boost::filesystem::path& Core::getDataPath()253 {254 return getInstance().configuration_->dataPath_;255 }256 /*static*/ std::string Core::getDataPathString()257 {258 return getInstance().configuration_->dataPath_.string() + '/';259 }260 261 /*static*/ const boost::filesystem::path& Core::getConfigPath()262 {263 return getInstance().configuration_->configPath_;264 }265 /*static*/ std::string Core::getConfigPathString()266 {267 return getInstance().configuration_->configPath_.string() + '/';268 }269 270 /*static*/ const boost::filesystem::path& Core::getLogPath()271 {272 return getInstance().configuration_->logPath_;273 }274 /*static*/ std::string Core::getLogPathString()275 {276 return getInstance().configuration_->logPath_.string() + '/';277 }278 279 /*static*/ const boost::filesystem::path& Core::getRootPath()280 {281 return getInstance().configuration_->rootPath_;282 }283 /*static*/ std::string Core::getRootPathString()284 {285 return getInstance().configuration_->rootPath_.string() + '/';286 }287 288 227 /** 289 228 @note … … 331 270 #endif 332 271 } 333 334 /**335 @brief336 Retrievs the executable path and sets all hard coded fixed path (currently only the module path)337 Also checks for "orxonox_dev_build.keep_me" in the executable diretory.338 If found it means that this is not an installed run, hence we339 don't write the logs and config files to ~/.orxonox340 @throw341 GeneralException342 */343 void Core::setFixedPaths()344 {345 //////////////////////////346 // FIND EXECUTABLE PATH //347 //////////////////////////348 349 #ifdef ORXONOX_PLATFORM_WINDOWS350 // get executable module351 TCHAR buffer[1024];352 if (GetModuleFileName(NULL, buffer, 1024) == 0)353 ThrowException(General, "Could not retrieve executable path.");354 355 #elif defined(ORXONOX_PLATFORM_APPLE)356 char buffer[1024];357 unsigned long path_len = 1023;358 if (_NSGetExecutablePath(buffer, &path_len))359 ThrowException(General, "Could not retrieve executable path.");360 361 #else /* Linux */362 /* written by Nicolai Haehnle <prefect_@gmx.net> */363 364 /* Get our PID and build the name of the link in /proc */365 char linkname[64]; /* /proc/<pid>/exe */366 if (snprintf(linkname, sizeof(linkname), "/proc/%i/exe", getpid()) < 0)367 {368 /* This should only happen on large word systems. I'm not sure369 what the proper response is here.370 Since it really is an assert-like condition, aborting the371 program seems to be in order. */372 assert(false);373 }374 375 /* Now read the symbolic link */376 char buffer[1024];377 int ret;378 ret = readlink(linkname, buffer, 1024);379 /* In case of an error, leave the handling up to the caller */380 if (ret == -1)381 ThrowException(General, "Could not retrieve executable path.");382 383 /* Ensure proper NUL termination */384 buffer[ret] = 0;385 #endif386 387 configuration_->executablePath_ = boost::filesystem::path(buffer);388 #ifndef ORXONOX_PLATFORM_APPLE389 configuration_->executablePath_ = configuration_->executablePath_.branch_path(); // remove executable name390 #endif391 392 /////////////////////393 // SET MODULE PATH //394 /////////////////////395 396 if (boost::filesystem::exists(configuration_->executablePath_ / "orxonox_dev_build.keep_me"))397 {398 COUT(1) << "Running from the build tree." << std::endl;399 Core::bDevRun_ = true;400 }401 else402 {403 404 #ifdef INSTALL_COPYABLE // --> relative paths405 406 // Also set the root path407 boost::filesystem::path relativeExecutablePath(specialConfig::defaultRuntimePath);408 configuration_->rootPath_ = configuration_->executablePath_;409 while (!boost::filesystem::equivalent(configuration_->rootPath_ / relativeExecutablePath, configuration_->executablePath_)410 && !configuration_->rootPath_.empty())411 configuration_->rootPath_ = configuration_->rootPath_.branch_path();412 if (configuration_->rootPath_.empty())413 ThrowException(General, "Could not derive a root directory. Might the binary installation directory contain '..' when taken relative to the installation prefix path?");414 415 #endif416 }417 }418 419 /**420 @brief421 Sets config, log and media path and creates folders if necessary.422 @throws423 GeneralException424 */425 void Core::setConfigurablePaths()426 {427 if (Core::isDevelopmentRun())428 {429 configuration_->dataPath_ = specialConfig::dataDevDirectory;430 configuration_->configPath_ = specialConfig::configDevDirectory;431 configuration_->logPath_ = specialConfig::logDevDirectory;432 }433 else434 {435 436 #ifdef INSTALL_COPYABLE // --> relative paths437 438 // Using paths relative to the install prefix, complete them439 configuration_->dataPath_ = configuration_->rootPath_ / specialConfig::defaultDataPath;440 configuration_->configPath_ = configuration_->rootPath_ / specialConfig::defaultConfigPath;441 configuration_->logPath_ = configuration_->rootPath_ / specialConfig::defaultLogPath;442 443 #else444 445 configuration_->dataPath_ = specialConfig::dataInstallDirectory;446 447 // Get user directory448 # ifdef ORXONOX_PLATFORM_UNIX /* Apple? */449 char* userDataPathPtr(getenv("HOME"));450 # else451 char* userDataPathPtr(getenv("APPDATA"));452 # endif453 if (userDataPathPtr == NULL)454 ThrowException(General, "Could not retrieve user data path.");455 boost::filesystem::path userDataPath(userDataPathPtr);456 userDataPath /= ".orxonox";457 458 configuration_->configPath_ = userDataPath / specialConfig::defaultConfigPath;459 configuration_->logPath_ = userDataPath / specialConfig::defaultLogPath;460 461 #endif462 463 }464 465 // Option to put all the config and log files in a separate folder466 if (!CommandLine::getArgument("writingPathSuffix")->hasDefaultValue())467 {468 std::string directory(CommandLine::getValue("writingPathSuffix").getString());469 configuration_->configPath_ = configuration_->configPath_ / directory;470 configuration_->logPath_ = configuration_->logPath_ / directory;471 }472 473 // Create directories to avoid problems when opening files in non existent folders.474 std::vector<std::pair<boost::filesystem::path, std::string> > directories;475 directories.push_back(std::make_pair(boost::filesystem::path(configuration_->configPath_), "config"));476 directories.push_back(std::make_pair(boost::filesystem::path(configuration_->logPath_), "log"));477 478 for (std::vector<std::pair<boost::filesystem::path, std::string> >::iterator it = directories.begin();479 it != directories.end(); ++it)480 {481 if (boost::filesystem::exists(it->first) && !boost::filesystem::is_directory(it->first))482 {483 ThrowException(General, std::string("The ") + it->second + " directory has been preoccupied by a file! \484 Please remove " + it->first.string());485 }486 if (boost::filesystem::create_directories(it->first)) // function may not return true at all (bug?)487 {488 COUT(4) << "Created " << it->second << " directory" << std::endl;489 }490 }491 }492 272 }
Note: See TracChangeset
for help on using the changeset viewer.