Arduino TinyFTP
All Classes Functions Pages
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 
8 namespace 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  FTPLogger::writeLog(LOG_DEBUG, "line", buffer.c_str());
87 
88  // End of ls !!!
89  if (api_ptr->currentOperation() == LS_OP && buffer[0] == 0) {
90  // Close data connection
91  api_ptr->closeData();
92  // Reset operation status
93  api_ptr->setCurrentOperation(NOP);
94 
95  // Get final status
96  const char *ok[] = {"226", "250", nullptr};
97  api_ptr->checkResult(ok, "ls-end", true);
98  }
99  } else {
100  FTPLogger::writeLog(LOG_ERROR, "FTPFileIterator", "stream_ptr is null");
101  }
102  }
103 
104  FTPBasicAPI *api_ptr = nullptr;
105  Stream *stream_ptr = nullptr;
106  FileMode file_mode;
107  const char *directory_name = "";
108  String buffer = "";
109 };
110 
111 } // 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