summaryrefslogtreecommitdiff
path: root/toxcore/tox.c
diff options
context:
space:
mode:
authorzugz (tox) <mbays+tox@sdf.org>2018-09-09 23:21:20 +0200
committerzugz (tox) <mbays+tox@sdf.org>2018-10-20 11:03:10 +0200
commit744dc2f5da2c54ad1e4d7d6ce229bc1756d81263 (patch)
tree35f6590fe3150118bc6b1336fbb0a7db06543668 /toxcore/tox.c
parentaa5c7828802b3fcaedfd8d6fe9a08ca714b9aa2b (diff)
Make saving and loading the responsibility of Tox rather than Messenger
Diffstat (limited to 'toxcore/tox.c')
-rw-r--r--toxcore/tox.c82
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
331static 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. */
356static 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
332Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error) 377Tox *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
585static uint32_t end_size(void)
586{
587 return 2 * sizeof(uint32_t);
588}
589
590static void end_save(uint8_t *data)
591{
592 state_write_section_header(data, STATE_COOKIE_TYPE, 0, STATE_TYPE_END);
593}
594
540size_t tox_get_savedata_size(const Tox *tox) 595size_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
546void tox_get_savedata(const Tox *tox, uint8_t *savedata) 604void 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
554bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, Tox_Err_Bootstrap *error) 626bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, Tox_Err_Bootstrap *error)