Arduino DLNA Server
Loading...
Searching...
No Matches
SdFatDirectoryTree.h
Go to the documentation of this file.
1
9#pragma once
10
11#include <string>
12#include <vector>
13
14#include "SdFatParser.h"
15#include "TreeNode.h"
16
17namespace tiny_dlna {
18
19// TreeNode is now declared in TreeNode.h
20
32template <typename FS>
34 public:
41 bool begin(FS& SD, const char* beginPath = "/") {
42 this->p_sd = &SD;
43 SD.chdir(beginPath);
44 // Allocate root node as first entry in tree_nodes
45 tree_nodes.clear();
46 auto* root = new TreeNode();
47 root->file_name = beginPath;
48 root->parent = nullptr;
49 root->id = 0;
50 tree_nodes.push_back(root);
52 return true;
53 }
54
58 void end() {
59 for (auto& ch : tree_nodes) {
60 delete ch;
61 }
62 tree_nodes.clear();
63 }
64
68 TreeNode& root() { return *tree_nodes[0]; }
69
75 TreeNode& getTreeNodeById(uint32_t id) {
76 TreeNode& result = *(tree_nodes[id]);
77 return result;
78 }
79
84 std::vector<TreeNode*, AllocatorPSRAM<TreeNode*>> getAllFiles() {
85 std::vector<TreeNode*, AllocatorPSRAM<TreeNode*>> result;
86 if (!tree_nodes.empty()) collectAllFilesFrom(*tree_nodes[0], result);
87 return result;
88 }
89
93 stringPSRAM path(uint32_t id) { return getTreeNodeById(id).path(); }
94
96 size_t size() { return tree_nodes.size(); }
97
98 protected:
100 FS* p_sd = nullptr;
101 std::vector<TreeNode*, AllocatorPSRAM<TreeNode*>> tree_nodes;
102 std::vector<TreeNode*> parent_stack; // stack for parent management
103
104 // Recursively collect all file nodes from a tree
106 TreeNode& node,
107 std::vector<TreeNode*, AllocatorPSRAM<TreeNode*>>& result) {
108 if (!node.is_dir) {
109 result.push_back(&node);
110 }
111 for (auto* child : node.children) {
112 if (child) collectAllFilesFrom(*child, result);
113 }
114 }
115
116 // Static callback invoked by SdFatParser when a line is parsed
117 static void onParsedCallback(SdFatFileInfo& info, void* ref) {
118 auto* self = static_cast<SdFatDirectoryTree*>(ref);
119 if (!self) return;
120 TreeNode* root = self->tree_nodes[0];
121 // Initialize stack with root if empty
122 if (self->parent_stack.empty()) self->parent_stack.push_back(root);
123
124 // Ensure parent_stack has exactly info.level+1 elements (root at 0)
125 while ((int)self->parent_stack.size() > info.level + 1) {
126 self->parent_stack.pop_back();
127 }
128 while ((int)self->parent_stack.size() < info.level + 1) {
129 self->parent_stack.push_back(nullptr);
130 }
131
132 TreeNode* parent = self->parent_stack[info.level];
133
134 auto* node = new TreeNode();
135 assert(node != nullptr);
136 node->is_dir = info.is_directory;
137 node->file_name = info.name;
138 node->parent = parent;
139 node->id = static_cast<uint32_t>(self->tree_nodes.size());
140 if (parent != nullptr) parent->children.push_back(node);
141 self->tree_nodes.push_back(node);
142
143 // If this is a directory, ensure parent_stack[info.level+1] is this node
144 if (node->is_dir) {
145 if (self->parent_stack.size() <= static_cast<size_t>(info.level + 1)) {
146 self->parent_stack.resize(static_cast<size_t>(info.level + 2), nullptr);
147 }
148 self->parent_stack[static_cast<size_t>(info.level + 1)] = node;
149 }
150 }
151
152 void buildTree(TreeNode& node) {
153 // Reset any previous children of the root
154 node.children.clear();
155 // Do not clear tree_nodes here; root is already allocated and in
156 // tree_nodes[0]
157
158 // Prepare parsing context on this instance
159 parent_stack.clear();
160 parent_stack.push_back(tree_nodes[0]); // root on stack
161
163
164 // Ask SdFat to list recursively; output is fed into our parser (Print)
165 p_sd->ls(&parser, LS_R);
166 }
167};
168
169} // namespace tiny_dlna
Lightweight line parser for SdFat directory listings.
Node type representing files and directories for the SdFat directory tree.
Custom allocator that uses ESP32's PSRAM for memory allocation.
Definition: Allocator.h:24
Simple in-memory directory tree built using SdFat recursive directory listing.
Definition: SdFatDirectoryTree.h:33
void buildTree(TreeNode &node)
Definition: SdFatDirectoryTree.h:152
stringPSRAM path(uint32_t id)
Convenience helper to get a path by node id.
Definition: SdFatDirectoryTree.h:93
std::vector< TreeNode *, AllocatorPSRAM< TreeNode * > > tree_nodes
Definition: SdFatDirectoryTree.h:101
size_t size()
Returns the total number of nodes in the tree.
Definition: SdFatDirectoryTree.h:96
TreeNode & root()
Returns the root node of the tree.
Definition: SdFatDirectoryTree.h:68
static void onParsedCallback(SdFatFileInfo &info, void *ref)
Definition: SdFatDirectoryTree.h:117
void end()
Releases all dynamically allocated nodes and clears the tree.
Definition: SdFatDirectoryTree.h:58
FS * p_sd
Definition: SdFatDirectoryTree.h:100
TreeNode & getTreeNodeById(uint32_t id)
Finds a node by its numeric id.
Definition: SdFatDirectoryTree.h:75
std::vector< TreeNode * > parent_stack
Definition: SdFatDirectoryTree.h:102
SdFatParser parser
Definition: SdFatDirectoryTree.h:99
void collectAllFilesFrom(TreeNode &node, std::vector< TreeNode *, AllocatorPSRAM< TreeNode * > > &result)
Definition: SdFatDirectoryTree.h:105
std::vector< TreeNode *, AllocatorPSRAM< TreeNode * > > getAllFiles()
Collects all file nodes (non-directories) under the root.
Definition: SdFatDirectoryTree.h:84
bool begin(FS &SD, const char *beginPath="/")
Initializes the tree by scanning from a starting path.
Definition: SdFatDirectoryTree.h:41
Simple character-by-character parser that emits SdFatFileInfo via a callback.
Definition: SdFatParser.h:45
void setCallback(void(*cb)(SdFatFileInfo &, void *ref), void *ref=nullptr)
Sets the callback that receives parsed entries.
Definition: SdFatParser.h:82
Node in the directory tree representing either a file or a directory.
Definition: TreeNode.h:18
std::vector< TreeNode *, AllocatorPSRAM< TreeNode * > > children
Definition: TreeNode.h:23
uint32_t id
Definition: TreeNode.h:21
stringPSRAM file_name
Definition: TreeNode.h:22
bool is_dir
Definition: TreeNode.h:27
std::string path() const
Computes the full path from the root to this node.
Definition: TreeNode.h:87
TreeNode * parent
Definition: TreeNode.h:24
Definition: Allocator.h:13
std::basic_string< char, std::char_traits< char >, AllocatorPSRAM< char > > stringPSRAM
Definition: Allocator.h:106
Describes an entry from a parsed SdFat directory listing.
Definition: SdFatParser.h:21
bool is_directory
Definition: SdFatParser.h:26
int level
Definition: SdFatParser.h:29
std::string name
Definition: SdFatParser.h:24