diff --git a/settings.cpp b/settings.cpp index 425b3d4..42e133b 100644 --- a/settings.cpp +++ b/settings.cpp @@ -26,9 +26,21 @@ void Settings::add_line(char const* section, char const* key, char const* val) Serial.print(val); Serial.println("\""); + if(string_starts_by(section, "wifi")) + { + char const* network_name = "0"; + if(section[4] == ':') + network_name = section + 5; + + wifi.add_info(network_name, key, val); + } + else + { + delete[] key; + delete[] val; + } + delete[] section; - delete[] key; - delete[] val; } Settings const* Settings::load(char const* settings_filename) diff --git a/settings.h b/settings.h index 3419271..a4206b8 100644 --- a/settings.h +++ b/settings.h @@ -18,7 +18,7 @@ class Settings public: static Settings const* load(char const* settings_filename); - protected: + WifiSettings wifi; }; #endif //SETTINGS_H diff --git a/wifi_settings.cpp b/wifi_settings.cpp new file mode 100644 index 0000000..a1eddf2 --- /dev/null +++ b/wifi_settings.cpp @@ -0,0 +1,75 @@ +#include "wifi_settings.h" +#include "string_helper.h" + +WifiSettings::Network::Network(char const* name, Network* next): + m_name(name), + m_ssid(nullptr), + m_pass(nullptr), + m_next(next) +{ +} + +WifiSettings::Network::~Network() +{ + if(m_next != nullptr) + delete m_next; +} + +WifiSettings::WifiSettings(): + m_first_network(nullptr) +{ +} + +WifiSettings::~WifiSettings() +{ + if(m_first_network != nullptr) + delete m_first_network; +} + +void WifiSettings::add_info(char const* network_name, char const* key, char const* val) +{ + Network* net = find_network(network_name); + if(net == nullptr) + { + net = new Network(string_copy(network_name), m_first_network); + m_first_network = net; + } + + if(string_equals(key, "ssid")) + { + if(net->m_ssid != nullptr) + delete[] net->m_ssid; + + net->m_ssid = val; + } + else if(string_equals(key, "password")) + { + if(net->m_pass != nullptr) + delete[] net->m_pass; + + net->m_pass = val; + } + else + delete[] val; + + delete[] key; +} + +WifiSettings::Network const* WifiSettings::networks_cbegin() const +{ + return m_first_network; +} + +WifiSettings::Network const* WifiSettings::networks_cend() const +{ + return nullptr; +} + +WifiSettings::Network* WifiSettings::find_network(char const* network_name) +{ + for(Network* net = m_first_network; net != nullptr; net = net->m_next) + if(string_equals(net->m_name, network_name)) + return net; + + return nullptr; +} diff --git a/wifi_settings.h b/wifi_settings.h index b568ee4..a8fe396 100644 --- a/wifi_settings.h +++ b/wifi_settings.h @@ -4,7 +4,47 @@ class WifiSettings { public: - //TODO + class Network + { + friend class WifiSettings; + + protected: + Network(char const* name, Network* next); + + public: + ~Network(); + + inline bool has_all_infos() const + { + return m_ssid != nullptr && m_pass != nullptr; + } + + inline char const* ssid() const {return m_ssid;} + inline char const* pass() const {return m_pass;} + + inline Network const* next() const {return m_next;} + + private: + char const*const m_name; + char const* m_ssid; + char const* m_pass; + + Network *const m_next; + }; + + WifiSettings(); + ~WifiSettings(); + + void add_info(char const* network_name, char const* key, char const* val); + + Network const* networks_cbegin() const; + Network const* networks_cend() const; + + protected: + Network* find_network(char const* network_name); + + protected: + Network* m_first_network; }; #endif //WIFI_SETTINGS_H