mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-13 07:58:36 -07:00
Remove file expand, use seek for mass storage
This commit is contained in:
@@ -125,19 +125,33 @@ bool mass_storage_scene_create_image_on_event(void* context, SceneManagerEvent e
|
|||||||
|
|
||||||
app->file = storage_file_alloc(app->fs_api);
|
app->file = storage_file_alloc(app->fs_api);
|
||||||
const char* error = NULL;
|
const char* error = NULL;
|
||||||
if(storage_file_open(
|
bool success = false;
|
||||||
app->file, furi_string_get_cstr(app->file_path), FSAM_WRITE, FSOM_CREATE_NEW)) {
|
|
||||||
|
uint8_t* buffer = malloc(WRITE_BUF_LEN);
|
||||||
|
do {
|
||||||
|
if(!storage_file_open(
|
||||||
|
app->file,
|
||||||
|
furi_string_get_cstr(app->file_path),
|
||||||
|
FSAM_WRITE,
|
||||||
|
FSOM_CREATE_NEW))
|
||||||
|
break;
|
||||||
|
|
||||||
uint64_t size = image_sizes[app->create_image_size].value;
|
uint64_t size = image_sizes[app->create_image_size].value;
|
||||||
if(size == app->create_image_max) {
|
if(size == app->create_image_max) size--;
|
||||||
size--;
|
if(!storage_file_seek(file, size, true)) break;
|
||||||
}
|
|
||||||
if(!storage_file_expand(app->file, size)) {
|
// Zero out first 4k - partition table and adjacent data
|
||||||
error = storage_file_get_error_desc(app->file);
|
if(!storage_file_seek(file, 0, true)) break;
|
||||||
storage_file_close(app->file);
|
if(!storage_file_write(file, buffer, WRITE_BUF_LEN)) break;
|
||||||
storage_common_remove(app->fs_api, furi_string_get_cstr(app->file_path));
|
|
||||||
}
|
success = true;
|
||||||
} else {
|
} while(false);
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
if(!success) {
|
||||||
error = storage_file_get_error_desc(app->file);
|
error = storage_file_get_error_desc(app->file);
|
||||||
|
storage_file_close(app->file);
|
||||||
|
storage_common_remove(app->fs_api, furi_string_get_cstr(app->file_path));
|
||||||
}
|
}
|
||||||
storage_file_free(app->file);
|
storage_file_free(app->file);
|
||||||
mass_storage_app_show_loading_popup(app, false);
|
mass_storage_app_show_loading_popup(app, false);
|
||||||
|
|||||||
@@ -62,12 +62,6 @@ struct File {
|
|||||||
* @param file pointer to file object
|
* @param file pointer to file object
|
||||||
* @return current r/w pointer position
|
* @return current r/w pointer position
|
||||||
*
|
*
|
||||||
* @var FS_File_Api::expand
|
|
||||||
* @brief Expand the file (allocate space for it)
|
|
||||||
* @param file pointer to file object
|
|
||||||
* @param size how many bytes to allocate
|
|
||||||
* @return success flag
|
|
||||||
*
|
|
||||||
* @var FS_File_Api::truncate
|
* @var FS_File_Api::truncate
|
||||||
* @brief Truncate file size to current r/w pointer position
|
* @brief Truncate file size to current r/w pointer position
|
||||||
* @param file pointer to file object
|
* @param file pointer to file object
|
||||||
@@ -100,7 +94,6 @@ typedef struct {
|
|||||||
uint16_t (*write)(void* context, File* file, const void* buff, uint16_t bytes_to_write);
|
uint16_t (*write)(void* context, File* file, const void* buff, uint16_t bytes_to_write);
|
||||||
bool (*const seek)(void* context, File* file, uint32_t offset, bool from_start);
|
bool (*const seek)(void* context, File* file, uint32_t offset, bool from_start);
|
||||||
uint64_t (*tell)(void* context, File* file);
|
uint64_t (*tell)(void* context, File* file);
|
||||||
bool (*const expand)(void* context, File* file, uint64_t size);
|
|
||||||
bool (*const truncate)(void* context, File* file);
|
bool (*const truncate)(void* context, File* file);
|
||||||
uint64_t (*size)(void* context, File* file);
|
uint64_t (*size)(void* context, File* file);
|
||||||
bool (*const sync)(void* context, File* file);
|
bool (*const sync)(void* context, File* file);
|
||||||
|
|||||||
@@ -117,13 +117,6 @@ bool storage_file_seek(File* file, uint32_t offset, bool from_start);
|
|||||||
*/
|
*/
|
||||||
uint64_t storage_file_tell(File* file);
|
uint64_t storage_file_tell(File* file);
|
||||||
|
|
||||||
/** Expand the file (allocate space for it)
|
|
||||||
* @param file pointer to file object.
|
|
||||||
* @param size how many bytes to allocate
|
|
||||||
* @return success flag
|
|
||||||
*/
|
|
||||||
bool storage_file_expand(File* file, uint64_t size);
|
|
||||||
|
|
||||||
/** Truncates the file size to the current position of the r/w pointer
|
/** Truncates the file size to the current position of the r/w pointer
|
||||||
* @param file pointer to file object.
|
* @param file pointer to file object.
|
||||||
* @return bool success flag
|
* @return bool success flag
|
||||||
|
|||||||
@@ -203,21 +203,6 @@ uint64_t storage_file_tell(File* file) {
|
|||||||
return S_RETURN_UINT64;
|
return S_RETURN_UINT64;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool storage_file_expand(File* file, uint64_t size) {
|
|
||||||
S_FILE_API_PROLOGUE;
|
|
||||||
S_API_PROLOGUE;
|
|
||||||
|
|
||||||
SAData data = {
|
|
||||||
.fexpand = {
|
|
||||||
.file = file,
|
|
||||||
.size = size,
|
|
||||||
}};
|
|
||||||
|
|
||||||
S_API_MESSAGE(StorageCommandFileExpand);
|
|
||||||
S_API_EPILOGUE;
|
|
||||||
return S_RETURN_BOOL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool storage_file_truncate(File* file) {
|
bool storage_file_truncate(File* file) {
|
||||||
S_FILE_API_PROLOGUE;
|
S_FILE_API_PROLOGUE;
|
||||||
S_API_PROLOGUE;
|
S_API_PROLOGUE;
|
||||||
|
|||||||
@@ -32,11 +32,6 @@ typedef struct {
|
|||||||
bool from_start;
|
bool from_start;
|
||||||
} SADataFSeek;
|
} SADataFSeek;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
File* file;
|
|
||||||
uint64_t size;
|
|
||||||
} SADataFExpand;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
File* file;
|
File* file;
|
||||||
const char* path;
|
const char* path;
|
||||||
@@ -102,7 +97,6 @@ typedef union {
|
|||||||
SADataFRead fread;
|
SADataFRead fread;
|
||||||
SADataFWrite fwrite;
|
SADataFWrite fwrite;
|
||||||
SADataFSeek fseek;
|
SADataFSeek fseek;
|
||||||
SADataFExpand fexpand;
|
|
||||||
|
|
||||||
SADataDOpen dopen;
|
SADataDOpen dopen;
|
||||||
SADataDRead dread;
|
SADataDRead dread;
|
||||||
@@ -136,7 +130,6 @@ typedef enum {
|
|||||||
StorageCommandFileWrite,
|
StorageCommandFileWrite,
|
||||||
StorageCommandFileSeek,
|
StorageCommandFileSeek,
|
||||||
StorageCommandFileTell,
|
StorageCommandFileTell,
|
||||||
StorageCommandFileExpand,
|
|
||||||
StorageCommandFileTruncate,
|
StorageCommandFileTruncate,
|
||||||
StorageCommandFileSize,
|
StorageCommandFileSize,
|
||||||
StorageCommandFileSync,
|
StorageCommandFileSync,
|
||||||
|
|||||||
@@ -206,19 +206,6 @@ static uint64_t storage_process_file_tell(Storage* app, File* file) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool storage_process_file_expand(Storage* app, File* file, const uint64_t size) {
|
|
||||||
bool ret = false;
|
|
||||||
StorageData* storage = get_storage_by_file(file, app->storage);
|
|
||||||
|
|
||||||
if(storage == NULL) {
|
|
||||||
file->error_id = FSE_INVALID_PARAMETER;
|
|
||||||
} else {
|
|
||||||
FS_CALL(storage, file.expand(storage, file, size));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool storage_process_file_truncate(Storage* app, File* file) {
|
static bool storage_process_file_truncate(Storage* app, File* file) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
StorageData* storage = get_storage_by_file(file, app->storage);
|
StorageData* storage = get_storage_by_file(file, app->storage);
|
||||||
@@ -588,10 +575,6 @@ void storage_process_message_internal(Storage* app, StorageMessage* message) {
|
|||||||
message->return_data->uint64_value =
|
message->return_data->uint64_value =
|
||||||
storage_process_file_tell(app, message->data->file.file);
|
storage_process_file_tell(app, message->data->file.file);
|
||||||
break;
|
break;
|
||||||
case StorageCommandFileExpand:
|
|
||||||
message->return_data->bool_value = storage_process_file_expand(
|
|
||||||
app, message->data->fexpand.file, message->data->fexpand.size);
|
|
||||||
break;
|
|
||||||
case StorageCommandFileTruncate:
|
case StorageCommandFileTruncate:
|
||||||
message->return_data->bool_value =
|
message->return_data->bool_value =
|
||||||
storage_process_file_truncate(app, message->data->file.file);
|
storage_process_file_truncate(app, message->data->file.file);
|
||||||
|
|||||||
@@ -396,22 +396,6 @@ static uint64_t storage_ext_file_tell(void* ctx, File* file) {
|
|||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool storage_ext_file_expand(void* ctx, File* file, const uint64_t size) {
|
|
||||||
#ifdef FURI_RAM_EXEC
|
|
||||||
UNUSED(ctx);
|
|
||||||
UNUSED(file);
|
|
||||||
UNUSED(size);
|
|
||||||
file->error_id = FSE_NOT_READY;
|
|
||||||
#else
|
|
||||||
StorageData* storage = ctx;
|
|
||||||
SDFile* file_data = storage_get_storage_file_data(file, storage);
|
|
||||||
|
|
||||||
file->internal_error_id = f_expand(file_data, size, 1);
|
|
||||||
file->error_id = storage_ext_parse_error(file->internal_error_id);
|
|
||||||
#endif
|
|
||||||
return (file->error_id == FSE_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool storage_ext_file_truncate(void* ctx, File* file) {
|
static bool storage_ext_file_truncate(void* ctx, File* file) {
|
||||||
#ifdef FURI_RAM_EXEC
|
#ifdef FURI_RAM_EXEC
|
||||||
UNUSED(ctx);
|
UNUSED(ctx);
|
||||||
@@ -625,7 +609,6 @@ static const FS_Api fs_api = {
|
|||||||
.write = storage_ext_file_write,
|
.write = storage_ext_file_write,
|
||||||
.seek = storage_ext_file_seek,
|
.seek = storage_ext_file_seek,
|
||||||
.tell = storage_ext_file_tell,
|
.tell = storage_ext_file_tell,
|
||||||
.expand = storage_ext_file_expand,
|
|
||||||
.truncate = storage_ext_file_truncate,
|
.truncate = storage_ext_file_truncate,
|
||||||
.size = storage_ext_file_size,
|
.size = storage_ext_file_size,
|
||||||
.sync = storage_ext_file_sync,
|
.sync = storage_ext_file_sync,
|
||||||
|
|||||||
@@ -455,14 +455,6 @@ static uint64_t storage_int_file_tell(void* ctx, File* file) {
|
|||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool storage_int_file_expand(void* ctx, File* file, const uint64_t size) {
|
|
||||||
UNUSED(ctx);
|
|
||||||
UNUSED(file);
|
|
||||||
UNUSED(size);
|
|
||||||
file->error_id = FSE_NOT_IMPLEMENTED;
|
|
||||||
return (file->error_id == FSE_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool storage_int_file_truncate(void* ctx, File* file) {
|
static bool storage_int_file_truncate(void* ctx, File* file) {
|
||||||
StorageData* storage = ctx;
|
StorageData* storage = ctx;
|
||||||
lfs_t* lfs = lfs_get_from_storage(storage);
|
lfs_t* lfs = lfs_get_from_storage(storage);
|
||||||
@@ -711,7 +703,6 @@ static const FS_Api fs_api = {
|
|||||||
.write = storage_int_file_write,
|
.write = storage_int_file_write,
|
||||||
.seek = storage_int_file_seek,
|
.seek = storage_int_file_seek,
|
||||||
.tell = storage_int_file_tell,
|
.tell = storage_int_file_tell,
|
||||||
.expand = storage_int_file_expand,
|
|
||||||
.truncate = storage_int_file_truncate,
|
.truncate = storage_int_file_truncate,
|
||||||
.size = storage_int_file_size,
|
.size = storage_int_file_size,
|
||||||
.sync = storage_int_file_sync,
|
.sync = storage_int_file_sync,
|
||||||
|
|||||||
@@ -2695,7 +2695,6 @@ Function,+,storage_file_close,_Bool,File*
|
|||||||
Function,+,storage_file_copy_to_file,_Bool,"File*, File*, uint32_t"
|
Function,+,storage_file_copy_to_file,_Bool,"File*, File*, uint32_t"
|
||||||
Function,+,storage_file_eof,_Bool,File*
|
Function,+,storage_file_eof,_Bool,File*
|
||||||
Function,+,storage_file_exists,_Bool,"Storage*, const char*"
|
Function,+,storage_file_exists,_Bool,"Storage*, const char*"
|
||||||
Function,+,storage_file_expand,_Bool,"File*, uint64_t"
|
|
||||||
Function,+,storage_file_free,void,File*
|
Function,+,storage_file_free,void,File*
|
||||||
Function,+,storage_file_get_error,FS_Error,File*
|
Function,+,storage_file_get_error,FS_Error,File*
|
||||||
Function,+,storage_file_get_error_desc,const char*,File*
|
Function,+,storage_file_get_error_desc,const char*,File*
|
||||||
|
|||||||
|
@@ -68,7 +68,7 @@
|
|||||||
#define _USE_FASTSEEK 1
|
#define _USE_FASTSEEK 1
|
||||||
/* This option switches fast seek feature. (0:Disable or 1:Enable) */
|
/* This option switches fast seek feature. (0:Disable or 1:Enable) */
|
||||||
|
|
||||||
#define _USE_EXPAND 1
|
#define _USE_EXPAND 0
|
||||||
/* This option switches f_expand function. (0:Disable or 1:Enable) */
|
/* This option switches f_expand function. (0:Disable or 1:Enable) */
|
||||||
|
|
||||||
#define _USE_CHMOD 0
|
#define _USE_CHMOD 0
|
||||||
|
|||||||
Reference in New Issue
Block a user