Files
roro9stack/lib/files/src/file_names.h
T
twislaandClaude Opus 5.5 7ab8f043d0 F1 step 1: names, read-only rules and the packed listing (host-tested)
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
2026-10-06 07:37:36 +02:00

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