| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- #include "../subbrute.h"
- #include "m-string.h"
- #include "subghz/types.h"
- #include <lib/toolbox/random_name.h>
- #include <gui/modules/validators.h>
- #include <lib/toolbox/path.h>
- #define MAX_TEXT_INPUT_LEN 22
- bool backpressed = false;
- bool subbrute_path_is_file(string_t path) {
- return string_end_with_str_p(path, ".sub");
- }
- // method modified from subghz_i.c
- // https://github.com/flipperdevices/flipperzero-firmware/blob/b0daa601ad5b87427a45f9089c8b403a01f72c2a/applications/subghz/subghz_i.c#L417-L456
- bool subbrute_save_protocol_to_file(Stream* flipper_format_stream, const char* dev_file_name) {
- furi_assert(dev_file_name);
- Storage* storage = furi_record_open(RECORD_STORAGE);
- bool saved = false;
- string_t file_dir;
- string_init(file_dir);
- path_extract_dirname(dev_file_name, file_dir);
- do {
- if(!storage_simply_mkdir(storage, string_get_cstr(file_dir))) {
- FURI_LOG_E(TAG, "(save) Cannot mkdir");
- break;
- }
- if(!storage_simply_remove(storage, dev_file_name)) {
- FURI_LOG_E(TAG, "(save) Cannot remove");
- break;
- }
- stream_seek(flipper_format_stream, 0, StreamOffsetFromStart);
- stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS);
- saved = true;
- FURI_LOG_D(TAG, "(save) OK Save");
- } while(0);
- string_clear(file_dir);
- furi_record_close(RECORD_STORAGE);
- return saved;
- }
- void custom_callback(SubBruteState* context) {
- if(strcmp(context->file_name_tmp, "")) {
- string_cat_printf(context->file_path, "/%s%s", context->file_name_tmp, ".sub");
- if(subbrute_path_is_file(context->file_path_tmp)) {
- context->current_scene = SceneAttack;
- return; //false;
- } else {
- subbrute_save_protocol_to_file(context->stream, string_get_cstr(context->file_path));
- }
- string_set_str(context->file_path, EXT_PATH("subghz"));
- string_reset(context->file_path_tmp);
- //scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveSuccess);
- context->current_scene = SceneAttack;
- return; //true;
- } else {
- //error no file name
- context->current_scene = SceneAttack;
- return; //true;
- }
- }
- void subbrute_scene_save_name_text_input_callback(void* context) {
- furi_assert(context);
- SubBruteState* statee = context;
- custom_callback(statee);
- }
- void subbrute_scene_save_name_on_tick(SubBruteState* context) {
- if(backpressed) {
- void* validator_context = text_input_get_validator_callback_context(context->text_input);
- text_input_set_validator(context->text_input, NULL, NULL);
- validator_is_file_free(validator_context);
- // Clear view
- text_input_reset(context->text_input);
- // TextInput
- view_dispatcher_remove_view(context->view_dispatcher, 0);
- text_input_free(context->text_input);
- // Popup
- view_dispatcher_remove_view(context->view_dispatcher, 1);
- popup_free(context->popup);
- context->current_scene = SceneAttack;
- }
- }
- bool subbrute_back_event_callback(void* context) {
- UNUSED(context);
- backpressed = true;
- return true;
- }
- void subbrute_scene_save_name_on_enter(SubBruteState* context) {
- // Text Input
- context->text_input = text_input_alloc();
- view_dispatcher_add_view(
- context->view_dispatcher, 0, text_input_get_view(context->text_input));
- // Popup
- context->popup = popup_alloc();
- view_dispatcher_add_view(context->view_dispatcher, 1, popup_get_view(context->popup));
- // Setup view
- TextInput* text_input = context->text_input;
- bool dev_name_empty = false;
- string_t file_name;
- string_t dir_name;
- string_init(file_name);
- string_init(dir_name);
- if(!subbrute_path_is_file(context->file_path)) {
- char file_name_buf[64] = {0};
- set_random_name(file_name_buf, 64);
- string_set_str(file_name, file_name_buf);
- string_set_str(context->file_path, EXT_PATH("subghz"));
- //highlighting the entire filename by default
- dev_name_empty = true;
- } else {
- string_set(context->file_path_tmp, context->file_path);
- path_extract_dirname(string_get_cstr(context->file_path), dir_name);
- path_extract_filename(context->file_path, file_name, true);
- string_set(context->file_path, dir_name);
- }
- strncpy(context->file_name_tmp, string_get_cstr(file_name), 64);
- text_input_set_header_text(text_input, "Name signal");
- text_input_set_result_callback(
- text_input,
- subbrute_scene_save_name_text_input_callback,
- context,
- context->file_name_tmp,
- MAX_TEXT_INPUT_LEN, // buffer size
- dev_name_empty);
- ValidatorIsFile* validator_is_file =
- validator_is_file_alloc_init(string_get_cstr(context->file_path), ".sub", "");
- text_input_set_validator(text_input, validator_is_file_callback, validator_is_file);
- string_clear(file_name);
- string_clear(dir_name);
- view_dispatcher_set_navigation_event_callback(
- context->view_dispatcher, subbrute_back_event_callback);
- view_dispatcher_switch_to_view(context->view_dispatcher, 0);
- }
- void subbrute_scene_save_name_on_event(SubBruteEvent event, SubBruteState* context) {
- UNUSED(context);
- if(event.evt_type == EventTypeKey) {
- if(event.input_type == InputTypeShort) {
- switch(event.key) {
- case InputKeyDown:
- case InputKeyUp:
- case InputKeyLeft:
- case InputKeyRight:
- case InputKeyOk:
- break;
- case InputKeyBack:
- //context->current_scene = SceneAttack;
- break;
- }
- }
- }
- }
- void subbrute_scene_save_name_on_exit(SubBruteState* context) {
- if(!backpressed) {
- // Clear validator
- void* validator_context = text_input_get_validator_callback_context(context->text_input);
- text_input_set_validator(context->text_input, NULL, NULL);
- validator_is_file_free(validator_context);
- // Clear view
- text_input_reset(context->text_input);
- // Setup view
- Popup* popup = context->popup;
- popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59);
- popup_set_header(popup, "Saved!", 13, 22, AlignLeft, AlignBottom);
- popup_set_timeout(popup, 1500);
- popup_set_context(popup, context);
- popup_set_callback(popup, NULL);
- popup_enable_timeout(popup);
- view_dispatcher_switch_to_view(context->view_dispatcher, 1);
- furi_delay_ms(1050);
- // Clear view
- //Popup* popup = subghz->popup;
- popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom);
- popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop);
- popup_set_icon(popup, 0, 0, NULL);
- popup_set_callback(popup, NULL);
- popup_set_context(popup, NULL);
- popup_set_timeout(popup, 0);
- popup_disable_timeout(popup);
- // TextInput
- view_dispatcher_remove_view(context->view_dispatcher, 0);
- text_input_free(context->text_input);
- // Popup
- view_dispatcher_remove_view(context->view_dispatcher, 1);
- popup_free(context->popup);
- } else {
- backpressed = false;
- }
- }
|