Arduino TinyFTP
Loading...
Searching...
No Matches
FTPFileIterator.h
1#pragma once
2
3#include "Arduino.h"
4#include "FTPBasicAPI.h" // Include for FTPBasicAPI class
5#include "FTPFile.h" // Include for FTPFile class
6#include "Stream.h"
7
8namespace ftp_client {
9
19 public:
20 FTPFileIterator() = default;
21
22 FTPFileIterator(FTPBasicAPI *api, const char *dir, FileMode mode) {
23 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator()");
24 this->directory_name = dir;
25 this->api_ptr = api;
26 this->file_mode = mode;
27 }
28
29 FTPFileIterator &begin() {
30 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator", "begin");
31 if (api_ptr != nullptr && directory_name != nullptr) {
32 stream_ptr = api_ptr->ls(directory_name);
33 readLine();
34 } else {
35 FTPLogger::writeLog(LOG_ERROR, "FTPFileIterator", "api_ptr is null");
36 buffer = "";
37 }
38 return *this;
39 }
40
41 FTPFileIterator &end() {
42 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator", "end");
43 static FTPFileIterator end;
44 end.buffer = "";
45 return end;
46 }
47
48 FTPFileIterator &operator++() {
49 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator", "++");
50 readLine();
51 return *this;
52 }
53
54 FTPFileIterator &operator++(int na) {
55 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator", "++(1)");
56 for (int j = 0; j < na; j++) readLine();
57 return *this;
58 }
59
60 FTPFile operator*() {
61 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator", "*");
62 // return file that does not autoclose
63 return FTPFile(api_ptr, buffer.c_str(), file_mode, false);
64 }
65
66 bool operator!=(const FTPFileIterator &comp) { return buffer != comp.buffer; }
67
68 bool operator==(const FTPFileIterator &comp) { return buffer == comp.buffer; }
69
70 bool operator>(const FTPFileIterator &comp) { return buffer > comp.buffer; }
71
72 bool operator<(const FTPFileIterator &comp) { return buffer < comp.buffer; }
73
74 bool operator>=(const FTPFileIterator &comp) { return buffer >= comp.buffer; }
75
76 bool operator<=(const FTPFileIterator &comp) { return buffer <= comp.buffer; }
77
78 const char *fileName() { return buffer.c_str(); }
79
80 protected:
81 void readLine() {
82 FTPLogger::writeLog(LOG_DEBUG, "FTPFileIterator", "readLine");
83 buffer = "";
84 if (stream_ptr != nullptr) {
85 buffer = stream_ptr->readStringUntil('\n');
86 // For Windows compatibility, remove trailing \r
87 if (buffer.endsWith("\r")) buffer.remove(buffer.length() - 1);
88 FTPLogger::writeLog(LOG_DEBUG, "line", buffer.c_str());
89
90 // End of ls !!!
91 if (api_ptr->currentOperation() == LS_OP && buffer[0] == 0) {
92 // Close data connection
93 api_ptr->closeData();
94 // Reset operation status
95 api_ptr->setCurrentOperation(NOP);
96
97 // Get final status
98 const char *ok[] = {"226", "250", nullptr};
99 api_ptr->checkResult(ok, "ls-end", true);
100 }
101 } else {
102 FTPLogger::writeLog(LOG_ERROR, "FTPFileIterator", "stream_ptr is null");
103 }
104 }
105
106 FTPBasicAPI *api_ptr = nullptr;
107 Stream *stream_ptr = nullptr;
108 FileMode file_mode;
109 const char *directory_name = "";
110 String buffer = "";
111};
112
113} // namespace ftp_client
FTPBasicAPI Implementation of Low Level FTP protocol. In order to simplify the logic we always use Pa...
Definition FTPBasicAPI.h:17
FTPFile A single file which supports read and write operations. This class is implemented as an Ardui...
Definition FTPFile.h:16
FTPFileIterator The file name iterator can be used to list all available files and directories....
Definition FTPFileIterator.h:18