diff options
author | zugz (tox) <mbays+tox@sdf.org> | 2018-09-09 23:21:20 +0200 |
---|---|---|
committer | zugz (tox) <mbays+tox@sdf.org> | 2018-10-20 11:03:10 +0200 |
commit | 744dc2f5da2c54ad1e4d7d6ce229bc1756d81263 (patch) | |
tree | 35f6590fe3150118bc6b1336fbb0a7db06543668 /toxcore/tox.c | |
parent | aa5c7828802b3fcaedfd8d6fe9a08ca714b9aa2b (diff) |
Make saving and loading the responsibility of Tox rather than Messenger
Diffstat (limited to 'toxcore/tox.c')
-rw-r--r-- | toxcore/tox.c | 82 |
1 files changed, 77 insertions, 5 deletions
diff --git a/toxcore/tox.c b/toxcore/tox.c index e679a168..629cc1c5 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c | |||
@@ -328,6 +328,51 @@ bool tox_version_is_compatible(uint32_t major, uint32_t minor, uint32_t patch) | |||
328 | return TOX_VERSION_IS_API_COMPATIBLE(major, minor, patch); | 328 | return TOX_VERSION_IS_API_COMPATIBLE(major, minor, patch); |
329 | } | 329 | } |
330 | 330 | ||
331 | static State_Load_Status state_load_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type) | ||
332 | { | ||
333 | Tox *tox = (Tox *)outer; | ||
334 | State_Load_Status status = STATE_LOAD_STATUS_CONTINUE; | ||
335 | |||
336 | if (messenger_load_state_section(tox->m, data, length, type, &status) | ||
337 | || conferences_load_state_section(tox->m->conferences_object, data, length, type, &status)) { | ||
338 | return status; | ||
339 | } | ||
340 | |||
341 | if (type == STATE_TYPE_END) { | ||
342 | if (length != 0) { | ||
343 | return STATE_LOAD_STATUS_ERROR; | ||
344 | } | ||
345 | |||
346 | return STATE_LOAD_STATUS_END; | ||
347 | } | ||
348 | |||
349 | LOGGER_ERROR(tox->m->log, "Load state: contains unrecognized part (len %u, type %u)\n", | ||
350 | length, type); | ||
351 | |||
352 | return STATE_LOAD_STATUS_CONTINUE; | ||
353 | } | ||
354 | |||
355 | /* Load tox from data of size length. */ | ||
356 | static int tox_load(Tox *tox, const uint8_t *data, uint32_t length) | ||
357 | { | ||
358 | uint32_t data32[2]; | ||
359 | uint32_t cookie_len = sizeof(data32); | ||
360 | |||
361 | if (length < cookie_len) { | ||
362 | return -1; | ||
363 | } | ||
364 | |||
365 | memcpy(data32, data, sizeof(uint32_t)); | ||
366 | lendian_bytes_to_host32(data32 + 1, data + sizeof(uint32_t)); | ||
367 | |||
368 | if (data32[0] != 0 || data32[1] != STATE_COOKIE_GLOBAL) { | ||
369 | return -1; | ||
370 | } | ||
371 | |||
372 | return state_load(tox->m->log, state_load_callback, tox, data + cookie_len, | ||
373 | length - cookie_len, STATE_COOKIE_TYPE); | ||
374 | } | ||
375 | |||
331 | 376 | ||
332 | Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error) | 377 | Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error) |
333 | { | 378 | { |
@@ -488,7 +533,7 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error) | |||
488 | } | 533 | } |
489 | 534 | ||
490 | if (load_savedata_tox | 535 | if (load_savedata_tox |
491 | && messenger_load(m, tox_options_get_savedata_data(opts), tox_options_get_savedata_length(opts)) == -1) { | 536 | && tox_load(tox, tox_options_get_savedata_data(opts), tox_options_get_savedata_length(opts)) == -1) { |
492 | SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT); | 537 | SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT); |
493 | } else if (load_savedata_sk) { | 538 | } else if (load_savedata_sk) { |
494 | load_secret_key(m->net_crypto, tox_options_get_savedata_data(opts)); | 539 | load_secret_key(m->net_crypto, tox_options_get_savedata_data(opts)); |
@@ -537,18 +582,45 @@ void tox_kill(Tox *tox) | |||
537 | free(tox); | 582 | free(tox); |
538 | } | 583 | } |
539 | 584 | ||
585 | static uint32_t end_size(void) | ||
586 | { | ||
587 | return 2 * sizeof(uint32_t); | ||
588 | } | ||
589 | |||
590 | static void end_save(uint8_t *data) | ||
591 | { | ||
592 | state_write_section_header(data, STATE_COOKIE_TYPE, 0, STATE_TYPE_END); | ||
593 | } | ||
594 | |||
540 | size_t tox_get_savedata_size(const Tox *tox) | 595 | size_t tox_get_savedata_size(const Tox *tox) |
541 | { | 596 | { |
542 | const Messenger *m = tox->m; | 597 | const Messenger *m = tox->m; |
543 | return messenger_size(m); | 598 | return 2 * sizeof(uint32_t) |
599 | + messenger_size(m) | ||
600 | + conferences_size(m->conferences_object) | ||
601 | + end_size(); | ||
544 | } | 602 | } |
545 | 603 | ||
546 | void tox_get_savedata(const Tox *tox, uint8_t *savedata) | 604 | void tox_get_savedata(const Tox *tox, uint8_t *savedata) |
547 | { | 605 | { |
548 | if (savedata) { | 606 | if (savedata == nullptr) { |
549 | const Messenger *m = tox->m; | 607 | return; |
550 | messenger_save(m, savedata); | ||
551 | } | 608 | } |
609 | |||
610 | memset(savedata, 0, tox_get_savedata_size(tox)); | ||
611 | |||
612 | const uint32_t size32 = sizeof(uint32_t); | ||
613 | |||
614 | // write cookie | ||
615 | memset(savedata, 0, size32); | ||
616 | savedata += size32; | ||
617 | host_to_lendian_bytes32(savedata, STATE_COOKIE_GLOBAL); | ||
618 | savedata += size32; | ||
619 | |||
620 | const Messenger *m = tox->m; | ||
621 | savedata = messenger_save(m, savedata); | ||
622 | savedata = conferences_save(m->conferences_object, savedata); | ||
623 | end_save(savedata); | ||
552 | } | 624 | } |
553 | 625 | ||
554 | bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, Tox_Err_Bootstrap *error) | 626 | bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, Tox_Err_Bootstrap *error) |