1075 lines
26 KiB
C
1075 lines
26 KiB
C
//
|
||
// Created by cfif on 13.12.22.
|
||
//
|
||
#include "httpd_get_handlers.h"
|
||
#include "JSONSettings.h"
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
|
||
// Создание и запись в файл
|
||
idPostResult_t
|
||
handlerGet_Message_Outbox_CreateTempOrRealFile_Sendmsg(tHttpSetting *env, bool isFile, char *filename, char *buf,
|
||
uint32_t buf_len,
|
||
time_t timestamp, char *to,
|
||
uint32_t urgency, uint32_t chSv, uint32_t isfile, uint32_t kvs,
|
||
uint32_t type, uint32_t sos) {
|
||
|
||
FIL file;
|
||
FRESULT fr;
|
||
|
||
char temp_filename[MAX_LEN_PATH_FS];
|
||
char real_filename[MAX_LEN_PATH_FS];
|
||
|
||
char bufTemp[12];
|
||
|
||
char bufIdFileOutBox[12];
|
||
char bufWithPrefixIdFileOutBox[12];
|
||
|
||
++env->storage->nvm.maxId_OutBox;
|
||
if (env->storage->nvm.maxId_OutBox > 32767)
|
||
env->storage->nvm.maxId_OutBox = 1;
|
||
|
||
DeviceStorageCounterIni_Dump(env->storage);
|
||
|
||
utoa(env->storage->nvm.maxId_OutBox, bufIdFileOutBox, 10);
|
||
toAddPrefixStr(bufWithPrefixIdFileOutBox, bufIdFileOutBox, 5);
|
||
|
||
temp_filename[0] = '\0';
|
||
strcat(temp_filename, "1:");
|
||
// strcat(temp_filename, dir_temp);
|
||
strcat(temp_filename, filename);
|
||
|
||
real_filename[0] = '\0';
|
||
strcat(real_filename, dir_outbox);
|
||
strcat(real_filename, bufWithPrefixIdFileOutBox);
|
||
strcat(real_filename, ".OTM");
|
||
|
||
// Запись заголовка в файл
|
||
char BufFileWrite[512];
|
||
BufFileWrite[0] = '\0';
|
||
strcat(BufFileWrite, &real_filename[2]);
|
||
strcat(BufFileWrite, "&timec=");
|
||
|
||
if (isFile) {
|
||
|
||
FILINFO fno;
|
||
fr = f_stat(temp_filename, &fno);
|
||
if (fr) {
|
||
f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(&BufFileWrite[strlen(BufFileWrite)], sizeof(BufFileWrite), "%d-%m-%g %T", &stm);
|
||
|
||
} else {
|
||
struct tm stm;
|
||
localtime_r(×tamp, &stm);
|
||
|
||
strftime(&BufFileWrite[strlen(BufFileWrite)], sizeof(BufFileWrite), "%d-%m-%g %T", &stm);
|
||
}
|
||
|
||
|
||
strcat(BufFileWrite, "&from=");
|
||
|
||
utoa(env->storage->nvm.Settings_General.ATnum_v, &BufFileWrite[strlen(BufFileWrite)], 10);
|
||
|
||
strcat(BufFileWrite, "&mnum=");
|
||
strcat(BufFileWrite, bufIdFileOutBox);
|
||
|
||
strcat(BufFileWrite, "&to=");
|
||
strcat(BufFileWrite, to);
|
||
|
||
if ((urgency > 0) && (urgency <= 4)) {
|
||
urgency = 1;
|
||
}
|
||
|
||
if ((urgency > 4) && (urgency <= 8)) {
|
||
urgency = 2;
|
||
}
|
||
|
||
if ((urgency > 8) && (urgency <= 13)) {
|
||
urgency = 3;
|
||
}
|
||
|
||
strcat(BufFileWrite, "&urgency=");
|
||
utoa(urgency, bufTemp, 10);
|
||
strcat(BufFileWrite, bufTemp);
|
||
|
||
strcat(BufFileWrite, "&type=");
|
||
utoa(type, bufTemp, 10);
|
||
strcat(BufFileWrite, bufTemp);
|
||
|
||
strcat(BufFileWrite, "&sos=");
|
||
utoa(sos, bufTemp, 10);
|
||
strcat(BufFileWrite, bufTemp);
|
||
|
||
|
||
strcat(BufFileWrite, "&chSv=");
|
||
utoa(chSv, bufTemp, 10);
|
||
strcat(BufFileWrite, bufTemp);
|
||
|
||
if (isfile == 0) {
|
||
strcat(BufFileWrite, "&subj=msg");
|
||
} else {
|
||
strcat(BufFileWrite, "&subj=file");
|
||
}
|
||
|
||
if (kvs == 0) {
|
||
strcat(BufFileWrite, "&kvs=000");
|
||
} else {
|
||
strcat(BufFileWrite, "&kvs=001");
|
||
}
|
||
|
||
if (isfile == 0) {
|
||
strcat(BufFileWrite, "&msg=");
|
||
} else {
|
||
strcat(BufFileWrite, "&msg=");
|
||
strcat(BufFileWrite, &filename[5]);
|
||
}
|
||
|
||
fr = f_open_i(env->fs, &file, (TCHAR *) real_filename, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (fr) {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
UINT bytes_written;
|
||
fr = f_write_i(env->fs, &file, BufFileWrite, strlen(BufFileWrite), &bytes_written);
|
||
|
||
if (isfile > 0) {
|
||
bufTemp[0] = '\0';
|
||
// bufTemp[1] = '\0';
|
||
|
||
fr = f_write_i(env->fs, &file, bufTemp, 1, &bytes_written);
|
||
|
||
}
|
||
|
||
if (isFile == false) {
|
||
fr = f_write_i(env->fs, &file, buf, buf_len, &bytes_written);
|
||
}
|
||
|
||
fr = f_close_i(env->fs, &file);
|
||
|
||
|
||
if (isFile) {
|
||
|
||
bool res = CopyFileFs(env->fs, real_filename, temp_filename, 0);
|
||
|
||
if (res == false) {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
// f_unlink_i(env->fs, temp_filename);
|
||
}
|
||
|
||
env->modemMain->stateRequest.stateReqCreateExtW = StateReqExtForCreate;
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
/*
|
||
idPostResult_t createFileView(tHttpSetting *env, char *dir, char *fileNameContent) {
|
||
FRESULT frDir;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
FRESULT frFile;
|
||
FIL file;
|
||
UINT bw;
|
||
|
||
uint32_t countTimestamp = 0;
|
||
|
||
char buf[164];
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
|
||
frDir = f_findfirst_i(env->fs, &dj, &fno, dirScan, "*");
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
|
||
frFile = f_unlink_i(env->fs, file_dir_tmp);
|
||
|
||
frFile = f_open_i(env->fs, &file, (TCHAR *) file_dir_tmp, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (frFile) {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
while (frDir == FR_OK && fno.fname[0]) {
|
||
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR)
|
||
tpf = 1;
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%FT%T", &stm);
|
||
|
||
time_t timestamp = mktime(&stm);
|
||
env->FileSort[countTimestamp].key = timestamp;
|
||
env->FileSort[countTimestamp].id = countTimestamp;
|
||
|
||
++countTimestamp;
|
||
|
||
size_t len_json = json_generate_get_elem_fs(buf, sizeof(buf), fno.fname, tpf, fno.fsize, fdt);
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, sizeof(buf), &bw);
|
||
|
||
frDir = f_findnext_i(env->fs, &dj, &fno);
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
f_closedir_i(env->fs, &dj);
|
||
|
||
f_close_i(env->fs, &file);
|
||
|
||
|
||
for (uint32_t i = 0; i < countTimestamp - 1; ++i)
|
||
for (uint32_t j = 0; j < countTimestamp - i - 1; ++j) {
|
||
|
||
if (env->FileSort[j + 1].key < env->FileSort[j].key) {
|
||
uint64_t tmpKey = env->FileSort[j].key;
|
||
env->FileSort[j].key = env->FileSort[j + 1].key;
|
||
env->FileSort[j + 1].key = tmpKey;
|
||
|
||
uint32_t tmpId = env->FileSort[j].id;
|
||
env->FileSort[j].id = env->FileSort[j + 1].id;
|
||
env->FileSort[j + 1].id = tmpId;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
fileNameContent[0] = '\0';
|
||
strcat(fileNameContent, file_dir_tmp);
|
||
|
||
return Post_OK;
|
||
}
|
||
*/
|
||
|
||
// Формирование ответа с содержимым директории
|
||
idPostResult_t getSampleDirMem(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir, uint32_t pos,
|
||
uint32_t len) {
|
||
FRESULT fr;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
|
||
uint32_t stepPos = 0;
|
||
|
||
DIR dj2;
|
||
FILINFO fno2;
|
||
char dirScanFile[MAX_LEN_PATH_FS];
|
||
char dirScan2[MAX_LEN_PATH_FS];
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
uint32_t offsetBuf = 1;
|
||
buf[0] = '[';
|
||
|
||
fr = f_findfirst_i(env->fs, &dj, &fno, dirScan, "*");
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
size_t len_json = json_generate_answer_get_elem_fs(&buf[offsetBuf], buf_len, result, dir);
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR) {
|
||
dirScan2[0] = '\0';
|
||
strcat(dirScan2, dirScan);
|
||
strcat(dirScan2, "/");
|
||
strcat(dirScan2, fno.fname);
|
||
|
||
fr = f_findfirst_i(env->fs, &dj2, &fno2, dirScan2, "*");
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
while (fr == FR_OK && fno2.fname[0]) {
|
||
|
||
|
||
if ((stepPos >= pos) && (stepPos < len)) {
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm,
|
||
env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%d-%m-%g %T", &stm);
|
||
|
||
dirScanFile[0] = '\0';
|
||
strcat(dirScanFile, fno.fname);
|
||
strcat(dirScanFile, "/");
|
||
strcat(dirScanFile, fno2.fname);
|
||
|
||
len_json = json_generate_get_elem_fs(&buf[offsetBuf], buf_len, dirScanFile, tpf, fno2.fsize, fdt);
|
||
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
}
|
||
|
||
++stepPos;
|
||
|
||
if (stepPos >= len)
|
||
break;
|
||
|
||
|
||
fr = f_findnext_i(env->fs, &dj2, &fno2);
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
}
|
||
fr = f_closedir_i(env->fs, &dj2);
|
||
|
||
|
||
} else {
|
||
|
||
if ((stepPos >= pos) && (stepPos < len)) {
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%d-%m-%g %T", &stm);
|
||
|
||
len_json = json_generate_get_elem_fs(&buf[offsetBuf], buf_len, fno.fname, tpf, fno.fsize, fdt);
|
||
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
}
|
||
|
||
++stepPos;
|
||
|
||
if (stepPos >= len)
|
||
break;
|
||
|
||
}
|
||
|
||
fr = f_findnext_i(env->fs, &dj, &fno);
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
}
|
||
fr = f_closedir_i(env->fs, &dj);
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
buf[offsetBuf - 1] = ']';
|
||
buf[offsetBuf] = '\0';
|
||
|
||
*tot_len = offsetBuf;
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Формирование ответа с содержимым директории
|
||
idPostResult_t
|
||
getDirExFile(tHttpSetting *env, uint32_t *tot_len, char *fileNameContent, char *buf, size_t buf_len, char *dir,
|
||
uint32_t count, uint32_t pos, uint32_t len) {
|
||
|
||
|
||
FRESULT frDir;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
FRESULT frFile;
|
||
FIL file;
|
||
UINT bw;
|
||
|
||
uint32_t stepPos = 0;
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
|
||
frDir = f_findfirst_i(env->fs, &dj, &fno, dirScan, "*");
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
buf[0] = '[';
|
||
size_t len_json = json_generate_answer_get_ex_elem_fs(&buf[1], buf_len, result, count, dir);
|
||
|
||
|
||
++env->countTmp;
|
||
if (env->countTmp > 20)
|
||
env->countTmp = 1;
|
||
|
||
char dirTmpFile[MAX_LEN_PATH_FS];
|
||
dirTmpFile[0] = '\0';
|
||
strcat(dirTmpFile, file_dir_tmp);
|
||
utoa(env->countTmp, &dirTmpFile[strlen(dirTmpFile)], 10);
|
||
|
||
frFile = f_unlink_i(env->fs, dirTmpFile);
|
||
|
||
frFile = f_open_i(env->fs, &file, (TCHAR *) dirTmpFile, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (frFile) {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, len_json + 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
while (frDir == FR_OK && fno.fname[0]) {
|
||
|
||
if ((stepPos >= pos) && (stepPos < len)) {
|
||
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR)
|
||
tpf = 1;
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%d-%m-%g %T", &stm);
|
||
|
||
frFile = f_write_i(env->fs, &file, ",", 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
len_json = json_generate_get_elem_fs(buf, buf_len, fno.fname, tpf, fno.fsize, fdt);
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, len_json, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
}
|
||
|
||
++stepPos;
|
||
|
||
if (stepPos >= len)
|
||
break;
|
||
|
||
frDir = f_findnext_i(env->fs, &dj, &fno);
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
frDir = f_closedir_i(env->fs, &dj);
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
|
||
|
||
frFile = f_write_i(env->fs, &file, "]", 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
frFile = f_close_i(env->fs, &file);
|
||
|
||
frFile = f_stat(dirTmpFile, &fno);
|
||
*tot_len = fno.fsize;
|
||
fileNameContent[0] = '\0';
|
||
strcat(fileNameContent, dirTmpFile);
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Формирование ответа с содержимым директории
|
||
idPostResult_t
|
||
getDirExMem(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir, uint32_t count, uint32_t pos,
|
||
uint32_t len) {
|
||
FRESULT fr;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
|
||
uint32_t stepPos = 0;
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
uint32_t offsetBuf = 1;
|
||
buf[0] = '[';
|
||
|
||
fr = f_findfirst_i(env->fs, &dj, &fno, dirScan, "*");
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
size_t len_json = json_generate_answer_get_ex_elem_fs(&buf[offsetBuf], buf_len, result, count, dir);
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
|
||
if ((stepPos >= pos) && (stepPos < len)) {
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR)
|
||
tpf = 1;
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%FT%T", &stm);
|
||
|
||
|
||
len_json = json_generate_get_elem_fs(&buf[offsetBuf], buf_len, fno.fname, tpf, fno.fsize, fdt);
|
||
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
if (offsetBuf > buf_len - 200)
|
||
break;
|
||
|
||
}
|
||
|
||
++stepPos;
|
||
|
||
if (stepPos >= len)
|
||
break;
|
||
|
||
fr = f_findnext_i(env->fs, &dj, &fno);
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
}
|
||
fr = f_closedir_i(env->fs, &dj);
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
buf[offsetBuf - 1] = ']';
|
||
buf[offsetBuf] = '\0';
|
||
|
||
*tot_len = offsetBuf;
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Формирование ответа с содержимым директории
|
||
idPostResult_t getDirMem(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir, char *flt) {
|
||
FRESULT fr;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
|
||
uint32_t offsetBuf = 1;
|
||
buf[0] = '[';
|
||
|
||
fr = f_findfirst_i(env->fs, &dj, &fno, dirScan, flt);
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
size_t len_json = json_generate_answer_get_elem_fs(&buf[offsetBuf], buf_len, result, dir);
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR)
|
||
tpf = 1;
|
||
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%FT%T", &stm);
|
||
|
||
len_json = json_generate_get_elem_fs(&buf[offsetBuf], buf_len, fno.fname, tpf, fno.fsize, fdt);
|
||
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
|
||
if (offsetBuf > buf_len - 200)
|
||
break;
|
||
|
||
fr = f_findnext_i(env->fs, &dj, &fno);
|
||
|
||
}
|
||
fr = f_closedir_i(env->fs, &dj);
|
||
|
||
|
||
buf[offsetBuf - 1] = ']';
|
||
buf[offsetBuf] = '\0';
|
||
|
||
*tot_len = offsetBuf;
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
// Количество файлов в каталоге
|
||
int getCountDir(tHttpSetting *env, char *dir, char *flt) {
|
||
int count = 0;
|
||
FRESULT frDir;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
frDir = f_findfirst_i(env->fs, &dj, &fno, dirScan, flt);
|
||
if (frDir)
|
||
return 0;
|
||
|
||
|
||
while (frDir == FR_OK && fno.fname[0]) {
|
||
|
||
++count;
|
||
|
||
frDir = f_findnext_i(env->fs, &dj, &fno);
|
||
if (frDir)
|
||
return 0;
|
||
}
|
||
|
||
frDir = f_closedir_i(env->fs, &dj);
|
||
|
||
|
||
return count;
|
||
}
|
||
|
||
|
||
idPostResult_t
|
||
getDirMemToFile(tHttpSetting *env, uint32_t *tot_len, char *fileNameContent, char *buf, size_t buf_len, char *dir,
|
||
char *flt) {
|
||
FRESULT fr;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
FIL file;
|
||
FRESULT frFile;
|
||
UINT bw;
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
|
||
uint32_t offsetBuf = 1;
|
||
buf[0] = '[';
|
||
|
||
/*
|
||
if (env->modemMain->crunchTrace) {
|
||
env->modemMain->crunchTrace = false;
|
||
pathFiltr[0] = '\0';
|
||
strcat(pathFiltr, "*.OTM");
|
||
}
|
||
*/
|
||
fr = f_findfirst_i(env->fs, &dj, &fno, dirScan, flt);
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
size_t len_json = json_generate_answer_get_elem_fs(&buf[offsetBuf], buf_len, result, dir);
|
||
offsetBuf += len_json;
|
||
|
||
// buf[offsetBuf] = ',';
|
||
// offsetBuf += 1;
|
||
// buf[offsetBuf] = '\0';
|
||
|
||
++env->countTmp;
|
||
if (env->countTmp > 20)
|
||
env->countTmp = 1;
|
||
|
||
char dirTmpFile[MAX_LEN_PATH_FS];
|
||
dirTmpFile[0] = '\0';
|
||
strcat(dirTmpFile, file_dir_tmp);
|
||
utoa(env->countTmp, &dirTmpFile[strlen(dirTmpFile)], 10);
|
||
|
||
frFile = f_unlink_i(env->fs, dirTmpFile);
|
||
|
||
frFile = f_open_i(env->fs, &file, (TCHAR *) dirTmpFile, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (frFile) {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
uint32_t stepFiles = 0;
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR)
|
||
tpf = 1;
|
||
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%FT%T", &stm);
|
||
|
||
buf[offsetBuf] = ',';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
|
||
len_json = json_generate_get_elem_fs(&buf[offsetBuf], buf_len, fno.fname, tpf, fno.fsize, fdt);
|
||
offsetBuf += len_json;
|
||
|
||
// buf[offsetBuf] = ',';
|
||
// offsetBuf += 1;
|
||
// buf[offsetBuf] = '\0';
|
||
|
||
++stepFiles;
|
||
if (stepFiles >= 100) {
|
||
stepFiles = 0;
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, offsetBuf, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
offsetBuf = 0;
|
||
}
|
||
|
||
|
||
fr = f_findnext_i(env->fs, &dj, &fno);
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
}
|
||
fr = f_closedir_i(env->fs, &dj);
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
if (stepFiles > 0) {
|
||
stepFiles = 0;
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, offsetBuf, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
}
|
||
|
||
frFile = f_write_i(env->fs, &file, "]", 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
frFile = f_close_i(env->fs, &file);
|
||
|
||
frFile = f_stat(dirTmpFile, &fno);
|
||
*tot_len = fno.fsize;
|
||
fileNameContent[0] = '\0';
|
||
strcat(fileNameContent, dirTmpFile);
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Формирование ответа с содержимым директории
|
||
idPostResult_t
|
||
getDirFile(tHttpSetting *env, uint32_t *tot_len, char *fileNameContent, char *buf, size_t buf_len, char *dir) {
|
||
FRESULT frDir;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
FRESULT frFile;
|
||
FIL file;
|
||
UINT bw;
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
uint8_t tpf;
|
||
char fdt[26];
|
||
|
||
char pathFiltr[12];
|
||
pathFiltr[0] = '\0';
|
||
strcat(pathFiltr, "*");
|
||
|
||
|
||
frDir = f_findfirst_i(env->fs, &dj, &fno, dirScan, pathFiltr);
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t result = 0;
|
||
buf[0] = '[';
|
||
size_t len_json = json_generate_answer_get_elem_fs(&buf[1], buf_len, result, dir);
|
||
|
||
++env->countTmp;
|
||
if (env->countTmp > 20)
|
||
env->countTmp = 1;
|
||
|
||
char dirTmpFile[MAX_LEN_PATH_FS];
|
||
dirTmpFile[0] = '\0';
|
||
strcat(dirTmpFile, file_dir_tmp);
|
||
utoa(env->countTmp, &dirTmpFile[strlen(dirTmpFile)], 10);
|
||
|
||
frFile = f_unlink_i(env->fs, dirTmpFile);
|
||
|
||
frFile = f_open_i(env->fs, &file, (TCHAR *) dirTmpFile, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (frFile) {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, len_json + 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
while (frDir == FR_OK && fno.fname[0]) {
|
||
|
||
tpf = 0;
|
||
if (fno.fattrib & AM_DIR)
|
||
tpf = 1;
|
||
|
||
struct tm stm;
|
||
fatTimeToTimeStamp(fno.ftime | (fno.fdate << 16), &stm, env->storage->nvm.Settings_General.GMTcorr_v);
|
||
strftime(fdt, sizeof(fdt), "%FT%T", &stm);
|
||
|
||
frFile = f_write_i(env->fs, &file, ",", 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
len_json = json_generate_get_elem_fs(buf, buf_len, fno.fname, tpf, fno.fsize, fdt);
|
||
|
||
frFile = f_write_i(env->fs, &file, buf, len_json, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
frDir = f_findnext_i(env->fs, &dj, &fno);
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
frDir = f_closedir_i(env->fs, &dj);
|
||
if (frDir)
|
||
return Post_FS_ERR;
|
||
|
||
|
||
frFile = f_write_i(env->fs, &file, "]", 1, &bw);
|
||
if (frFile) {
|
||
frFile = f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
|
||
frFile = f_close_i(env->fs, &file);
|
||
|
||
frFile = f_stat(dirTmpFile, &fno);
|
||
*tot_len = fno.fsize;
|
||
fileNameContent[0] = '\0';
|
||
strcat(fileNameContent, dirTmpFile);
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Формирование ответа с содержимым файла
|
||
idPostResult_t
|
||
getFile(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file_name, int32_t pos, size_t len) {
|
||
char bufDumpFile[1024];
|
||
|
||
if (len > 1024)
|
||
return Post_SIZE_ERR;
|
||
|
||
char dirFileName[MAX_LEN_PATH_FS];
|
||
dirFileName[0] = '\0';
|
||
strcat(dirFileName, "1:");
|
||
strcat(dirFileName, file_name);
|
||
|
||
uint32_t offsetBuf = 1;
|
||
buf[0] = '[';
|
||
|
||
FIL file;
|
||
FRESULT fr = f_open_i(env->fs, &file, (TCHAR *) dirFileName, FA_READ);
|
||
|
||
if (fr) return Post_FS_ERR;
|
||
|
||
if (pos < 0) {
|
||
FILINFO fno;
|
||
fr = f_stat(dirFileName, &fno);
|
||
|
||
pos = fno.fsize + pos;
|
||
if (pos < 0) pos = 0;
|
||
}
|
||
|
||
fr = f_lseek_i(env->fs, &file, pos);
|
||
if (fr) return Post_FS_ERR;
|
||
|
||
UINT bytes_read;
|
||
fr = f_read_i(env->fs, &file, bufDumpFile, len, &bytes_read);
|
||
|
||
uint32_t result = 0;
|
||
size_t len_json = json_generate_answer_get_elem_file_fs(&buf[offsetBuf], buf_len, result, file_name, pos,
|
||
bytes_read);
|
||
offsetBuf += len_json;
|
||
buf[offsetBuf] = ']';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
offsetBuf += 1;
|
||
buf[offsetBuf] = '\0';
|
||
|
||
memcpy(&buf[offsetBuf], bufDumpFile, bytes_read);
|
||
offsetBuf += bytes_read;
|
||
|
||
if (fr) {
|
||
f_close_i(env->fs, &file);
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
fr = f_close_i(env->fs, &file);
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
*tot_len = offsetBuf;
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Получение размера файла
|
||
idPostResult_t getFileSize(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file_name) {
|
||
char dirFileName[MAX_LEN_PATH_FS];
|
||
dirFileName[0] = '\0';
|
||
strcat(dirFileName, "1:");
|
||
strcat(dirFileName, file_name);
|
||
|
||
FRESULT fr;
|
||
FILINFO fno;
|
||
|
||
fr = f_stat(dirFileName, &fno);
|
||
|
||
if (fr == FR_OK) {
|
||
uint32_t err = 0;
|
||
*tot_len = json_generate_fileinfo_answer(buf, buf_len, fno.fsize);
|
||
|
||
} else {
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
|
||
// Удаление файла
|
||
idPostResult_t delFile(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file_name) {
|
||
char dirFileName[MAX_LEN_PATH_FS];
|
||
dirFileName[0] = '\0';
|
||
strcat(dirFileName, "1:");
|
||
strcat(dirFileName, file_name);
|
||
|
||
FRESULT result = f_unlink_i(env->fs, dirFileName);
|
||
if (result) {
|
||
if (result != FR_NO_FILE)
|
||
return Post_FS_ERR;
|
||
}
|
||
|
||
uint32_t err = 0;
|
||
*tot_len = json_generate_err_answer(buf, buf_len, err);
|
||
|
||
return Post_OK;
|
||
}
|
||
|
||
// Удаление всех файлов в директории
|
||
idPostResult_t delDirFile(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir) {
|
||
FRESULT fr;
|
||
DIR dj;
|
||
FILINFO fno;
|
||
|
||
char dirScan[MAX_LEN_PATH_FS];
|
||
dirScan[0] = '\0';
|
||
strcat(dirScan, "1:");
|
||
strcat(dirScan, dir);
|
||
|
||
char dirFileScan[MAX_LEN_PATH_FS];
|
||
|
||
fr = f_findfirst_i(env->fs, &dj, &fno, dirScan, "*");
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
dirFileScan[0] = '\0';
|
||
strcat(dirFileScan, dirScan);
|
||
strcat(dirFileScan, "/");
|
||
strcat(dirFileScan, fno.fname);
|
||
|
||
fr = f_unlink_i(env->fs, dirFileScan);
|
||
|
||
fr = f_findnext_i(env->fs, &dj, &fno);
|
||
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
}
|
||
fr = f_closedir_i(env->fs, &dj);
|
||
if (fr)
|
||
return Post_FS_ERR;
|
||
|
||
uint32_t err = 0;
|
||
*tot_len = json_generate_err_answer(buf, buf_len, err);
|
||
|
||
return Post_OK;
|
||
}
|