Public Access
lib/files: path parts; names checked for rename and new folder; why something can't be renamed, moved or deleted (the Gemini cache, a file being written or a folder holding one, the firmware's top-level folders), and why it can't go into a folder; the viewer for a file by its name, with a sniff for text. FileList keeps a folder's entries packed, 256 at most, the first 256 by name whatever order the card lists them in, and sorts by name, date or size with folders first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
43 lines
1.8 KiB
C++
43 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace roro::files {
|
|
|
|
// Paths on the SD card are absolute and use '/': "/gemini/saved/index.gmi".
|
|
std::string parentOf(const std::string& path); // "/" for a top-level entry and for "/"
|
|
std::string baseName(const std::string& path); // "" for "/"
|
|
std::string joinPath(const std::string& folder, const std::string& name);
|
|
std::string extensionOf(const std::string& name); // lower case, without the dot; "" if none
|
|
bool isInside(const std::string& path, const std::string& folder); // a folder is inside itself
|
|
|
|
// A name typed for rename or a new folder (F1, Q131): "" if FAT and this App can take it, or why not.
|
|
std::string checkName(const std::string& name);
|
|
|
|
// The top-level folders the firmware keeps its files in. They can't be renamed or deleted;
|
|
// what's in them can (Q130).
|
|
extern const char* const kFirmwareFolders[];
|
|
extern const size_t kFirmwareFolderCount;
|
|
constexpr const char* kGeminiCache = "/gemini/cache";
|
|
|
|
// Why `path` can't be renamed, moved or deleted, or "" if it can (Q130). `inUse`: the files the
|
|
// firmware has open right now.
|
|
std::string whyReadOnly(const std::string& path, const std::vector<std::string>& inUse);
|
|
|
|
// Why `source` can't be copied or moved into the folder `into`, or "" if it can.
|
|
std::string whyNotInto(const std::string& source, const std::string& into);
|
|
|
|
// "a (2).gmi": the name of a copy made next to its original.
|
|
std::string copyName(const std::string& name, int n);
|
|
|
|
// Which viewer opens a file (Q134), from its name. Unknown: look at the first bytes.
|
|
enum class FileKind : uint8_t { Text, Gpx, Pcap, Ota, Unknown };
|
|
FileKind kindOf(const std::string& name);
|
|
bool opensAtEnd(const std::string& name); // logs
|
|
bool looksLikeText(const uint8_t* data, size_t len);
|
|
|
|
} // namespace roro::files
|