//---------------------------------------------------- // Auteur : Yoann // Date de création : Mars 2019 // Description : Gestionnaire des commandes passés à // l'executable. //---------------------------------------------------- #include "Framework.h" using namespace fw; template<> CommandLineManager* Singleton<CommandLineManager>::ms_instance = nullptr; /********************************** Déclaration de la classe Parameter **********************************/ // Format : -PARAM ARG1 ARG2... Parameter::Parameter(const std::string& sName) : m_sName(sName) { } Parameter::~Parameter() { } // On ajoute les arg1, arg2 à la suite des un et des autres void Parameter::PushArgument(const std::string& sArgument) { m_vArguments.push_back(sArgument); } const std::string& Parameter::GetName() const { return m_sName; } const char* Parameter::GetArgument(uint32 iArgumentNumber) const { if (iArgumentNumber < m_vArguments.size()) return m_vArguments[iArgumentNumber].c_str(); else return UNKNOWN; } uint32 Parameter::GetArgumentCount() const { return m_vArguments.size(); } /********************************** Déclaration de la classe CommandLineManager **********************************/ CommandLineManager::CommandLineManager(int argc, char* argv[]) { ParseCommandLineArguments(argc, argv); } CommandLineManager::~CommandLineManager() { // Libère les objets paramètre de la mémoire. std::map<std::string, Parameter*>::iterator it; for (it = m_vParameters.begin(); it != m_vParameters.end(); ++it) { Parameter* pParam = (*it).second; SAFE_DELETE(pParam); } } void CommandLineManager::ParseCommandLineArguments(uint32 iArgumentCount, char* paArguments[]) { Parameter* pCurrentParameter = nullptr; // Exemple de ligne de commande : game.exe -fullscreen -res 800 600 -opengl for (uint32 i = 0; i < iArgumentCount; ++i) { std::string sCurrentArgumentName(paArguments[i]); // Si on a un nouvel argument qui commence par un '-'. if (sCurrentArgumentName[0] == '-') { // On enlève l'indicateur de paramètre (premier caractère). sCurrentArgumentName.erase(0, 1); // On créé un nouveau objet paramètre avec son nom. pCurrentParameter = new Parameter(sCurrentArgumentName); // On l'ajoute dans la liste des arguments. m_vParameters[sCurrentArgumentName] = pCurrentParameter; } else if (pCurrentParameter)// C'est peut-être un argument, (paramètre qui ne commence pas par '-'). { pCurrentParameter->PushArgument(sCurrentArgumentName); } } } bool CommandLineManager::HasParameter(const std::string& sParameter) { return m_vParameters.count(sParameter) > 0; } uint32 CommandLineManager::GetParameterCount() { return m_vParameters.size(); } Parameter* CommandLineManager::GetParameter(const std::string& sParameter) { if (m_vParameters.count(sParameter) > 0) { return m_vParameters[sParameter]; } else { return nullptr; } }