mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-14 19:58:36 -07:00
OFW be like rEnAmE = cOpY + dElEtE, bro stfu :/
This commit is contained in:
@@ -169,6 +169,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
FS_Error (*const stat)(void* context, const char* path, FileInfo* fileinfo);
|
FS_Error (*const stat)(void* context, const char* path, FileInfo* fileinfo);
|
||||||
FS_Error (*const remove)(void* context, const char* path);
|
FS_Error (*const remove)(void* context, const char* path);
|
||||||
|
FS_Error (*const rename)(void* context, const char* old, const char* new);
|
||||||
FS_Error (*const mkdir)(void* context, const char* path);
|
FS_Error (*const mkdir)(void* context, const char* path);
|
||||||
FS_Error (*const fs_info)(
|
FS_Error (*const fs_info)(
|
||||||
void* context,
|
void* context,
|
||||||
|
|||||||
@@ -422,14 +422,17 @@ FS_Error storage_common_remove(Storage* storage, const char* path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FS_Error storage_common_rename(Storage* storage, const char* old_path, const char* new_path) {
|
FS_Error storage_common_rename(Storage* storage, const char* old_path, const char* new_path) {
|
||||||
FS_Error error = storage_common_copy(storage, old_path, new_path);
|
S_API_PROLOGUE;
|
||||||
if(error == FSE_OK) {
|
SAData data = {
|
||||||
if(!storage_simply_remove_recursive(storage, old_path)) {
|
.rename = {
|
||||||
error = FSE_INTERNAL;
|
.old = old_path,
|
||||||
}
|
.new = new_path,
|
||||||
}
|
.thread_id = furi_thread_get_current_id(),
|
||||||
|
}};
|
||||||
|
|
||||||
return error;
|
S_API_MESSAGE(StorageCommandCommonRename);
|
||||||
|
S_API_EPILOGUE;
|
||||||
|
return S_RETURN_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FS_Error
|
static FS_Error
|
||||||
|
|||||||
@@ -78,6 +78,12 @@ typedef struct {
|
|||||||
FuriThreadId thread_id;
|
FuriThreadId thread_id;
|
||||||
} SADataPath;
|
} SADataPath;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char* old;
|
||||||
|
const char* new;
|
||||||
|
FuriThreadId thread_id;
|
||||||
|
} SADataRename;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
File* file;
|
File* file;
|
||||||
} SADataFile;
|
} SADataFile;
|
||||||
@@ -104,6 +110,7 @@ typedef union {
|
|||||||
|
|
||||||
SADataFile file;
|
SADataFile file;
|
||||||
SADataPath path;
|
SADataPath path;
|
||||||
|
SADataRename rename;
|
||||||
|
|
||||||
SAInfo sdinfo;
|
SAInfo sdinfo;
|
||||||
} SAData;
|
} SAData;
|
||||||
@@ -134,6 +141,7 @@ typedef enum {
|
|||||||
StorageCommandCommonTimestamp,
|
StorageCommandCommonTimestamp,
|
||||||
StorageCommandCommonStat,
|
StorageCommandCommonStat,
|
||||||
StorageCommandCommonRemove,
|
StorageCommandCommonRemove,
|
||||||
|
StorageCommandCommonRename,
|
||||||
StorageCommandCommonMkDir,
|
StorageCommandCommonMkDir,
|
||||||
StorageCommandCommonFSInfo,
|
StorageCommandCommonFSInfo,
|
||||||
StorageCommandSDFormat,
|
StorageCommandSDFormat,
|
||||||
|
|||||||
@@ -369,6 +369,39 @@ static FS_Error storage_process_common_remove(Storage* app, FuriString* path) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FS_Error storage_process_common_rename(Storage* app, FuriString* old, FuriString* new) {
|
||||||
|
FS_Error ret;
|
||||||
|
// Paths are already resolved, no aliases
|
||||||
|
if(strncmp(furi_string_get_cstr(old), furi_string_get_cstr(new), STORAGE_PATH_PREFIX_LEN)) {
|
||||||
|
// Different filesystems, use copy + remove
|
||||||
|
ret = storage_common_copy(app, furi_string_get_cstr(old), furi_string_get_cstr(new));
|
||||||
|
if(ret == FSE_OK) {
|
||||||
|
if(!storage_simply_remove_recursive(app, furi_string_get_cstr(old))) {
|
||||||
|
ret = FSE_INTERNAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Same filesystem, use rename
|
||||||
|
StorageData* storage;
|
||||||
|
ret = storage_get_data(app, old, &storage);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if(storage_path_already_open(old, storage)) {
|
||||||
|
ret = FSE_ALREADY_OPEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
storage_data_timestamp(storage);
|
||||||
|
FS_CALL(
|
||||||
|
storage,
|
||||||
|
common.rename(
|
||||||
|
storage, cstr_path_without_vfs_prefix(old), cstr_path_without_vfs_prefix(new)));
|
||||||
|
} while(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static FS_Error storage_process_common_mkdir(Storage* app, FuriString* path) {
|
static FS_Error storage_process_common_mkdir(Storage* app, FuriString* path) {
|
||||||
StorageData* storage;
|
StorageData* storage;
|
||||||
FS_Error ret = storage_get_data(app, path, &storage);
|
FS_Error ret = storage_get_data(app, path, &storage);
|
||||||
@@ -514,6 +547,7 @@ void storage_process_alias(
|
|||||||
|
|
||||||
void storage_process_message_internal(Storage* app, StorageMessage* message) {
|
void storage_process_message_internal(Storage* app, StorageMessage* message) {
|
||||||
FuriString* path = NULL;
|
FuriString* path = NULL;
|
||||||
|
FuriString* opath = NULL;
|
||||||
|
|
||||||
switch(message->command) {
|
switch(message->command) {
|
||||||
// File operations
|
// File operations
|
||||||
@@ -614,6 +648,13 @@ void storage_process_message_internal(Storage* app, StorageMessage* message) {
|
|||||||
storage_process_alias(app, path, message->data->path.thread_id, false);
|
storage_process_alias(app, path, message->data->path.thread_id, false);
|
||||||
message->return_data->error_value = storage_process_common_remove(app, path);
|
message->return_data->error_value = storage_process_common_remove(app, path);
|
||||||
break;
|
break;
|
||||||
|
case StorageCommandCommonRename:
|
||||||
|
opath = furi_string_alloc_set(message->data->rename.old);
|
||||||
|
storage_process_alias(app, opath, message->data->rename.thread_id, false);
|
||||||
|
path = furi_string_alloc_set(message->data->rename.new);
|
||||||
|
storage_process_alias(app, path, message->data->rename.thread_id, false);
|
||||||
|
message->return_data->error_value = storage_process_common_rename(app, opath, path);
|
||||||
|
break;
|
||||||
case StorageCommandCommonMkDir:
|
case StorageCommandCommonMkDir:
|
||||||
path = furi_string_alloc_set(message->data->path.path);
|
path = furi_string_alloc_set(message->data->path.path);
|
||||||
storage_process_alias(app, path, message->data->path.thread_id, true);
|
storage_process_alias(app, path, message->data->path.thread_id, true);
|
||||||
@@ -649,6 +690,9 @@ void storage_process_message_internal(Storage* app, StorageMessage* message) {
|
|||||||
if(path != NULL) { //-V547
|
if(path != NULL) { //-V547
|
||||||
furi_string_free(path);
|
furi_string_free(path);
|
||||||
}
|
}
|
||||||
|
if(opath != NULL) { //-V547
|
||||||
|
furi_string_free(opath);
|
||||||
|
}
|
||||||
|
|
||||||
api_lock_unlock(message->lock);
|
api_lock_unlock(message->lock);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -535,6 +535,18 @@ static FS_Error storage_ext_common_remove(void* ctx, const char* path) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FS_Error storage_ext_common_rename(void* ctx, const char* old, const char* new) {
|
||||||
|
UNUSED(ctx);
|
||||||
|
#ifdef FURI_RAM_EXEC
|
||||||
|
UNUSED(old);
|
||||||
|
UNUSED(new);
|
||||||
|
return FSE_NOT_READY;
|
||||||
|
#else
|
||||||
|
SDError result = f_rename(old, new);
|
||||||
|
return storage_ext_parse_error(result);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static FS_Error storage_ext_common_mkdir(void* ctx, const char* path) {
|
static FS_Error storage_ext_common_mkdir(void* ctx, const char* path) {
|
||||||
UNUSED(ctx);
|
UNUSED(ctx);
|
||||||
#ifdef FURI_RAM_EXEC
|
#ifdef FURI_RAM_EXEC
|
||||||
@@ -614,6 +626,7 @@ static const FS_Api fs_api = {
|
|||||||
.stat = storage_ext_common_stat,
|
.stat = storage_ext_common_stat,
|
||||||
.mkdir = storage_ext_common_mkdir,
|
.mkdir = storage_ext_common_mkdir,
|
||||||
.remove = storage_ext_common_remove,
|
.remove = storage_ext_common_remove,
|
||||||
|
.rename = storage_ext_common_rename,
|
||||||
.fs_info = storage_ext_common_fs_info,
|
.fs_info = storage_ext_common_fs_info,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -689,6 +689,13 @@ static FS_Error storage_int_common_remove(void* ctx, const char* path) {
|
|||||||
return storage_int_parse_error(result);
|
return storage_int_parse_error(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FS_Error storage_int_common_rename(void* ctx, const char* old, const char* new) { // FIXME
|
||||||
|
StorageData* storage = ctx;
|
||||||
|
lfs_t* lfs = lfs_get_from_storage(storage);
|
||||||
|
int result = lfs_rename(lfs, old, new);
|
||||||
|
return storage_int_parse_error(result);
|
||||||
|
}
|
||||||
|
|
||||||
static FS_Error storage_int_common_mkdir(void* ctx, const char* path) {
|
static FS_Error storage_int_common_mkdir(void* ctx, const char* path) {
|
||||||
StorageData* storage = ctx;
|
StorageData* storage = ctx;
|
||||||
lfs_t* lfs = lfs_get_from_storage(storage);
|
lfs_t* lfs = lfs_get_from_storage(storage);
|
||||||
@@ -746,6 +753,7 @@ static const FS_Api fs_api = {
|
|||||||
.stat = storage_int_common_stat,
|
.stat = storage_int_common_stat,
|
||||||
.mkdir = storage_int_common_mkdir,
|
.mkdir = storage_int_common_mkdir,
|
||||||
.remove = storage_int_common_remove,
|
.remove = storage_int_common_remove,
|
||||||
|
.rename = storage_int_common_rename,
|
||||||
.fs_info = storage_int_common_fs_info,
|
.fs_info = storage_int_common_fs_info,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user