mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
tox_callback_connection_status() implemented.
Attempted fix of connection checking to make it more stable.
This commit is contained in:
parent
572484f06e
commit
43fe6e71bd
|
@ -202,6 +202,18 @@ void write_file(Tox *tox, uint32_t friendnumber, uint32_t filenumber, uint64_t p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int connected_t1;
|
||||||
|
void tox_connection_status(Tox *tox, TOX_CONNECTION connection_status, void *user_data)
|
||||||
|
{
|
||||||
|
if (*((uint32_t *)user_data) != 974536)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (connected_t1 && !connection_status)
|
||||||
|
ck_abort_msg("Tox went offline");
|
||||||
|
|
||||||
|
connected_t1 = connection_status;
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(test_one)
|
START_TEST(test_one)
|
||||||
{
|
{
|
||||||
Tox *tox1 = tox_new(0, 0, 0, 0);
|
Tox *tox1 = tox_new(0, 0, 0, 0);
|
||||||
|
@ -286,6 +298,8 @@ START_TEST(test_few_clients)
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t to_compare = 974536;
|
uint32_t to_compare = 974536;
|
||||||
|
connected_t1 = 0;
|
||||||
|
tox_callback_connection_status(tox1, tox_connection_status, &to_compare);
|
||||||
tox_callback_friend_request(tox2, accept_friend_request, &to_compare);
|
tox_callback_friend_request(tox2, accept_friend_request, &to_compare);
|
||||||
uint8_t address[TOX_ADDRESS_SIZE];
|
uint8_t address[TOX_ADDRESS_SIZE];
|
||||||
tox_self_get_address(tox2, address);
|
tox_self_get_address(tox2, address);
|
||||||
|
@ -299,20 +313,22 @@ START_TEST(test_few_clients)
|
||||||
tox_iteration(tox2);
|
tox_iteration(tox2);
|
||||||
tox_iteration(tox3);
|
tox_iteration(tox3);
|
||||||
|
|
||||||
if (tox_get_connection_status(tox1) && tox_get_connection_status(tox2) && tox_get_connection_status(tox3) && off) {
|
if (tox_get_connection_status(tox1) && tox_get_connection_status(tox2) && tox_get_connection_status(tox3)) {
|
||||||
printf("Toxes are online, took %llu seconds\n", time(NULL) - cur_time);
|
if (off) {
|
||||||
con_time = time(NULL);
|
printf("Toxes are online, took %llu seconds\n", time(NULL) - cur_time);
|
||||||
off = 0;
|
con_time = time(NULL);
|
||||||
|
off = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tox_friend_get_connection_status(tox2, 0, 0) == TOX_CONNECTION_UDP
|
||||||
|
&& tox_friend_get_connection_status(tox3, 0, 0) == TOX_CONNECTION_UDP)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (tox_friend_get_connection_status(tox2, 0, 0) == TOX_CONNECTION_UDP
|
|
||||||
&& tox_friend_get_connection_status(tox3, 0, 0) == TOX_CONNECTION_UDP)
|
|
||||||
break;
|
|
||||||
|
|
||||||
c_sleep(50);
|
c_sleep(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ck_assert_msg(connected_t1, "Tox1 isn't connected. %u", connected_t1);
|
||||||
printf("tox clients connected took %llu seconds\n", time(NULL) - con_time);
|
printf("tox clients connected took %llu seconds\n", time(NULL) - con_time);
|
||||||
to_compare = 974536;
|
to_compare = 974536;
|
||||||
tox_callback_friend_message(tox3, print_message, &to_compare);
|
tox_callback_friend_message(tox3, print_message, &to_compare);
|
||||||
|
|
|
@ -865,6 +865,12 @@ void m_callback_connectionstatus(Messenger *m, void (*function)(Messenger *m, ui
|
||||||
m->friend_connectionstatuschange_userdata = userdata;
|
m->friend_connectionstatuschange_userdata = userdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void m_callback_core_connection(Messenger *m, void (*function)(Messenger *m, unsigned int, void *), void *userdata)
|
||||||
|
{
|
||||||
|
m->core_connection_change = function;
|
||||||
|
m->core_connection_change_userdata = userdata;
|
||||||
|
}
|
||||||
|
|
||||||
void m_callback_connectionstatus_internal_av(Messenger *m, void (*function)(Messenger *m, uint32_t, uint8_t, void *),
|
void m_callback_connectionstatus_internal_av(Messenger *m, void (*function)(Messenger *m, uint32_t, uint8_t, void *),
|
||||||
void *userdata)
|
void *userdata)
|
||||||
{
|
{
|
||||||
|
@ -2047,7 +2053,17 @@ void do_friends(Messenger *m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void connection_status_cb(Messenger *m)
|
||||||
|
{
|
||||||
|
unsigned int conn_status = onion_connection_status(m->onion_c);
|
||||||
|
|
||||||
|
if (conn_status != m->last_connection_status) {
|
||||||
|
if (m->core_connection_change)
|
||||||
|
(*m->core_connection_change)(m, conn_status, m->core_connection_change_userdata);
|
||||||
|
|
||||||
|
m->last_connection_status = conn_status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef LOGGING
|
#ifdef LOGGING
|
||||||
|
@ -2112,6 +2128,7 @@ void do_messenger(Messenger *m)
|
||||||
do_friend_connections(m->fr_c);
|
do_friend_connections(m->fr_c);
|
||||||
do_friends(m);
|
do_friends(m);
|
||||||
LANdiscovery(m);
|
LANdiscovery(m);
|
||||||
|
connection_status_cb(m);
|
||||||
|
|
||||||
#ifdef LOGGING
|
#ifdef LOGGING
|
||||||
|
|
||||||
|
|
|
@ -271,6 +271,10 @@ struct Messenger {
|
||||||
void (*lossless_packethandler)(struct Messenger *m, uint32_t, const uint8_t *, size_t, void *);
|
void (*lossless_packethandler)(struct Messenger *m, uint32_t, const uint8_t *, size_t, void *);
|
||||||
void *lossless_packethandler_userdata;
|
void *lossless_packethandler_userdata;
|
||||||
|
|
||||||
|
void (*core_connection_change)(struct Messenger *m, unsigned int, void *);
|
||||||
|
void *core_connection_change_userdata;
|
||||||
|
unsigned int last_connection_status;
|
||||||
|
|
||||||
Messenger_Options options;
|
Messenger_Options options;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -543,6 +547,11 @@ void m_callback_connectionstatus_internal_av(Messenger *m, void (*function)(Mess
|
||||||
void *userdata);
|
void *userdata);
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the callback for typing changes.
|
||||||
|
* Function(unsigned int connection_status (0 = not connected, 1 = TCP only, 2 = UDP + TCP))
|
||||||
|
*/
|
||||||
|
void m_callback_core_connection(Messenger *m, void (*function)(Messenger *m, unsigned int, void *), void *userdata);
|
||||||
|
|
||||||
/**********GROUP CHATS************/
|
/**********GROUP CHATS************/
|
||||||
|
|
||||||
/* Set the callback for group invites.
|
/* Set the callback for group invites.
|
||||||
|
|
|
@ -1351,6 +1351,64 @@ static void do_announce(Onion_Client *onion_c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return 0 if we are not connected to the network.
|
||||||
|
* return 1 if we are.
|
||||||
|
*/
|
||||||
|
static int onion_isconnected(const Onion_Client *onion_c)
|
||||||
|
{
|
||||||
|
unsigned int i, num = 0, announced = 0;
|
||||||
|
|
||||||
|
if (is_timeout(onion_c->last_packet_recv, ONION_OFFLINE_TIMEOUT))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (onion_c->path_nodes_index == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
|
||||||
|
if (!is_timeout(onion_c->clients_announce_list[i].timestamp, ONION_NODE_TIMEOUT)) {
|
||||||
|
++num;
|
||||||
|
|
||||||
|
if (onion_c->clients_announce_list[i].is_stored) {
|
||||||
|
++announced;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int pnodes = onion_c->path_nodes_index;
|
||||||
|
|
||||||
|
if (pnodes > MAX_ONION_CLIENTS) {
|
||||||
|
pnodes = MAX_ONION_CLIENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Consider ourselves online if we are announced to half or more nodes
|
||||||
|
we are connected to */
|
||||||
|
if (num && announced) {
|
||||||
|
if ((num / 2) <= announced && (pnodes / 2) <= num)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ONION_CONNECTION_SECONDS 2
|
||||||
|
|
||||||
|
/* return 0 if we are not connected to the network.
|
||||||
|
* return 1 if we are connected with TCP only.
|
||||||
|
* return 2 if we are also connected with UDP.
|
||||||
|
*/
|
||||||
|
unsigned int onion_connection_status(const Onion_Client *onion_c)
|
||||||
|
{
|
||||||
|
if (onion_c->onion_connected >= ONION_CONNECTION_SECONDS) {
|
||||||
|
if (onion_c->UDP_connected) {
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void do_onion_client(Onion_Client *onion_c)
|
void do_onion_client(Onion_Client *onion_c)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -1363,11 +1421,23 @@ void do_onion_client(Onion_Client *onion_c)
|
||||||
do_announce(onion_c);
|
do_announce(onion_c);
|
||||||
|
|
||||||
if (onion_isconnected(onion_c)) {
|
if (onion_isconnected(onion_c)) {
|
||||||
|
if (onion_c->onion_connected < ONION_CONNECTION_SECONDS * 2) {
|
||||||
|
++onion_c->onion_connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
onion_c->UDP_connected = DHT_non_lan_connected(onion_c->dht);
|
||||||
|
} else {
|
||||||
|
populate_path_nodes_tcp(onion_c);
|
||||||
|
|
||||||
|
if (onion_c->onion_connected != 0) {
|
||||||
|
--onion_c->onion_connected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onion_connection_status(onion_c)) {
|
||||||
for (i = 0; i < onion_c->num_friends; ++i) {
|
for (i = 0; i < onion_c->num_friends; ++i) {
|
||||||
do_friend(onion_c, i);
|
do_friend(onion_c, i);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
populate_path_nodes_tcp(onion_c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onion_c->last_run = unix_time();
|
onion_c->last_run = unix_time();
|
||||||
|
@ -1418,42 +1488,3 @@ void kill_onion_client(Onion_Client *onion_c)
|
||||||
free(onion_c);
|
free(onion_c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* return 0 if we are not connected to the network.
|
|
||||||
* return 1 if we are.
|
|
||||||
*/
|
|
||||||
int onion_isconnected(const Onion_Client *onion_c)
|
|
||||||
{
|
|
||||||
unsigned int i, num = 0, announced = 0;
|
|
||||||
|
|
||||||
if (is_timeout(onion_c->last_packet_recv, ONION_OFFLINE_TIMEOUT))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (onion_c->path_nodes_index == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
|
|
||||||
if (!is_timeout(onion_c->clients_announce_list[i].timestamp, ONION_NODE_TIMEOUT)) {
|
|
||||||
++num;
|
|
||||||
|
|
||||||
if (onion_c->clients_announce_list[i].is_stored) {
|
|
||||||
++announced;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int pnodes = onion_c->path_nodes_index;
|
|
||||||
|
|
||||||
if (pnodes > MAX_ONION_CLIENTS) {
|
|
||||||
pnodes = MAX_ONION_CLIENTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Consider ourselves online if we are announced to half or more nodes
|
|
||||||
we are connected to */
|
|
||||||
if (num && announced) {
|
|
||||||
if ((num / 2) <= announced && (pnodes / 2) <= num)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -157,6 +157,9 @@ typedef struct {
|
||||||
} Onion_Data_Handlers[256];
|
} Onion_Data_Handlers[256];
|
||||||
|
|
||||||
uint64_t last_packet_recv;
|
uint64_t last_packet_recv;
|
||||||
|
|
||||||
|
unsigned int onion_connected;
|
||||||
|
_Bool UDP_connected;
|
||||||
} Onion_Client;
|
} Onion_Client;
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,8 +281,9 @@ void kill_onion_client(Onion_Client *onion_c);
|
||||||
|
|
||||||
|
|
||||||
/* return 0 if we are not connected to the network.
|
/* return 0 if we are not connected to the network.
|
||||||
* return 1 if we are.
|
* return 1 if we are connected with TCP only.
|
||||||
|
* return 2 if we are also connected with UDP.
|
||||||
*/
|
*/
|
||||||
int onion_isconnected(const Onion_Client *onion_c);
|
unsigned int onion_connection_status(const Onion_Client *onion_c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -278,21 +278,22 @@ TOX_CONNECTION tox_get_connection_status(const Tox *tox)
|
||||||
{
|
{
|
||||||
const Messenger *m = tox;
|
const Messenger *m = tox;
|
||||||
|
|
||||||
if (onion_isconnected(m->onion_c)) {
|
unsigned int ret = onion_connection_status(m->onion_c);
|
||||||
if (DHT_non_lan_connected(m->dht)) {
|
|
||||||
return TOX_CONNECTION_UDP;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (ret == 2) {
|
||||||
|
return TOX_CONNECTION_UDP;
|
||||||
|
} else if (ret == 1) {
|
||||||
return TOX_CONNECTION_TCP;
|
return TOX_CONNECTION_TCP;
|
||||||
|
} else {
|
||||||
|
return TOX_CONNECTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TOX_CONNECTION_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void tox_callback_connection_status(Tox *tox, tox_connection_status_cb *function, void *user_data)
|
void tox_callback_connection_status(Tox *tox, tox_connection_status_cb *function, void *user_data)
|
||||||
{
|
{
|
||||||
//TODO
|
Messenger *m = tox;
|
||||||
|
m_callback_core_connection(m, function, user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t tox_iteration_interval(const Tox *tox)
|
uint32_t tox_iteration_interval(const Tox *tox)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user