1
0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2024-11-29 23:07:42 +00:00

🚸 MKS UI long filename WiFi upload (#27482)

This commit is contained in:
schnurly 2024-10-20 04:36:30 +02:00 committed by GitHub
parent e824e16a41
commit b43d6ed5d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 91 additions and 31 deletions

View File

@ -19,6 +19,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include "../../../sd/SdFatConfig.h"
#pragma once
#ifdef __cplusplus
@ -33,15 +35,15 @@ typedef struct {
extern DIR_OFFSET dir_offset[10];
#define FILE_NUM 6
#define SHORT_NAME_LEN 13
#define NAME_CUT_LEN 23
#define MAX_DIR_LEVEL 10
typedef struct {
char file_name[FILE_NUM][SHORT_NAME_LEN * MAX_DIR_LEVEL + 1];
char curDirPath[SHORT_NAME_LEN * MAX_DIR_LEVEL + 1];
char long_name[FILE_NUM][SHORT_NAME_LEN * 2 + 1];
char file_name[FILE_NUM][FILENAME_LENGTH * MAX_DIR_LEVEL + 1];
char long_name[FILE_NUM][TERN(LONG_FILENAME_WRITE_SUPPORT, LONG_FILENAME_LENGTH, FILENAME_LENGTH * 2) + 1];
char curDirPath[FILENAME_LENGTH * MAX_DIR_LEVEL + 1];
bool IsFolder[FILE_NUM];
char Sd_file_cnt;
char sd_file_index;

View File

@ -142,38 +142,97 @@ void mount_file_sys(const uint8_t disk_type) {
}
}
#define ILLEGAL_CHAR_REPLACE 0x5F // '_'
#define ILLEGAL_CHAR_REPLACE '_' // 0x5F
static bool longName2DosName(const char *longName, char *dosName) {
uint8_t i = FILENAME_LENGTH;
while (i) dosName[--i] = '\0';
#if ENABLED(LONG_FILENAME_WRITE_SUPPORT)
while (*longName) {
uint8_t c = *longName++;
if (c == '.') { // For a dot...
if (i == 0) return false;
strcat_P(dosName, PSTR(".GCO"));
return dosName[0] != '\0';
static bool removeIllegalChars(const char *unsanitizedName, char *sanitizedName) {
const size_t maxLength = LONG_FILENAME_LENGTH;
uint8_t i = 0;
const char *fileExtension = NULL;
const char *dot = strrchr(unsanitizedName, '.');
if (dot && dot != unsanitizedName) {
fileExtension = dot;
}
// Fail for illegal characters
if (c < 0x21 || c == 0x7F) // Check size, non-printable characters
c = ILLEGAL_CHAR_REPLACE; // replace non-printable chars with underscore '_'
size_t extensionLength = fileExtension ? strlen(fileExtension) : 0;
size_t nameMaxLength = maxLength - extensionLength - 3;
while (*unsanitizedName && unsanitizedName != fileExtension && i < nameMaxLength) {
uint8_t c = *unsanitizedName++;
if (c < 0x21 || c == 0x7F) {
c = ILLEGAL_CHAR_REPLACE;
}
else {
PGM_P illegalChars = PSTR("|<>^+=?/[];,*\"\\");
while (const uint8_t illegalChar = pgm_read_byte(illegalChars++)) {
if (c == illegalChar) {
c = ILLEGAL_CHAR_REPLACE;
break;
}
}
}
sanitizedName[i++] = c;
}
if (i >= nameMaxLength) {
snprintf(sanitizedName + nameMaxLength, 4, "~1");
i = strlen(sanitizedName);
}
if (fileExtension) {
strncpy(sanitizedName + i, fileExtension, maxLength - i - 1);
sanitizedName[maxLength - 1] = '\0';
}
else {
PGM_P p = PSTR("|<>^+=?/[];,*\"\\");
while (const uint8_t b = pgm_read_byte(p++))
if (b == c) c = ILLEGAL_CHAR_REPLACE; // replace illegal chars with underscore '_'
sanitizedName[i] = '\0';
}
dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name
return sanitizedName[0] != '\0';
}
if (i >= 5) {
strcat_P(dosName, PSTR("~1.GCO"));
return dosName[0] != '\0';
#else // !LONG_FILENAME_WRITE_SUPPORT
static bool longName2DosName(const char *longName, char *dosName) {
uint8_t i = FILENAME_LENGTH;
while (i) dosName[--i] = '\0';
while (*longName) {
uint8_t c = *longName++;
if (c == '.') { // For a dot...
if (i == 0) return false;
strcat_P(dosName, PSTR(".GCO"));
return dosName[0] != '\0';
}
// Fail for illegal characters
if (c < 0x21 || c == 0x7F) // Check size, non-printable characters
c = ILLEGAL_CHAR_REPLACE; // replace non-printable chars
else {
PGM_P p = PSTR("|<>^+=?/[];,*\"\\");
while (const uint8_t b = pgm_read_byte(p++))
if (b == c) c = ILLEGAL_CHAR_REPLACE; // replace illegal chars
}
dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name
if (i >= 5) {
strcat_P(dosName, PSTR("~1.GCO"));
return dosName[0] != '\0';
}
}
}
return dosName[0] != '\0'; // Return true if any name was set
return dosName[0] != '\0'; // Return true if any name was set
}
#endif // !LONG_FILENAME_WRITE_SUPPORT
static bool sanitizeName(const char * const unsanitizedName, char * const sanitizedName) {
#if ENABLED(LONG_FILENAME_WRITE_SUPPORT)
return removeIllegalChars(unsanitizedName, sanitizedName);
#else
return longName2DosName((const char *)unsanitizedName, sanitizedName);
#endif
}
#ifdef __STM32F1__
@ -947,7 +1006,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
strcat_P((char *)list_file.file_name[sel_id], PSTR("/"));
if (file_writer.fileTransfer == 1) {
char dosName[FILENAME_LENGTH];
char dosName[TERN(LONG_FILENAME_WRITE_SUPPORT, LONG_FILENAME_LENGTH, FILENAME_LENGTH)];
uint8_t fileName[sizeof(list_file.file_name[sel_id])];
fileName[0] = '\0';
if (has_path_selected == 1) {
@ -955,7 +1014,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
strcat_P((char *)list_file.file_name[sel_id], PSTR("/"));
}
else strcat((char *)fileName, &mStr[index]);
if (!longName2DosName((const char *)fileName, dosName))
if (!sanitizeName((const char *)fileName, dosName))
strcpy_P(list_file.file_name[sel_id], PSTR("notValid"));
strcat((char *)list_file.file_name[sel_id], dosName);
strcat((char *)list_file.long_name[sel_id], (const char *)fileName);
@ -1542,10 +1601,9 @@ static void file_first_msg_handle(const uint8_t * const msg, const uint16_t msgL
wifi_delay(1000);
#if HAS_MEDIA
char dosName[TERN(LONG_FILENAME_WRITE_SUPPORT, LONG_FILENAME_LENGTH, FILENAME_LENGTH)];
char dosName[FILENAME_LENGTH];
if (!longName2DosName((const char *)file_writer.saveFileName, dosName)) {
if (!sanitizeName((const char *)file_writer.saveFileName, dosName)) {
clear_cur_ui();
upload_result = 2;
wifiTransError.flag = 1;