#pragma once #include #include #include "rapidjson/document.h" #include "Base64.hpp" #include "Utils.hpp" #include "Constants.h" namespace khofmann { /// /// Read a file and return file contents /// /// Path of BASE64 encoded File /// Allocator /// File contents static rapidjson::Value readFile(const char* path, rapidjson::Document::AllocatorType& alloc) { FILE* file = fopen(path, "r"); if (file) { fseek(file, 0, SEEK_END); long fsize = ftell(file); fseek(file, 0, SEEK_SET); char* string = (char*)calloc(sizeof(char), fsize + 1); fread(string, fsize, 1, file); fclose(file); return rapidjson::Value(string, alloc); } return rapidjson::Value("", alloc); } /// /// Enumerate a directory and return list of directories. /// Return tumbnail as BASE64 and page count if present. /// /// Path of directory /// Allocator /// List of Files static rapidjson::Value enumerateDir(const char* path, rapidjson::Document::AllocatorType& alloc) { rapidjson::Value files; files.SetArray(); int count = 0; DIR* d; struct dirent* dir; d = opendir(path); if (d) { while ((dir = readdir(d)) != NULL) { if (strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..")) { std::string dirPath(path); dirPath += dir->d_name; std::string thumb(dirPath); thumb += "/thumb.bjpg"; FILE* check = fopen(thumb.c_str(), "r"); if (check) { fclose(check); DIR* f; struct dirent* file; f = opendir(dirPath.c_str()); if (f) { log(stdout, "Found file %s\n", dir->d_name); while ((file = readdir(f)) != NULL) { if (file->d_type == DT_REG) { count++; } } rapidjson::Value entry; entry.SetObject(); entry.AddMember("name", rapidjson::Value(dir->d_name, alloc).Move(), alloc); entry.AddMember("pages", count - 1, alloc); entry.AddMember("thumb", readFile(thumb.c_str(), alloc).Move(), alloc); entry.AddMember("type", "file", alloc); files.PushBack(entry.Move(), alloc); } closedir(f); } else { log(stdout, "Found directory %s\n", dir->d_name); rapidjson::Value entry; entry.SetObject(); entry.AddMember("name", rapidjson::Value(dir->d_name, alloc).Move(), alloc); entry.AddMember("type", "directory", alloc); files.PushBack(entry.Move(), alloc); } } } } closedir(d); return files; } }