diff --git a/CMakeLists.txt b/CMakeLists.txt index 12c8185..c3e1243 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,19 +4,34 @@ cmake_minimum_required(VERSION 3.28.2) file(READ ${CMAKE_CURRENT_SOURCE_DIR}/props.json PROPS) string(JSON VER GET ${PROPS} version) +# find curl +find_package(CURL REQUIRED) project(stc DESCRIPTION "Easily download collections and mods from steam." VERSION ${VER}) set(CMAKE_CXX_STANDARD 26) +# check if build type is set if it isnt set it to release +if(NOT CMAKE_BUILD_TYPE) + set(DCKMAKE_BUILD_TYPE Release) +endif() + # Add the path to the source files for stc file(GLOB_RECURSE STC_SOURCE_FILES "src/*.cpp") +# add compiler flags +set(CMAKE_CXX_FLAGS_DEBUG "-g") +set(CMAKE_CXX_FLAGS_RELEASE "-03") + # Add the executable target for stc add_executable(stc ${STC_SOURCE_FILES}) install(TARGETS stc DESTINATION bin) +# add curl libraries +target_link_libraries(stc PRIVATE ${CURL_LIBRARIES}) +target_include_directories(stc PRIVATE ${CURL_INCLUDE_DIRS}) + # DEBIAN set(CPACK_DEBIAN_PACKAGE_MAINTAINER "DRAGONTOS") set(CPACK_DEBIAN_PACKAGE_LICENSE "GPLv3") @@ -24,6 +39,7 @@ set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${DESCRIPTION}) set(CPACK_DEBIAN_PACKAGE_RELEASE_DIST ON) set(CPACK_GENERATOR DEBIAN) set(CPACK_PACKAGING_INSTALL_PREFIX "/usr") + # RPM set(CPACK_PACKAGE_VENDOR "DRAGONTOS") set(CPACK_RPM_PACKAGE_LICENSE "GPLv3") diff --git a/src/getHttp.cpp b/src/getHttp.cpp new file mode 100644 index 0000000..2d6a774 --- /dev/null +++ b/src/getHttp.cpp @@ -0,0 +1,42 @@ +#include +#include +#include + +size_t appendCurlOutputToString(void *ptr, size_t size, size_t nmemb, std::string *woof) { + // append the output from curl to a string + woof->append(static_cast(ptr), size*nmemb); + return size*nmemb; +} + +void writeHtmlFile(std::string* woof, std::string *outputfile) { + // check for nullptrs + if (!woof || !outputfile){ + throw("string is null\n"); + } + // open file and write to it + std::ofstream meow{*outputfile}; + meow << *woof; +} + +void getHttp(std::string url, std::string *outputfile) { + //initialize curl object and curlcode + CURL *meow = curl_easy_init(); + CURLcode res; + std::string woof; + // check for nullptr and if nullptr throw an exception + if (!outputfile){ + curl_easy_cleanup(meow); + throw("outputfile is null\n"); + } + // set the options + curl_easy_setopt(meow, CURLOPT_URL, url.c_str()); + curl_easy_setopt(meow, CURLOPT_WRITEFUNCTION, appendCurlOutputToString); + curl_easy_setopt(meow, CURLOPT_WRITEDATA, &woof); + // perform the request + res = curl_easy_perform(meow); + if (res != CURLE_OK){ + throw("failed to perform the request\n"); + } + writeHtmlFile(&woof, outputfile); + curl_easy_cleanup(meow); +} diff --git a/src/includes/getHttp.h b/src/includes/getHttp.h new file mode 100644 index 0000000..41b876f --- /dev/null +++ b/src/includes/getHttp.h @@ -0,0 +1,6 @@ +#ifndef GETHTTP_H +#define GETHTTP_H +#include +void getHttp(std::string url, std::string *outputfile); +#endif + diff --git a/src/main.cpp b/src/main.cpp index 4746423..cdc2100 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "includes/getHttp.h" #include #include #include @@ -84,11 +85,15 @@ int main(int argc, char **argv, char **envp) { if (argc == 7) { dir = ARGS[1+5]; } - - // should be done with libcurl in the future ata - system(std::string {"curl https://steamcommunity.com/sharedfiles/filedetails/?id=" + collectionid + " -o " + cachesc}.c_str()); - std::cout << collectionid << user << pass << gameid << dir; + try { + getHttp(std::string {"https://steamcommunity.com/sharedfiles/filedetails/?id=" + collectionid}, &cachesc); + } + catch(std::string& meow) { + std::cout << meow; + return 1; + } + std::cout << "success1\n"; break; } @@ -102,11 +107,14 @@ int main(int argc, char **argv, char **envp) { dir = ARGS[1+3]; } - // should be done with libcurl in the future ata - system(std::string {"curl https://steamcommunity.com/sharedfiles/filedetails/?id=" + collectionid + " -o " + cachesc}.c_str()); - - std::cout << collectionid << gameid << dir; - + try { + getHttp(std::string {"https://steamcommunity.com/sharedfiles/filedetails/?id=" + collectionid}, &cachesc); + } + catch(std::string& meow) { + std::cout << meow; + return 1; + } + std::cout << "success\n"; break; } else {