From 4a913ea465ae4eb8687f1513faf7ae5ab4fb624e Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Mon, 10 Mar 2025 12:12:52 +0100 Subject: [PATCH] Initial commit. --- .gitignore | 5 +++ CMakeLists.txt | 14 +++++++++ dependencies.cmake | 62 ++++++++++++++++++++++++++++++++++++++ fetchtest/CMakeLists.txt | 54 +++++++++++++++++++++++++++++++++ fetchtest/include/libxml.h | 7 +++++ fetchtest/include/poco.h | 9 ++++++ fetchtest/src/libxml.cpp | 35 +++++++++++++++++++++ fetchtest/src/main.cpp | 37 +++++++++++++++++++++++ fetchtest/src/poco.cpp | 21 +++++++++++++ 9 files changed, 244 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 dependencies.cmake create mode 100644 fetchtest/CMakeLists.txt create mode 100644 fetchtest/include/libxml.h create mode 100644 fetchtest/include/poco.h create mode 100644 fetchtest/src/libxml.cpp create mode 100644 fetchtest/src/main.cpp create mode 100644 fetchtest/src/poco.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1cc6140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Generated code +build/** + +# VSCode +.vscode/** \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6466e0f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.18) +project(protocolstack_test_fetch) + +# C/C++ Standard +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD_REQUIRED ON) + +# Dependencies +include(dependencies.cmake) + +# Game source files +add_subdirectory(fetchtest) \ No newline at end of file diff --git a/dependencies.cmake b/dependencies.cmake new file mode 100644 index 0000000..0b466f9 --- /dev/null +++ b/dependencies.cmake @@ -0,0 +1,62 @@ +cmake_minimum_required(VERSION 3.11) + +# Poco +set(ENABLE_MONGODB OFF) +set(ENABLE_REDIS OFF) +set(ENABLE_DATA_SQLITE OFF) +set(ENABLE_DATA_MYSQL OFF) +set(ENABLE_DATA_ODBC OFF) +set(ENABLE_ZIP OFF) +set(ENABLE_PAGECOMPILER OFF) # Disable PageCompiler (unused binary) +set(ENABLE_PAGECOMPILER_FILE2PAGE OFF) # Disable File2Page (unused binary) +# Will maybe change later, for now we want the lib to be static. +set(POCO_STATIC ON) + +find_package(Poco QUIET) +if (NOT Poco_FOUND) + include(FetchContent) + FetchContent_Declare( + Poco + DOWNLOAD_EXTRACT_TIMESTAMP OFF + URL https://github.com/pocoproject/poco/archive/refs/tags/poco-1.9.4-release.tar.gz + ) + FetchContent_GetProperties(Poco) + FetchContent_MakeAvailable(Poco) + set(Poco_INCLUDE_DIRS + "${poco_SOURCE_DIR}/Foundation/include" + "${poco_SOURCE_DIR}/Encodings/include" + "${poco_SOURCE_DIR}/XML/include" + "${poco_SOURCE_DIR}/JSON/include" + "${poco_SOURCE_DIR}/Util/include" + "${poco_SOURCE_DIR}/Net/include" + "${poco_SOURCE_DIR}/Data/include" + ) +endif() + +# LibXML2 +set(LIBXML2_WITH_PROGRAMS OFF) # Disable programs +set(LIBXML2_WITH_TESTS OFF) # Disable tests +# Disabling every dependencies to build libxml2 +set(LIBXML2_WITH_PYTHON OFF) +set(LIBXML2_WITH_ICONV OFF) +set(LIBXML2_WITH_LZMA OFF) +set(LIBXML2_WITH_ZLIB OFF) +# Will maybe change later, for now we want the lib to be static. +set(BUILD_SHARED_LIBS OFF) + +find_package(libxml2 QUIET) +if (NOT (libxml2_FOUND OR LIBXML2_FOUND)) + include(FetchContent) + FetchContent_Declare( + libxml2 + GIT_REPOSITORY https://gitlab.gnome.org/GNOME/libxml2.git + GIT_TAG v2.12.6 + ) + FetchContent_GetProperties(libxml2) + FetchContent_MakeAvailable(libxml2) + set(LIBXML2_INCLUDE_DIR + "${libxml2_SOURCE_DIR}/include" + "${libxml2_BINARY_DIR}" + ) + set(LIBXML2_LIBRARY "${libxml2_BINARY_DIR}/libxml2.a") +endif() diff --git a/fetchtest/CMakeLists.txt b/fetchtest/CMakeLists.txt new file mode 100644 index 0000000..2177255 --- /dev/null +++ b/fetchtest/CMakeLists.txt @@ -0,0 +1,54 @@ +# Project +project( + fetchtest + VERSION 1.0.0 + DESCRIPTION "fetchtest" + HOMEPAGE_URL "https://cmake.org/" + LANGUAGES CXX C +) +set(TARGET fetchtest) + +# Source files +set(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src") +add_executable(${TARGET} + ${SOURCES}/libxml.cpp + ${SOURCES}/poco.cpp + ${SOURCES}/main.cpp +) + +# Include folders +target_include_directories(${TARGET} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_include_directories(${TARGET} PRIVATE "${LIBXML2_INCLUDE_DIR}") +target_include_directories(${TARGET} PRIVATE "${Poco_INCLUDE_DIRS}") + +# Libraries +target_link_libraries( + ${TARGET} PRIVATE + ${LIBXML2_LIBRARY} + PocoFoundation + PocoUtil + PocoNet + PocoXML + PocoJSON +) + +# Compilation depending on the platform +if(MSVC) + # Build the program as a window-only (no cmd) + if(CMAKE_BUILD_TYPE STREQUAL "Release") + target_link_options(${TARGET} PRIVATE "/SUBSYSTEM:WINDOWS") + target_compile_options(${TARGET} PRIVATE /W3 /WX ) + else() + target_compile_options(${TARGET} PRIVATE /W3 /WX /DEBUG ) + endif() +else() + target_compile_options(${TARGET} PRIVATE -Wall -Wextra -Wpedantic -Werror) +endif() + +# Output folder +set_target_properties(${TARGET} + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" +) \ No newline at end of file diff --git a/fetchtest/include/libxml.h b/fetchtest/include/libxml.h new file mode 100644 index 0000000..63b6bb8 --- /dev/null +++ b/fetchtest/include/libxml.h @@ -0,0 +1,7 @@ +#ifndef _HEADER_FETCHTEST_LIBXML +#define _HEADER_FETCHTEST_LIBXML + +void info_libxml(void); +void create_xml(void); + +#endif // _HEADER_FETCHTEST_LIBXML \ No newline at end of file diff --git a/fetchtest/include/poco.h b/fetchtest/include/poco.h new file mode 100644 index 0000000..20878cf --- /dev/null +++ b/fetchtest/include/poco.h @@ -0,0 +1,9 @@ +#ifndef _HEADER_FETCHTEST_POCO +#define _HEADER_FETCHTEST_POCO + +#include + +std::string get_date_time(); +std::string format_poco_version(); + +#endif // _HEADER_FETCHTEST__POCO \ No newline at end of file diff --git a/fetchtest/src/libxml.cpp b/fetchtest/src/libxml.cpp new file mode 100644 index 0000000..b0a2920 --- /dev/null +++ b/fetchtest/src/libxml.cpp @@ -0,0 +1,35 @@ +#include "libxml.h" + +#include +#include +#include +#include + +void info_libxml(void) +{ + std::cout << "[LIBXML2]\t version: " << LIBXML_DOTTED_VERSION << std::endl; +} + +void create_xml(void) +{ + std::cout << "[LIBXML2]\tWriting basic .xml file..." << std::endl; + // Create new doc + xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); + xmlNodePtr root_node = xmlNewNode(nullptr, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + + xmlNodePtr child1 = xmlNewChild(root_node, nullptr, BAD_CAST "child1", BAD_CAST "This is child 1"); + xmlNewProp(child1, BAD_CAST "attribute", BAD_CAST "value"); + + // Save the document + const char* filename = "example.xml"; + if (xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1) != -1) { + std::cout << "[LIBXML2]\tXML file created successfully: " << filename << std::endl; + } else { + std::cerr << "LIBXML2]\tError saving XML file!" << std::endl; + } + + // Clean up + xmlFreeDoc(doc); + xmlCleanupParser(); +} \ No newline at end of file diff --git a/fetchtest/src/main.cpp b/fetchtest/src/main.cpp new file mode 100644 index 0000000..392ba27 --- /dev/null +++ b/fetchtest/src/main.cpp @@ -0,0 +1,37 @@ +#include +#include + +#include "poco.h" +#include "libxml.h" + +void info_poco(void); + +int main(void) +{ + try + { + std::cout << "Poco Test..." << std::endl; + info_poco(); + std::cout << "Libxml2 Test..." << std::endl; + info_libxml(); + create_xml(); + std::cout << "Enter any key to quit the program\n> "; + std::cin.ignore(); + } + catch (const std::exception &ex) + { + std::cerr << "\033[0;31m[ ERR]:\t" << ex.what() << "\033[0m" << std::flush; + } + return 0; +} + +void info_poco(void) +{ + std::cout << "\n"; + std::cout << "[TIME]:\t" << get_date_time() << "\n"; + std::cout << "[ OS]:\t" << Poco::Environment::osDisplayName() << " v" << Poco::Environment::osVersion() << "\n"; + std::cout << "[ARCH]:\t" << Poco::Environment::osArchitecture() << "\n"; + std::cout << "[POCO]:\tPoco C++ Library v" << format_poco_version() << "\n"; + std::cout << "\n" + << std::flush; +} diff --git a/fetchtest/src/poco.cpp b/fetchtest/src/poco.cpp new file mode 100644 index 0000000..8172252 --- /dev/null +++ b/fetchtest/src/poco.cpp @@ -0,0 +1,21 @@ +#include "poco.h" + +#include +#include +#include +#include +#include + +std::string get_date_time() +{ + Poco::LocalDateTime dateTime; + return Poco::DateTimeFormatter::format( + dateTime, + "%W %d %B %Y at %H:%M:%S"); +} + +std::string format_poco_version() +{ + uint32_t full_version = Poco::Environment::libraryVersion(); + return Poco::format("%u.%u.%u", (full_version >> 24), ((full_version >> 16) & 0xff), ((full_version >> 8) & 0xff)); +} \ No newline at end of file