diff --git a/include/aman/config/IdentifierFileFormat.h b/include/aman/config/IdentifierFileFormat.h new file mode 100644 index 0000000..4b9f638 --- /dev/null +++ b/include/aman/config/IdentifierFileFormat.h @@ -0,0 +1,51 @@ +/* + * @brief Defines the communication file format + * @file aman/config/CommunicationFileFormat.h + * @author Sven Czarnian + * @copyright Copyright 2021 Sven Czarnian + * @license This project is published under the GNU General Public License v3 (GPLv3) + */ + +#pragma once + +#include +#include + +namespace aman { + /** + * @brief Defines the parser of communication configurations + * @ingroup format + * + * All configuration entries need to be stored in 'AmanCommunication.txt'. + * + * The following entries of the configuration exist: + * + * + * + * + * + * + * + * + * + * + *
Setting entries
NameDescriptionDefault valueUnit
UIDDefines the identifier to access the backend.
+ */ + class IdentifierFileFormat : public FileFormat { +#ifndef DOXYGEN_IGNORE + public: + /** + * @brief Initializes the identifier file format + */ + IdentifierFileFormat(); + + /** + * @brief Parses the set configuration file + * @param[in] filename The path to the configuration file + * @param[out] config The resulting configuration + * @return True if the configuration file was valid, else false + */ + bool parse(const std::string& filename, Communication& config); +#endif + }; +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 86807c0..fdea3af 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,6 +16,7 @@ SET(SOURCE_FILES ) SET(SOURCE_CONFIG_FILES config/FileFormat.cpp + config/IdentifierFileFormat.cpp ) SET(SOURCE_FILES_RES ${CMAKE_BINARY_DIR}/ArrivalMANager.rc @@ -24,6 +25,7 @@ SET(SOURCE_FILES_RES ) SET(INCLUDE_CONFIG_FILES ${CMAKE_SOURCE_DIR}/include/aman/config/FileFormat.h + ${CMAKE_SOURCE_DIR}/include/aman/config/IdentifierFileFormat.h ) SET(INCLUDE_HELPER_FILES ${CMAKE_SOURCE_DIR}/include/aman/helper/String.h @@ -57,6 +59,7 @@ IF(MSVC) ENDIF() SOURCE_GROUP("Source Files" FILES ${SOURCE_FILES}) +SOURCE_GROUP("Source Files\\config" FILES ${SOURCE_CONFIG_FILES}) SOURCE_GROUP("Source Files\\res" FILES ${SOURCE_FILES_RES}) SOURCE_GROUP("Header Files\\config" FILES ${INCLUDE_CONFIG_FILES}) SOURCE_GROUP("Header Files\\helper" FILES ${INCLUDE_HELPER_FILES}) diff --git a/src/config/IdentifierFileFormat.cpp b/src/config/IdentifierFileFormat.cpp new file mode 100644 index 0000000..5e5e36c --- /dev/null +++ b/src/config/IdentifierFileFormat.cpp @@ -0,0 +1,94 @@ +/* + * Author: + * Sven Czarnian + * Brief: + * Implements the identifier file format + * Copyright: + * 2021 Sven Czarnian + * License: + * GNU General Public License v3 (GPLv3) + */ + +#include + +#include + +#include +#include + +using namespace aman; + +IdentifierFileFormat::IdentifierFileFormat() : + FileFormat() { } + +bool IdentifierFileFormat::parse(const std::string& filename, Communication& config) { + config.valid = true; + + std::ifstream stream(filename); + if (false == stream.is_open()) { + this->m_errorMessage = "Unable to open the configuration file: " + filename; + this->m_errorLine = 0; + config.valid = false; + return false; + } + + std::string line; + std::uint32_t lineOffset = 0; + while (std::getline(stream, line)) { + std::string value; + + lineOffset += 1; + + /* skip a new line */ + if (0 == line.length()) + continue; + + /* trimm the line and check if a comment line is used */ + std::string trimmed = String::trim(line); + if (0 == trimmed.find_first_of('#', 0)) + continue; + + auto entry = String::splitString(trimmed, "="); + if (2 > entry.size()) { + this->m_errorLine = lineOffset; + this->m_errorMessage = "Invalid configuration entry"; + config.valid = false; + return false; + } + else if (2 < entry.size()) { + for (std::size_t idx = 1; idx < entry.size() - 1; ++idx) + value += gsl::at(entry, idx) + "="; + value += entry.back(); + } + else { + value = gsl::at(entry, 1); + } + + /* found an invalid line */ + if (0 == value.length()) { + this->m_errorLine = lineOffset; + this->m_errorMessage = "Invalid entry"; + config.valid = false; + return false; + } + + if ("UID" == gsl::at(entry, 0)) { + config.identifier = gsl::at(entry, 1); + } + else { + this->m_errorLine = lineOffset; + this->m_errorMessage = "Unknown entry: " + gsl::at(entry, 0); + config.valid = false; + return false; + } + } + + if (0 == lineOffset) { + this->m_errorLine = 0; + this->m_errorMessage = "No data found in " + filename; + config.valid = false; + return false; + } + + return true; +}