diff options
author | Robin Lindén <mail+gitlab@robinlinden.eu> | 2016-11-16 02:10:38 +0100 |
---|---|---|
committer | iphydf <iphydf@users.noreply.github.com> | 2016-11-21 00:28:33 +0000 |
commit | 6e1a01bd1662f9ccb834ebdd706f753ca22ff2cf (patch) | |
tree | 98a9076073f5dd9cd894410bbe918a47de048b9b | |
parent | 75a33d220106f66e3abe80409a10cb55130fc457 (diff) |
Made saveformat platform-independent.
Fixes #215.
-rw-r--r-- | auto_tests/tox_one_test.c | 12 | ||||
-rw-r--r-- | toxcore/Messenger.c | 127 |
2 files changed, 124 insertions, 15 deletions
diff --git a/auto_tests/tox_one_test.c b/auto_tests/tox_one_test.c index 871aa443..350fafe9 100644 --- a/auto_tests/tox_one_test.c +++ b/auto_tests/tox_one_test.c | |||
@@ -30,12 +30,6 @@ START_TEST(test_one) | |||
30 | Tox *tox1 = tox_new_log(0, 0, &index[0]); | 30 | Tox *tox1 = tox_new_log(0, 0, &index[0]); |
31 | Tox *tox2 = tox_new_log(0, 0, &index[1]); | 31 | Tox *tox2 = tox_new_log(0, 0, &index[1]); |
32 | 32 | ||
33 | { | ||
34 | TOX_ERR_GET_PORT error; | ||
35 | ck_assert_msg(tox_self_get_udp_port(tox1, &error) == 33445, "First Tox instance did not bind to udp port 33445.\n"); | ||
36 | ck_assert_msg(error == TOX_ERR_GET_PORT_OK, "wrong error"); | ||
37 | } | ||
38 | |||
39 | uint8_t address[TOX_ADDRESS_SIZE]; | 33 | uint8_t address[TOX_ADDRESS_SIZE]; |
40 | tox_self_get_address(tox1, address); | 34 | tox_self_get_address(tox1, address); |
41 | TOX_ERR_FRIEND_ADD error; | 35 | TOX_ERR_FRIEND_ADD error; |
@@ -115,6 +109,12 @@ START_TEST(test_one) | |||
115 | tox_self_get_public_key(tox2, pk); | 109 | tox_self_get_public_key(tox2, pk); |
116 | ck_assert_msg(memcmp(pk, address, TOX_PUBLIC_KEY_SIZE) == 0, "Wrong public key."); | 110 | ck_assert_msg(memcmp(pk, address, TOX_PUBLIC_KEY_SIZE) == 0, "Wrong public key."); |
117 | 111 | ||
112 | { | ||
113 | TOX_ERR_GET_PORT error; | ||
114 | ck_assert_msg(tox_self_get_udp_port(tox1, &error) == 33445, "First Tox instance did not bind to udp port 33445.\n"); | ||
115 | ck_assert_msg(error == TOX_ERR_GET_PORT_OK, "wrong error"); | ||
116 | } | ||
117 | |||
118 | tox_kill(tox1); | 118 | tox_kill(tox1); |
119 | tox_kill(tox2); | 119 | tox_kill(tox2); |
120 | } | 120 | } |
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index 77a19f30..d4c4526e 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -2633,6 +2633,7 @@ void do_messenger(Messenger *m, void *userdata) | |||
2633 | 2633 | ||
2634 | #define SAVED_FRIEND_REQUEST_SIZE 1024 | 2634 | #define SAVED_FRIEND_REQUEST_SIZE 1024 |
2635 | #define NUM_SAVED_PATH_NODES 8 | 2635 | #define NUM_SAVED_PATH_NODES 8 |
2636 | |||
2636 | struct SAVED_FRIEND { | 2637 | struct SAVED_FRIEND { |
2637 | uint8_t status; | 2638 | uint8_t status; |
2638 | uint8_t real_pk[crypto_box_PUBLICKEYBYTES]; | 2639 | uint8_t real_pk[crypto_box_PUBLICKEYBYTES]; |
@@ -2647,20 +2648,82 @@ struct SAVED_FRIEND { | |||
2647 | uint64_t last_seen_time; | 2648 | uint64_t last_seen_time; |
2648 | }; | 2649 | }; |
2649 | 2650 | ||
2651 | static uint32_t friend_size() | ||
2652 | { | ||
2653 | uint32_t data = 0; | ||
2654 | const struct SAVED_FRIEND temp = { 0 }; | ||
2655 | |||
2656 | #define VALUE_MEMBER(NAME) data += sizeof(temp.NAME) | ||
2657 | #define ARRAY_MEMBER(NAME) data += sizeof(temp.NAME) | ||
2658 | |||
2659 | // Exactly the same in friend_load, friend_save, and friend_size | ||
2660 | VALUE_MEMBER(status); | ||
2661 | ARRAY_MEMBER(real_pk); | ||
2662 | ARRAY_MEMBER(info); | ||
2663 | data++; // padding | ||
2664 | VALUE_MEMBER(info_size); | ||
2665 | ARRAY_MEMBER(name); | ||
2666 | data++; // padding | ||
2667 | VALUE_MEMBER(name_length); | ||
2668 | ARRAY_MEMBER(statusmessage); | ||
2669 | VALUE_MEMBER(statusmessage_length); | ||
2670 | VALUE_MEMBER(userstatus); | ||
2671 | data += 3; // padding | ||
2672 | VALUE_MEMBER(friendrequest_nospam); | ||
2673 | VALUE_MEMBER(last_seen_time); | ||
2674 | |||
2675 | #undef VALUE_MEMBER | ||
2676 | #undef ARRAY_MEMBER | ||
2677 | |||
2678 | return data; | ||
2679 | } | ||
2680 | |||
2650 | static uint32_t saved_friendslist_size(const Messenger *m) | 2681 | static uint32_t saved_friendslist_size(const Messenger *m) |
2651 | { | 2682 | { |
2652 | return count_friendlist(m) * sizeof(struct SAVED_FRIEND); | 2683 | return count_friendlist(m) * friend_size(); |
2684 | } | ||
2685 | |||
2686 | static uint8_t *friend_save(const struct SAVED_FRIEND *temp, uint8_t *data) | ||
2687 | { | ||
2688 | #define VALUE_MEMBER(NAME) \ | ||
2689 | memcpy(data, &temp->NAME, sizeof(temp->NAME)); \ | ||
2690 | data += sizeof(temp->NAME) | ||
2691 | |||
2692 | #define ARRAY_MEMBER(NAME) \ | ||
2693 | memcpy(data, temp->NAME, sizeof(temp->NAME)); \ | ||
2694 | data += sizeof(temp->NAME) | ||
2695 | |||
2696 | // Exactly the same in friend_load, friend_save, and friend_size | ||
2697 | VALUE_MEMBER(status); | ||
2698 | ARRAY_MEMBER(real_pk); | ||
2699 | ARRAY_MEMBER(info); | ||
2700 | data++; // padding | ||
2701 | VALUE_MEMBER(info_size); | ||
2702 | ARRAY_MEMBER(name); | ||
2703 | data++; // padding | ||
2704 | VALUE_MEMBER(name_length); | ||
2705 | ARRAY_MEMBER(statusmessage); | ||
2706 | VALUE_MEMBER(statusmessage_length); | ||
2707 | VALUE_MEMBER(userstatus); | ||
2708 | data += 3; // padding | ||
2709 | VALUE_MEMBER(friendrequest_nospam); | ||
2710 | VALUE_MEMBER(last_seen_time); | ||
2711 | |||
2712 | #undef VALUE_MEMBER | ||
2713 | #undef ARRAY_MEMBER | ||
2714 | |||
2715 | return data; | ||
2653 | } | 2716 | } |
2654 | 2717 | ||
2655 | static uint32_t friends_list_save(const Messenger *m, uint8_t *data) | 2718 | static uint32_t friends_list_save(const Messenger *m, uint8_t *data) |
2656 | { | 2719 | { |
2657 | uint32_t i; | 2720 | uint32_t i; |
2658 | uint32_t num = 0; | 2721 | uint32_t num = 0; |
2722 | uint8_t *cur_data = data; | ||
2659 | 2723 | ||
2660 | for (i = 0; i < m->numfriends; i++) { | 2724 | for (i = 0; i < m->numfriends; i++) { |
2661 | if (m->friendlist[i].status > 0) { | 2725 | if (m->friendlist[i].status > 0) { |
2662 | struct SAVED_FRIEND temp; | 2726 | struct SAVED_FRIEND temp = { 0 }; |
2663 | memset(&temp, 0, sizeof(struct SAVED_FRIEND)); | ||
2664 | temp.status = m->friendlist[i].status; | 2727 | temp.status = m->friendlist[i].status; |
2665 | memcpy(temp.real_pk, m->friendlist[i].real_pk, crypto_box_PUBLICKEYBYTES); | 2728 | memcpy(temp.real_pk, m->friendlist[i].real_pk, crypto_box_PUBLICKEYBYTES); |
2666 | 2729 | ||
@@ -2686,26 +2749,72 @@ static uint32_t friends_list_save(const Messenger *m, uint8_t *data) | |||
2686 | memcpy(&temp.last_seen_time, last_seen_time, sizeof(uint64_t)); | 2749 | memcpy(&temp.last_seen_time, last_seen_time, sizeof(uint64_t)); |
2687 | } | 2750 | } |
2688 | 2751 | ||
2689 | memcpy(data + num * sizeof(struct SAVED_FRIEND), &temp, sizeof(struct SAVED_FRIEND)); | 2752 | uint8_t *next_data = friend_save(&temp, cur_data); |
2753 | #ifdef TOX_DEBUG | ||
2754 | assert(next_data - cur_data == friend_size()); | ||
2755 | assert(memcmp(cur_data, &temp, friend_size()) == 0); | ||
2756 | #endif | ||
2757 | cur_data = next_data; | ||
2690 | num++; | 2758 | num++; |
2691 | } | 2759 | } |
2692 | } | 2760 | } |
2693 | 2761 | ||
2694 | return num * sizeof(struct SAVED_FRIEND); | 2762 | #ifdef TOX_DEBUG |
2763 | assert(cur_data - data == num * friend_size()); | ||
2764 | #endif | ||
2765 | return cur_data - data; | ||
2766 | } | ||
2767 | |||
2768 | static const uint8_t *friend_load(struct SAVED_FRIEND *temp, const uint8_t *data) | ||
2769 | { | ||
2770 | #define VALUE_MEMBER(NAME) \ | ||
2771 | memcpy(&temp->NAME, data, sizeof(temp->NAME)); \ | ||
2772 | data += sizeof(temp->NAME) | ||
2773 | |||
2774 | #define ARRAY_MEMBER(NAME) \ | ||
2775 | memcpy(temp->NAME, data, sizeof(temp->NAME)); \ | ||
2776 | data += sizeof(temp->NAME) | ||
2777 | |||
2778 | // Exactly the same in friend_load, friend_save, and friend_size | ||
2779 | VALUE_MEMBER(status); | ||
2780 | ARRAY_MEMBER(real_pk); | ||
2781 | ARRAY_MEMBER(info); | ||
2782 | data++; // padding | ||
2783 | VALUE_MEMBER(info_size); | ||
2784 | ARRAY_MEMBER(name); | ||
2785 | data++; // padding | ||
2786 | VALUE_MEMBER(name_length); | ||
2787 | ARRAY_MEMBER(statusmessage); | ||
2788 | VALUE_MEMBER(statusmessage_length); | ||
2789 | VALUE_MEMBER(userstatus); | ||
2790 | data += 3; // padding | ||
2791 | VALUE_MEMBER(friendrequest_nospam); | ||
2792 | VALUE_MEMBER(last_seen_time); | ||
2793 | |||
2794 | #undef VALUE_MEMBER | ||
2795 | #undef ARRAY_MEMBER | ||
2796 | |||
2797 | return data; | ||
2695 | } | 2798 | } |
2696 | 2799 | ||
2697 | static int friends_list_load(Messenger *m, const uint8_t *data, uint32_t length) | 2800 | static int friends_list_load(Messenger *m, const uint8_t *data, uint32_t length) |
2698 | { | 2801 | { |
2699 | if (length % sizeof(struct SAVED_FRIEND) != 0) { | 2802 | if (length % friend_size() != 0) { |
2700 | return -1; | 2803 | return -1; |
2701 | } | 2804 | } |
2702 | 2805 | ||
2703 | uint32_t num = length / sizeof(struct SAVED_FRIEND); | 2806 | uint32_t num = length / friend_size(); |
2704 | uint32_t i; | 2807 | uint32_t i; |
2808 | const uint8_t *cur_data = data; | ||
2705 | 2809 | ||
2706 | for (i = 0; i < num; ++i) { | 2810 | for (i = 0; i < num; ++i) { |
2707 | struct SAVED_FRIEND temp; | 2811 | struct SAVED_FRIEND temp = { 0 }; |
2708 | memcpy(&temp, data + i * sizeof(struct SAVED_FRIEND), sizeof(struct SAVED_FRIEND)); | 2812 | const uint8_t *next_data = friend_load(&temp, cur_data); |
2813 | #ifdef TOX_DEBUG | ||
2814 | assert(next_data - cur_data == friend_size()); | ||
2815 | assert(memcmp(&temp, cur_data, friend_size()) == 0); | ||
2816 | #endif | ||
2817 | cur_data = next_data; | ||
2709 | 2818 | ||
2710 | if (temp.status >= 3) { | 2819 | if (temp.status >= 3) { |
2711 | int fnum = m_addfriend_norequest(m, temp.real_pk); | 2820 | int fnum = m_addfriend_norequest(m, temp.real_pk); |