|
@@ -21,11 +21,12 @@ LibNfc::Utils::ResultBool FreeFareTagClassic::authenticate(int sector, const std
|
21
|
21
|
return std::static_pointer_cast<FreeFareTagClassicInternal>(_tag)->authenticate(sector, key, keyType);
|
22
|
22
|
}
|
23
|
23
|
|
24
|
|
-LibNfc::Utils::Result<MappedKeys> FreeFareTagClassic::mapKeys(const std::vector<std::string>& keys, std::function<void(int, int)> cb)
|
|
24
|
+LibNfc::Utils::Result<MappedKeys> FreeFareTagClassic::mapKeys(const std::vector<std::string>& keys,
|
|
25
|
+ std::function<void(FreeFareTagClassicMappingProgress)> mapCb)
|
25
|
26
|
{
|
26
|
27
|
MappedKeys mappedKeys;
|
27
|
|
- unsigned long done = 0;
|
28
|
|
- unsigned long total = 16 * keys.size();
|
|
28
|
+ int32_t done = 0;
|
|
29
|
+ int32_t total = 16 * keys.size();
|
29
|
30
|
|
30
|
31
|
for (int i = 0; i < 16; ++i) {
|
31
|
32
|
std::pair<std::string, std::string> blockKeys;
|
|
@@ -37,8 +38,8 @@ LibNfc::Utils::Result<MappedKeys> FreeFareTagClassic::mapKeys(const std::vector<
|
37
|
38
|
if (authenticate(i, key, MFC_KEY_B)) {
|
38
|
39
|
blockKeys.second = key;
|
39
|
40
|
}
|
40
|
|
- if (cb != nullptr) {
|
41
|
|
- cb(++done, total);
|
|
41
|
+ if (mapCb != nullptr) {
|
|
42
|
+ mapCb({++done, total});
|
42
|
43
|
}
|
43
|
44
|
if (!blockKeys.first.empty() && !blockKeys.second.empty()) {
|
44
|
45
|
break;
|
|
@@ -46,8 +47,8 @@ LibNfc::Utils::Result<MappedKeys> FreeFareTagClassic::mapKeys(const std::vector<
|
46
|
47
|
}
|
47
|
48
|
mappedKeys.push_back(blockKeys);
|
48
|
49
|
}
|
49
|
|
- if (cb != nullptr && done < total) {
|
50
|
|
- cb(total, total);
|
|
50
|
+ if (mapCb != nullptr && done < total) {
|
|
51
|
+ mapCb({total, total});
|
51
|
52
|
}
|
52
|
53
|
|
53
|
54
|
return LibNfc::Utils::Result<MappedKeys>::ok(mappedKeys);
|
|
@@ -74,13 +75,14 @@ LibNfc::Utils::Result<FreeFareClassicSector> FreeFareTagClassic::readSector(int
|
74
|
75
|
return LibNfc::Utils::Result<FreeFareClassicSector>::ok(FreeFareClassicSector(res));
|
75
|
76
|
}
|
76
|
77
|
|
77
|
|
-LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::read(const MappedKeys& keys, std::function<void(int, int)> cb)
|
|
78
|
+LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::read(const MappedKeys& keys,
|
|
79
|
+ std::function<void(FreeFareTagClassicReadProgress)> readCb)
|
78
|
80
|
{
|
79
|
81
|
if (keys.size() != 16) {
|
80
|
82
|
return LibNfc::Utils::Result<std::vector<FreeFareClassicSector>>::error("Must have 16 sectors keys");
|
81
|
83
|
}
|
82
|
|
- int done = 0;
|
83
|
|
- int total = 4 * keys.size();
|
|
84
|
+ int32_t done = 0;
|
|
85
|
+ int32_t total = 4 * keys.size();
|
84
|
86
|
std::vector<FreeFareClassicSector> sectors;
|
85
|
87
|
for (int s = 0; s < keys.size(); ++s) {
|
86
|
88
|
auto sectorKey = keys[s];
|
|
@@ -88,7 +90,7 @@ LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::re
|
88
|
90
|
bool keyA = false;
|
89
|
91
|
bool keyB = false;
|
90
|
92
|
for (int b = 0; b < 3; ++b) {
|
91
|
|
- std::string data = "";
|
|
93
|
+ std::string data;
|
92
|
94
|
if (!sectorKey.first.empty()) {
|
93
|
95
|
auto blockResult = readBlock(s, b, sectorKey.first, MFC_KEY_A);
|
94
|
96
|
if (blockResult) {
|
|
@@ -106,8 +108,8 @@ LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::re
|
106
|
108
|
}
|
107
|
109
|
}
|
108
|
110
|
sector.setBlock(b, data);
|
109
|
|
- if (cb != nullptr) {
|
110
|
|
- cb(++done, total);
|
|
111
|
+ if (readCb != nullptr) {
|
|
112
|
+ readCb({++done, total});
|
111
|
113
|
}
|
112
|
114
|
}
|
113
|
115
|
int b = 3;
|
|
@@ -127,8 +129,8 @@ LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::re
|
127
|
129
|
keyB = true;
|
128
|
130
|
}
|
129
|
131
|
}
|
130
|
|
- if (cb != nullptr) {
|
131
|
|
- cb(++done, total);
|
|
132
|
+ if (readCb != nullptr) {
|
|
133
|
+ readCb({++done, total});
|
132
|
134
|
}
|
133
|
135
|
|
134
|
136
|
sector.setBlock(b, dataA);
|
|
@@ -149,16 +151,16 @@ LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::re
|
149
|
151
|
|
150
|
152
|
sectors.push_back(sector);
|
151
|
153
|
}
|
152
|
|
- if (cb != nullptr && done < total) {
|
153
|
|
- cb(total, total);
|
|
154
|
+ if (readCb != nullptr && done < total) {
|
|
155
|
+ readCb({total, total});
|
154
|
156
|
}
|
155
|
157
|
|
156
|
158
|
return LibNfc::Utils::Result<std::vector<FreeFareClassicSector>>::ok(sectors);
|
157
|
159
|
}
|
158
|
160
|
|
159
|
161
|
LibNfc::Utils::Result<std::vector<FreeFareClassicSector>> FreeFareTagClassic::read(const std::vector<std::string>& keys,
|
160
|
|
- std::function<void(int, int)> mapCb,
|
161
|
|
- std::function<void(int, int)> readCb)
|
|
162
|
+ std::function<void(FreeFareTagClassicMappingProgress)> mapCb,
|
|
163
|
+ std::function<void(FreeFareTagClassicReadProgress)> readCb)
|
162
|
164
|
{
|
163
|
165
|
auto mappedKeysResult = mapKeys(keys, mapCb);
|
164
|
166
|
if (!mappedKeysResult) {
|
|
@@ -190,17 +192,17 @@ LibNfc::Utils::ResultBool FreeFareTagClassic::writeSector(int sector, const std:
|
190
|
192
|
}
|
191
|
193
|
|
192
|
194
|
LibNfc::Utils::ResultBool FreeFareTagClassic::write(const MappedKeys& keys,
|
193
|
|
- const std::string& data,
|
194
|
|
- bool writeSector0,
|
195
|
|
- std::function<void(int, int)> cb)
|
|
195
|
+ const std::string& data,
|
|
196
|
+ bool writeSector0,
|
|
197
|
+ std::function<void(FreeFareTagClassicWriteProgress)> writeCb)
|
196
|
198
|
{
|
197
|
199
|
if (keys.size() != 16) {
|
198
|
200
|
return LibNfc::Utils::ResultBool::error("Must have 16 sectors keys");
|
199
|
201
|
}
|
200
|
202
|
std::string d = LibNfc::Utils::StringUtils::ensureSize(data, 1024);
|
201
|
203
|
std::string errors;
|
202
|
|
- unsigned long done = 0;
|
203
|
|
- unsigned long total = 4 * keys.size();
|
|
204
|
+ int32_t done = 0;
|
|
205
|
+ int32_t total = 4 * keys.size();
|
204
|
206
|
for (unsigned long s = 0; s < keys.size(); ++s) {
|
205
|
207
|
auto sectorKey = keys[s];
|
206
|
208
|
for (int b = 0; b < 4; ++b) {
|
|
@@ -208,7 +210,7 @@ LibNfc::Utils::ResultBool FreeFareTagClassic::write(const MappedKeys& keys,
|
208
|
210
|
continue;
|
209
|
211
|
}
|
210
|
212
|
std::string blockData = d.substr((s * 64) + (b * 16), 16);
|
211
|
|
- if (cb != nullptr && done < total) {
|
|
213
|
+ if (writeCb != nullptr && done < total) {
|
212
|
214
|
bool keyA = false;
|
213
|
215
|
bool keyB = false;
|
214
|
216
|
std::string sectorErrors;
|
|
@@ -235,12 +237,12 @@ LibNfc::Utils::ResultBool FreeFareTagClassic::write(const MappedKeys& keys,
|
235
|
237
|
if (!keyA && !keyB) {
|
236
|
238
|
errors += std::string(errors.empty() ? "" : "\n") + sectorErrors;
|
237
|
239
|
}
|
238
|
|
- cb(++done, total);
|
|
240
|
+ writeCb({++done, total});
|
239
|
241
|
}
|
240
|
242
|
}
|
241
|
243
|
}
|
242
|
|
- if (cb != nullptr && done < total) {
|
243
|
|
- cb(total, total);
|
|
244
|
+ if (writeCb != nullptr && done < total) {
|
|
245
|
+ writeCb({total, total});
|
244
|
246
|
}
|
245
|
247
|
if (errors.empty()) {
|
246
|
248
|
return LibNfc::Utils::ResultBool::ok(true);
|
|
@@ -248,8 +250,11 @@ LibNfc::Utils::ResultBool FreeFareTagClassic::write(const MappedKeys& keys,
|
248
|
250
|
return LibNfc::Utils::ResultBool::error(errors);
|
249
|
251
|
}
|
250
|
252
|
|
251
|
|
-LibNfc::Utils::ResultBool FreeFareTagClassic::write(const std::vector<std::string>& keys, const std::string& data, bool writeSector0,
|
252
|
|
- std::function<void(int, int)> mapCb, std::function<void(int, int)> writeCb)
|
|
253
|
+LibNfc::Utils::ResultBool FreeFareTagClassic::write(const std::vector<std::string>& keys,
|
|
254
|
+ const std::string& data,
|
|
255
|
+ bool writeSector0,
|
|
256
|
+ std::function<void(FreeFareTagClassicMappingProgress)> mapCb,
|
|
257
|
+ std::function<void(FreeFareTagClassicWriteProgress)> writeCb)
|
253
|
258
|
{
|
254
|
259
|
auto mappedKeysResult = mapKeys(keys, mapCb);
|
255
|
260
|
if (!mappedKeysResult) {
|