Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 5, 2009, 10:15:05 PM (15 years ago)
Author:
rgrieder
Message:

Also synchronised sandbox_light with current trunk.

Location:
sandbox_light
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sandbox_light

  • sandbox_light/src/libraries/core/Core.cc

    r5789 r6040  
    3737
    3838#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>
    4441
    4542#ifdef ORXONOX_PLATFORM_WINDOWS
     
    5047#  undef min
    5148#  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"
    6152#include "util/Debug.h"
    6253#include "util/Exception.h"
    6354#include "util/SignalHandler.h"
    64 #include "Clock.h"
    65 #include "CommandLine.h"
     55#include "PathConfig.h"
     56#include "CommandLineParser.h"
    6657#include "LuaState.h"
    67 
    68 // Boost 1.36 has some issues with deprecated functions that have been omitted
    69 #if (BOOST_VERSION == 103600)
    70 #  define BOOST_LEAF_FUNCTION filename
    71 #else
    72 #  define BOOST_LEAF_FUNCTION leaf
    73 #endif
    7458
    7559namespace orxonox
     
    7862    Core* Core::singletonPtr_s  = 0;
    7963
    80     SetCommandLineOnlyArgument(writingPathSuffix, "").information("Additional subfolder for config and log files");
    8164    SetCommandLineArgument(settingsFile, "orxonox.ini").information("THE configuration file");
    8265#ifdef ORXONOX_PLATFORM_WINDOWS
     
    151134        int softDebugLevelShell_;                       //!< The debug level for the ingame shell
    152135        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 pahts
    155         boost::filesystem::path rootPath_;
    156         boost::filesystem::path executablePath_;        //!< Path to the executable
    157         boost::filesystem::path dataPath_;              //!< Path to the data file folder
    158         boost::filesystem::path configPath_;            //!< Path to the config file folder
    159         boost::filesystem::path logPath_;               //!< Path to the log file folder
    160136    };
    161137
     
    164140        // Cleanup guard for identifier destruction (incl. XMLPort, configValues, consoleCommands)
    165141        : configuration_(new CoreConfiguration()) // Don't yet create config values!
    166         , bDevRun_(false)
    167142    {
    168143        // Set the hard coded fixed paths
    169         this->setFixedPaths();
     144        this->pathConfig_.reset(new PathConfig());
    170145
    171146        // Parse command line arguments AFTER the modules have been loaded (static code!)
    172         CommandLine::parseCommandLine(cmdLine);
     147        CommandLineParser::parseCommandLine(cmdLine);
    173148
    174149        // Set configurable paths like log, config and media
    175         this->setConfigurablePaths();
     150        this->pathConfig_->setConfigurablePaths();
    176151
    177152        // create a signal handler (only active for linux)
    178153        // This call is placed as soon as possible, but after the directories are set
    179154        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");
    181156
    182157        // 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());
    184159
    185160        // Parse additional options file now that we know its path
    186         CommandLine::parseFile();
     161        CommandLineParser::parseFile();
    187162
    188163#ifdef ORXONOX_PLATFORM_WINDOWS
     
    190165        // do this after ogre has initialised. Somehow Ogre changes the settings again (not through
    191166        // the timer though).
    192         int limitToCPU = CommandLine::getValue("limitToCPU");
     167        int limitToCPU = CommandLineParser::getValue("limitToCPU");
    193168        if (limitToCPU > 0)
    194169            setThreadAffinity(static_cast<unsigned int>(limitToCPU));
     
    250225    }
    251226
    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 
    288227    /**
    289228    @note
     
    331270#endif
    332271    }
    333 
    334     /**
    335     @brief
    336         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 we
    339         don't write the logs and config files to ~/.orxonox
    340     @throw
    341         GeneralException
    342     */
    343     void Core::setFixedPaths()
    344     {
    345         //////////////////////////
    346         // FIND EXECUTABLE PATH //
    347         //////////////////////////
    348 
    349 #ifdef ORXONOX_PLATFORM_WINDOWS
    350         // get executable module
    351         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 sure
    369                what the proper response is here.
    370                Since it really is an assert-like condition, aborting the
    371                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 #endif
    386 
    387         configuration_->executablePath_ = boost::filesystem::path(buffer);
    388 #ifndef ORXONOX_PLATFORM_APPLE
    389         configuration_->executablePath_ = configuration_->executablePath_.branch_path(); // remove executable name
    390 #endif
    391 
    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         else
    402         {
    403 
    404 #ifdef INSTALL_COPYABLE // --> relative paths
    405 
    406             // Also set the root path
    407             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 #endif
    416         }
    417     }
    418 
    419     /**
    420     @brief
    421         Sets config, log and media path and creates folders if necessary.
    422     @throws
    423         GeneralException
    424     */
    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         else
    434         {
    435 
    436 #ifdef INSTALL_COPYABLE // --> relative paths
    437 
    438             // Using paths relative to the install prefix, complete them
    439             configuration_->dataPath_   = configuration_->rootPath_ / specialConfig::defaultDataPath;
    440             configuration_->configPath_ = configuration_->rootPath_ / specialConfig::defaultConfigPath;
    441             configuration_->logPath_    = configuration_->rootPath_ / specialConfig::defaultLogPath;
    442 
    443 #else
    444 
    445             configuration_->dataPath_  = specialConfig::dataInstallDirectory;
    446 
    447             // Get user directory
    448 #  ifdef ORXONOX_PLATFORM_UNIX /* Apple? */
    449             char* userDataPathPtr(getenv("HOME"));
    450 #  else
    451             char* userDataPathPtr(getenv("APPDATA"));
    452 #  endif
    453             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 #endif
    462 
    463         }
    464 
    465         // Option to put all the config and log files in a separate folder
    466         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     }
    492272}
Note: See TracChangeset for help on using the changeset viewer.