1416 lines
44 KiB
C
1416 lines
44 KiB
C
//
|
||
// Created by cfif on 21.02.23.
|
||
//
|
||
#include "ModemReceiveFunc.h"
|
||
#include "GonetsCrcs.h"
|
||
#include "httpd_base_func.h"
|
||
|
||
extern uint8_t bufFreeOperation[1500];
|
||
extern uint8_t bufFreeOperationKV[1500];
|
||
extern uint8_t bufFillOperation[1500];
|
||
|
||
//const uint8_t bufFreeOperation[32768];
|
||
//extern const uint8_t bufFreeOperationKV[2048];
|
||
//extern const uint8_t bufFillOperation[2048];
|
||
|
||
/*
|
||
// Создание имени файла из транспортного пакета
|
||
void
|
||
createFileFragInbox(char *path, uint32_t dateCreateTransportPacket, uint32_t numberSender, uint32_t numberMessage, char t, char *ext) {
|
||
char buf[12];
|
||
char bufWithPrefix[18];
|
||
|
||
utoa(dateCreateTransportPacket, buf, 10);
|
||
toAddPrefixStr(bufWithPrefix, buf, 5);
|
||
strcat(path, bufWithPrefix);
|
||
strcat(path, "_");
|
||
|
||
utoa(numberSender, buf, 10);
|
||
toAddPrefixStr(bufWithPrefix, buf, 5);
|
||
strcat(path, bufWithPrefix);
|
||
strcat(path, "_");
|
||
|
||
utoa(numberMessage, buf, 10);
|
||
toAddPrefixStr(bufWithPrefix, buf, 5);
|
||
strcat(path, bufWithPrefix);
|
||
|
||
buf[0] = t;
|
||
buf[1] = '\0';
|
||
strcat(path, buf);
|
||
|
||
strcat(path, ext);
|
||
|
||
}
|
||
*/
|
||
|
||
// Создание имени файла
|
||
void createFileNameForId(char *path, char *basePath, uint32_t id, char *ext) {
|
||
char buf[12];
|
||
char bufWithPrefix[18];
|
||
|
||
path[0] = '\0';
|
||
strcat(path, basePath);
|
||
utoa(id, buf, 10);
|
||
toAddPrefixStr(bufWithPrefix, buf, 5);
|
||
strcat(path, bufWithPrefix);
|
||
strcat(path, ".");
|
||
strcat(path, ext);
|
||
}
|
||
|
||
// Создание имени файла
|
||
void createFileNameForId_REP_MSK_INF(char *pathRep, char *pathMsk, char *pathInf, char *basePath, uint32_t id) {
|
||
createFileNameForId(pathRep, basePath, id, "REP");
|
||
createFileNameForId(pathMsk, basePath, id, "MSK");
|
||
createFileNameForId(pathInf, basePath, id, "INF");
|
||
}
|
||
|
||
|
||
bool readRepresentationRecvFileRep(tFs *fs, tStructRepresentationPacket *structRepresentationPacket,
|
||
char *path_dir_frag_inbox_fileName) {
|
||
FRESULT fr;
|
||
FIL file;
|
||
UINT br;
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_READ);
|
||
if (fr) {
|
||
return false;
|
||
}
|
||
|
||
fr = f_read_i(fs, &file, structRepresentationPacket, sizeof(tStructRepresentationPacket), &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
bool readRecvFileInfo(tFs *fs, tFileRecvInfo *fileRecvInfo, char *path_inf_fileName) {
|
||
/*
|
||
fileRecvInfo->from = ini_getl("MAIN", "from", 0, path_inf_fileName);
|
||
fileRecvInfo->mnumFrom = ini_getl("MAIN", "mnumFrom", 0, path_inf_fileName);
|
||
fileRecvInfo->to = ini_getl("MAIN", "to", 0, path_inf_fileName);
|
||
fileRecvInfo->chSv = ini_getl("MAIN", "chSv", 0, path_inf_fileName);
|
||
fileRecvInfo->kvs = ini_getl("MAIN", "kvs", 0, path_inf_fileName);
|
||
fileRecvInfo->mnum = ini_getl("MAIN", "mnum", 0, path_inf_fileName);
|
||
fileRecvInfo->dateDay = ini_getl("MAIN", "dateDay", 0, path_inf_fileName);
|
||
fileRecvInfo->dateMon = ini_getl("MAIN", "dateMon", 0, path_inf_fileName);
|
||
fileRecvInfo->fileSize = ini_getl("MAIN", "fileSize", 0, path_inf_fileName);
|
||
fileRecvInfo->isEnd = ini_getl("MAIN", "isEnd", 0, path_inf_fileName);
|
||
fileRecvInfo->isRecvInbox = ini_getl("MAIN", "isRecvInbox", 0, path_inf_fileName);
|
||
fileRecvInfo->crc32_MSK = ini_getl("MAIN", "crc32_MSK", 0, path_inf_fileName);
|
||
fileRecvInfo->crc32_REP = ini_getl("MAIN", "crc32_REP", 0, path_inf_fileName);
|
||
*/
|
||
|
||
FRESULT fr;
|
||
FIL file;
|
||
UINT br;
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_inf_fileName, FA_READ);
|
||
if (fr) {
|
||
return false;
|
||
}
|
||
|
||
fr = f_read_i(fs, &file, fileRecvInfo, sizeof(tFileRecvInfo), &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
return true;
|
||
}
|
||
|
||
bool writeRecvFileInfo(tFs *fs, tFileRecvInfo *fileRecvInfo, char *path_inf_fileName) {
|
||
bool result;
|
||
/*
|
||
result = ini_putl("MAIN", "from", fileRecvInfo->from, path_inf_fileName);
|
||
result = ini_putl("MAIN", "mnumFrom", fileRecvInfo->mnumFrom, path_inf_fileName);
|
||
result = ini_putl("MAIN", "chSv", fileRecvInfo->chSv, path_inf_fileName);
|
||
result = ini_putl("MAIN", "to", fileRecvInfo->to, path_inf_fileName);
|
||
result = ini_putl("MAIN", "kvs", fileRecvInfo->kvs, path_inf_fileName);
|
||
result = ini_putl("MAIN", "mnum", fileRecvInfo->mnum, path_inf_fileName);
|
||
result = ini_putl("MAIN", "dateDay", fileRecvInfo->dateDay, path_inf_fileName);
|
||
result = ini_putl("MAIN", "dateMon", fileRecvInfo->dateMon, path_inf_fileName);
|
||
result = ini_putl("MAIN", "fileSize", fileRecvInfo->fileSize, path_inf_fileName);
|
||
result = ini_putl("MAIN", "isEnd", fileRecvInfo->isEnd, path_inf_fileName);
|
||
result = ini_putl("MAIN", "isRecvInbox", fileRecvInfo->isRecvInbox, path_inf_fileName);
|
||
result = ini_putl("MAIN", "crc32_MSK", fileRecvInfo->crc32_MSK, path_inf_fileName);
|
||
result = ini_putl("MAIN", "crc32_REP", fileRecvInfo->crc32_REP, path_inf_fileName);
|
||
*/
|
||
|
||
FRESULT fr;
|
||
FIL file;
|
||
UINT bw;
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_inf_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (fr) {
|
||
return false;
|
||
}
|
||
|
||
fr = f_write_i(fs, &file, fileRecvInfo, sizeof(tFileRecvInfo), &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
// Прием пакетов - Создание файлов
|
||
bool
|
||
isReceivedCreate(tFs *fs, uint32_t mnum, uint32_t to, tStructTransportPacket *packet, uint8_t *buf, uint32_t buf_len,
|
||
char *path_dir_info_fileName, char *path_dir_mask_fileName, char *path_dir_frag_inbox_fileName,
|
||
bool *isCrcUpdate) {
|
||
FIL file;
|
||
FRESULT fr;
|
||
UINT bw;
|
||
FILINFO fno;
|
||
|
||
*isCrcUpdate = true;
|
||
|
||
uint32_t size = packet->offsetPacket;
|
||
|
||
if (packet->offsetPacket > 0) {
|
||
|
||
uint32_t lenMaskInteger = size / sizeof(bufFreeOperation);
|
||
uint32_t lenMaskTail = size % sizeof(bufFreeOperation);
|
||
|
||
|
||
// Расширение МАСКИ
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (fr) return false;
|
||
|
||
for (uint32_t i = 0; i < lenMaskInteger; ++i) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (lenMaskTail > 0) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
|
||
// Расширение СООБЩЕНИЯ
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (fr) return false;
|
||
|
||
for (uint32_t i = 0; i < lenMaskInteger; ++i) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (lenMaskTail > 0) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// Запись данных сообщения
|
||
//fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
} else {
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
|
||
if (fr) return false;
|
||
|
||
// fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
// Создание файла сегментов и запись сегмента сообщения
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
if (fr) return false;
|
||
|
||
// fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
}
|
||
|
||
|
||
|
||
// Размер файла
|
||
fr = f_stat(path_dir_frag_inbox_fileName, &fno);
|
||
|
||
tFileRecvInfo fileRecvInfo;
|
||
fileRecvInfo.mnum = mnum;
|
||
fileRecvInfo.from = packet->numberSender;
|
||
fileRecvInfo.mnumFrom = packet->numberMessage;
|
||
fileRecvInfo.dateDay = packet->dateCreateTransportPacketDay;
|
||
fileRecvInfo.dateMon = packet->dateCreateTransportPacketMon;
|
||
fileRecvInfo.to = to;
|
||
fileRecvInfo.chSv = 1;
|
||
fileRecvInfo.kvs = 0;
|
||
if (packet->dataType == 0)
|
||
fileRecvInfo.kvs = 1;
|
||
fileRecvInfo.isEnd = packet->isEnd;
|
||
fileRecvInfo.fileSize = fno.fsize;
|
||
fileRecvInfo.isRecvInbox = 0;
|
||
|
||
fileRecvInfo.crc32_MSK = CrcFileFs(fs, path_dir_mask_fileName);
|
||
fileRecvInfo.crc32_REP = CrcFileFs(fs, path_dir_frag_inbox_fileName);
|
||
|
||
// Создание файла информации
|
||
bool result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
|
||
return result;
|
||
}
|
||
|
||
// Прием пакетов - Добавление файлов
|
||
bool isReceivedAppend(tFs *fs, tStructTransportPacket *packet, uint8_t *buf, uint32_t buf_len,
|
||
char *path_dir_info_fileName, char *path_dir_mask_fileName, char *path_dir_frag_inbox_fileName,
|
||
bool *isCrcUpdate) {
|
||
FIL file;
|
||
FRESULT fr;
|
||
UINT bw;
|
||
FILINFO fno;
|
||
|
||
*isCrcUpdate = false;
|
||
|
||
tFileRecvInfo fileRecvInfo;
|
||
|
||
// Чтение файла информации
|
||
bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
|
||
uint32_t crcMSK_Old = fileRecvInfo.crc32_MSK;
|
||
|
||
// Размер файла
|
||
fr = f_stat(path_dir_mask_fileName, &fno);
|
||
|
||
if (fno.fsize < packet->offsetPacket) {
|
||
|
||
uint32_t size = packet->offsetPacket - fno.fsize;
|
||
|
||
uint32_t lenMaskInteger = size / sizeof(bufFreeOperation);
|
||
uint32_t lenMaskTail = size % sizeof(bufFreeOperation);
|
||
|
||
// Расширение МАСКИ
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE | FA_OPEN_APPEND);
|
||
if (fr) return false;
|
||
|
||
for (uint32_t i = 0; i < lenMaskInteger; ++i) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (lenMaskTail > 0) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)),buf_len - sizeof(tStructTransportPacket),&bw);
|
||
fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
// Расширение СООБЩЕНИЯ
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_OPEN_APPEND);
|
||
if (fr) return false;
|
||
|
||
for (uint32_t i = 0; i < lenMaskInteger; ++i) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (lenMaskTail > 0) {
|
||
fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// Запись данных сообщения
|
||
// fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket),&bw);
|
||
fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
} else {
|
||
// Запись маски в файл маски
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE);
|
||
if (fr) return false;
|
||
fr = f_lseek_i(fs, &file, packet->offsetPacket);
|
||
|
||
// fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)),buf_len - sizeof(tStructTransportPacket), &bw);
|
||
fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
// Запись сегментов в файл сообщения
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE);
|
||
if (fr) return false;
|
||
fr = f_lseek_i(fs, &file, packet->offsetPacket);
|
||
|
||
// fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket),&bw);
|
||
fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw);
|
||
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
fr = f_close_i(fs, &file);
|
||
|
||
}
|
||
|
||
// Размер файла
|
||
fr = f_stat(path_dir_frag_inbox_fileName, &fno);
|
||
|
||
if (packet->dataType == 0)
|
||
fileRecvInfo.kvs = 1;
|
||
|
||
if (packet->isEnd == 1)
|
||
fileRecvInfo.isEnd = packet->isEnd;
|
||
|
||
fileRecvInfo.fileSize = fno.fsize;
|
||
|
||
fileRecvInfo.crc32_MSK = CrcFileFs(fs, path_dir_mask_fileName);
|
||
fileRecvInfo.crc32_REP = CrcFileFs(fs, path_dir_frag_inbox_fileName);
|
||
|
||
// Запись файла информации
|
||
result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
|
||
if (crcMSK_Old != fileRecvInfo.crc32_MSK) {
|
||
*isCrcUpdate = true;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
//начало--------------------------------------Квитирование приема-------------------------------------------------------
|
||
//начало--------------------------------------Квитирование приема-------------------------------------------------------
|
||
//начало--------------------------------------Квитирование приема-------------------------------------------------------
|
||
|
||
bool Kvitin(tFs *fs, tRtcIO *rtcIo, uint32_t numberMessage, uint32_t numberSender,
|
||
char *path_dir_info_fileName,
|
||
char *path_dir_mask_fileName, uint8_t *bufKvit, uint32_t *lenPacketKvit, bool *isAll) {
|
||
// uint32_t sizeBufKvit = 0;
|
||
|
||
uint8_t bufRead[512];
|
||
FIL file;
|
||
FRESULT fr;
|
||
UINT br; // File read/write count
|
||
|
||
*isAll = false;
|
||
*lenPacketKvit = 0;
|
||
|
||
tFileRecvInfo fileRecvInfo;
|
||
|
||
// Чтение файла информации
|
||
bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
if (result == false) {
|
||
return false;
|
||
}
|
||
|
||
uint32_t sizeFileFrag = fileRecvInfo.fileSize;
|
||
|
||
// Чтение файла маски
|
||
uint32_t stepSizeFileFrag = 0;
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_READ);
|
||
if (fr) return false;
|
||
|
||
|
||
fr = f_read_i(fs, &file, bufRead, sizeof(bufRead), &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
uint32_t lenFieldKvit = 0;
|
||
|
||
if (fileRecvInfo.isEnd)
|
||
*isAll = true;
|
||
|
||
tStructTransportKvitPacketData *dataKvit = (tStructTransportKvitPacketData *) &bufKvit[0];
|
||
|
||
uint8_t prefByte;
|
||
|
||
if (bufRead[0] == 0x55) {
|
||
dataKvit->offsetKvitPacket = 0;
|
||
++dataKvit;
|
||
++lenFieldKvit;
|
||
} else {
|
||
*isAll = false;
|
||
}
|
||
prefByte = bufRead[0];
|
||
|
||
for (;;) {
|
||
|
||
for (uint32_t i = 0; i < br; ++i) {
|
||
|
||
if (stepSizeFileFrag == sizeFileFrag) {
|
||
break;
|
||
}
|
||
|
||
if (prefByte != bufRead[i]) {
|
||
|
||
if (bufRead[i] == 0x55) {
|
||
dataKvit->offsetKvitPacket = stepSizeFileFrag;
|
||
}
|
||
if (bufRead[i] == 0x00) {
|
||
dataKvit->offsetKvitPacket = stepSizeFileFrag;
|
||
*isAll = false;
|
||
}
|
||
|
||
++dataKvit;
|
||
++lenFieldKvit;
|
||
|
||
prefByte = bufRead[i];
|
||
}
|
||
|
||
++stepSizeFileFrag;
|
||
}
|
||
|
||
if ((stepSizeFileFrag == sizeFileFrag) || (br == 0)) {
|
||
break;
|
||
}
|
||
|
||
fr = f_read_i(fs, &file, bufRead, sizeof(bufRead), &br);
|
||
if (fr) {
|
||
*isAll = false;
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
if (*isAll == true) {
|
||
dataKvit->offsetKvitPacket = 0;
|
||
lenFieldKvit = 1;
|
||
}
|
||
|
||
// Если не было последнего пакета
|
||
if (fileRecvInfo.isEnd == 0) {
|
||
dataKvit->offsetKvitPacket = fileRecvInfo.fileSize;
|
||
++lenFieldKvit;
|
||
}
|
||
|
||
*lenPacketKvit = lenFieldKvit * 3;
|
||
|
||
return true;
|
||
}
|
||
//конец--------------------------------------Квитирование приема-------------------------------------------------------
|
||
//конец--------------------------------------Квитирование приема-------------------------------------------------------
|
||
//конец--------------------------------------Квитирование приема-------------------------------------------------------
|
||
|
||
|
||
|
||
// Сообщение принято целиком
|
||
bool isReceivedAll(tFs *fs, char *path_dir_info_fileName, char *path_dir_mask_fileName, bool *isAll) {
|
||
uint8_t bufRead[512];
|
||
FIL file;
|
||
FRESULT fr;
|
||
UINT br; // File read/write count
|
||
|
||
*isAll = false;
|
||
|
||
tFileRecvInfo fileRecvInfo;
|
||
|
||
// Чтение файла информации
|
||
bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
if (result == false) {
|
||
return false;
|
||
}
|
||
|
||
/*
|
||
uint32_t sizeFileFrag = 0;
|
||
uint32_t isEnd = 0;
|
||
uint32_t isKvit = 0;
|
||
|
||
// Чтение размера файла
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_info_fileName, FA_READ);
|
||
if (fr) return false;
|
||
|
||
fr = f_read_i(fs, &file, &sizeFileFrag, 4, &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
fr = f_read_i(fs, &file, &isKvit, 4, &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
fr = f_read_i(fs, &file, &isEnd, 4, &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
*/
|
||
|
||
uint32_t sizeFileFrag = 0;
|
||
|
||
// Чтение файла маски
|
||
uint32_t stepSizeFileFrag = 0;
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_READ);
|
||
if (fr) {
|
||
return false;
|
||
}
|
||
|
||
//начало--------------------------------------БЕЗ Квитирование приема----------------------------------------------------
|
||
//начало--------------------------------------БЕЗ Квитирование приема----------------------------------------------------
|
||
//начало--------------------------------------БЕЗ Квитирование приема----------------------------------------------------
|
||
for (;;) {
|
||
|
||
fr = f_read_i(fs, &file, bufRead, sizeof(bufRead), &br);
|
||
if (fr) {
|
||
fr = f_close_i(fs, &file);
|
||
return false;
|
||
}
|
||
|
||
for (uint32_t i = 0; i < br; ++i) {
|
||
|
||
if (stepSizeFileFrag == sizeFileFrag) {
|
||
break;
|
||
}
|
||
|
||
if (bufRead[i] == 0) {
|
||
fr = f_close_i(fs, &file);
|
||
return true;
|
||
}
|
||
|
||
++stepSizeFileFrag;
|
||
}
|
||
|
||
if ((br == 0) || (stepSizeFileFrag == sizeFileFrag))
|
||
break;
|
||
}
|
||
|
||
//конец--------------------------------------БЕЗ Квитирование приема----------------------------------------------------
|
||
//конец--------------------------------------БЕЗ Квитирование приема----------------------------------------------------
|
||
//конец--------------------------------------БЕЗ Квитирование приема----------------------------------------------------
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
if (stepSizeFileFrag == sizeFileFrag) {
|
||
if (fileRecvInfo.isEnd) {
|
||
*isAll = true;
|
||
return true;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
// Создание заголовка файла входящего сообщения трассировки
|
||
void
|
||
createFileHeadFragInboxTrace(char *str, uint32_t numberSender, uint32_t numberRecipient, uint32_t numberMessage,
|
||
uint32_t kvs, uint32_t typeMessage, char *bufIdFileInBox) {
|
||
char buf[9];
|
||
|
||
strcat(str, "&from=");
|
||
utoa(numberSender, buf, 10);
|
||
strcat(str, buf);
|
||
|
||
strcat(str, "&to=");
|
||
utoa(numberRecipient, buf, 10);
|
||
strcat(str, buf);
|
||
|
||
strcat(str, "&chSv=1");
|
||
|
||
if ((kvs == 0) || (kvs == 1)) {
|
||
strcat(str, "&mnum=");
|
||
utoa(numberMessage, buf, 10);
|
||
strcat(str, buf);
|
||
|
||
strcat(str, "&kvs=0");
|
||
|
||
strcat(str, "&subj=file&msg=");
|
||
|
||
strcat(str, bufIdFileInBox);
|
||
strcat(str, ".DAT");
|
||
|
||
}
|
||
|
||
// if ((kvs == 8) || (kvs == 4)) {
|
||
// strcat(str, "&subj=KVITIN&msg=");
|
||
// }
|
||
|
||
}
|
||
|
||
// Создание заголовка файла входящего сообщения
|
||
void
|
||
createFileHeadFragInbox(char *str, uint32_t numberSender, uint32_t numberRecipient, uint32_t numberMessage,
|
||
uint32_t kvs, uint32_t typeMessage) {
|
||
char buf[9];
|
||
|
||
strcat(str, "&from=");
|
||
utoa(numberSender, buf, 10);
|
||
strcat(str, buf);
|
||
|
||
strcat(str, "&to=");
|
||
utoa(numberRecipient, buf, 10);
|
||
strcat(str, buf);
|
||
|
||
strcat(str, "&chSv=1");
|
||
|
||
if ((kvs == 0) || (kvs == 1)) {
|
||
strcat(str, "&mnum=");
|
||
utoa(numberMessage, buf, 10);
|
||
strcat(str, buf);
|
||
|
||
if (kvs == 0) {
|
||
strcat(str, "&kvs=0");
|
||
}
|
||
|
||
if (kvs == 1) {
|
||
strcat(str, "&kvs=1");
|
||
}
|
||
|
||
if (typeMessage == 2) {
|
||
strcat(str, "&subj=file&msg=");
|
||
} else {
|
||
strcat(str, "&msg=");
|
||
}
|
||
}
|
||
|
||
// if ((kvs == 8) || (kvs == 4)) {
|
||
// strcat(str, "&subj=KVITIN&msg=");
|
||
// }
|
||
|
||
}
|
||
|
||
// Получение информации о принятых файлах квитанций
|
||
bool checkNumSentBoxKvitin(tFs *fs,
|
||
uint8_t *bufReceivedPacket,
|
||
uint32_t bufReceivedPacketLen,
|
||
uint32_t numberSender,
|
||
uint32_t numberMessage,
|
||
uint32_t dateCreateTransportPacketMon,
|
||
uint32_t dateCreateTransportPacketDay) {
|
||
FRESULT fr;
|
||
char bufDumpFile[256];
|
||
|
||
char *end;
|
||
|
||
DIR dj;
|
||
FILINFO fno;
|
||
FIL file;
|
||
|
||
char fileName[MAX_LEN_PATH_FS];
|
||
|
||
struct {
|
||
int paramcount;
|
||
char *params_names[MAX_POST_GET_PARAMETERS];
|
||
char *params_vals[MAX_POST_GET_PARAMETERS];
|
||
} params_uri;
|
||
|
||
uint32_t crc32 = 0xFFFFFFFF;
|
||
crc32 = GonetsCrc32_noreverse_update(&bufReceivedPacket[sizeof(tStructTransportKvitPacket)],
|
||
bufReceivedPacketLen - sizeof(tStructTransportKvitPacket), crc32);
|
||
crc32 = GonetsCrc32_noreverse_finish(crc32);
|
||
|
||
// Путь к файлу в SENTBOX KVITIN
|
||
char path_sent_fileName[MAX_LEN_PATH_FS];
|
||
path_sent_fileName[0] = '\0';
|
||
strcat(path_sent_fileName, dir_kvitin);
|
||
|
||
fr = f_findfirst_i(fs, &dj, &fno, path_sent_fileName, "*.ITM");
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
fileName[0] = '\0';
|
||
strcat(fileName, path_sent_fileName);
|
||
strcat(fileName, fno.fname);
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) fileName, FA_READ);
|
||
if (fr != FR_OK) {
|
||
fr = f_findnext_i(fs, &dj, &fno);
|
||
continue;
|
||
}
|
||
|
||
UINT bytes_read;
|
||
fr = f_read_i(fs, &file, bufDumpFile, sizeof(bufDumpFile), &bytes_read);
|
||
if (fr != FR_OK) {
|
||
fr = f_close_i(fs, &file);
|
||
fr = f_findnext_i(fs, &dj, &fno);
|
||
continue;
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
params_uri.paramcount = extract_uri_ex_parameters(bufDumpFile, params_uri.params_names,
|
||
params_uri.params_vals,
|
||
MAX_POST_GET_PARAMETERS);
|
||
|
||
|
||
int stepParam = 0;
|
||
uint32_t fromFile = 0;
|
||
uint32_t kvt_numFile = 0;
|
||
uint32_t kvt_monFile = 0;
|
||
uint32_t kvt_dayFile = 0;
|
||
uint32_t kvt_crc = 0;
|
||
for (int i = 0; i < params_uri.paramcount; ++i) {
|
||
|
||
if (strcmp(params_uri.params_names[i], "from") == 0) {
|
||
fromFile = atoi(params_uri.params_vals[i]);
|
||
++stepParam;
|
||
}
|
||
|
||
if (strcmp(params_uri.params_names[i], "kvt_num") == 0) {
|
||
kvt_numFile = atoi(params_uri.params_vals[i]);
|
||
++stepParam;
|
||
}
|
||
|
||
if (strcmp(params_uri.params_names[i], "kvt_mon") == 0) {
|
||
kvt_monFile = atoi(params_uri.params_vals[i]);
|
||
++stepParam;
|
||
}
|
||
|
||
if (strcmp(params_uri.params_names[i], "kvt_day") == 0) {
|
||
kvt_dayFile = atoi(params_uri.params_vals[i]);
|
||
++stepParam;
|
||
}
|
||
|
||
if (strcmp(params_uri.params_names[i], "kvt_crc") == 0) {
|
||
++stepParam;
|
||
kvt_crc = strtoul(params_uri.params_vals[i], &end, 10);
|
||
}
|
||
}
|
||
|
||
if ((numberSender == fromFile) && (numberMessage == kvt_numFile) &&
|
||
(dateCreateTransportPacketMon == kvt_monFile) && (dateCreateTransportPacketDay == kvt_dayFile) &&
|
||
(crc32 == kvt_crc)) {
|
||
|
||
fr = f_closedir_i(fs, &dj);
|
||
return true;
|
||
}
|
||
|
||
fr = f_findnext_i(fs, &dj, &fno);
|
||
}
|
||
fr = f_closedir_i(fs, &dj);
|
||
|
||
return false;
|
||
}
|
||
|
||
// Получение информации о принятых файлах
|
||
bool checkNumSentBox(tFs *fs, tRtcIO *rtc, uint32_t mnum, uint32_t from) {
|
||
FRESULT fr;
|
||
char bufDumpFile[256];
|
||
|
||
DIR dj;
|
||
FILINFO fno;
|
||
FIL file;
|
||
|
||
char fileName[MAX_LEN_PATH_FS];
|
||
|
||
struct {
|
||
int paramcount;
|
||
char *params_names[MAX_POST_GET_PARAMETERS];
|
||
char *params_vals[MAX_POST_GET_PARAMETERS];
|
||
} params_uri;
|
||
|
||
|
||
// Количество дней назад
|
||
for (int j = 0; j < 4; ++j) {
|
||
|
||
// Путь к каталогу с датой
|
||
char path_sent_dirDate[MAX_LEN_PATH_FS];
|
||
path_sent_dirDate[0] = '\0';
|
||
|
||
time_t timestamp;
|
||
rtc->get(rtc, ×tamp);
|
||
timestamp -= j * 24 * 3600;
|
||
|
||
struct tm timestampTM;
|
||
localtime_r(×tamp, ×tampTM);
|
||
|
||
strftime(path_sent_dirDate, sizeof(path_sent_dirDate), "%Y%m%d", ×tampTM);
|
||
|
||
// Путь к файлу в SENTBOX
|
||
char path_sent_fileName[MAX_LEN_PATH_FS];
|
||
path_sent_fileName[0] = '\0';
|
||
strcat(path_sent_fileName, dir_inbox);
|
||
strcat(path_sent_fileName, path_sent_dirDate);
|
||
strcat(path_sent_fileName, "/");
|
||
|
||
|
||
fr = f_findfirst_i(fs, &dj, &fno, path_sent_fileName, "*.ITM");
|
||
|
||
while (fr == FR_OK && fno.fname[0]) {
|
||
|
||
fileName[0] = '\0';
|
||
strcat(fileName, path_sent_fileName);
|
||
strcat(fileName, fno.fname);
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) fileName, FA_READ);
|
||
if (fr != FR_OK) {
|
||
fr = f_findnext_i(fs, &dj, &fno);
|
||
continue;
|
||
}
|
||
|
||
UINT bytes_read;
|
||
fr = f_read_i(fs, &file, bufDumpFile, sizeof(bufDumpFile), &bytes_read);
|
||
if (fr != FR_OK) {
|
||
fr = f_close_i(fs, &file);
|
||
fr = f_findnext_i(fs, &dj, &fno);
|
||
continue;
|
||
}
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
params_uri.paramcount = extract_uri_ex_parameters(bufDumpFile, params_uri.params_names,
|
||
params_uri.params_vals,
|
||
MAX_POST_GET_PARAMETERS);
|
||
|
||
|
||
int stepParam = 0;
|
||
uint32_t mnumFile = 0;
|
||
uint32_t fromFile = 0;
|
||
for (int i = 0; i < params_uri.paramcount; ++i) {
|
||
|
||
if (strcmp(params_uri.params_names[i], "mnum") == 0) {
|
||
mnumFile = atoi(params_uri.params_vals[i]);
|
||
++stepParam;
|
||
if (stepParam == 2)
|
||
break;
|
||
}
|
||
|
||
if (strcmp(params_uri.params_names[i], "from") == 0) {
|
||
fromFile = atoi(params_uri.params_vals[i]);
|
||
++stepParam;
|
||
if (stepParam == 2)
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
if ((stepParam == 2) && (mnum == mnumFile) && (from == fromFile)) {
|
||
fr = f_closedir_i(fs, &dj);
|
||
return true;
|
||
}
|
||
|
||
fr = f_findnext_i(fs, &dj, &fno);
|
||
}
|
||
fr = f_closedir_i(fs, &dj);
|
||
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
// Перенос собранного фрагментированного файла в хранилище принятых сообщений inbox
|
||
tReceiveBuildResult
|
||
renameFromFrgToInBox(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, uint32_t idFile, tRtcIO *rtc,
|
||
char *path_dir_info_fileName,
|
||
char *path_dir_frag_inbox_fileName, tLoggerInterface *logger) {
|
||
tFileRecvInfo fileRecvInfo;
|
||
|
||
// Чтение файла информации
|
||
bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
|
||
|
||
// Получение информации о принятых файлах
|
||
if (checkNumSentBox(fs, rtc, fileRecvInfo.mnumFrom, fileRecvInfo.from)) {
|
||
|
||
#ifdef DEBUG_EXT_MODEM
|
||
char strMessage[128];
|
||
strMessage[0] = '\0';
|
||
strcat(strMessage, "Сообщение номер ");
|
||
char buf[12];
|
||
utoa(fileRecvInfo.mnumFrom, buf, 10);
|
||
strcat(strMessage, buf);
|
||
strcat(strMessage, " от АТ-");
|
||
utoa(fileRecvInfo.from, buf, 10);
|
||
strcat(strMessage, buf);
|
||
|
||
strcat(strMessage, " было принято ранее");
|
||
|
||
LoggerInfo(logger, "GONEC", strMessage, strlen(strMessage));
|
||
#endif
|
||
|
||
return true;
|
||
}
|
||
|
||
// if (fileRecvInfo.isRecvInbox) {
|
||
// return true;
|
||
// }
|
||
|
||
tStructRepresentationPacket structRepresentationPacket;
|
||
result = readRepresentationRecvFileRep(fs, &structRepresentationPacket, path_dir_frag_inbox_fileName);
|
||
if (result == false) {
|
||
return false;
|
||
}
|
||
|
||
vGonetsReedSalmonRecovery_1410_3430(gonetsReedSalmon, (uint8_t *) &structRepresentationPacket);
|
||
|
||
uint8_t crc8 = GonetsCrc8((uint8_t *) &structRepresentationPacket, 9);
|
||
|
||
if (crc8 != structRepresentationPacket.crc8) {
|
||
LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка crc8 в заголовке сообщения");
|
||
}
|
||
|
||
|
||
char path_in_dirDate[MAX_LEN_PATH_FS];
|
||
path_in_dirDate[0] = '\0';
|
||
char path_in_fileName[MAX_LEN_PATH_FS];
|
||
path_in_fileName[0] = '\0';
|
||
char path_in_fileNameTrace[MAX_LEN_PATH_FS];
|
||
path_in_fileNameTrace[0] = '\0';
|
||
|
||
// Путь к файлу принятых сообщений
|
||
getDateStr(rtc, path_in_dirDate, sizeof(path_in_dirDate));
|
||
strcat(path_in_fileName, dir_inbox);
|
||
strcat(path_in_fileName, path_in_dirDate);
|
||
strcat(path_in_fileName, "/");
|
||
|
||
|
||
// Путь к файлу принятых сообщений трассировки
|
||
getDateStr(rtc, path_in_dirDate, sizeof(path_in_dirDate));
|
||
strcat(path_in_fileNameTrace, dir_inbox);
|
||
strcat(path_in_fileNameTrace, path_in_dirDate);
|
||
strcat(path_in_fileNameTrace, "/");
|
||
|
||
FRESULT fr;
|
||
FIL file;
|
||
fr = f_mkdir_i(fs, path_in_fileName);
|
||
|
||
if (fr) {
|
||
if (fr != FR_EXIST)
|
||
return false;
|
||
}
|
||
|
||
// Имя файла в принятых сообщениях
|
||
char bufIdFileInBox[12];
|
||
char bufWithPrefixIdFileInBox[12];
|
||
|
||
utoa(idFile, bufIdFileInBox, 10);
|
||
|
||
toAddPrefixStr(bufWithPrefixIdFileInBox, bufIdFileInBox, 5);
|
||
strcat(path_in_fileName, bufWithPrefixIdFileInBox);
|
||
strcat(path_in_fileName, ".ITM");
|
||
|
||
strcat(path_in_fileNameTrace, bufWithPrefixIdFileInBox);
|
||
strcat(path_in_fileNameTrace, ".DAT");
|
||
|
||
UINT br;
|
||
uint8_t headBufForTracer[10];
|
||
memset(headBufForTracer, 0, sizeof(headBufForTracer));
|
||
|
||
uint8_t headerTracer[10] = {0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x74, 0x6e, 0x64, 0x00};
|
||
|
||
// Читаем заголовок файла
|
||
fr = f_open_i(fs, &file, path_dir_frag_inbox_fileName, FA_READ);
|
||
if (fr) return false;
|
||
|
||
f_lseek_i(fs, &file, sizeof(tStructRepresentationPacket));
|
||
|
||
f_read_i(fs, &file, headBufForTracer, 10, &br);
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
bool isTracer = false;
|
||
if (memcmp(headBufForTracer, headerTracer, sizeof(headerTracer)) == 0) {
|
||
isTracer = true;
|
||
}
|
||
|
||
// Создание заголовка файла входящего сообщения
|
||
char bufHeader[128];
|
||
bufHeader[0] = '\0';
|
||
|
||
if (isTracer) {
|
||
createFileHeadFragInboxTrace(bufHeader, fileRecvInfo.from, fileRecvInfo.to, fileRecvInfo.mnumFrom,
|
||
fileRecvInfo.kvs,
|
||
structRepresentationPacket.typeMessage, bufWithPrefixIdFileInBox);
|
||
|
||
} else {
|
||
createFileHeadFragInbox(bufHeader, fileRecvInfo.from, fileRecvInfo.to, fileRecvInfo.mnumFrom, fileRecvInfo.kvs,
|
||
structRepresentationPacket.typeMessage);
|
||
}
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_in_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
|
||
UINT bytes_written;
|
||
fr = f_write_i(fs, &file, bufHeader, strlen(bufHeader), &bytes_written);
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
uint32_t truncCrc = 0;
|
||
// CRC32
|
||
if (structRepresentationPacket.typeCrc == 1) {
|
||
truncCrc = 4;
|
||
}
|
||
// MD5
|
||
if (structRepresentationPacket.typeCrc == 2) {
|
||
truncCrc = 16;
|
||
}
|
||
|
||
uint32_t crc32sum;
|
||
uint8_t md5sum[16];
|
||
|
||
uint32_t crc32sumFile;
|
||
uint8_t md5sumFile[16];
|
||
|
||
if (isTracer) {
|
||
result = CopyFileTrucSizeFs(fs, structRepresentationPacket.typeCrc, md5ctx,
|
||
&crc32sum, md5sum,
|
||
&crc32sumFile, md5sumFile,
|
||
path_in_fileNameTrace,
|
||
path_dir_frag_inbox_fileName, sizeof(tStructRepresentationPacket),
|
||
truncCrc, fileRecvInfo.fileSize);
|
||
} else {
|
||
|
||
result = CopyFileTrucSizeFs(fs, structRepresentationPacket.typeCrc, md5ctx,
|
||
&crc32sum, md5sum,
|
||
&crc32sumFile, md5sumFile,
|
||
path_in_fileName,
|
||
path_dir_frag_inbox_fileName, sizeof(tStructRepresentationPacket),
|
||
truncCrc, fileRecvInfo.fileSize);
|
||
}
|
||
|
||
// CRC32
|
||
if (structRepresentationPacket.typeCrc == 1) {
|
||
if (crc32sum != crc32sumFile) {
|
||
LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка crc32 в теле сообщения");
|
||
}
|
||
}
|
||
// MD5
|
||
if (structRepresentationPacket.typeCrc == 2) {
|
||
bool isMd5Err = false;
|
||
|
||
for (int i = 0; i < 16; ++i) {
|
||
if (md5sum[i] != md5sumFile[i]) {
|
||
isMd5Err = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (isMd5Err) {
|
||
LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка md5 в теле сообщения");
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
if (result == false) {
|
||
return false;
|
||
}
|
||
// fr = f_rename_i(fs, path_dir_frag_inbox_fileName, path_in_fileName);
|
||
// if (fr) {
|
||
// return false;
|
||
// }
|
||
|
||
// fileRecvInfo.isRecvInbox = 1;
|
||
// Запись файла информации
|
||
// result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
// if (result == false) {
|
||
// return false;
|
||
// }
|
||
|
||
return true;
|
||
}
|
||
|
||
/*
|
||
uint8_t file_rep[] = {
|
||
0x01, 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x84, 0x3D, 0x32, 0x9D,
|
||
|
||
// Данные (<p>Сообщение 23:23 22-05-2023<br></p>)
|
||
0x3C, 0x70, 0x3E, 0xD0, 0xA1, 0xD0, 0xBE, 0xD0, 0xBE, 0xD0, 0xB1, 0xD1, 0x89,
|
||
0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB8, 0xD0, 0xB5, 0x20, 0x32, 0x33, 0x3A, 0x32,
|
||
0x33, 0x20, 0x32, 0x32, 0x2D, 0x30, 0x35, 0x2D, 0x32, 0x30, 0x32, 0x33, 0x3C,
|
||
0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x70, 0x3E,
|
||
|
||
// CRC32 данных
|
||
0x43, 0x5B, 0x38, 0xFC
|
||
};
|
||
|
||
|
||
// Перенос собранного фрагментированного файла в хранилище принятых сообщений inbox
|
||
tReceiveBuildResult
|
||
renameFromFrgToInBox5555(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, uint32_t idFile,
|
||
tRtcIO *rtc,
|
||
char *path_dir_info_fileName,
|
||
char *path_dir_frag_inbox_fileName, tLoggerInterface *logger) {
|
||
tFileRecvInfo fileRecvInfo;
|
||
|
||
fileRecvInfo.fileSize = sizeof(file_rep);
|
||
|
||
|
||
FIL file;
|
||
FRESULT fr;
|
||
|
||
fr = f_unlink_i(fs, path_dir_frag_inbox_fileName);
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
UINT bytes_written;
|
||
fr = f_write_i(fs, &file, file_rep, sizeof(file_rep), &bytes_written);
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
bool result;
|
||
// Чтение файла информации
|
||
//bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
|
||
//if (fileRecvInfo.isRecvInbox) {
|
||
// return true;
|
||
//}
|
||
|
||
|
||
|
||
tStructRepresentationPacket structRepresentationPacket;
|
||
result = readRepresentationRecvFileRep(fs, &structRepresentationPacket, path_dir_frag_inbox_fileName);
|
||
if (result == false) {
|
||
return false;
|
||
}
|
||
|
||
vGonetsReedSalmonRecovery_1410_3430(gonetsReedSalmon, (uint8_t *) &structRepresentationPacket);
|
||
|
||
uint8_t crc8 = GonetsCrc8((uint8_t *) &structRepresentationPacket, 9);
|
||
|
||
if (crc8 != structRepresentationPacket.crc8) {
|
||
LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка crc8 в заголовке сообщения");
|
||
}
|
||
|
||
|
||
char path_in_dirDate[MAX_LEN_PATH_FS];
|
||
path_in_dirDate[0] = '\0';
|
||
char path_in_fileName[MAX_LEN_PATH_FS];
|
||
path_in_fileName[0] = '\0';
|
||
char path_in_fileNameTrace[MAX_LEN_PATH_FS];
|
||
path_in_fileNameTrace[0] = '\0';
|
||
|
||
// Путь к файлу принятых сообщений
|
||
getDateStr(rtc, path_in_dirDate, sizeof(path_in_dirDate));
|
||
strcat(path_in_fileName, dir_inbox);
|
||
strcat(path_in_fileName, path_in_dirDate);
|
||
strcat(path_in_fileName, "/");
|
||
|
||
|
||
// Путь к файлу принятых сообщений трассировки
|
||
getDateStr(rtc, path_in_dirDate, sizeof(path_in_dirDate));
|
||
strcat(path_in_fileNameTrace, dir_inbox);
|
||
strcat(path_in_fileNameTrace, path_in_dirDate);
|
||
strcat(path_in_fileNameTrace, "/");
|
||
|
||
|
||
fr = f_mkdir_i(fs, path_in_fileName);
|
||
|
||
if (fr) {
|
||
if (fr != FR_EXIST)
|
||
return false;
|
||
}
|
||
|
||
// Имя файла в принятых сообщениях
|
||
char bufIdFileInBox[12];
|
||
char bufWithPrefixIdFileInBox[12];
|
||
|
||
utoa(idFile, bufIdFileInBox, 10);
|
||
|
||
toAddPrefixStr(bufWithPrefixIdFileInBox, bufIdFileInBox, 5);
|
||
strcat(path_in_fileName, bufWithPrefixIdFileInBox);
|
||
strcat(path_in_fileName, ".ITM");
|
||
|
||
strcat(path_in_fileNameTrace, bufWithPrefixIdFileInBox);
|
||
strcat(path_in_fileNameTrace, ".DAT");
|
||
|
||
UINT br;
|
||
uint8_t headBufForTracer[10];
|
||
memset(headBufForTracer, 0, sizeof(headBufForTracer));
|
||
|
||
uint8_t headerTracer[10] = {0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x74, 0x6e, 0x64, 0x00};
|
||
|
||
// Читаем заголовок файла
|
||
fr = f_open_i(fs, &file, path_dir_frag_inbox_fileName, FA_READ);
|
||
if (fr) return false;
|
||
|
||
f_lseek_i(fs, &file, sizeof(tStructRepresentationPacket));
|
||
|
||
f_read_i(fs, &file, headBufForTracer, 10, &br);
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
bool isTracer = false;
|
||
if (memcmp(headBufForTracer, headerTracer, sizeof(headerTracer)) == 0) {
|
||
isTracer = true;
|
||
}
|
||
|
||
// Создание заголовка файла входящего сообщения
|
||
char bufHeader[128];
|
||
bufHeader[0] = '\0';
|
||
|
||
if (isTracer) {
|
||
createFileHeadFragInboxTrace(bufHeader, fileRecvInfo.from, fileRecvInfo.to, fileRecvInfo.mnumFrom,
|
||
fileRecvInfo.kvs,
|
||
structRepresentationPacket.typeMessage, bufWithPrefixIdFileInBox);
|
||
|
||
} else {
|
||
createFileHeadFragInbox(bufHeader, fileRecvInfo.from, fileRecvInfo.to, fileRecvInfo.mnumFrom, fileRecvInfo.kvs,
|
||
structRepresentationPacket.typeMessage);
|
||
}
|
||
|
||
fr = f_open_i(fs, &file, (TCHAR *) path_in_fileName, FA_WRITE | FA_CREATE_ALWAYS);
|
||
|
||
fr = f_write_i(fs, &file, bufHeader, strlen(bufHeader), &bytes_written);
|
||
|
||
fr = f_close_i(fs, &file);
|
||
|
||
|
||
uint32_t truncCrc = 0;
|
||
// CRC32
|
||
if (structRepresentationPacket.typeCrc == 1) {
|
||
truncCrc = 4;
|
||
}
|
||
// MD5
|
||
if (structRepresentationPacket.typeCrc == 2) {
|
||
truncCrc = 16;
|
||
}
|
||
|
||
uint32_t crc32sum;
|
||
uint8_t md5sum[16];
|
||
|
||
uint32_t crc32sumFile;
|
||
uint8_t md5sumFile[16];
|
||
|
||
if (isTracer) {
|
||
result = CopyFileTrucSizeFs(fs, structRepresentationPacket.typeCrc, md5ctx,
|
||
&crc32sum, md5sum,
|
||
&crc32sumFile, md5sumFile,
|
||
path_in_fileNameTrace,
|
||
path_dir_frag_inbox_fileName, sizeof(tStructRepresentationPacket),
|
||
truncCrc, fileRecvInfo.fileSize);
|
||
} else {
|
||
|
||
result = CopyFileTrucSizeFs(fs, structRepresentationPacket.typeCrc, md5ctx,
|
||
&crc32sum, md5sum,
|
||
&crc32sumFile, md5sumFile,
|
||
path_in_fileName,
|
||
path_dir_frag_inbox_fileName, sizeof(tStructRepresentationPacket),
|
||
truncCrc, fileRecvInfo.fileSize);
|
||
}
|
||
|
||
// CRC32
|
||
if (structRepresentationPacket.typeCrc == 1) {
|
||
if (crc32sum != crc32sumFile) {
|
||
LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка crc32 в теле сообщения");
|
||
}
|
||
}
|
||
// MD5
|
||
if (structRepresentationPacket.typeCrc == 2) {
|
||
bool isMd5Err = false;
|
||
|
||
for (int i = 0; i < 16; ++i) {
|
||
if (md5sum[i] != md5sumFile[i]) {
|
||
isMd5Err = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (isMd5Err) {
|
||
LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка md5 в теле сообщения");
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
if (result == false) {
|
||
return false;
|
||
}
|
||
// fr = f_rename_i(fs, path_dir_frag_inbox_fileName, path_in_fileName);
|
||
// if (fr) {
|
||
// return false;
|
||
// }
|
||
|
||
fileRecvInfo.isRecvInbox = 1;
|
||
// Запись файла информации
|
||
result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
|
||
// if (result == false) {
|
||
// return false;
|
||
// }
|
||
|
||
return true;
|
||
}
|
||
*/
|