Welcome to mirror list, hosted at ThFree Co, Russian Federation.

irda_app_brute_force.cpp « irda « applications - github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8d7d684de34aa5dc1f5ce155a2a1f4f108195f70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

#include "helpers/irda_parser.h"
#include "irda_app_brute_force.h"
#include "irda_app_signal.h"
#include <memory>
#include <m-string.h>
#include <furi.h>
#include <file_worker_cpp.h>

void IrdaAppBruteForce::add_record(int index, const char* name) {
    records[name].index = index;
    records[name].amount = 0;
}

bool IrdaAppBruteForce::calculate_messages() {
    bool result = false;

    Storage* storage = static_cast<Storage*>(furi_record_open("storage"));
    FlipperFormat* ff = flipper_format_file_alloc(storage);
    result = flipper_format_file_open_existing(ff, universal_db_filename);

    if(result) {
        IrdaAppSignal signal;

        string_t signal_name;
        string_init(signal_name);
        while(flipper_format_read_string(ff, "name", signal_name)) {
            auto element = records.find(string_get_cstr(signal_name));
            if(element != records.cend()) {
                ++element->second.amount;
            }
        }
        string_clear(signal_name);
    }

    flipper_format_free(ff);
    furi_record_close("storage");
    return result;
}

void IrdaAppBruteForce::stop_bruteforce() {
    furi_assert((current_record.size()));

    if(current_record.size()) {
        furi_assert(ff);
        current_record.clear();
        flipper_format_free(ff);
        furi_record_close("storage");
    }
}

bool IrdaAppBruteForce::send_next_bruteforce(void) {
    furi_assert(current_record.size());
    furi_assert(ff);

    IrdaAppSignal signal;
    std::string signal_name;
    bool result = false;
    do {
        result = irda_parser_read_signal(ff, signal, signal_name);
    } while(result && current_record.compare(signal_name));

    if(result) {
        signal.transmit();
    }
    return result;
}

bool IrdaAppBruteForce::start_bruteforce(int index, int& record_amount) {
    bool result = false;
    record_amount = 0;

    for(const auto& it : records) {
        if(it.second.index == index) {
            record_amount = it.second.amount;
            if(record_amount) {
                current_record = it.first;
            }
            break;
        }
    }

    if(record_amount) {
        Storage* storage = static_cast<Storage*>(furi_record_open("storage"));
        ff = flipper_format_file_alloc(storage);
        result = flipper_format_file_open_existing(ff, universal_db_filename);
        if(!result) {
            flipper_format_free(ff);
            furi_record_close("storage");
        }
    }

    return result;
}