diff --git a/src/network/Network.cpp b/src/network/Network.cpp new file mode 100644 index 00000000..bdd2a2ac --- /dev/null +++ b/src/network/Network.cpp @@ -0,0 +1,60 @@ +#include "Network.hpp" + +#include +#include + +#include "debug/Logger.hpp" + +using namespace network; + +static debug::Logger logger("network"); + +size_t write_callback(char* ptr, size_t size, size_t nmemb, void* userdata) { + auto& buffer = *reinterpret_cast*>(userdata); + size_t psize = buffer.size(); + buffer.resize(psize + size * nmemb); + std::memcpy(buffer.data() + psize, ptr, size * nmemb); + return size * nmemb; +} + +class CurlHttp : public Http { + CURL* curl; +public: + CurlHttp(CURL* curl) : curl(curl) { + } + + virtual ~CurlHttp() { + curl_easy_cleanup(curl); + } + + void get(const std::string& url, const OnResponse& callback) override { + std::vector buffer; + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + CURLcode res = curl_easy_perform(curl); + callback(res, std::move(buffer)); + } + + static std::unique_ptr create() { + if (auto curl = curl_easy_init()) { + return std::make_unique(curl); + } + throw std::runtime_error("could not initialzie cURL"); + } +}; + + +Network::Network(std::unique_ptr http) : http(std::move(http)) { +} + +Network::~Network() = default; + +void Network::httpGet(const std::string& url, const OnResponse& callback) { + http->get(url, callback); +} + +std::unique_ptr Network::create(const NetworkSettings& settings) { + auto http = CurlHttp::create(); + return std::make_unique(std::move(http)); +} diff --git a/src/network/Network.hpp b/src/network/Network.hpp new file mode 100644 index 00000000..2e92a302 --- /dev/null +++ b/src/network/Network.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include + +#include "typedefs.hpp" +#include "settings.hpp" +#include "util/Buffer.hpp" + +namespace network { + using OnResponse = std::function)>; + + class Http { + public: + virtual ~Http() {} + + virtual void get(const std::string& url, const OnResponse& callback) = 0; + }; + + class Network { + std::unique_ptr http; + public: + Network(std::unique_ptr http); + ~Network(); + + void httpGet(const std::string& url, const OnResponse& callback); + + static std::unique_ptr create(const NetworkSettings& settings); + }; +} diff --git a/src/settings.hpp b/src/settings.hpp index 8343ee68..b0eee035 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -81,6 +81,9 @@ struct UiSettings { IntegerSetting worldPreviewSize {64, 1, 512}; }; +struct NetworkSettings { +}; + struct EngineSettings { AudioSettings audio; DisplaySettings display; @@ -89,4 +92,5 @@ struct EngineSettings { GraphicsSettings graphics; DebugSettings debug; UiSettings ui; + NetworkSettings network; }; diff --git a/test/curltest.cpp b/test/curltest.cpp deleted file mode 100644 index a8d3424e..00000000 --- a/test/curltest.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -#include - -size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) { - return size * nmemb; -} - -TEST(curltest, curltest) { - if (CURL* curl = curl_easy_init()) { - CURLcode res; - curl_easy_setopt(curl, CURLOPT_URL, "https://github.com"); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); - res = curl_easy_perform(curl); - std::cout << curl_easy_strerror(res) << std::endl; - curl_easy_cleanup(curl); - } -} diff --git a/test/network/curltest.cpp b/test/network/curltest.cpp new file mode 100644 index 00000000..ea4924be --- /dev/null +++ b/test/network/curltest.cpp @@ -0,0 +1,18 @@ +#include + +#include "network/Network.hpp" +#include "coders/json.hpp" + +TEST(curltest, curltest) { + NetworkSettings settings {}; + auto network = network::Network::create(settings); + network->httpGet( + "https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/" + "heads/curl/res/content/base/blocks/lamp.json", + [=](int code, std::vector data) { + auto v = std::string_view(data.data(), data.size()); + auto value = json::parse(v); + std::cout << value << std::endl; + } + ); +}