#include "CacheManager.h" #include #include #include #include CacheManager::CacheManager(const char* cache_path) : CacheManager(std::string(cache_path)) { } CacheManager::CacheManager(std::string cache_path) { this->cache_path = cache_path; this->verify_cache(); } CacheManager::~CacheManager() { for (std::fstream* file : this->files) { if (file != nullptr) { file->close(); delete file; file = nullptr; } } } void CacheManager::verify_cache() { if (!std::filesystem::is_directory(this->cache_path)) this->init_cache(); this->update_cache(); } void CacheManager::init_cache() { std::filesystem::create_directory(this->cache_path); this->update_cache(); } void CacheManager::update_cache() { std::fstream& date = *cache_get("date"); this->age = std::time(nullptr); date << this->age; date.close(); } std::fstream* CacheManager::cache_get(std::string filename) { return cache_get(filename.c_str()); } std::fstream* CacheManager::cache_get(const char* filename) { std::filesystem::path fixed_path = prefix_cache_path(filename); // fix duplicate slashes and add prefix std::filesystem::create_directories(fixed_path.parent_path()); // make sure folder exists if (!std::filesystem::exists(fixed_path)) std::fstream(fixed_path, std::ios::trunc | std::ios::out).close(); // touch file std::fstream* file = new std::fstream(fixed_path.c_str(), std::ios::out | std::ios::in); // open file this->files.push_back(file); // add file pointer (for closing all files on exit) return file; } bool CacheManager::cache_exists(std::string filename) { return cache_exists(filename.c_str()); } bool CacheManager::cache_exists(const char* filename) { return std::filesystem::exists(prefix_cache_path(filename)); } std::string CacheManager::prefix_cache_path(const char* filename) { return this->cache_path + "/" + std::string(filename); }