├── .nojekyll ├── docs └── html │ ├── .nojekyll │ ├── bc_s.png │ ├── bdwn.png │ ├── doc.png │ ├── docd.png │ ├── open.png │ ├── bc_sd.png │ ├── closed.png │ ├── nav_f.png │ ├── nav_fd.png │ ├── nav_g.png │ ├── nav_h.png │ ├── nav_hd.png │ ├── sync_on.png │ ├── tab_a.png │ ├── tab_ad.png │ ├── tab_b.png │ ├── tab_bd.png │ ├── tab_h.png │ ├── tab_hd.png │ ├── tab_s.png │ ├── tab_sd.png │ ├── splitbar.png │ ├── splitbard.png │ ├── sync_off.png │ ├── folderclosed.png │ ├── folderopen.png │ ├── class_f_t_p_file.png │ ├── search │ ├── search_l.png │ ├── search_m.png │ ├── search_r.png │ ├── pages_0.js │ ├── all_d.js │ ├── classes_2.js │ ├── files_0.js │ ├── all_1.js │ ├── all_b.js │ ├── classes_0.js │ ├── enums_0.js │ ├── all_0.js │ ├── functions_5.js │ ├── functions_3.js │ ├── functions_6.js │ ├── functions_a.js │ ├── functions_b.js │ ├── functions_4.js │ ├── all_a.js │ ├── all_8.js │ ├── functions_8.js │ ├── functions_7.js │ ├── functions_2.js │ ├── all_12.js │ ├── all_9.js │ ├── all_10.js │ ├── searchdata.js │ ├── all_11.js │ ├── all_6.js │ ├── all_c.js │ ├── all_4.js │ ├── all_5.js │ ├── functions_1.js │ ├── nomatches.html │ ├── functions_0.js │ ├── functions_9.js │ ├── all_3.js │ ├── classes_1.js │ ├── all_2.js │ ├── all_e.js │ ├── all_f.js │ ├── mag.svg │ ├── mag_d.svg │ ├── close.svg │ ├── mag_sel.svg │ ├── mag_seld.svg │ ├── all_7.js │ ├── all_0.html │ ├── all_1.html │ ├── all_2.html │ ├── all_3.html │ ├── all_4.html │ ├── all_5.html │ ├── all_6.html │ ├── all_7.html │ ├── all_8.html │ ├── all_9.html │ ├── all_a.html │ ├── all_b.html │ ├── all_c.html │ ├── enums_0.html │ ├── files_0.html │ ├── pages_0.html │ ├── classes_0.html │ ├── classes_1.html │ ├── functions_0.html │ ├── functions_1.html │ ├── functions_2.html │ ├── functions_3.html │ ├── functions_4.html │ ├── functions_5.html │ ├── functions_6.html │ ├── functions_7.html │ ├── functions_8.html │ ├── functions_9.html │ ├── functions_a.html │ ├── functions_b.html │ └── search.css │ ├── class_ftp_ip_client.png │ ├── class_ftp_ip_client_wifi.png │ ├── class_i_p_connect_ethernet.png │ ├── classftp__client_1_1_f_t_p_file.png │ ├── minus.svg │ ├── minusd.svg │ ├── plus.svg │ ├── plusd.svg │ ├── doc.svg │ ├── docd.svg │ ├── menudata.js │ ├── folderclosed.svg │ ├── folderclosedd.svg │ ├── globals_enum.html │ ├── folderopend.svg │ ├── folderopen.svg │ ├── globals.html │ ├── class_i_p_connect_ethernet-members.html │ ├── class_c_string_functions-members.html │ ├── classes.html │ ├── classftp__client_1_1_c_string_functions-members.html │ ├── class_i_p_connect_ethernet.html │ ├── class_ftp_ip_client-members.html │ ├── class_f_t_p_logger-members.html │ ├── classftp__client_1_1_f_t_p_logger-members.html │ ├── class_c_string_functions.html │ ├── class_ftp_ip_client_wifi-members.html │ ├── files.html │ ├── dir_68267d1309a1af8e8297ef4c3efbcdba.html │ └── menu.js ├── .gitignore ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── Issue-report.yml └── FUNDING.yml ├── examples ├── CMakeLists.txt ├── ls │ ├── CMakeLists.txt │ └── ls.ino ├── upload │ ├── CMakeLists.txt │ └── upload.ino ├── download │ ├── CMakeLists.txt │ └── download.ino └── fileinfo │ ├── CMakeLists.txt │ └── fileinfo.ino ├── keywords.txt ├── library.properties ├── CMakeLists.txt └── src ├── FTPLogger.h ├── FTPCommon.h ├── FTPSession.h ├── FTPSessionMgr.h ├── FTPFileIterator.h ├── FTPClient.h └── FTPFile.h /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/html/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | debug* 2 | .vscode/ 3 | build/ -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /docs/html/bc_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/bc_s.png -------------------------------------------------------------------------------- /docs/html/bdwn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/bdwn.png -------------------------------------------------------------------------------- /docs/html/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/doc.png -------------------------------------------------------------------------------- /docs/html/docd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/docd.png -------------------------------------------------------------------------------- /docs/html/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/open.png -------------------------------------------------------------------------------- /docs/html/bc_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/bc_sd.png -------------------------------------------------------------------------------- /docs/html/closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/closed.png -------------------------------------------------------------------------------- /docs/html/nav_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/nav_f.png -------------------------------------------------------------------------------- /docs/html/nav_fd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/nav_fd.png -------------------------------------------------------------------------------- /docs/html/nav_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/nav_g.png -------------------------------------------------------------------------------- /docs/html/nav_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/nav_h.png -------------------------------------------------------------------------------- /docs/html/nav_hd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/nav_hd.png -------------------------------------------------------------------------------- /docs/html/sync_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/sync_on.png -------------------------------------------------------------------------------- /docs/html/tab_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_a.png -------------------------------------------------------------------------------- /docs/html/tab_ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_ad.png -------------------------------------------------------------------------------- /docs/html/tab_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_b.png -------------------------------------------------------------------------------- /docs/html/tab_bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_bd.png -------------------------------------------------------------------------------- /docs/html/tab_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_h.png -------------------------------------------------------------------------------- /docs/html/tab_hd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_hd.png -------------------------------------------------------------------------------- /docs/html/tab_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_s.png -------------------------------------------------------------------------------- /docs/html/tab_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/tab_sd.png -------------------------------------------------------------------------------- /docs/html/splitbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/splitbar.png -------------------------------------------------------------------------------- /docs/html/splitbard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/splitbard.png -------------------------------------------------------------------------------- /docs/html/sync_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/sync_off.png -------------------------------------------------------------------------------- /docs/html/folderclosed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/folderclosed.png -------------------------------------------------------------------------------- /docs/html/folderopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/folderopen.png -------------------------------------------------------------------------------- /docs/html/class_f_t_p_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/class_f_t_p_file.png -------------------------------------------------------------------------------- /docs/html/search/search_l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/search/search_l.png -------------------------------------------------------------------------------- /docs/html/search/search_m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/search/search_m.png -------------------------------------------------------------------------------- /docs/html/search/search_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/search/search_r.png -------------------------------------------------------------------------------- /docs/html/class_ftp_ip_client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/class_ftp_ip_client.png -------------------------------------------------------------------------------- /docs/html/search/pages_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['tinyftpclient_0',['TinyFTPClient',['../index.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/class_ftp_ip_client_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/class_ftp_ip_client_wifi.png -------------------------------------------------------------------------------- /docs/html/search/all_d.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['platforms_0',['Other Platforms',['../index.html#autotoc_md7',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/class_i_p_connect_ethernet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/class_i_p_connect_ethernet.png -------------------------------------------------------------------------------- /docs/html/classftp__client_1_1_f_t_p_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschatzmann/TinyFTPClient/HEAD/docs/html/classftp__client_1_1_f_t_p_file.png -------------------------------------------------------------------------------- /docs/html/search/classes_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ipconnectethernet_0',['IPConnectEthernet',['../class_i_p_connect_ethernet.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/files_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['arduinoftpclient_2eh_27',['ArduinoFTPClient.h',['../_arduino_f_t_p_client_8h.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/all_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['33_20iot_20etc_0',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/all_b.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['nano_2033_20iot_20etc_0',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/classes_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['cstringfunctions_0',['CStringFunctions',['../classftp__client_1_1_c_string_functions.html',1,'ftp_client']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/enums_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['filemode_44',['FileMode',['../_arduino_f_t_p_client_8h.html#a444d232382d32a4a05e76a0d5edd9fec',1,'ftp_client']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /examples/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | 2 | # define location for header files 3 | add_subdirectory("download") 4 | add_subdirectory("fileinfo") 5 | add_subdirectory("ls") 6 | add_subdirectory("upload") -------------------------------------------------------------------------------- /docs/html/search/all_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['2_20arduino_20nano_2033_20iot_20etc_0',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/functions_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ls_0',['ls',['../classftp__client_1_1_f_t_p_client.html#a2bac8d0b56270e832b6a0b19453fc7a8',1,'ftp_client::FTPClient']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/functions_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['end_0',['end',['../classftp__client_1_1_f_t_p_client.html#a793410cfa0c3eed6b5edca705b2ae534',1,'ftp_client::FTPClient']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/functions_6.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['mkdir_0',['mkdir',['../classftp__client_1_1_f_t_p_client.html#aec4e6bea22d1974389500b122a3475ec',1,'ftp_client::FTPClient']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/functions_a.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['type_0',['type',['../classftp__client_1_1_f_t_p_client.html#ac31ca05125215904b5ce5887209fa5b5',1,'ftp_client::FTPClient']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/functions_b.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['type_47',['type',['../classftp__client_1_1_f_t_p_client.html#ac31ca05125215904b5ce5887209fa5b5',1,'ftp_client::FTPClient']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/functions_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ftpclient_0',['FTPClient',['../classftp__client_1_1_f_t_p_client.html#a271743be55c750fc7b9af8a731c3ab25',1,'ftp_client::FTPClient']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/all_a.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['me_0',['Sponsor Me',['../index.html#autotoc_md19',1,'']]], 4 | ['mkdir_1',['mkdir',['../classftp__client_1_1_f_t_p_client.html#aec4e6bea22d1974389500b122a3475ec',1,'ftp_client::FTPClient']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | FTP KEYWORD1 2 | Client KEYWORD1 3 | FTP Client KEYWORD1 4 | Files KEYWORD1 5 | Remote Files KEYWORD1 6 | API KEYWORD1 7 | FTPFile KEYWORD1 8 | Client KEYWORD1 9 | FTPClient KEYWORD1 10 | FileNameIterator KEYWORD1 11 | FTPBasicAPI KEYWORD1 12 | -------------------------------------------------------------------------------- /docs/html/search/all_8.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['installation_0',['Installation',['../index.html#autotoc_md18',1,'']]], 4 | ['iot_20etc_1',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]], 5 | ['ip_2',['TCP IP',['../index.html#autotoc_md1',1,'']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/html/search/functions_8.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['remove_0',['remove',['../classftp__client_1_1_f_t_p_client.html#a04e0014bb39632b25c95296f32d3ad8e',1,'ftp_client::FTPClient']]], 4 | ['rmdir_1',['rmdir',['../classftp__client_1_1_f_t_p_client.html#af6b03cacfc23b889709204a3fbeafb0c',1,'ftp_client::FTPClient']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=TinyFTPClient 2 | version=1.2.2 3 | author=Phil Schatzmann 4 | maintainer= 5 | sentence=Arduino FTP Client 6 | paragraph=Reading and Writing of Remote Files using FTP 7 | category=Communication 8 | url=https://github.com/pschatzmann/ArduinoFTPClient.git 9 | architectures=* 10 | 11 | -------------------------------------------------------------------------------- /docs/html/search/functions_7.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['open_0',['open',['../classftp__client_1_1_f_t_p_client.html#a78bf1e833b04c2c8858a063ee9e71932',1,'ftp_client::FTPClient']]], 4 | ['operator_20bool_1',['operator bool',['../classftp__client_1_1_f_t_p_session.html#a354e074bd75e8f8fd3a99665649b8998',1,'ftp_client::FTPSession']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /docs/html/search/functions_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['count_0',['count',['../classftp__client_1_1_f_t_p_session_mgr.html#a3a32c0d933666e120c1a3322091e0781',1,'ftp_client::FTPSessionMgr::count()'],['../classftp__client_1_1_f_t_p_session_mgr.html#a224d9eb76280ac9a2d2013bb807fab98',1,'ftp_client::FTPSessionMgr::count(CurrentOperation op)']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/html/search/all_12.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['w_0',['RP2040 W',['../index.html#autotoc_md4',1,'']]], 4 | ['wifi_20rev_202_20arduino_20nano_2033_20iot_20etc_1',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]], 5 | ['writing_20to_20remote_20files_2',['File Upload - Writing to Remote Files',['../index.html#autotoc_md11',1,'']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/html/search/all_9.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['line_20based_0',['File Download - Line Based',['../index.html#autotoc_md10',1,'']]], 4 | ['list_20directory_1',['List Directory',['../index.html#autotoc_md14',1,'']]], 5 | ['logging_2',['Logging',['../index.html#autotoc_md15',1,'']]], 6 | ['ls_3',['ls',['../classftp__client_1_1_f_t_p_client.html#a2bac8d0b56270e832b6a0b19453fc7a8',1,'ftp_client::FTPClient']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /docs/html/search/all_10.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['tcp_20ip_0',['TCP IP',['../index.html#autotoc_md1',1,'']]], 4 | ['tinyftpclient_1',['TinyFTPClient',['../index.html',1,'']]], 5 | ['to_20remote_20files_2',['File Upload - Writing to Remote Files',['../index.html#autotoc_md11',1,'']]], 6 | ['type_3',['type',['../classftp__client_1_1_f_t_p_client.html#ac31ca05125215904b5ce5887209fa5b5',1,'ftp_client::FTPClient']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /docs/html/search/searchdata.js: -------------------------------------------------------------------------------- 1 | var indexSectionsWithContent = 2 | { 3 | 0: "23abcdefilmnoprstuw", 4 | 1: "cf", 5 | 2: "abceflmorst", 6 | 3: "t" 7 | }; 8 | 9 | var indexSectionNames = 10 | { 11 | 0: "all", 12 | 1: "classes", 13 | 2: "functions", 14 | 3: "pages" 15 | }; 16 | 17 | var indexSectionLabels = 18 | { 19 | 0: "All", 20 | 1: "Classes", 21 | 2: "Functions", 22 | 3: "Pages" 23 | }; 24 | 25 | -------------------------------------------------------------------------------- /docs/html/search/all_11.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['uno_20wifi_20rev_202_20arduino_20nano_2033_20iot_20etc_0',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]], 4 | ['upload_20appending_1',['File Upload - Appending',['../index.html#autotoc_md12',1,'']]], 5 | ['upload_20writing_20to_20remote_20files_2',['File Upload - Writing to Remote Files',['../index.html#autotoc_md11',1,'']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/html/search/all_6.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['end_0',['end',['../classftp__client_1_1_f_t_p_client.html#a793410cfa0c3eed6b5edca705b2ae534',1,'ftp_client::FTPClient']]], 4 | ['esp32_1',['ESP32',['../index.html#autotoc_md2',1,'']]], 5 | ['esp8266_2',['ESP8266',['../index.html#autotoc_md3',1,'']]], 6 | ['etc_3',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]], 7 | ['ethernet_20shield_4',['Ethernet Shield',['../index.html#autotoc_md6',1,'']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/html/search/all_c.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['open_0',['open',['../classftp__client_1_1_f_t_p_client.html#a78bf1e833b04c2c8858a063ee9e71932',1,'ftp_client::FTPClient']]], 4 | ['operator_20bool_1',['operator bool',['../classftp__client_1_1_f_t_p_session.html#a354e074bd75e8f8fd3a99665649b8998',1,'ftp_client::FTPSession']]], 5 | ['operatrions_2',['Directory operatrions',['../index.html#autotoc_md13',1,'']]], 6 | ['other_20platforms_3',['Other Platforms',['../index.html#autotoc_md7',1,'']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /docs/html/search/all_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['connecting_0',['Connecting',['../index.html#autotoc_md8',1,'']]], 4 | ['count_1',['count',['../classftp__client_1_1_f_t_p_session_mgr.html#a3a32c0d933666e120c1a3322091e0781',1,'ftp_client::FTPSessionMgr::count()'],['../classftp__client_1_1_f_t_p_session_mgr.html#a224d9eb76280ac9a2d2013bb807fab98',1,'ftp_client::FTPSessionMgr::count(CurrentOperation op)']]], 5 | ['cstringfunctions_2',['CStringFunctions',['../classftp__client_1_1_c_string_functions.html',1,'ftp_client']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/html/search/all_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['directory_0',['List Directory',['../index.html#autotoc_md14',1,'']]], 4 | ['directory_20operatrions_1',['Directory operatrions',['../index.html#autotoc_md13',1,'']]], 5 | ['documentation_2',['Documentation',['../index.html#autotoc_md16',1,'']]], 6 | ['download_20line_20based_3',['File Download - Line Based',['../index.html#autotoc_md10',1,'']]], 7 | ['download_20reading_20remote_20files_4',['File Download - Reading Remote Files',['../index.html#autotoc_md9',1,'']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/html/search/functions_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['begin_0',['begin',['../classftp__client_1_1_f_t_p_client.html#af28b09eaf0aef5c342da743e1e2291e6',1,'ftp_client::FTPClient::begin()'],['../classftp__client_1_1_f_t_p_session.html#aca22520bec67d4369cd58c67d15d57a9',1,'ftp_client::FTPSession::begin()'],['../classftp__client_1_1_f_t_p_session_mgr.html#a79063b3165352ec087d3d7b03462e42a',1,'ftp_client::FTPSessionMgr::begin()']]], 4 | ['binary_1',['binary',['../classftp__client_1_1_f_t_p_client.html#a991962b43b870dc8e985af712b2bc217',1,'ftp_client::FTPClient']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /docs/html/search/nomatches.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |
No Matches
11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/html/search/functions_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['abort_0',['abort',['../classftp__client_1_1_f_t_p_client.html#a09afdf7442d932f34ce355c16ffba0ae',1,'ftp_client::FTPClient::abort()'],['../classftp__client_1_1_f_t_p_session_mgr.html#a6d7e974212b261d7002f986bf5bba81b',1,'ftp_client::FTPSessionMgr::abort()']]], 4 | ['api_1',['api',['../classftp__client_1_1_f_t_p_session.html#a3999ca7c02f9d83e02fa803277ba832d',1,'ftp_client::FTPSession']]], 5 | ['ascii_2',['ascii',['../classftp__client_1_1_f_t_p_client.html#a587f98bf75e7324361289cc43de90baa',1,'ftp_client::FTPClient']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /examples/ls/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.20) 2 | 3 | # set the project name 4 | project(ls) 5 | set (CMAKE_CXX_STANDARD 11) 6 | set (DCMAKE_CXX_FLAGS "-Werror") 7 | 8 | include(FetchContent) 9 | 10 | 11 | # build sketch as executable 12 | set_source_files_properties(ls.ino PROPERTIES LANGUAGE CXX) 13 | add_executable (ls ls.ino) 14 | 15 | # set preprocessor defines 16 | target_compile_definitions(arduino_emulator PUBLIC -DDEFINE_MAIN) 17 | target_compile_definitions(ls PUBLIC -DARDUINO -DIS_DESKTOP) 18 | 19 | # specify libraries 20 | target_link_libraries(ls arduino_emulator ftp-client) -------------------------------------------------------------------------------- /docs/html/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/html/minusd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /examples/upload/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.20) 2 | 3 | # set the project name 4 | project(upload) 5 | set (CMAKE_CXX_STANDARD 11) 6 | set (DCMAKE_CXX_FLAGS "-Werror") 7 | 8 | include(FetchContent) 9 | 10 | # build sketch as executable 11 | set_source_files_properties(upload.ino PROPERTIES LANGUAGE CXX) 12 | add_executable (upload upload.ino) 13 | 14 | # set preprocessor defines 15 | target_compile_definitions(arduino_emulator PUBLIC -DDEFINE_MAIN) 16 | target_compile_definitions(upload PUBLIC -DARDUINO -DIS_DESKTOP) 17 | 18 | # specify libraries 19 | target_link_libraries(upload arduino_emulator ftp-client) -------------------------------------------------------------------------------- /docs/html/search/functions_9.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['session_0',['session',['../classftp__client_1_1_f_t_p_session_mgr.html#a82c4035509fceaaa1135b6d222da3a72',1,'ftp_client::FTPSessionMgr']]], 4 | ['sessionmgr_1',['sessionMgr',['../classftp__client_1_1_f_t_p_client.html#ad8d1d66169160e2cd5830554cb10890b',1,'ftp_client::FTPClient']]], 5 | ['setusetypecommand_2',['setUseTypeCommand',['../classftp__client_1_1_f_t_p_client.html#a22a074908ac825a78b92f722b90be1ef',1,'ftp_client::FTPClient']]], 6 | ['setvalid_3',['setValid',['../classftp__client_1_1_f_t_p_session.html#a61ca4d164dbd9127b3ac242fcb8a34e9',1,'ftp_client::FTPSession']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /examples/download/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.20) 2 | 3 | # set the project name 4 | project(download) 5 | set (CMAKE_CXX_STANDARD 11) 6 | set (DCMAKE_CXX_FLAGS "-Werror") 7 | 8 | include(FetchContent) 9 | 10 | # build sketch as executable 11 | set_source_files_properties(download.ino PROPERTIES LANGUAGE CXX) 12 | add_executable (download download.ino) 13 | 14 | # set preprocessor defines 15 | target_compile_definitions(arduino_emulator PUBLIC -DDEFINE_MAIN) 16 | target_compile_definitions(download PUBLIC -DARDUINO -DIS_DESKTOP) 17 | 18 | # specify libraries 19 | target_link_libraries(download arduino_emulator ftp-client) -------------------------------------------------------------------------------- /examples/fileinfo/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.20) 2 | 3 | # set the project name 4 | project(fileinfo) 5 | set (CMAKE_CXX_STANDARD 11) 6 | set (DCMAKE_CXX_FLAGS "-Werror") 7 | 8 | include(FetchContent) 9 | 10 | # build sketch as executable 11 | set_source_files_properties(fileinfo.ino PROPERTIES LANGUAGE CXX) 12 | add_executable (fileinfo fileinfo.ino) 13 | 14 | # set preprocessor defines 15 | target_compile_definitions(arduino_emulator PUBLIC -DDEFINE_MAIN) 16 | target_compile_definitions(fileinfo PUBLIC -DARDUINO -DIS_DESKTOP) 17 | 18 | # specify libraries 19 | target_link_libraries(fileinfo arduino_emulator ftp-client) -------------------------------------------------------------------------------- /docs/html/search/all_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['based_0',['File Download - Line Based',['../index.html#autotoc_md10',1,'']]], 4 | ['begin_1',['begin',['../classftp__client_1_1_f_t_p_client.html#af28b09eaf0aef5c342da743e1e2291e6',1,'ftp_client::FTPClient::begin()'],['../classftp__client_1_1_f_t_p_session.html#aca22520bec67d4369cd58c67d15d57a9',1,'ftp_client::FTPSession::begin()'],['../classftp__client_1_1_f_t_p_session_mgr.html#a79063b3165352ec087d3d7b03462e42a',1,'ftp_client::FTPSessionMgr::begin()']]], 5 | ['binary_2',['binary',['../classftp__client_1_1_f_t_p_client.html#a991962b43b870dc8e985af712b2bc217',1,'ftp_client::FTPClient']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/html/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/html/plusd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/html/search/classes_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ftpbasicapi_0',['FTPBasicAPI',['../classftp__client_1_1_f_t_p_basic_a_p_i.html',1,'ftp_client']]], 4 | ['ftpclient_1',['FTPClient',['../classftp__client_1_1_f_t_p_client.html',1,'ftp_client']]], 5 | ['ftpfile_2',['FTPFile',['../classftp__client_1_1_f_t_p_file.html',1,'ftp_client']]], 6 | ['ftpfileiterator_3',['FTPFileIterator',['../classftp__client_1_1_f_t_p_file_iterator.html',1,'ftp_client']]], 7 | ['ftplogger_4',['FTPLogger',['../classftp__client_1_1_f_t_p_logger.html',1,'ftp_client']]], 8 | ['ftpsession_5',['FTPSession',['../classftp__client_1_1_f_t_p_session.html',1,'ftp_client']]], 9 | ['ftpsessionmgr_6',['FTPSessionMgr',['../classftp__client_1_1_f_t_p_session_mgr.html',1,'ftp_client']]] 10 | ]; 11 | -------------------------------------------------------------------------------- /docs/html/search/all_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['abort_0',['abort',['../classftp__client_1_1_f_t_p_client.html#a09afdf7442d932f34ce355c16ffba0ae',1,'ftp_client::FTPClient::abort()'],['../classftp__client_1_1_f_t_p_session_mgr.html#a6d7e974212b261d7002f986bf5bba81b',1,'ftp_client::FTPSessionMgr::abort()']]], 4 | ['api_1',['api',['../classftp__client_1_1_f_t_p_session.html#a3999ca7c02f9d83e02fa803277ba832d',1,'ftp_client::FTPSession']]], 5 | ['appending_2',['File Upload - Appending',['../index.html#autotoc_md12',1,'']]], 6 | ['arduino_20uno_20wifi_20rev_202_20arduino_20nano_2033_20iot_20etc_3',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]], 7 | ['ascii_4',['ascii',['../classftp__client_1_1_f_t_p_client.html#a587f98bf75e7324361289cc43de90baa',1,'ftp_client::FTPClient']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/html/search/all_e.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['reading_20remote_20files_0',['File Download - Reading Remote Files',['../index.html#autotoc_md9',1,'']]], 4 | ['remote_20files_1',['remote files',['../index.html#autotoc_md9',1,'File Download - Reading Remote Files'],['../index.html#autotoc_md11',1,'File Upload - Writing to Remote Files']]], 5 | ['remove_2',['remove',['../classftp__client_1_1_f_t_p_client.html#a04e0014bb39632b25c95296f32d3ad8e',1,'ftp_client::FTPClient']]], 6 | ['rev_202_20arduino_20nano_2033_20iot_20etc_3',['Arduino Uno WiFi Rev.2, Arduino Nano 33 IoT etc',['../index.html#autotoc_md5',1,'']]], 7 | ['rmdir_4',['rmdir',['../classftp__client_1_1_f_t_p_client.html#af6b03cacfc23b889709204a3fbeafb0c',1,'ftp_client::FTPClient']]], 8 | ['rp2040_20w_5',['RP2040 W',['../index.html#autotoc_md4',1,'']]] 9 | ]; 10 | -------------------------------------------------------------------------------- /docs/html/search/all_f.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['session_0',['session',['../classftp__client_1_1_f_t_p_session_mgr.html#a82c4035509fceaaa1135b6d222da3a72',1,'ftp_client::FTPSessionMgr']]], 4 | ['sessionmgr_1',['sessionMgr',['../classftp__client_1_1_f_t_p_client.html#ad8d1d66169160e2cd5830554cb10890b',1,'ftp_client::FTPClient']]], 5 | ['setusetypecommand_2',['setUseTypeCommand',['../classftp__client_1_1_f_t_p_client.html#a22a074908ac825a78b92f722b90be1ef',1,'ftp_client::FTPClient']]], 6 | ['setvalid_3',['setValid',['../classftp__client_1_1_f_t_p_session.html#a61ca4d164dbd9127b3ac242fcb8a34e9',1,'ftp_client::FTPSession']]], 7 | ['shield_4',['Ethernet Shield',['../index.html#autotoc_md6',1,'']]], 8 | ['sponsor_20me_5',['Sponsor Me',['../index.html#autotoc_md19',1,'']]], 9 | ['support_6',['Support',['../index.html#autotoc_md17',1,'']]] 10 | ]; 11 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: philschatzh 14 | custom: ['https://www.paypal.com/paypalme/pschatzmann?country.x=CH&locale.x=en_US'] -------------------------------------------------------------------------------- /docs/html/search/mag.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | 14 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /docs/html/search/mag_d.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | 14 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /examples/ls/ls.ino: -------------------------------------------------------------------------------- 1 | #include "WiFi.h" 2 | #include "FTPClient.h" 3 | 4 | FTPClient client; 5 | 6 | void setup() { 7 | Serial.begin(115200); 8 | 9 | // connect to WIFI 10 | WiFi.begin("network name", "password"); 11 | while (WiFi.status() != WL_CONNECTED) { 12 | delay(500); 13 | Serial.print("."); 14 | } 15 | 16 | #ifdef ESP32 17 | IPAddress localAddress = WiFi.localIP(); 18 | Serial.println(); 19 | Serial.print("Started with address "); 20 | Serial.println(localAddress.toString()); 21 | #endif 22 | // optional logging 23 | FTPLogger::setOutput(Serial); 24 | //FTPLogger::setLogLevel(LOG_DEBUG); 25 | 26 | // open connection 27 | client.begin(IPAddress(192,168,1,10), "ftp-userid", "ftp-password"); 28 | 29 | // list files 30 | for (auto file : client.ls("/")) { 31 | Serial.println(file.name()); 32 | } 33 | 34 | // clenaup 35 | client.end(); 36 | } 37 | 38 | 39 | void loop() { 40 | } -------------------------------------------------------------------------------- /docs/html/search/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 2 | # You can build the examples of this project on the desktop using the Arduino Emulator 3 | # with cmake using the following commands: 4 | # 5 | # mkdir build 6 | # cd build 7 | # cmake .. 8 | # make 9 | # 10 | 11 | cmake_minimum_required(VERSION 3.16) 12 | 13 | # set the project name 14 | project(ftp-client) 15 | 16 | # lots of warnings and all warnings as errors 17 | # add_compile_options(-Wall -Wextra ) 18 | 19 | include(FetchContent) 20 | 21 | # Build with Linux Arduino Emulator 22 | FetchContent_Declare(arduino_emulator GIT_REPOSITORY "https://github.com/pschatzmann/Arduino-Emulator.git" GIT_TAG main ) 23 | FetchContent_GetProperties(arduino_emulator) 24 | if(NOT arduino_emulator_POPULATED) 25 | FetchContent_Populate(arduino_emulator) 26 | add_subdirectory(${arduino_emulator_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/emulator) 27 | endif() 28 | 29 | # define location for header files 30 | add_library(ftp-client INTERFACE) 31 | target_include_directories(ftp-client INTERFACE src) 32 | 33 | add_subdirectory("examples") -------------------------------------------------------------------------------- /examples/upload/upload.ino: -------------------------------------------------------------------------------- 1 | #include "WiFi.h" 2 | #include "FTPClient.h" 3 | 4 | FTPClient client; 5 | 6 | void setup() { 7 | Serial.begin(115200); 8 | 9 | // connect to WIFI 10 | WiFi.begin("network name", "password"); 11 | while (WiFi.status() != WL_CONNECTED) { 12 | delay(500); 13 | Serial.print("."); 14 | } 15 | 16 | #ifdef ESP32 17 | IPAddress localAddress = WiFi.localIP(); 18 | Serial.println(); 19 | Serial.print("Started with address "); 20 | Serial.println(localAddress.toString()); 21 | #endif 22 | // optional logging 23 | FTPLogger::setOutput(Serial); 24 | FTPLogger::setLogLevel(LOG_DEBUG); 25 | 26 | // open connection 27 | client.begin(IPAddress(192,168,1,10), "ftp-userid", "ftp-password"); 28 | 29 | // copy data to file 30 | FTPFile file = client.open("test.txt", WRITE_MODE); 31 | char buffer[100]; 32 | for (int j=0;j<100;j++){ 33 | sprintf(buffer, "test %d", j); 34 | file.println(buffer); 35 | } 36 | file.close(); 37 | client.end(); 38 | } 39 | 40 | 41 | void loop() { 42 | } -------------------------------------------------------------------------------- /docs/html/search/mag_sel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 13 | 15 | 21 | 26 | 31 | 32 | -------------------------------------------------------------------------------- /docs/html/search/mag_seld.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 13 | 15 | 21 | 26 | 31 | 32 | -------------------------------------------------------------------------------- /examples/fileinfo/fileinfo.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #include "WiFi.h" 5 | #include "FTPClient.h" 6 | 7 | FTPClient client; 8 | 9 | void setup() { 10 | Serial.begin(115200); 11 | 12 | // connect to WIFI 13 | WiFi.begin("network name", "password"); 14 | while (WiFi.status() != WL_CONNECTED) { 15 | delay(500); 16 | Serial.print("."); 17 | } 18 | 19 | #ifdef ESP32 20 | IPAddress localAddress = WiFi.localIP(); 21 | Serial.println(); 22 | Serial.print("Started with address "); 23 | Serial.println(localAddress.toString()); 24 | #endif 25 | // optional logging 26 | FTPLogger::setOutput(Serial); 27 | //FTPLogger::setLogLevel(LOG_DEBUG); 28 | 29 | // open connection 30 | client.begin(IPAddress(192,168,1,10), "ftp-userid", "ftp-password"); 31 | 32 | FTPFile file = client.open("/home/ftp-userid/docker-cleanup.sh"); 33 | if (file){ 34 | Serial.print("name:"); Serial.println(file.name()); 35 | Serial.print("size:");Serial.println(file.size()); 36 | Serial.print("is directory:"); Serial.println(file.isDirectory()?"true":"false"); 37 | } 38 | 39 | // clenaup 40 | client.end(); 41 | } 42 | 43 | void loop() { 44 | } -------------------------------------------------------------------------------- /examples/download/download.ino: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * FTP download using an ESP32 4 | */ 5 | 6 | #include "WiFi.h" 7 | #include "FTPClient.h" 8 | 9 | FTPClient client; 10 | 11 | void setup() { 12 | Serial.begin(115200); 13 | 14 | // connect to WIFI 15 | WiFi.begin("network name", "password"); 16 | while (WiFi.status() != WL_CONNECTED) { 17 | delay(500); 18 | Serial.print("."); 19 | } 20 | 21 | #ifdef ESP32 22 | IPAddress localAddress = WiFi.localIP(); 23 | Serial.println(); 24 | Serial.print("Started with address "); 25 | Serial.println(localAddress.toString()); 26 | #endif 27 | // optional logging 28 | FTPLogger::setOutput(Serial); 29 | //FTPLogger::setLogLevel(LOG_DEBUG); 30 | 31 | // open connection 32 | client.begin(IPAddress(192,168,1,10), "ftp-userid", "ftp-password"); 33 | 34 | // copy data from file 35 | FTPFile file = client.open("/home/ftp-userid/Dropbox/Manuals/Mavlink.pdf"); 36 | int len; 37 | byte buffer[100]; 38 | while (file.available()>0){ 39 | len = file.readBytes(buffer,100); 40 | Serial.write(buffer,len); 41 | } 42 | 43 | // clenaup 44 | file.close(); 45 | client.end(); 46 | } 47 | 48 | 49 | void loop() { 50 | } -------------------------------------------------------------------------------- /docs/html/doc.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/html/docd.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/html/search/all_7.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['file_20download_20line_20based_0',['File Download - Line Based',['../index.html#autotoc_md10',1,'']]], 4 | ['file_20download_20reading_20remote_20files_1',['File Download - Reading Remote Files',['../index.html#autotoc_md9',1,'']]], 5 | ['file_20upload_20appending_2',['File Upload - Appending',['../index.html#autotoc_md12',1,'']]], 6 | ['file_20upload_20writing_20to_20remote_20files_3',['File Upload - Writing to Remote Files',['../index.html#autotoc_md11',1,'']]], 7 | ['files_4',['files',['../index.html#autotoc_md9',1,'File Download - Reading Remote Files'],['../index.html#autotoc_md11',1,'File Upload - Writing to Remote Files']]], 8 | ['ftpbasicapi_5',['FTPBasicAPI',['../classftp__client_1_1_f_t_p_basic_a_p_i.html',1,'ftp_client']]], 9 | ['ftpclient_6',['ftpclient',['../classftp__client_1_1_f_t_p_client.html',1,'ftp_client::FTPClient< ClientType >'],['../classftp__client_1_1_f_t_p_client.html#a271743be55c750fc7b9af8a731c3ab25',1,'ftp_client::FTPClient::FTPClient()']]], 10 | ['ftpfile_7',['FTPFile',['../classftp__client_1_1_f_t_p_file.html',1,'ftp_client']]], 11 | ['ftpfileiterator_8',['FTPFileIterator',['../classftp__client_1_1_f_t_p_file_iterator.html',1,'ftp_client']]], 12 | ['ftplogger_9',['FTPLogger',['../classftp__client_1_1_f_t_p_logger.html',1,'ftp_client']]], 13 | ['ftpsession_10',['FTPSession',['../classftp__client_1_1_f_t_p_session.html',1,'ftp_client']]], 14 | ['ftpsessionmgr_11',['FTPSessionMgr',['../classftp__client_1_1_f_t_p_session_mgr.html',1,'ftp_client']]] 15 | ]; 16 | -------------------------------------------------------------------------------- /docs/html/search/all_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_7.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_8.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_9.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_a.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_b.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/all_c.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/enums_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/files_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/pages_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/classes_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/classes_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_7.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_8.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_9.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_a.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/html/search/functions_b.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
Loading...
13 |
14 | 19 |
Searching...
20 |
No Matches
21 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /src/FTPLogger.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "FTPCommon.h" 4 | 5 | namespace ftp_client { 6 | 7 | // initialize static variables 8 | static LogLevel ftp_min_log_level = LOG_ERROR; 9 | static Stream *ftp_logger_out_ptr = nullptr; 10 | 11 | /** 12 | * @brief FTPLogger 13 | * To activate logging define the output stream e.g. with 14 | * FTPLogger.setOutput(Serial); and (optionally) set the log level 15 | * @author Phil Schatzmann 16 | */ 17 | class FTPLogger { 18 | public: 19 | static void setLogLevel(LogLevel level) { 20 | ftp_min_log_level = level; 21 | } 22 | 23 | static LogLevel getLogLevel() { 24 | return ftp_min_log_level; 25 | } 26 | 27 | static void setOutput(Stream &out) { 28 | ftp_logger_out_ptr = &out; 29 | } 30 | 31 | static void writeLog(LogLevel level, const char *module, const char *msg = nullptr) { 32 | if (ftp_logger_out_ptr != nullptr && level >= ftp_min_log_level) { 33 | ftp_logger_out_ptr->print("FTP "); 34 | switch (level) { 35 | case LOG_DEBUG: 36 | ftp_logger_out_ptr->print("DEBUG - "); 37 | break; 38 | case LOG_INFO: 39 | ftp_logger_out_ptr->print("INFO - "); 40 | break; 41 | case LOG_WARN: 42 | ftp_logger_out_ptr->print("WARN - "); 43 | break; 44 | case LOG_ERROR: 45 | ftp_logger_out_ptr->print("ERROR - "); 46 | break; 47 | } 48 | ftp_logger_out_ptr->print(module); 49 | if (msg != nullptr) { 50 | ftp_logger_out_ptr->print(": "); 51 | ftp_logger_out_ptr->print(msg); 52 | } 53 | ftp_logger_out_ptr->println(); 54 | } 55 | } 56 | }; 57 | 58 | } -------------------------------------------------------------------------------- /docs/html/menudata.js: -------------------------------------------------------------------------------- 1 | /* 2 | @licstart The following is the entire license notice for the JavaScript code in this file. 3 | 4 | The MIT License (MIT) 5 | 6 | Copyright (C) 1997-2020 by Dimitri van Heesch 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 9 | and associated documentation files (the "Software"), to deal in the Software without restriction, 10 | including without limitation the rights to use, copy, modify, merge, publish, distribute, 11 | sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all copies or 15 | substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 18 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 20 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | @licend The above is the entire license notice for the JavaScript code in this file 24 | */ 25 | var menudata={children:[ 26 | {text:"Main Page",url:"index.html"}, 27 | {text:"Classes",url:"annotated.html",children:[ 28 | {text:"Class List",url:"annotated.html"}, 29 | {text:"Class Index",url:"classes.html"}, 30 | {text:"Class Hierarchy",url:"hierarchy.html"}, 31 | {text:"Class Members",url:"functions.html",children:[ 32 | {text:"All",url:"functions.html"}, 33 | {text:"Functions",url:"functions_func.html"}]}]}, 34 | {text:"Files",url:"files.html",children:[ 35 | {text:"File List",url:"files.html"}]}]} 36 | -------------------------------------------------------------------------------- /docs/html/folderclosed.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/html/folderclosedd.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/FTPCommon.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "Client.h" 5 | #include "IPAddress.h" 6 | #include "Stream.h" 7 | 8 | #ifndef FTP_USE_NAMESPACE 9 | #define FTP_USE_NAMESPACE true 10 | #endif 11 | 12 | #ifndef FTP_ABORT_DELAY_MS 13 | #define FTP_ABORT_DELAY_MS 300 14 | #endif 15 | 16 | #ifndef FTP_COMMAND_BUFFER_SIZE 17 | #define FTP_COMMAND_BUFFER_SIZE 300 18 | #endif 19 | 20 | #ifndef FTP_RESULT_BUFFER_SIZE 21 | #define FTP_RESULT_BUFFER_SIZE 300 22 | #endif 23 | 24 | #ifndef FTP_COMMAND_PORT 25 | #define FTP_COMMAND_PORT 21 26 | #endif 27 | 28 | #ifndef FTP_MAX_SESSIONS 29 | #define FTP_MAX_SESSIONS 10 30 | #endif 31 | 32 | namespace ftp_client { 33 | 34 | /// @brief File Mode 35 | enum FileMode { READ_MODE, WRITE_MODE, WRITE_APPEND_MODE }; 36 | enum CurrentOperation { READ_OP, WRITE_OP, LS_OP, NOP, IS_EOF }; 37 | enum LogLevel { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR }; 38 | enum ObjectType { TypeFile, TypeDirectory, TypeUndefined }; 39 | 40 | /** 41 | * @brief CStringFunctions 42 | * We implemented some missing C based string functions for character arrays 43 | * @author Phil Schatzmann 44 | */ 45 | 46 | class CStringFunctions { 47 | public: 48 | static int findNthInStr(char *str, char ch, int n) { 49 | int occur = 0; 50 | // Loop to find the Nth 51 | // occurence of the character 52 | for (unsigned int i = 0; i < strlen(str); i++) { 53 | if (str[i] == ch) { 54 | occur += 1; 55 | } 56 | if (occur == n) return i; 57 | } 58 | return -1; 59 | } 60 | 61 | static int readln(Stream &stream, char *str, int maxLen) { 62 | int len = 0; 63 | if (maxLen > stream.available()) { 64 | maxLen = stream.available(); 65 | } 66 | for (int j = 0; j < maxLen; j++) { 67 | len = j; 68 | char c = stream.read(); 69 | if (c == 0 || c == '\n') { 70 | break; 71 | } 72 | str[j] = c; 73 | } 74 | // For Windows we remove the \r at the end 75 | if (str[len - 1] == '\r') { 76 | len--; // remove \r 77 | } 78 | memset(str + len, 0, maxLen - len); 79 | return len; 80 | } 81 | }; 82 | 83 | } 84 | 85 | #if FTP_USE_NAMESPACE 86 | using namespace ftp_client; 87 | #endif 88 | -------------------------------------------------------------------------------- /src/FTPSession.h: -------------------------------------------------------------------------------- 1 | #include "FTPBasicAPI.h" 2 | 3 | namespace ftp_client { 4 | /** 5 | * @brief FTPSession 6 | * This class manages the FTP session, including command and data connections. 7 | * It provides methods to initialize the session, open data connections, and 8 | * manage the session lifecycle. 9 | * @note The class is designed to be used in an Arduino environment, where 10 | * the Client interface is typically implemented by network libraries such 11 | * as WiFi or Ethernet. 12 | * @tparam ClientType The type of client to use for command and data 13 | * connections. It should be a class that implements the Client interface. 14 | * @author Phil Schatzmann 15 | */ 16 | template 17 | class FTPSession { 18 | public: 19 | FTPSession() { FTPLogger::writeLog(LOG_DEBUG, "FTPSession"); } 20 | 21 | ~FTPSession() { 22 | FTPLogger::writeLog(LOG_DEBUG, "~FTPSession"); 23 | end(); 24 | } 25 | 26 | /// Initializes the session with the command client 27 | bool begin(IPAddress &address, int port, const char *username, 28 | const char *password) { 29 | if (!is_valid) return false; 30 | return basic_api.begin(&command_client, &data_client, address, port, 31 | username, password); 32 | } 33 | 34 | void end() { 35 | if (!is_valid) return; 36 | FTPLogger::writeLog(LOG_DEBUG, "FTPSession", "end"); 37 | closeCommand(); 38 | closeData(); 39 | } 40 | 41 | /// Returns the access to the basic API 42 | FTPBasicAPI &api() { return basic_api; } 43 | 44 | /// Returns true if the command client is connected 45 | operator bool() { return is_valid && command_client.connected(); } 46 | 47 | /// Used to set as invalid for dummy error session 48 | void setValid(bool valid) { is_valid = valid; } 49 | 50 | protected: 51 | ClientType command_client; 52 | ClientType data_client; 53 | FTPBasicAPI basic_api; 54 | bool is_valid = true; 55 | 56 | void closeCommand() { 57 | FTPLogger::writeLog(LOG_DEBUG, "FTPSession", "endCommand"); 58 | command_client.stop(); 59 | } 60 | 61 | void closeData() { 62 | FTPLogger::writeLog(LOG_DEBUG, "FTPSession", "endData"); 63 | data_client.stop(); 64 | } 65 | 66 | }; 67 | 68 | } // namespace ftp_client -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Issue-report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: Report only a bugs here! 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | * Before reporting a new bug please check and search the [list of existing issues](https://github.com/pschatzmann/arduino-audiokit/issues?q=) 8 | * Please check [the Readme](https://github.com/pschatzmann/arduino-audiokit) and [Wiki](https://github.com/pschatzmann/arduino-audiokit/wiki) 9 | * Don't forget to check [the discusions](https://github.com/pschatzmann/arduino-audiokit/discussions) 10 | * If still experiencing the issue, please provide as many details as possible below about your hardware, computer setup and code. 11 | - type: textarea 12 | id: Description 13 | attributes: 14 | label: Problem Description 15 | description: Please describe your problem here and expected behaviour 16 | placeholder: ex. Can't connect/weird behaviour/wrong function/missing parameter.. 17 | validations: 18 | required: true 19 | - type: textarea 20 | id: Board 21 | attributes: 22 | label: Device Description 23 | description: What development board are you using 24 | placeholder: e.g. ai_thinker (ES8388) rev 2957 25 | validations: 26 | required: true 27 | - type: textarea 28 | id: sketch 29 | attributes: 30 | label: Sketch 31 | description: Please provide full minimal sketch/code which can be run to reproduce your issue 32 | placeholder: ex. Related part of the code to replicate the issue 33 | render: cpp 34 | validations: 35 | required: true 36 | - type: textarea 37 | id: other-remarks 38 | attributes: 39 | label: Other Steps to Reproduce 40 | description: Is there any other information you can think of which will help us reproduce this problem? Any additional info can be added as well. 41 | placeholder: ex. I also tried on other OS, HW...it works correctly on that setup. 42 | 43 | - type: input 44 | id: esp32-version 45 | attributes: 46 | label: Provide your Version of the EP32 Arduino Core 47 | description: This information can be found in the Boards Manager 48 | placeholder: e.g. 2.0.13 49 | 50 | - type: checkboxes 51 | id: confirmation 52 | attributes: 53 | label: I have checked existing issues, discussions and online documentation 54 | description: You agree to check all the resources above before opening a new issue. 55 | options: 56 | - label: I confirm I have checked existing issues, discussions and online documentation 57 | required: true 58 | -------------------------------------------------------------------------------- /docs/html/globals_enum.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: File Members 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 47 | 48 |
49 | 50 |
54 |
55 | 56 | 57 |
58 | 61 |
62 | 63 |
64 |   69 |
70 | 71 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /docs/html/folderopend.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/html/folderopen.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/html/globals.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: File Members 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 47 | 48 |
49 | 50 |
54 |
55 | 56 | 57 |
58 | 61 |
62 | 63 |
64 |
Here is a list of all documented file members with links to the documentation:
69 |
70 | 71 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /docs/html/class_i_p_connect_ethernet-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 |
71 |
72 |
IPConnectEthernet Member List
73 |
74 |
75 | 76 |

This is the complete list of members for IPConnectEthernet, including all inherited members.

77 |
78 | 79 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /src/FTPSessionMgr.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "FTPSession.h" 3 | #include "IPAddress.h" 4 | 5 | namespace ftp_client { 6 | /** 7 | * @brief FTPSessionMgr 8 | * This class manages multiple FTP sessions, allowing for concurrent operations 9 | * and session reuse. It provides methods to begin a session, end all sessions, 10 | * and retrieve an available session for FTP operations. 11 | * @tparam ClientType The type of client to use for command and data 12 | * connections. It should be a class that implements the Client interface. 13 | * @author Phil Schatzmann 14 | */ 15 | 16 | template 17 | class FTPSessionMgr { 18 | public: 19 | FTPSessionMgr() { FTPLogger::writeLog(LOG_DEBUG, "FTPSessionMgr"); } 20 | 21 | ~FTPSessionMgr() { 22 | FTPLogger::writeLog(LOG_DEBUG, "~FTPSessionMgr"); 23 | end(); 24 | } 25 | 26 | /// Initializes the session manager with the FTP server details 27 | bool begin(IPAddress &address, int port, const char *username, 28 | const char *password) { 29 | FTPLogger::writeLog(LOG_DEBUG, "FTPSessionMgr", "createSession"); 30 | this->address = address; 31 | this->port = port; 32 | this->username = username; 33 | this->password = password; 34 | return true; 35 | } 36 | 37 | void end() { 38 | FTPLogger::writeLog(LOG_DEBUG, "FTPSessionMgr", "end"); 39 | for (int i = 0; i < FTP_MAX_SESSIONS; i++) { 40 | if (sessions[i] != nullptr) { 41 | FTPSession &session = *sessions[i]; 42 | session.api().quit(); // Send QUIT command to the server 43 | session.end(); 44 | delete sessions[i]; 45 | sessions[i] = nullptr; 46 | } 47 | } 48 | } 49 | 50 | /// Provides a session for the FTP operations 51 | FTPSession &session() { 52 | for (int i = 0; i < FTP_MAX_SESSIONS; i++) { 53 | if (sessions[i] == nullptr) { 54 | sessions[i] = new FTPSession(); 55 | if (sessions[i]->begin(address, port, username, password)) { 56 | return *sessions[i]; 57 | } else { 58 | delete sessions[i]; 59 | sessions[i] = nullptr; 60 | } 61 | } else if (sessions[i]->api().currentOperation() == NOP) { 62 | // Reuse existing session if it is not currently in use 63 | return *sessions[i]; 64 | } 65 | } 66 | FTPLogger::writeLog(LOG_ERROR, "FTPSessionMgr", "No available sessions"); 67 | static FTPSession empty_session; 68 | empty_session.setValid(false); 69 | return empty_session; // No available session 70 | } 71 | 72 | /// Aborts the current operation in all sessions 73 | bool abort(CurrentOperation op) { 74 | FTPLogger::writeLog(LOG_DEBUG, "FTPSessionMgr", "abort"); 75 | for (int i = 0; i < FTP_MAX_SESSIONS; i++) { 76 | if (sessions[i] != nullptr && 77 | sessions[i]->api().currentOperation() == op) { 78 | return sessions[i]->api().abort(); 79 | } 80 | } 81 | return false; // No session found with the specified operation 82 | } 83 | 84 | /// Count the sessions 85 | int count() { 86 | int result = 0; 87 | for (auto &session : sessions) { 88 | if (session != nullptr) { 89 | result++; 90 | } 91 | } 92 | return result; 93 | } 94 | 95 | /// Count the sessions with a specific current operation 96 | int count(CurrentOperation op) { 97 | int result = 0; 98 | for (auto &session : sessions) { 99 | if (session != nullptr && session->api().currentOperation() == op) { 100 | result++; 101 | } 102 | } 103 | return result; 104 | } 105 | 106 | protected: 107 | FTPSession *sessions[FTP_MAX_SESSIONS] = {nullptr}; 108 | IPAddress address; 109 | int port; 110 | const char *username; 111 | const char *password; 112 | }; 113 | 114 | } // namespace ftp_client -------------------------------------------------------------------------------- /src/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 | 10 | /** 11 | * @brief FTPFileIterator 12 | * The file name iterator can be used to list all available files and 13 | * directories. We open a separate session for the ls operation so that we do 14 | * not need to keep the result in memory and we don't lose the data when we mix 15 | * it with read and write operations. 16 | * @author Phil Schatzmann 17 | */ 18 | class FTPFileIterator { 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 114 | -------------------------------------------------------------------------------- /docs/html/class_c_string_functions-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 47 | 48 | 49 |
53 |
54 | 55 | 56 |
57 | 60 |
61 | 62 |
63 |
64 |
65 |
CStringFunctions Member List
66 |
67 |
68 | 69 |

This is the complete list of members for CStringFunctions, including all inherited members.

70 | 71 | 72 | 73 |
findNthInStr(char *str, char ch, int n) (defined in CStringFunctions)CStringFunctionsinlinestatic
readln(Stream &stream, char *str, int maxLen) (defined in CStringFunctions)CStringFunctionsinlinestatic
74 | 75 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /docs/html/classes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Class Index 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 |
50 | 51 |
55 |
56 | 57 | 58 |
59 |
60 |
61 |
62 |
63 |
Loading...
64 |
Searching...
65 |
No Matches
66 |
67 |
68 |
69 |
70 | 71 |
72 |
Class Index
73 |
74 |
75 |
C | F
76 |
77 |
78 |
C
79 |
CStringFunctions (ftp_client)
80 |
81 |
F
82 |
FTPBasicAPI (ftp_client)
FTPClient (ftp_client)
FTPFile (ftp_client)
FTPFileIterator (ftp_client)
FTPLogger (ftp_client)
FTPSession (ftp_client)
FTPSessionMgr (ftp_client)
83 |
84 |
85 | 86 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /docs/html/classftp__client_1_1_c_string_functions-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 | 74 |
75 |
76 |
ftp_client::CStringFunctions Member List
77 |
78 |
79 | 80 |

This is the complete list of members for ftp_client::CStringFunctions, including all inherited members.

81 | 82 | 83 | 84 |
findNthInStr(char *str, char ch, int n) (defined in ftp_client::CStringFunctions)ftp_client::CStringFunctionsinlinestatic
readln(Stream &stream, char *str, int maxLen) (defined in ftp_client::CStringFunctions)ftp_client::CStringFunctionsinlinestatic
85 | 86 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /src/FTPClient.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "Client.h" 5 | #include "FTPBasicAPI.h" 6 | #include "FTPFile.h" 7 | #include "FTPFileIterator.h" 8 | #include "FTPSessionMgr.h" 9 | #include "IPAddress.h" 10 | #include "Stream.h" 11 | 12 | namespace ftp_client { 13 | 14 | /** 15 | * @brief FTPClient 16 | * Basic FTP access class which supports directory operations and the opening 17 | * of files 18 | * @author Phil Schatzmann 19 | */ 20 | template 21 | class FTPClient { 22 | public: 23 | /// Default constructor: Provide the client class as template argument e.g. FTPClient client; 24 | FTPClient(int port = FTP_COMMAND_PORT, bool useType = false) { 25 | FTPLogger::writeLog(LOG_DEBUG, "FTPClient"); 26 | setUseTypeCommand(useType); 27 | setPort(port); 28 | } 29 | 30 | /// if set to true the BIN and ASCII command are executed as type I or A 31 | void setUseTypeCommand(bool useType) { 32 | use_type_command = useType; 33 | } 34 | 35 | /// Opens the FTP connection 36 | bool begin(IPAddress remote_addr, const char *user = "anonymous", 37 | const char *password = nullptr) { 38 | FTPLogger::writeLog(LOG_INFO, "FTPClient", "begin"); 39 | this->userid = user; 40 | this->password = password; 41 | this->remote_addr = remote_addr; 42 | return mgr.begin(remote_addr, this->port, user, password); 43 | } 44 | 45 | /// Close the sessions by calling QUIT or BYE 46 | void end() { 47 | FTPLogger::writeLog(LOG_INFO, "FTPClient", "end"); 48 | mgr.end(); 49 | } 50 | 51 | /// Open a file 52 | FTPFile open(const char *filename, FileMode mode = READ_MODE, 53 | bool autoClose = false) { 54 | char msg[200]; 55 | snprintf(msg, sizeof(msg), "open: %s", filename); 56 | FTPLogger::writeLog(LOG_INFO, "FTPClient", msg); 57 | 58 | FTPBasicAPI &api = mgr.session().api(); 59 | 60 | // Open new data connection 61 | api.passv(); 62 | 63 | return FTPFile(&api, filename, mode, autoClose); 64 | } 65 | 66 | /// Create the requested directory hierarchy--if intermediate directories 67 | /// do not exist they will be created. 68 | bool mkdir(const char *filepath) { 69 | FTPLogger::writeLog(LOG_INFO, "FTPClient", "mkdir"); 70 | FTPBasicAPI &api = mgr.session().api(); 71 | if (!api) return false; 72 | return api.mkdir(filepath); 73 | } 74 | 75 | /// Delete the file 76 | bool remove(const char *filepath) { 77 | FTPLogger::writeLog(LOG_INFO, "FTPClient", "remove"); 78 | FTPBasicAPI &api = mgr.session().api(); 79 | if (!api) return false; 80 | return api.del(filepath); 81 | } 82 | 83 | /// Removes a directory 84 | bool rmdir(const char *filepath) { 85 | FTPLogger::writeLog(LOG_INFO, "FTPClient", "rmdir"); 86 | FTPBasicAPI &api = mgr.session().api(); 87 | if (!api) return false; 88 | return api.rmd(filepath); 89 | } 90 | 91 | /// Lists all file names in the specified directory 92 | FTPFileIterator ls(const char *path, FileMode mode = WRITE_MODE) { 93 | FTPLogger::writeLog(LOG_INFO, "FTPClient", "ls"); 94 | FTPBasicAPI &api = mgr.session().api(); 95 | 96 | // Open new data connection 97 | api.passv(); 98 | 99 | FTPFileIterator it(&api, path, mode); 100 | return it; 101 | } 102 | 103 | /// Switch to binary mode 104 | bool binary() { 105 | FTPBasicAPI &api = mgr.session().api(); 106 | if (!api) return false; 107 | api.setUseTypeCommand(use_type_command); 108 | return api.binary(); 109 | } 110 | 111 | /// Switch to ascii mode 112 | bool ascii() { 113 | FTPBasicAPI &api = mgr.session().api(); 114 | if (!api) return false; 115 | api.setUseTypeCommand(use_type_command); 116 | return api.ascii(); 117 | } 118 | 119 | /// Binary or ascii with type command 120 | bool type(const char *str) { 121 | FTPBasicAPI &api = mgr.session().api(); 122 | if (!api) return false; 123 | return api.type(str); 124 | } 125 | 126 | void setPort(int port) { 127 | this->port = port; 128 | } 129 | 130 | /// Abort the indicated operation (e.g., READ_OP, WRITE_OP, LS_OP.) 131 | bool abort(CurrentOperation op) { 132 | return mgr.abort(op); 133 | } 134 | 135 | /// Provides access to the session manager 136 | FTPSessionMgr &sessionMgr() { 137 | return mgr; 138 | } 139 | protected: 140 | FTPSessionMgr mgr; 141 | IPAddress remote_addr; 142 | const char *userid = nullptr; 143 | const char *password = nullptr; 144 | int port; 145 | bool cleanup_clients; 146 | bool auto_close = true; 147 | bool use_type_command = false; 148 | 149 | }; 150 | 151 | } // namespace ftp_client -------------------------------------------------------------------------------- /docs/html/class_i_p_connect_ethernet.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: IPConnectEthernet Class Reference 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 |
71 |
72 | 74 |
IPConnectEthernet Class Reference
75 |
76 |
77 | 78 |

Client for Ethernet. 79 | More...

80 | 81 |

#include <ArduinoFTPClient.h>

82 |
83 | Inheritance diagram for IPConnectEthernet:
84 |
85 |
86 | 87 | 88 | Client 89 | 90 |
91 |

Detailed Description

92 |

Client for Ethernet.

93 |

The documentation for this class was generated from the following file: 96 |
97 | 98 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /docs/html/class_ftp_ip_client-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 |
71 |
72 |
Client Member List
73 |
74 |
75 | 76 |

This is the complete list of members for Client, including all inherited members.

77 | 78 | 79 | 80 | 81 | 82 | 83 |
connect(IPAddress address, int port)=0 (defined in Client)Clientpure virtual
connected()=0 (defined in Client)Clientpure virtual
localAddress()=0 (defined in Client)Clientpure virtual
stop()=0 (defined in Client)Clientpure virtual
stream()=0 (defined in Client)Clientpure virtual
84 | 85 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /docs/html/class_f_t_p_logger-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 47 | 48 | 49 |
53 |
54 | 55 | 56 |
57 | 60 |
61 | 62 |
63 |
64 |
65 |
FTPLogger Member List
66 |
67 |
68 | 69 |

This is the complete list of members for FTPLogger, including all inherited members.

70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |
getLogLevel() (defined in FTPLogger)FTPLoggerstatic
min_log_level (defined in FTPLogger)FTPLoggerprotectedstatic
out_ptr (defined in FTPLogger)FTPLoggerprotectedstatic
setLogLevel(LogLevel level)FTPLoggerstatic
setOutput(Stream &out) (defined in FTPLogger)FTPLoggerstatic
writeLog(LogLevel level, const char *module, const char *msg=nullptr) (defined in FTPLogger)FTPLoggerstatic
78 | 79 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /docs/html/classftp__client_1_1_f_t_p_logger-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 | 74 |
75 |
76 |
ftp_client::FTPLogger Member List
77 |
78 |
79 | 80 |

This is the complete list of members for ftp_client::FTPLogger, including all inherited members.

81 | 82 | 83 | 84 | 85 | 86 |
getLogLevel() (defined in ftp_client::FTPLogger)ftp_client::FTPLoggerinlinestatic
setLogLevel(LogLevel level) (defined in ftp_client::FTPLogger)ftp_client::FTPLoggerinlinestatic
setOutput(Stream &out) (defined in ftp_client::FTPLogger)ftp_client::FTPLoggerinlinestatic
writeLog(LogLevel level, const char *module, const char *msg=nullptr) (defined in ftp_client::FTPLogger)ftp_client::FTPLoggerinlinestatic
87 | 88 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /docs/html/class_c_string_functions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: CStringFunctions Class Reference 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 47 | 48 | 49 |
53 |
54 | 55 | 56 |
57 | 60 |
61 | 62 |
63 |
64 | 67 |
68 |
CStringFunctions Class Reference
69 |
70 |
71 | 72 |

CStringFunctions We implemented some missing C based string functions for character arrays. 73 | More...

74 | 75 |

#include <ArduinoFTPClient.h>

76 | 77 | 79 | 81 | 82 | 84 | 85 |

78 | Static Public Member Functions

80 | static int findNthInStr (char *str, char ch, int n)
 
83 | static int readln (Stream &stream, char *str, int maxLen)
 
86 |

Detailed Description

87 |

CStringFunctions We implemented some missing C based string functions for character arrays.

88 |

The documentation for this class was generated from the following file: 91 |
92 | 93 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /docs/html/class_ftp_ip_client_wifi-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: Member List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 |
71 |
72 |
ClientWifi Member List
73 |
74 |
75 | 76 |

This is the complete list of members for ClientWifi, including all inherited members.

77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 |
client (defined in ClientWifi)ClientWifi
connect(IPAddress address, int port) (defined in ClientWifi)ClientWifiinlinevirtual
connected() (defined in ClientWifi)ClientWifiinlinevirtual
localAddress() (defined in ClientWifi)ClientWifiinlinevirtual
stop() (defined in ClientWifi)ClientWifiinlinevirtual
stream() (defined in ClientWifi)ClientWifiinlinevirtual
85 | 86 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /docs/html/files.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: File List 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 |
50 | 51 |
55 |
56 | 57 | 58 |
59 |
60 |
61 |
62 |
63 |
Loading...
64 |
Searching...
65 |
No Matches
66 |
67 |
68 |
69 |
70 | 71 |
72 |
File List
73 |
74 |
75 |
Here is a list of all documented files with brief descriptions:
76 |
[detail level 12]
77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 |
  src
 FTPBasicAPI.h
 FTPClient.h
 FTPCommon.h
 FTPFile.h
 FTPFileIterator.h
 FTPLogger.h
 FTPSession.h
 FTPSessionMgr.h
87 |
88 |
89 | 90 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/FTPFile.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "FTPBasicAPI.h" // You'll need to create this or include the API definitions 5 | #include "Stream.h" 6 | 7 | namespace ftp_client { 8 | 9 | /** 10 | * @brief FTPFile 11 | * A single file which supports read and write operations. This class is 12 | * implemented as an Arduino Stream and therefore provides all corresponding 13 | * functionality 14 | * @author Phil Schatzmann 15 | */ 16 | class FTPFile : public Stream { 17 | public: 18 | FTPFile() { is_open = false; } 19 | 20 | FTPFile(FTPBasicAPI *api_ptr, const char *name, FileMode mode, 21 | bool autoClose = true) { 22 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", name); 23 | auto_close = autoClose; 24 | if (name != nullptr) file_name = name; 25 | this->mode = mode; 26 | this->api_ptr = api_ptr; 27 | } 28 | 29 | ~FTPFile() { 30 | if (auto_close) close(); 31 | } 32 | 33 | size_t write(uint8_t data) { 34 | if (!is_open) return 0; 35 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "write"); 36 | if (mode == READ_MODE) { 37 | FTPLogger::writeLog(LOG_ERROR, "FTPFile", "Cannot write in READ_MODE"); 38 | return 0; 39 | } 40 | Stream *result_ptr = api_ptr->write(file_name.c_str(), mode); 41 | return result_ptr->write(data); 42 | } 43 | 44 | size_t write(const uint8_t *data, size_t len) override { 45 | if (!is_open) return 0; 46 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "write"); 47 | if (mode == READ_MODE) { 48 | FTPLogger::writeLog(LOG_ERROR, "FTPFile", "Cannot write in READ_MODE"); 49 | return 0; 50 | } 51 | Stream *result_ptr = api_ptr->write(file_name.c_str(), mode); 52 | return result_ptr->write(data, len); 53 | } 54 | 55 | size_t write(const char *data, int len) { 56 | return write((const uint8_t *)data, len); 57 | } 58 | 59 | int read() { 60 | if (!is_open) return -1; 61 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "read"); 62 | Stream *result_ptr = api_ptr->read(file_name.c_str()); 63 | return result_ptr->read(); 64 | } 65 | 66 | size_t readBytes(char *buf, size_t nbyte) { 67 | return readBytes((uint8_t *)buf, nbyte); 68 | } 69 | 70 | size_t readBytes(uint8_t *buf, size_t nbyte) { 71 | if (!is_open) return 0; 72 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "readBytes"); 73 | memset(buf, 0, nbyte); 74 | Stream *result_ptr = api_ptr->read(file_name.c_str()); 75 | return result_ptr->readBytes((char *)buf, nbyte); 76 | } 77 | 78 | size_t readln(char *buf, size_t nbyte) { 79 | if (!is_open) return 0; 80 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "readln"); 81 | memset(buf, 0, nbyte); 82 | Stream *result_ptr = api_ptr->read(file_name.c_str()); 83 | return result_ptr->readBytesUntil(eol[0], (char *)buf, nbyte); 84 | } 85 | 86 | int peek() { 87 | if (!is_open) return -1; 88 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "peek"); 89 | Stream *result_ptr = api_ptr->read(file_name.c_str()); 90 | return result_ptr->peek(); 91 | } 92 | 93 | int available() { 94 | if (api_ptr->currentOperation() == IS_EOF) return 0; 95 | if (!is_open) return 0; 96 | 97 | char msg[80]; 98 | Stream *result_ptr = api_ptr->read(file_name.c_str()); 99 | int len = result_ptr->available(); 100 | sprintf(msg, "available: %d", len); 101 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", msg); 102 | return len; 103 | } 104 | 105 | void flush() { 106 | if (!is_open) return; 107 | if (api_ptr->currentOperation() == WRITE_OP) { 108 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "flush"); 109 | api_ptr->flush(); 110 | } 111 | } 112 | 113 | void reopen() { is_open = true; } 114 | 115 | void close() { 116 | if (is_open) { 117 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "close"); 118 | if (api_ptr->currentOperation() == WRITE_OP) { 119 | // end of write operation !!! 120 | api_ptr->data_ptr->stop(); 121 | const char *ok[] = {"226", "250", nullptr}; 122 | api_ptr->checkResult(ok, "close-write", true); 123 | } else if (api_ptr->currentOperation() == READ_OP) { 124 | // end of read operation !!! 125 | api_ptr->data_ptr->stop(); 126 | const char *ok[] = {"226", "250", nullptr}; 127 | api_ptr->checkResult(ok, "close-read", true); 128 | } 129 | api_ptr->setCurrentOperation(NOP); 130 | is_open = false; 131 | } 132 | } 133 | 134 | bool cancel() { 135 | if (is_open) { 136 | FTPLogger::writeLog(LOG_INFO, "FTPFile", "cancel"); 137 | bool result = api_ptr->abort(); 138 | is_open = false; 139 | return result; 140 | } 141 | return true; 142 | } 143 | 144 | const char *name() const { return file_name.c_str(); } 145 | 146 | size_t size() const { 147 | if (!is_open) return 0; 148 | char msg[80]; 149 | size_t size = api_ptr->size(file_name.c_str()); 150 | sprintf(msg, "size: %ld", size); 151 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", msg); 152 | return size; 153 | } 154 | 155 | void setEOL(char *eol) { 156 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "setEOL"); 157 | this->eol = eol; 158 | } 159 | 160 | bool isDirectory() const { 161 | if (!is_open) return false; 162 | FTPLogger::writeLog(LOG_DEBUG, "FTPFile", "isDirectory"); 163 | return api_ptr->objectType(file_name.c_str()) == TypeDirectory; 164 | } 165 | 166 | operator bool() { return is_open && file_name.length() > 0; } 167 | 168 | protected: 169 | String file_name; 170 | const char *eol = "\n"; 171 | FileMode mode; 172 | FTPBasicAPI *api_ptr; 173 | ObjectType object_type = TypeUndefined; 174 | bool is_open = true; 175 | bool auto_close = false; 176 | }; 177 | 178 | } // namespace ftp_client -------------------------------------------------------------------------------- /docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Arduino TinyFTP: src Directory Reference 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
Arduino TinyFTP 25 |
26 |
30 |
31 | 32 | 33 | 38 | 39 | 40 | 48 | 49 | 50 |
54 |
55 | 56 | 57 |
58 |
59 |
60 |
61 |
62 |
Loading...
63 |
Searching...
64 |
No Matches
65 |
66 |
67 |
68 |
69 | 70 | 74 |
75 |
76 |
src Directory Reference
77 |
78 |
79 | 80 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 |

81 | Files

 FTPBasicAPI.h
 
 FTPClient.h
 
 FTPCommon.h
 
 FTPFile.h
 
 FTPFileIterator.h
 
 FTPLogger.h
 
 FTPSession.h
 
 FTPSessionMgr.h
 
99 |
100 | 101 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /docs/html/menu.js: -------------------------------------------------------------------------------- 1 | /* 2 | @licstart The following is the entire license notice for the JavaScript code in this file. 3 | 4 | The MIT License (MIT) 5 | 6 | Copyright (C) 1997-2020 by Dimitri van Heesch 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 9 | and associated documentation files (the "Software"), to deal in the Software without restriction, 10 | including without limitation the rights to use, copy, modify, merge, publish, distribute, 11 | sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all copies or 15 | substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 18 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 20 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | @licend The above is the entire license notice for the JavaScript code in this file 24 | */ 25 | function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { 26 | function makeTree(data,relPath) { 27 | var result=''; 28 | if ('children' in data) { 29 | result+='
    '; 30 | for (var i in data.children) { 31 | var url; 32 | var link; 33 | link = data.children[i].url; 34 | if (link.substring(0,1)=='^') { 35 | url = link.substring(1); 36 | } else { 37 | url = relPath+link; 38 | } 39 | result+='
  • '+ 40 | data.children[i].text+''+ 41 | makeTree(data.children[i],relPath)+'
  • '; 42 | } 43 | result+='
'; 44 | } 45 | return result; 46 | } 47 | var searchBoxHtml; 48 | if (searchEnabled) { 49 | if (serverSide) { 50 | searchBoxHtml='
'+ 51 | '
'+ 52 | '
 '+ 54 | ''+ 57 | '
'+ 58 | '
'+ 59 | '
'+ 60 | '
'; 61 | } else { 62 | searchBoxHtml='
'+ 63 | ''+ 64 | ' '+ 66 | ''+ 70 | ''+ 71 | ''+ 73 | ''+ 75 | ''+ 76 | '
'; 77 | } 78 | } 79 | 80 | $('#main-nav').before('
'+ 81 | ''+ 84 | ''+ 85 | '
'); 86 | $('#main-nav').append(makeTree(menudata,relPath)); 87 | $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); 88 | if (searchBoxHtml) { 89 | $('#main-menu').append('
  • '); 90 | } 91 | var $mainMenuState = $('#main-menu-state'); 92 | var prevWidth = 0; 93 | if ($mainMenuState.length) { 94 | function initResizableIfExists() { 95 | if (typeof initResizable==='function') initResizable(); 96 | } 97 | // animate mobile menu 98 | $mainMenuState.change(function(e) { 99 | var $menu = $('#main-menu'); 100 | var options = { duration: 250, step: initResizableIfExists }; 101 | if (this.checked) { 102 | options['complete'] = function() { $menu.css('display', 'block') }; 103 | $menu.hide().slideDown(options); 104 | } else { 105 | options['complete'] = function() { $menu.css('display', 'none') }; 106 | $menu.show().slideUp(options); 107 | } 108 | }); 109 | // set default menu visibility 110 | function resetState() { 111 | var $menu = $('#main-menu'); 112 | var $mainMenuState = $('#main-menu-state'); 113 | var newWidth = $(window).outerWidth(); 114 | if (newWidth!=prevWidth) { 115 | if ($(window).outerWidth()<768) { 116 | $mainMenuState.prop('checked',false); $menu.hide(); 117 | $('#searchBoxPos1').html(searchBoxHtml); 118 | $('#searchBoxPos2').hide(); 119 | } else { 120 | $menu.show(); 121 | $('#searchBoxPos1').empty(); 122 | $('#searchBoxPos2').html(searchBoxHtml); 123 | $('#searchBoxPos2').show(); 124 | } 125 | if (typeof searchBox!=='undefined') { 126 | searchBox.CloseResultsWindow(); 127 | } 128 | prevWidth = newWidth; 129 | } 130 | } 131 | $(window).ready(function() { resetState(); initResizableIfExists(); }); 132 | $(window).resize(resetState); 133 | } 134 | $('#main-menu').smartmenus(); 135 | } 136 | /* @license-end */ 137 | -------------------------------------------------------------------------------- /docs/html/search/search.css: -------------------------------------------------------------------------------- 1 | /*---------------- Search Box positioning */ 2 | 3 | #main-menu > li:last-child { 4 | /* This
  • object is the parent of the search bar */ 5 | display: flex; 6 | justify-content: center; 7 | align-items: center; 8 | height: 36px; 9 | margin-right: 1em; 10 | } 11 | 12 | /*---------------- Search box styling */ 13 | 14 | .SRPage * { 15 | font-weight: normal; 16 | line-height: normal; 17 | } 18 | 19 | dark-mode-toggle { 20 | margin-left: 5px; 21 | display: flex; 22 | float: right; 23 | } 24 | 25 | #MSearchBox { 26 | display: inline-block; 27 | white-space : nowrap; 28 | background: var(--search-background-color); 29 | border-radius: 0.65em; 30 | box-shadow: var(--search-box-shadow); 31 | z-index: 102; 32 | } 33 | 34 | #MSearchBox .left { 35 | display: inline-block; 36 | vertical-align: middle; 37 | height: 1.4em; 38 | } 39 | 40 | #MSearchSelect { 41 | display: inline-block; 42 | vertical-align: middle; 43 | width: 20px; 44 | height: 19px; 45 | background-image: var(--search-magnification-select-image); 46 | margin: 0 0 0 0.3em; 47 | padding: 0; 48 | } 49 | 50 | #MSearchSelectExt { 51 | display: inline-block; 52 | vertical-align: middle; 53 | width: 10px; 54 | height: 19px; 55 | background-image: var(--search-magnification-image); 56 | margin: 0 0 0 0.5em; 57 | padding: 0; 58 | } 59 | 60 | 61 | #MSearchField { 62 | display: inline-block; 63 | vertical-align: middle; 64 | width: 7.5em; 65 | height: 19px; 66 | margin: 0 0.15em; 67 | padding: 0; 68 | line-height: 1em; 69 | border:none; 70 | color: var(--search-foreground-color); 71 | outline: none; 72 | font-family: var(--font-family-search); 73 | -webkit-border-radius: 0px; 74 | border-radius: 0px; 75 | background: none; 76 | } 77 | 78 | @media(hover: none) { 79 | /* to avoid zooming on iOS */ 80 | #MSearchField { 81 | font-size: 16px; 82 | } 83 | } 84 | 85 | #MSearchBox .right { 86 | display: inline-block; 87 | vertical-align: middle; 88 | width: 1.4em; 89 | height: 1.4em; 90 | } 91 | 92 | #MSearchClose { 93 | display: none; 94 | font-size: inherit; 95 | background : none; 96 | border: none; 97 | margin: 0; 98 | padding: 0; 99 | outline: none; 100 | 101 | } 102 | 103 | #MSearchCloseImg { 104 | padding: 0.3em; 105 | margin: 0; 106 | } 107 | 108 | .MSearchBoxActive #MSearchField { 109 | color: var(--search-active-color); 110 | } 111 | 112 | 113 | 114 | /*---------------- Search filter selection */ 115 | 116 | #MSearchSelectWindow { 117 | display: none; 118 | position: absolute; 119 | left: 0; top: 0; 120 | border: 1px solid var(--search-filter-border-color); 121 | background-color: var(--search-filter-background-color); 122 | z-index: 10001; 123 | padding-top: 4px; 124 | padding-bottom: 4px; 125 | -moz-border-radius: 4px; 126 | -webkit-border-top-left-radius: 4px; 127 | -webkit-border-top-right-radius: 4px; 128 | -webkit-border-bottom-left-radius: 4px; 129 | -webkit-border-bottom-right-radius: 4px; 130 | -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); 131 | } 132 | 133 | .SelectItem { 134 | font: 8pt var(--font-family-search); 135 | padding-left: 2px; 136 | padding-right: 12px; 137 | border: 0px; 138 | } 139 | 140 | span.SelectionMark { 141 | margin-right: 4px; 142 | font-family: var(--font-family-monospace); 143 | outline-style: none; 144 | text-decoration: none; 145 | } 146 | 147 | a.SelectItem { 148 | display: block; 149 | outline-style: none; 150 | color: var(--search-filter-foreground-color); 151 | text-decoration: none; 152 | padding-left: 6px; 153 | padding-right: 12px; 154 | } 155 | 156 | a.SelectItem:focus, 157 | a.SelectItem:active { 158 | color: var(--search-filter-foreground-color); 159 | outline-style: none; 160 | text-decoration: none; 161 | } 162 | 163 | a.SelectItem:hover { 164 | color: var(--search-filter-highlight-text-color); 165 | background-color: var(--search-filter-highlight-bg-color); 166 | outline-style: none; 167 | text-decoration: none; 168 | cursor: pointer; 169 | display: block; 170 | } 171 | 172 | /*---------------- Search results window */ 173 | 174 | iframe#MSearchResults { 175 | /*width: 60ex;*/ 176 | height: 15em; 177 | } 178 | 179 | #MSearchResultsWindow { 180 | display: none; 181 | position: absolute; 182 | left: 0; top: 0; 183 | border: 1px solid var(--search-results-border-color); 184 | background-color: var(--search-results-background-color); 185 | z-index:10000; 186 | width: 300px; 187 | height: 400px; 188 | overflow: auto; 189 | } 190 | 191 | /* ----------------------------------- */ 192 | 193 | 194 | #SRIndex { 195 | clear:both; 196 | } 197 | 198 | .SREntry { 199 | font-size: 10pt; 200 | padding-left: 1ex; 201 | } 202 | 203 | .SRPage .SREntry { 204 | font-size: 8pt; 205 | padding: 1px 5px; 206 | } 207 | 208 | div.SRPage { 209 | margin: 5px 2px; 210 | background-color: var(--search-results-background-color); 211 | } 212 | 213 | .SRChildren { 214 | padding-left: 3ex; padding-bottom: .5em 215 | } 216 | 217 | .SRPage .SRChildren { 218 | display: none; 219 | } 220 | 221 | .SRSymbol { 222 | font-weight: bold; 223 | color: var(--search-results-foreground-color); 224 | font-family: var(--font-family-search); 225 | text-decoration: none; 226 | outline: none; 227 | } 228 | 229 | a.SRScope { 230 | display: block; 231 | color: var(--search-results-foreground-color); 232 | font-family: var(--font-family-search); 233 | font-size: 8pt; 234 | text-decoration: none; 235 | outline: none; 236 | } 237 | 238 | a.SRSymbol:focus, a.SRSymbol:active, 239 | a.SRScope:focus, a.SRScope:active { 240 | text-decoration: underline; 241 | } 242 | 243 | span.SRScope { 244 | padding-left: 4px; 245 | font-family: var(--font-family-search); 246 | } 247 | 248 | .SRPage .SRStatus { 249 | padding: 2px 5px; 250 | font-size: 8pt; 251 | font-style: italic; 252 | font-family: var(--font-family-search); 253 | } 254 | 255 | .SRResult { 256 | display: none; 257 | } 258 | 259 | div.searchresults { 260 | margin-left: 10px; 261 | margin-right: 10px; 262 | } 263 | 264 | /*---------------- External search page results */ 265 | 266 | .pages b { 267 | color: white; 268 | padding: 5px 5px 3px 5px; 269 | background-image: var(--nav-gradient-active-image-parent); 270 | background-repeat: repeat-x; 271 | text-shadow: 0 1px 1px #000000; 272 | } 273 | 274 | .pages { 275 | line-height: 17px; 276 | margin-left: 4px; 277 | text-decoration: none; 278 | } 279 | 280 | .hl { 281 | font-weight: bold; 282 | } 283 | 284 | #searchresults { 285 | margin-bottom: 20px; 286 | } 287 | 288 | .searchpages { 289 | margin-top: 10px; 290 | } 291 | 292 | --------------------------------------------------------------------------------