@@ -117,6 +117,10 @@ void FtpServer::end()
117
117
118
118
DEBUG_PRINTLN (F (" Stop server!" ));
119
119
120
+ if (FtpServer::_callback) {
121
+ FtpServer::_callback (FTP_DISCONNECT, free (), capacity ());
122
+ }
123
+
120
124
cmdStage = FTP_Init;
121
125
transferStage = FTP_Close;
122
126
dataConn = FTP_NoConn;
@@ -224,6 +228,10 @@ uint8_t FtpServer::handleFTP() {
224
228
else
225
229
millisEndConnection = millis () + 1000L * FTP_TIME_OUT;
226
230
} else if (!client.connected ()) {
231
+ if (FtpServer::_callback) {
232
+ FtpServer::_callback (FTP_DISCONNECT, free (), capacity ());
233
+ }
234
+
227
235
cmdStage = FTP_Init;
228
236
}
229
237
if (transferStage == FTP_Retrieve) // Retrieve data
@@ -498,6 +506,22 @@ bool FtpServer::processCommand()
498
506
} else {
499
507
dataIp = localIp;
500
508
}
509
+ DEBUG_PRINT ( F (" IP: " ) );
510
+ DEBUG_PRINT ( int ( dataIp[0 ]) ); DEBUG_PRINT ( F (" ." ) ); DEBUG_PRINT ( int ( dataIp[1 ]) ); DEBUG_PRINT ( F (" ." ) );
511
+ DEBUG_PRINT ( int ( dataIp[2 ]) ); DEBUG_PRINT ( F (" ." ) ); DEBUG_PRINTLN ( int ( dataIp[3 ]) );
512
+
513
+ DEBUG_PRINT ( F (" IP 0.0.0.0: " ) );
514
+ DEBUG_PRINT (dataIp.toString ());
515
+
516
+ #if (FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_ESP8266_ASYNC) || (FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_ESP8266) || (FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_ESP8266) || (FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_ESP32) || (FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_WiFiNINA) || (FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_SEEED_RTL8720DN)
517
+ if (dataIp.toString () == F (" 0.0.0.0" )) {
518
+ dataIp = NET_CLASS.softAPIP ();
519
+ }
520
+ #endif
521
+ DEBUG_PRINT ( F (" Soft IP: " ) );
522
+ DEBUG_PRINT ( int ( dataIp[0 ]) ); DEBUG_PRINT ( F (" ." ) ); DEBUG_PRINT ( int ( dataIp[1 ]) ); DEBUG_PRINT ( F (" ." ) );
523
+ DEBUG_PRINT ( int ( dataIp[2 ]) ); DEBUG_PRINT ( F (" ." ) ); DEBUG_PRINTLN ( int ( dataIp[3 ]) );
524
+
501
525
dataPort = pasvPort;
502
526
DEBUG_PRINTLN ( F (" Connection management set to passive" ) );
503
527
DEBUG_PRINT ( F (" Listening at " ) );
@@ -1031,7 +1055,7 @@ bool FtpServer::openDir( FTP_DIR * pdir )
1031
1055
if ( ! openD ) {
1032
1056
client.print ( F (" 550 Can't open directory " ) ); client.println ( cwdName );
1033
1057
}
1034
- #elif STORAGE_TYPE == STORAGE_SD
1058
+ #elif STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC
1035
1059
if ( cwdName == 0 ) {
1036
1060
dir = STORAGE_MANAGER.open ( " /" );
1037
1061
} else {
@@ -1398,7 +1422,7 @@ bool FtpServer::doList()
1398
1422
nbMatch ++;
1399
1423
return true ;
1400
1424
}
1401
- #elif STORAGE_TYPE == STORAGE_SD
1425
+ #elif STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC
1402
1426
FTP_FILE fileDir = dir.openNextFile ();
1403
1427
if ( fileDir )
1404
1428
{
@@ -1604,7 +1628,7 @@ bool FtpServer::doMlsd()
1604
1628
return true ;
1605
1629
}
1606
1630
1607
- #elif STORAGE_TYPE == STORAGE_SD
1631
+ #elif STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC
1608
1632
DEBUG_PRINTLN (" DIR MLSD " );
1609
1633
File fileDir = dir.openNextFile ();
1610
1634
if ( fileDir )
@@ -1840,6 +1864,62 @@ int utf8_strlen(const String& str)
1840
1864
return q;
1841
1865
}
1842
1866
1867
+ // // ****** UTF8-Decoder: convert UTF8-string to extended ASCII *******
1868
+ // static byte c1; // Last character buffer
1869
+ //
1870
+ // // Convert a single Character from UTF8 to Extended ASCII
1871
+ // // Return "0" if a byte has to be ignored
1872
+ // byte utf8ascii(byte ascii) {
1873
+ // if ( ascii<128 ) // Standard ASCII-set 0..0x7F handling
1874
+ // { c1=0;
1875
+ // return( ascii );
1876
+ // }
1877
+ //
1878
+ // // get previous input
1879
+ // byte last = c1; // get last char
1880
+ // c1=ascii; // remember actual character
1881
+ //
1882
+ // switch (last) // conversion depending on first UTF8-character
1883
+ // { case 0xC2: return (ascii); break;
1884
+ // case 0xC3: return (ascii | 0xC0); break;
1885
+ // case 0x82: if(ascii==0xAC) return(0x80); // special case Euro-symbol
1886
+ // }
1887
+ //
1888
+ // return (0); // otherwise: return zero, if character has to be ignored
1889
+ // }
1890
+ //
1891
+ // // convert String object from UTF8 String to Extended ASCII
1892
+ // String utf8ascii(String s)
1893
+ // {
1894
+ // String r="";
1895
+ // char c;
1896
+ // for (int i=0; i<s.length(); i++)
1897
+ // {
1898
+ // c = utf8ascii(s.charAt(i));
1899
+ // if (c!=0) r+=c;
1900
+ // }
1901
+ // return r;
1902
+ // }
1903
+ //
1904
+ // // In Place conversion UTF8-string to Extended ASCII (ASCII is shorter!)
1905
+ // void utf8ascii(char* s)
1906
+ // {
1907
+ // int k=0;
1908
+ // char c;
1909
+ // for (int i=0; i<strlen(s); i++)
1910
+ // {
1911
+ // c = utf8ascii(s[i]);
1912
+ // if (c!=0)
1913
+ // s[k++]=c;
1914
+ // }
1915
+ // s[k]=0;
1916
+ // }
1917
+ //
1918
+ // int utf8_strlen(const String& str)
1919
+ // {
1920
+ // String ascii = utf8ascii(str);
1921
+ // return ascii.length();
1922
+ // }
1843
1923
// Make complete path/name from cwdName and param
1844
1924
//
1845
1925
// 3 possible cases: param can be absolute path, relative path or only the name
@@ -1884,6 +1964,12 @@ bool FtpServer::makePath( char * fullName, char * param )
1884
1964
// for( uint8_t i = 0; i < utf8_strlen( fullName ); i ++ ) {
1885
1965
//
1886
1966
// }
1967
+
1968
+ DEBUG_PRINT (F (" utf8_strlen" ));
1969
+ DEBUG_PRINTLN (utf8_strlen (fullName));
1970
+ // DEBUG_PRINT(F("utf8_strlen2"));
1971
+ // DEBUG_PRINTLN(utf8_strlen2(fullName));
1972
+
1887
1973
if (utf8_strlen (fullName)>=FILENAME_LENGTH) {
1888
1974
client.println (F (" 553 File name not allowed. Too long." ) );
1889
1975
return false ;
@@ -1910,7 +1996,7 @@ bool FtpServer::makeExistsPath( char * path, char * param )
1910
1996
return false ;
1911
1997
// RoSchmi
1912
1998
// #if STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_SD
1913
- #if (STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SEEED_SD)
1999
+ #if (STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC || STORAGE_TYPE == STORAGE_SEEED_SD)
1914
2000
if (strcmp (path, " /" ) == 0 ) return true ;
1915
2001
#endif
1916
2002
DEBUG_PRINT (" PATH --> " )
@@ -2000,7 +2086,7 @@ char * FtpServer::makeDateTimeStr( char * tstr, uint16_t date, uint16_t time )
2000
2086
2001
2087
2002
2088
uint32_t FtpServer::fileSize ( FTP_FILE file ) {
2003
- #if (STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_LITTLEFS || STORAGE_TYPE == STORAGE_FFAT || STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SEEED_SD)
2089
+ #if (STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_LITTLEFS || STORAGE_TYPE == STORAGE_FFAT || STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC || STORAGE_TYPE == STORAGE_SEEED_SD)
2004
2090
return file.size ();
2005
2091
#else
2006
2092
return file.fileSize ();
@@ -2029,7 +2115,7 @@ uint32_t FtpServer::fileSize( FTP_FILE file ) {
2029
2115
return true ;
2030
2116
}
2031
2117
}
2032
- #elif (STORAGE_TYPE == STORAGE_SD && defined(ESP8266))// FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_ESP8266_242)
2118
+ #elif (( STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC) && defined(ESP8266))// FTP_SERVER_NETWORK_TYPE_SELECTED == NETWORK_ESP8266_242)
2033
2119
bool FtpServer::openFile ( char path[ FTP_CWD_SIZE ], int readTypeInt ){
2034
2120
DEBUG_PRINT (F (" File to open " ) );
2035
2121
DEBUG_PRINT ( path );
@@ -2066,7 +2152,7 @@ uint32_t FtpServer::fileSize( FTP_FILE file ) {
2066
2152
return true ;
2067
2153
}
2068
2154
}
2069
- #elif STORAGE_TYPE <= STORAGE_SDFAT2 || STORAGE_TYPE == STORAGE_SPIFM || (STORAGE_TYPE == STORAGE_SD && ARDUINO_ARCH_SAMD)
2155
+ #elif STORAGE_TYPE <= STORAGE_SDFAT2 || STORAGE_TYPE == STORAGE_SPIFM || (( STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC) && ARDUINO_ARCH_SAMD)
2070
2156
bool FtpServer::openFile ( char path[ FTP_CWD_SIZE ], int readTypeInt ){
2071
2157
DEBUG_PRINT (F (" File to open " ) );
2072
2158
DEBUG_PRINT ( path );
@@ -2092,7 +2178,7 @@ uint32_t FtpServer::fileSize( FTP_FILE file ) {
2092
2178
DEBUG_PRINT ( path );
2093
2179
DEBUG_PRINT (F (" readType " ) );
2094
2180
DEBUG_PRINTLN (readType);
2095
- #if (STORAGE_TYPE == STORAGE_SD && !defined(ESP32))
2181
+ #if (( STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC) && !defined(ESP32))
2096
2182
if (readType == 0X01 ) {
2097
2183
readType = FILE_READ;
2098
2184
}else {
@@ -2150,7 +2236,7 @@ bool FtpServer::isDir( char * path )
2150
2236
if ( ! openFile ( path, FTP_FILE_READ )) {
2151
2237
return false ;
2152
2238
}
2153
- #if STORAGE_TYPE == STORAGE_SD
2239
+ #if STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC
2154
2240
// if (strcmp(path, "/") == 0) return true;
2155
2241
// res = file.isDirectory();
2156
2242
// DEBUG_PRINT(path);
@@ -2170,7 +2256,7 @@ bool FtpServer::isDir( char * path )
2170
2256
bool FtpServer::timeStamp ( char * path, uint16_t year, uint8_t month, uint8_t day,
2171
2257
uint8_t hour, uint8_t minute, uint8_t second )
2172
2258
{
2173
- #if STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_LITTLEFS || STORAGE_TYPE == STORAGE_FFAT || STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SEEED_SD
2259
+ #if STORAGE_TYPE == STORAGE_SPIFFS || STORAGE_TYPE == STORAGE_LITTLEFS || STORAGE_TYPE == STORAGE_FFAT || STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC || STORAGE_TYPE == STORAGE_SEEED_SD
2174
2260
// struct tm tmDate = { second, minute, hour, day, month, year };
2175
2261
// time_t rawtime = mktime(&tmDate);
2176
2262
@@ -2235,7 +2321,7 @@ bool FtpServer::getFileModTime( uint16_t * pdate, uint16_t * ptime )
2235
2321
}
2236
2322
#endif
2237
2323
2238
- #if STORAGE_TYPE == STORAGE_SD
2324
+ #if STORAGE_TYPE == STORAGE_SD || STORAGE_TYPE == STORAGE_SD_MMC
2239
2325
bool FtpServer::rename ( const char * path, const char * newpath ){
2240
2326
2241
2327
FTP_FILE myFileIn = STORAGE_MANAGER.open (path, FILE_READ);
0 commit comments