diff options
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r-- | toxcore/Messenger.c | 78 |
1 files changed, 42 insertions, 36 deletions
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index a7e0a9fe..dc0e605a 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -52,24 +52,6 @@ static uint8_t friend_not_valid(const Messenger *m, int32_t friendnumber) | |||
52 | return 1; | 52 | return 1; |
53 | } | 53 | } |
54 | 54 | ||
55 | static int add_online_friend(Messenger *m, int32_t friendnumber) | ||
56 | { | ||
57 | if (friend_not_valid(m, friendnumber)) | ||
58 | return -1; | ||
59 | |||
60 | ++m->numonline_friends; | ||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | |||
65 | static int remove_online_friend(Messenger *m, int32_t friendnumber) | ||
66 | { | ||
67 | if (friend_not_valid(m, friendnumber)) | ||
68 | return -1; | ||
69 | |||
70 | --m->numonline_friends; | ||
71 | return 0; | ||
72 | } | ||
73 | /* Set the size of the friend list to numfriends. | 55 | /* Set the size of the friend list to numfriends. |
74 | * | 56 | * |
75 | * return -1 if realloc fails. | 57 | * return -1 if realloc fails. |
@@ -399,9 +381,6 @@ int m_delfriend(Messenger *m, int32_t friendnumber) | |||
399 | if (friend_not_valid(m, friendnumber)) | 381 | if (friend_not_valid(m, friendnumber)) |
400 | return -1; | 382 | return -1; |
401 | 383 | ||
402 | if (m->friendlist[friendnumber].status == FRIEND_ONLINE) | ||
403 | remove_online_friend(m, friendnumber); | ||
404 | |||
405 | clear_receipts(m, friendnumber); | 384 | clear_receipts(m, friendnumber); |
406 | remove_request_received(&(m->fr), m->friendlist[friendnumber].real_pk); | 385 | remove_request_received(&(m->fr), m->friendlist[friendnumber].real_pk); |
407 | friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, 0, 0, 0, 0, 0); | 386 | friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, 0, 0, 0, 0, 0); |
@@ -884,10 +863,7 @@ static void check_friend_connectionstatus(Messenger *m, int32_t friendnumber, ui | |||
884 | if (is_online != was_online) { | 863 | if (is_online != was_online) { |
885 | if (was_online) { | 864 | if (was_online) { |
886 | break_files(m, friendnumber); | 865 | break_files(m, friendnumber); |
887 | remove_online_friend(m, friendnumber); | ||
888 | clear_receipts(m, friendnumber); | 866 | clear_receipts(m, friendnumber); |
889 | } else { | ||
890 | add_online_friend(m, friendnumber); | ||
891 | } | 867 | } |
892 | 868 | ||
893 | m->friendlist[friendnumber].status = status; | 869 | m->friendlist[friendnumber].status = status; |
@@ -1831,6 +1807,27 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error) | |||
1831 | return NULL; | 1807 | return NULL; |
1832 | } | 1808 | } |
1833 | 1809 | ||
1810 | if (options->tcp_server_port) { | ||
1811 | m->tcp_server = new_TCP_server(options->ipv6enabled, 1, &options->tcp_server_port, m->dht->self_public_key, | ||
1812 | m->dht->self_secret_key, m->onion); | ||
1813 | |||
1814 | if (m->tcp_server == NULL) { | ||
1815 | kill_friend_connections(m->fr_c); | ||
1816 | kill_onion(m->onion); | ||
1817 | kill_onion_announce(m->onion_a); | ||
1818 | kill_onion_client(m->onion_c); | ||
1819 | kill_DHT(m->dht); | ||
1820 | kill_net_crypto(m->net_crypto); | ||
1821 | kill_networking(m->net); | ||
1822 | free(m); | ||
1823 | |||
1824 | if (error) | ||
1825 | *error = MESSENGER_ERROR_TCP_SERVER; | ||
1826 | |||
1827 | return NULL; | ||
1828 | } | ||
1829 | } | ||
1830 | |||
1834 | m->options = *options; | 1831 | m->options = *options; |
1835 | friendreq_init(&(m->fr), m->fr_c); | 1832 | friendreq_init(&(m->fr), m->fr_c); |
1836 | set_nospam(&(m->fr), random_int()); | 1833 | set_nospam(&(m->fr), random_int()); |
@@ -1850,6 +1847,10 @@ void kill_messenger(Messenger *m) | |||
1850 | 1847 | ||
1851 | uint32_t i; | 1848 | uint32_t i; |
1852 | 1849 | ||
1850 | if (m->tcp_server) { | ||
1851 | kill_TCP_server(m->tcp_server); | ||
1852 | } | ||
1853 | |||
1853 | kill_friend_connections(m->fr_c); | 1854 | kill_friend_connections(m->fr_c); |
1854 | kill_onion(m->onion); | 1855 | kill_onion(m->onion); |
1855 | kill_onion_announce(m->onion_a); | 1856 | kill_onion_announce(m->onion_a); |
@@ -2285,6 +2286,15 @@ void do_messenger(Messenger *m) | |||
2285 | for (i = 0; i < NUM_SAVED_TCP_RELAYS; ++i) { | 2286 | for (i = 0; i < NUM_SAVED_TCP_RELAYS; ++i) { |
2286 | add_tcp_relay(m->net_crypto, m->loaded_relays[i].ip_port, m->loaded_relays[i].public_key); | 2287 | add_tcp_relay(m->net_crypto, m->loaded_relays[i].ip_port, m->loaded_relays[i].public_key); |
2287 | } | 2288 | } |
2289 | |||
2290 | if (m->tcp_server) { | ||
2291 | /* Add self tcp server. */ | ||
2292 | IP_Port local_ip_port; | ||
2293 | local_ip_port.port = m->options.tcp_server_port; | ||
2294 | local_ip_port.ip.family = AF_INET; | ||
2295 | local_ip_port.ip.ip4.uint32 = INADDR_LOOPBACK; | ||
2296 | add_tcp_relay(m->net_crypto, local_ip_port, m->tcp_server->public_key); | ||
2297 | } | ||
2288 | } | 2298 | } |
2289 | 2299 | ||
2290 | unix_time_update(); | 2300 | unix_time_update(); |
@@ -2294,6 +2304,10 @@ void do_messenger(Messenger *m) | |||
2294 | do_DHT(m->dht); | 2304 | do_DHT(m->dht); |
2295 | } | 2305 | } |
2296 | 2306 | ||
2307 | if (m->tcp_server) { | ||
2308 | do_TCP_server(m->tcp_server); | ||
2309 | } | ||
2310 | |||
2297 | do_net_crypto(m->net_crypto); | 2311 | do_net_crypto(m->net_crypto); |
2298 | do_onion_client(m->onion_c); | 2312 | do_onion_client(m->onion_c); |
2299 | do_friend_connections(m->fr_c); | 2313 | do_friend_connections(m->fr_c); |
@@ -2622,13 +2636,11 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3 | |||
2622 | case MESSENGER_STATE_TYPE_NOSPAMKEYS: | 2636 | case MESSENGER_STATE_TYPE_NOSPAMKEYS: |
2623 | if (length == crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t)) { | 2637 | if (length == crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t)) { |
2624 | set_nospam(&(m->fr), *(uint32_t *)data); | 2638 | set_nospam(&(m->fr), *(uint32_t *)data); |
2625 | load_keys(m->net_crypto, &data[sizeof(uint32_t)]); | 2639 | load_secret_key(m->net_crypto, (&data[sizeof(uint32_t)]) + crypto_box_PUBLICKEYBYTES); |
2626 | #ifdef ENABLE_ASSOC_DHT | ||
2627 | 2640 | ||
2628 | if (m->dht->assoc) | 2641 | if (memcmp((&data[sizeof(uint32_t)]), m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES) != 0) { |
2629 | Assoc_self_client_id_changed(m->dht->assoc, m->net_crypto->self_public_key); | 2642 | return -1; |
2630 | 2643 | } | |
2631 | #endif | ||
2632 | } else | 2644 | } else |
2633 | return -1; /* critical */ | 2645 | return -1; /* critical */ |
2634 | 2646 | ||
@@ -2738,12 +2750,6 @@ uint32_t count_friendlist(const Messenger *m) | |||
2738 | return ret; | 2750 | return ret; |
2739 | } | 2751 | } |
2740 | 2752 | ||
2741 | /* Return the number of online friends in the instance m. */ | ||
2742 | uint32_t get_num_online_friends(const Messenger *m) | ||
2743 | { | ||
2744 | return m->numonline_friends; | ||
2745 | } | ||
2746 | |||
2747 | /* Copy a list of valid friend IDs into the array out_list. | 2753 | /* Copy a list of valid friend IDs into the array out_list. |
2748 | * If out_list is NULL, returns 0. | 2754 | * If out_list is NULL, returns 0. |
2749 | * Otherwise, returns the number of elements copied. | 2755 | * Otherwise, returns the number of elements copied. |