diff --git a/CMakeLists.txt b/CMakeLists.txt index a40493d..000271a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ add_library(usenetsearch "src/Filter.cpp" "src/Indexer.cpp" "src/IoSocket.cpp" + "src/Logger.cpp" "src/Serialize.cpp" "src/SSLConnection.cpp" "src/StringUtils.cpp" diff --git a/include/usenetsearch/Application.h b/include/usenetsearch/Application.h index ecf4501..e693f18 100644 --- a/include/usenetsearch/Application.h +++ b/include/usenetsearch/Application.h @@ -17,14 +17,14 @@ #pragma once -#include -#include -#include - #include "usenetsearch/Configuration.h" #include "usenetsearch/Database.h" #include "usenetsearch/Filter.h" +#include +#include +#include + namespace usenetsearch { enum class CommandLineOptionType diff --git a/include/usenetsearch/Configuration.h b/include/usenetsearch/Configuration.h index be6e3a6..a533d4a 100644 --- a/include/usenetsearch/Configuration.h +++ b/include/usenetsearch/Configuration.h @@ -17,12 +17,12 @@ #pragma once +#include "usenetsearch/Except.h" + #include #include #include -#include "usenetsearch/Except.h" - namespace usenetsearch { struct ConfigurationException: public UsenetSearchException diff --git a/include/usenetsearch/Database.h b/include/usenetsearch/Database.h index bedaf4b..c2cb919 100644 --- a/include/usenetsearch/Database.h +++ b/include/usenetsearch/Database.h @@ -17,6 +17,10 @@ #pragma once +#include "usenetsearch/Filter.h" +#include "usenetsearch/Serialize.h" +#include "usenetsearch/UsenetClient.h" + #include #include #include @@ -26,10 +30,6 @@ #include #include -#include "usenetsearch/Filter.h" -#include "usenetsearch/Serialize.h" -#include "usenetsearch/UsenetClient.h" - namespace usenetsearch { class Application; diff --git a/include/usenetsearch/Dns.h b/include/usenetsearch/Dns.h index 8b409f9..e6b9bd8 100644 --- a/include/usenetsearch/Dns.h +++ b/include/usenetsearch/Dns.h @@ -17,13 +17,13 @@ #pragma once -#include -#include -#include +#include "usenetsearch/Except.h" #include // struct addrinfo -#include "usenetsearch/Except.h" +#include +#include +#include namespace usenetsearch { diff --git a/include/usenetsearch/Filter.h b/include/usenetsearch/Filter.h index 89d5e93..3e97119 100644 --- a/include/usenetsearch/Filter.h +++ b/include/usenetsearch/Filter.h @@ -17,14 +17,14 @@ #pragma once +#include "usenetsearch/Configuration.h" + #include #include #include #include #include -#include "usenetsearch/Configuration.h" - namespace usenetsearch { class Filter diff --git a/include/usenetsearch/Indexer.h b/include/usenetsearch/Indexer.h index 2683e6d..94bf682 100644 --- a/include/usenetsearch/Indexer.h +++ b/include/usenetsearch/Indexer.h @@ -17,16 +17,16 @@ #pragma once -#include -#include -#include -#include - #include "usenetsearch/Application.h" #include "usenetsearch/Filter.h" #include "usenetsearch/UsenetClient.h" #include "usenetsearch/ThreadPool.h" +#include +#include +#include +#include + namespace usenetsearch { class SearchResult diff --git a/include/usenetsearch/Logger.h b/include/usenetsearch/Logger.h new file mode 100644 index 0000000..748172c --- /dev/null +++ b/include/usenetsearch/Logger.h @@ -0,0 +1,90 @@ +/* + Copyright© 2021 John Sennesael + + UsenetSearch is Free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + UsenetSearch is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with UsenetSearch. If not, see . +*/ + +#pragma once + +#include +#include +#include +#include + +namespace usenetsearch { + +/** + * Simple logging class singleton. + */ +class Logger +{ + + /// Holds a pointer to the singleton instance. + static std::unique_ptr m_instance; + +public: + /** + * Constructor. + */ + Logger(); + + /** + * Destructor. + */ + virtual ~Logger() = default; + + /** + * Gets an instance to the logger. + */ + static Logger& get(); + + /** + * Logs a debug message. + * + * @param[in] msg Message to be logged. + */ + void debug(const std::string& msg) const; + + /** + * Logs an info message. + * + * @param[in] msg Message to be logged. + */ + void info(const std::string& msg) const; + + /** + * Logs an error message. + * + * @param[in] msg Message to be logged. + */ + void error(const std::string& msg) const; + + /** + * Logs an error message and throws. + * + * @tparam EXCEPTION Type of exception to throw. + * @param[in] msg Error message to be logged. + */ + template + inline void fatal(const std::string& msg) const + { + static_assert( + std::is_base_of::value, + "EXCEPTION must be an std::exception or derrived child."); + error(msg); + throw EXCEPTION(msg); + }; +}; + +} // namespace usenetsearch diff --git a/include/usenetsearch/SSLConnection.h b/include/usenetsearch/SSLConnection.h index 7138fe4..4a3f8c0 100644 --- a/include/usenetsearch/SSLConnection.h +++ b/include/usenetsearch/SSLConnection.h @@ -17,12 +17,12 @@ #pragma once -#include +#include "usenetsearch/IoSocket.h" +#include "usenetsearch/TcpConnection.h" #include -#include "usenetsearch/IoSocket.h" -#include "usenetsearch/TcpConnection.h" +#include namespace usenetsearch { diff --git a/include/usenetsearch/Serialize.h b/include/usenetsearch/Serialize.h index af3d551..2b631e9 100644 --- a/include/usenetsearch/Serialize.h +++ b/include/usenetsearch/Serialize.h @@ -17,13 +17,14 @@ #pragma once +#include "usenetsearch/Except.h" + #include #include +#include #include #include -#include "usenetsearch/Except.h" - namespace usenetsearch { struct ArticleEntry; diff --git a/include/usenetsearch/StringUtils.h b/include/usenetsearch/StringUtils.h index 6e5eee9..6f4470b 100644 --- a/include/usenetsearch/StringUtils.h +++ b/include/usenetsearch/StringUtils.h @@ -17,14 +17,14 @@ #pragma once +#include "usenetsearch/Except.h" + #include #include #include #include #include -#include "usenetsearch/Except.h" - namespace usenetsearch { struct StringException: public UsenetSearchException diff --git a/include/usenetsearch/TcpConnection.h b/include/usenetsearch/TcpConnection.h index 71f8d2b..3391f96 100644 --- a/include/usenetsearch/TcpConnection.h +++ b/include/usenetsearch/TcpConnection.h @@ -17,12 +17,12 @@ #pragma once -#include -#include - #include "usenetsearch/Except.h" #include "usenetsearch/IoSocket.h" +#include +#include + namespace usenetsearch { struct SocketException: public UsenetSearchException diff --git a/include/usenetsearch/UsenetClient.h b/include/usenetsearch/UsenetClient.h index 9a3cdf5..b7239ef 100644 --- a/include/usenetsearch/UsenetClient.h +++ b/include/usenetsearch/UsenetClient.h @@ -17,6 +17,9 @@ #pragma once +#include "usenetsearch/SSLConnection.h" +#include "usenetsearch/TcpConnection.h" + #include #include #include @@ -27,9 +30,6 @@ #include #include -#include "usenetsearch/SSLConnection.h" -#include "usenetsearch/TcpConnection.h" - namespace usenetsearch { class Application; diff --git a/src/Application.cpp b/src/Application.cpp index 7c9f538..f1feab0 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -15,15 +15,15 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/Application.h" + +#include "usenetsearch/StringUtils.h" + #include #include #include #include -#include "usenetsearch/StringUtils.h" - -#include "usenetsearch/Application.h" - namespace usenetsearch { void Application::AddBooleanOption( diff --git a/src/Configuration.cpp b/src/Configuration.cpp index 65a90ba..1560f82 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -15,15 +15,15 @@ along with UsenetSearch. If not, see . */ -#include -#include -#include -#include +#include "usenetsearch/Configuration.h" #include "usenetsearch/ScopeExit.h" #include "usenetsearch/StringUtils.h" -#include "usenetsearch/Configuration.h" +#include +#include +#include +#include namespace usenetsearch { diff --git a/src/Database.cpp b/src/Database.cpp index 3a0863b..76f6edb 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -15,6 +15,14 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/Database.h" + +#include "usenetsearch/Application.h" +#include "usenetsearch/StringUtils.h" +#include "usenetsearch/UsenetClient.h" +#include "usenetsearch/ScopeExit.h" +#include "usenetsearch/Serialize.h" + #include #include #include @@ -24,14 +32,6 @@ #include #include -#include "usenetsearch/Application.h" -#include "usenetsearch/StringUtils.h" -#include "usenetsearch/UsenetClient.h" -#include "usenetsearch/ScopeExit.h" -#include "usenetsearch/Serialize.h" - -#include "usenetsearch/Database.h" - namespace usenetsearch { // Database class -------------------------------------------------------------- diff --git a/src/Dns.cpp b/src/Dns.cpp index 574e0b5..d9fa8e9 100644 --- a/src/Dns.cpp +++ b/src/Dns.cpp @@ -15,11 +15,11 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/Dns.h" + #include #include -#include "usenetsearch/Dns.h" - namespace usenetsearch { std::vector DnsResolve( diff --git a/src/Filter.cpp b/src/Filter.cpp index 5b1317b..5eec53b 100644 --- a/src/Filter.cpp +++ b/src/Filter.cpp @@ -15,13 +15,13 @@ along with UsenetSearch. If not, see . */ -#include -#include -#include +#include "usenetsearch/Filter.h" #include "usenetsearch/StringUtils.h" -#include "usenetsearch/Filter.h" +#include +#include +#include namespace usenetsearch { diff --git a/src/Indexer.cpp b/src/Indexer.cpp index 0ab3397..c367cb6 100644 --- a/src/Indexer.cpp +++ b/src/Indexer.cpp @@ -15,11 +15,12 @@ along with UsenetSearch. If not, see . */ -#include +#include "usenetsearch/Indexer.h" +#include "usenetsearch/Logger.h" #include "usenetsearch/StringUtils.h" -#include "usenetsearch/Indexer.h" +#include namespace usenetsearch { @@ -197,9 +198,6 @@ void Indexer::Index(const std::vector& newsgroups) dbref.get().SetLastIndexedArticle( groupID, lastArticle ); - std::cout << "Setting last indexed article for newsgroup ID " - << groupID << " to: " - << lastArticle << std::endl; } std::cout << "."; std::cout.flush(); diff --git a/src/IoSocket.cpp b/src/IoSocket.cpp index 2efc754..acceba4 100644 --- a/src/IoSocket.cpp +++ b/src/IoSocket.cpp @@ -15,11 +15,11 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/IoSocket.h" + #include #include -#include "usenetsearch/IoSocket.h" - namespace usenetsearch { std::chrono::milliseconds IoSocket::ConnectionTimeout() const diff --git a/src/Logger.cpp b/src/Logger.cpp new file mode 100644 index 0000000..a67e57f --- /dev/null +++ b/src/Logger.cpp @@ -0,0 +1,54 @@ +/* + Copyright© 2021 John Sennesael + + UsenetSearch is Free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + UsenetSearch is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with UsenetSearch. If not, see . +*/ + +#include "usenetsearch/Logger.h" + +#include +#include +#include + +namespace usenetsearch { + +std::unique_ptr Logger::m_instance; + +Logger::Logger() {} + +Logger& Logger::get() +{ + if (m_instance == nullptr) + { + m_instance = std::make_unique(); + } + return *m_instance; +} + +void Logger::debug(const std::string& msg) const +{ + std::cout << "[debug] " << msg << std::endl << std::flush; +} + +void Logger::info(const std::string& msg) const +{ + std::cout << "[info] " << msg << std::endl << std::flush; +} + +void Logger::error(const std::string& msg) const +{ + std::cerr << "[error] " << msg << std::endl << std::flush; +} + +} // namespace usenetsearch diff --git a/src/SSLConnection.cpp b/src/SSLConnection.cpp index 155873b..2d5802c 100644 --- a/src/SSLConnection.cpp +++ b/src/SSLConnection.cpp @@ -15,14 +15,14 @@ along with UsenetSearch. If not, see . */ -#include -#include -#include +#include "usenetsearch/SSLConnection.h" #include #include -#include "usenetsearch/SSLConnection.h" +#include +#include +#include namespace usenetsearch { diff --git a/src/Serialize.cpp b/src/Serialize.cpp index cfeac42..4c8f977 100644 --- a/src/Serialize.cpp +++ b/src/Serialize.cpp @@ -13,13 +13,11 @@ along with UsenetSearch. If not, see . */ -#include -#include -#include -#include -#include -#include -#include +#include "usenetsearch/Serialize.h" + +#include "usenetsearch/Database.h" +#include "usenetsearch/ScopeExit.h" +#include "usenetsearch/UsenetClient.h" #include #include @@ -27,11 +25,13 @@ #include #include -#include "usenetsearch/Database.h" -#include "usenetsearch/ScopeExit.h" -#include "usenetsearch/UsenetClient.h" - -#include "usenetsearch/Serialize.h" +#include +#include +#include +#include +#include +#include +#include namespace usenetsearch { diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp index a323da7..d4d716e 100644 --- a/src/StringUtils.cpp +++ b/src/StringUtils.cpp @@ -15,6 +15,10 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/StringUtils.h" + +#include + #include #include #include @@ -24,10 +28,6 @@ #include #include -#include - -#include "usenetsearch/StringUtils.h" - namespace usenetsearch { static std::wstring_convert> conv; diff --git a/src/TcpConnection.cpp b/src/TcpConnection.cpp index 9a3f484..f944628 100644 --- a/src/TcpConnection.cpp +++ b/src/TcpConnection.cpp @@ -15,6 +15,12 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/TcpConnection.h" + +#include "usenetsearch/Dns.h" + +#include // close(), read(), write() + #include #include #include @@ -22,12 +28,6 @@ #include #include -#include // close(), read(), write() - -#include "usenetsearch/Dns.h" - -#include "usenetsearch/TcpConnection.h" - namespace usenetsearch { TcpConnection::~TcpConnection() diff --git a/src/ThreadPool.cpp b/src/ThreadPool.cpp index 6119f2a..da5f4d3 100644 --- a/src/ThreadPool.cpp +++ b/src/ThreadPool.cpp @@ -15,6 +15,9 @@ #include "usenetsearch/ThreadPool.h" +#include +#include + namespace usenetsearch { ThreadPool::ThreadPool() @@ -57,71 +60,19 @@ void ThreadPool::Queue(std::function fn) // Wait for an available thread. while (m_threads.size() >= m_maxThreads) { - //std::lock_guard threadsLock(m_threadsMutex); auto foundThread = m_threads.end(); - //auto foundStatus = m_threadStates->end(); for (auto it = m_threads.begin(); it != m_threads.end(); ++it) { const auto& t = (*it); if (!t) continue; - //const auto threadID = t->get_id(); - //if (threadID == std::thread::id{}) continue; - //ThreadStates::iterator statusIt; - //{ - // std::lock_guard tsl(m_threadStatesMutex); - // statusIt = m_threadStates->find(threadID); - //} - //if (statusIt == m_threadStates->end()) continue; - //bool state = statusIt->second; - //if (state == true) - //{ if (t->joinable()) t->join(); foundThread = it; - // foundStatus = statusIt; break; - //} } if (foundThread != m_threads.end()) m_threads.erase(foundThread); - /* - { - std::lock_guard tsl(m_threadStatesMutex); - if (foundStatus != m_threadStates->end()) m_threadStates->erase(foundStatus); - } - */ } // Spawn a new thread. auto thread = std::make_unique(fn); - /* - auto thread = std::make_unique( - [](std::function func, std::mutex& tsm, std::shared_ptr ts) - { - if (ts == nullptr) return; - { - std::lock_guard tsl(tsm); - const auto threadID = std::this_thread::get_id(); - if (threadID == std::thread::id{}) return; - ts->emplace(threadID, false); - } - func(); - { - std::lock_guard tsl(tsm); - const auto threadID = std::this_thread::get_id(); - if (threadID != std::thread::id{}) - { - auto it = ts->find(threadID); - if (it == ts->end()) - { - ts->emplace(threadID, true); - } - else - { - (*ts)[threadID] = true; - } - } - } - }, fn, std::ref(m_threadStatesMutex), m_threadStates); - */ - //std::lock_guard threadsLock(m_threadsMutex); m_threads.emplace_back(std::move(thread)); } diff --git a/src/UsenetClient.cpp b/src/UsenetClient.cpp index eeb064c..22549c8 100644 --- a/src/UsenetClient.cpp +++ b/src/UsenetClient.cpp @@ -15,6 +15,12 @@ along with UsenetSearch. If not, see . */ +#include "usenetsearch/UsenetClient.h" + +#include "usenetsearch/Application.h" +#include "usenetsearch/Except.h" +#include "usenetsearch/StringUtils.h" + #include #include #include @@ -22,12 +28,6 @@ #include #include -#include "usenetsearch/Application.h" -#include "usenetsearch/Except.h" -#include "usenetsearch/StringUtils.h" - -#include "usenetsearch/UsenetClient.h" - namespace usenetsearch { // UsenetClient class ---------------------------------------------------------- diff --git a/src/dbdump.cpp b/src/dbdump.cpp index f82565b..d67a8dd 100644 --- a/src/dbdump.cpp +++ b/src/dbdump.cpp @@ -15,12 +15,12 @@ along with UsenetSearch. If not, see . */ -#include -#include - #include "usenetsearch/Application.h" #include "usenetsearch/StringUtils.h" +#include +#include + using namespace usenetsearch; int main(int argc, char* argv[]) diff --git a/src/usenetfind.cpp b/src/usenetfind.cpp index c642bc8..a57770b 100644 --- a/src/usenetfind.cpp +++ b/src/usenetfind.cpp @@ -1,9 +1,10 @@ -#include #include "usenetsearch/Application.h" #include "usenetsearch/UsenetClient.h" #include "usenetsearch/Indexer.h" +#include + using namespace usenetsearch; int main(int argc, char* argv[]) diff --git a/src/usenetindexd.cpp b/src/usenetindexd.cpp index 4233435..20753d1 100644 --- a/src/usenetindexd.cpp +++ b/src/usenetindexd.cpp @@ -15,13 +15,13 @@ along with UsenetSearch. If not, see . */ -#include - #include "usenetsearch/Application.h" #include "usenetsearch/Except.h" #include "usenetsearch/Indexer.h" #include "usenetsearch/UsenetClient.h" +#include + using namespace usenetsearch; int main(int argc, char* argv[])