#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); rapidjson::Value retVal(string, alloc); free(string); return retVal; } return rapidjson::Value("", alloc); } /// /// Enumerate a directory and return list of directories. /// Return tumbnail as BASE64 and page count if present. /// /// Path of directory /// Pointer to files value object /// Allocator static void enumerateDir(const char* path, rapidjson::Value *files, rapidjson::Document::AllocatorType& alloc) { DIR* d = opendir(path); if (d) { struct dirent* dir; while ((dir = readdir(d)) != NULL) { if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0) continue; 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) { int count = 0; log(stdout, "Found file %s\n", dir->d_name); while ((file = readdir(f)) != NULL) { if (file->d_type == DT_REG && strstr(file->d_name, ".bjpg") != NULL) { 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 if (dir->d_type == DT_DIR) { 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); } }