Skip to content

Commit

Permalink
Make file connection stateless
Browse files Browse the repository at this point in the history
Messenger is slightly twisty when it comes to sending connection status
callbacks It will very likely need at the very least a partial refactor to
clean it up a bit. Toxcore shouldn't need void *userdata as deep as is
currently does.

(amend 1) Because of the nature of toxcore connection callbacks, I also decided
to include the stateless change for friend requests. It's simpler this was and
doesn't include doing anything foolish in the meantime between commits.
  • Loading branch information
Gregory Mullen (grayhatter) committed Aug 24, 2016
1 parent 503d198 commit 0bd1908
Show file tree
Hide file tree
Showing 18 changed files with 80 additions and 74 deletions.
2 changes: 1 addition & 1 deletion auto_tests/friends_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ int main(int argc, char *argv[])
Messenger_save(m, child_id);
msync(child_id, crypto_box_PUBLICKEYBYTES, MS_SYNC);

m_callback_friendrequest(m, child_got_request, NULL);
m_callback_friendrequest(m, child_got_request);
m_callback_statusmessage(m, child_got_statuschange, NULL);

/* wait on the friend request */
Expand Down
2 changes: 1 addition & 1 deletion other/apidsl/tox.in.h
Original file line number Diff line number Diff line change
Expand Up @@ -1459,7 +1459,7 @@ namespace friend {
/**
* This event is triggered when a friend request is received.
*/
event request {
event request const {
/**
* @param public_key The Public Key of the user who sent the friend request.
* @param time_delta A delta in seconds between when the message was composed
Expand Down
2 changes: 1 addition & 1 deletion testing/Messenger_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ int main(int argc, char *argv[])

}

m_callback_friendrequest(m, print_request, NULL);
m_callback_friendrequest(m, print_request);
m_callback_friendmessage(m, print_message);

printf("OUR ID: ");
Expand Down
6 changes: 3 additions & 3 deletions toxcore/DHT.c
Original file line number Diff line number Diff line change
Expand Up @@ -1847,7 +1847,7 @@ static int send_NATping(DHT *dht, const uint8_t *public_key, uint64_t ping_id, u

/* Handle a received ping request for. */
static int handle_NATping(void *object, IP_Port source, const uint8_t *source_pubkey, const uint8_t *packet,
uint16_t length)
uint16_t length, void *userdata)
{
if (length != sizeof(uint64_t) + 1)
return 1;
Expand Down Expand Up @@ -2127,7 +2127,7 @@ static uint32_t have_nodes_closelist(DHT *dht, Node_format *nodes, uint16_t num)

/* Handle a received hardening packet */
static int handle_hardening(void *object, IP_Port source, const uint8_t *source_pubkey, const uint8_t *packet,
uint16_t length)
uint16_t length, void *userdata)
{
DHT *dht = object;

Expand Down Expand Up @@ -2364,7 +2364,7 @@ static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *pack
if (!dht->cryptopackethandlers[number].function) return 1;

return dht->cryptopackethandlers[number].function(dht->cryptopackethandlers[number].object, source, public_key,
data, len);
data, len, userdata);

} else { /* If request is not for us, try routing it. */
int retval = route_packet(dht, packet + 1, packet, length);
Expand Down
2 changes: 1 addition & 1 deletion toxcore/DHT.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ typedef struct {
/*----------------------------------------------------------------------------------*/

typedef int (*cryptopacket_handler_callback)(void *object, IP_Port ip_port, const uint8_t *source_pubkey,
const uint8_t *data, uint16_t len);
const uint8_t *data, uint16_t len, void *userdata);

typedef struct {
cryptopacket_handler_callback function;
Expand Down
15 changes: 7 additions & 8 deletions toxcore/Messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static int send_offline_packet(Messenger *m, int friendcon_id)
sizeof(packet), 0) != -1;
}

static int handle_status(void *object, int i, uint8_t status);
static int handle_status(void *object, int i, uint8_t status, void *userdata);
static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len, void *userdata);
static int handle_custom_lossy_packet(void *object, int friend_num, const uint8_t *packet, uint16_t length);

Expand Down Expand Up @@ -418,8 +418,8 @@ int m_get_friend_connectionstatus(const Messenger *m, int32_t friendnumber)
if (m->friendlist[friendnumber].status == FRIEND_ONLINE) {
_Bool direct_connected = 0;
unsigned int num_online_relays = 0;
crypto_connection_status(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c,
m->friendlist[friendnumber].friendcon_id), &direct_connected, &num_online_relays);
int crypt_conn_id = friend_connection_crypt_connection_id(m->fr_c, m->friendlist[friendnumber].friendcon_id);
crypto_connection_status(m->net_crypto, crypt_conn_id, &direct_connected, &num_online_relays);

if (direct_connected) {
return CONNECTION_UDP;
Expand Down Expand Up @@ -764,10 +764,9 @@ static void set_friend_typing(const Messenger *m, int32_t friendnumber, uint8_t

/* Set the function that will be executed when a friend request is received. */
void m_callback_friendrequest(Messenger *m, void (*function)(Messenger *m, const uint8_t *, const uint8_t *, size_t,
void *), void *userdata)
void *))
{
void (*handle_friendrequest)(void *, const uint8_t *, const uint8_t *, size_t, void *) = (void *)function;
callback_friendrequest(&(m->fr), handle_friendrequest, m, userdata);
callback_friendrequest(&(m->fr), function, m);
}

/* Set the function that will be executed when a message from a friend is received. */
Expand Down Expand Up @@ -1882,7 +1881,7 @@ static void check_friend_request_timed_out(Messenger *m, uint32_t i, uint64_t t)
}
}

static int handle_status(void *object, int i, uint8_t status)
static int handle_status(void *object, int i, uint8_t status, void *userdata)
{
Messenger *m = object;

Expand Down Expand Up @@ -2310,7 +2309,7 @@ void do_messenger(Messenger *m, void *userdata)

do_net_crypto(m->net_crypto, userdata);
do_onion_client(m->onion_c);
do_friend_connections(m->fr_c);
do_friend_connections(m->fr_c, userdata);
do_friends(m, userdata);
connection_status_cb(m, userdata);

Expand Down
2 changes: 1 addition & 1 deletion toxcore/Messenger.h
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ int m_get_istyping(const Messenger *m, int32_t friendnumber);
* Function format is function(uint8_t * public_key, uint8_t * data, size_t length)
*/
void m_callback_friendrequest(Messenger *m, void (*function)(Messenger *m, const uint8_t *, const uint8_t *, size_t,
void *), void *userdata);
void *));

/* Set the function that will be executed when a message from a friend is received.
* Function format is: function(uint32_t friendnumber, unsigned int type, uint8_t * message, uint32_t length)
Expand Down
30 changes: 16 additions & 14 deletions toxcore/friend_connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ static void change_dht_pk(Friend_Connections *fr_c, int friendcon_id, const uint
memcpy(friend_con->dht_temp_pk, dht_public_key, crypto_box_PUBLICKEYBYTES);
}

static int handle_status(void *object, int number, uint8_t status)
static int handle_status(void *object, int number, uint8_t status, void *userdata)
{
Friend_Connections *fr_c = object;
Friend_Conn *friend_con = get_conn(fr_c, number);
Expand Down Expand Up @@ -340,15 +340,15 @@ static int handle_status(void *object, int number, uint8_t status)
for (i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) {
if (friend_con->callbacks[i].status_callback)
friend_con->callbacks[i].status_callback(friend_con->callbacks[i].status_callback_object,
friend_con->callbacks[i].status_callback_id, status);
friend_con->callbacks[i].status_callback_id, status, userdata);
}
}

return 0;
}

/* Callback for dht public key changes. */
static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_public_key)
static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_public_key, void *userdata)
{
Friend_Connections *fr_c = object;
Friend_Conn *friend_con = get_conn(fr_c, number);
Expand All @@ -365,7 +365,7 @@ static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_pub
if (friend_con->crypt_connection_id != -1) {
crypto_kill(fr_c->net_crypto, friend_con->crypt_connection_id);
friend_con->crypt_connection_id = -1;
handle_status(object, number, 0); /* Going offline. */
handle_status(object, number, 0, userdata); /* Going offline. */
}

friend_new_connection(fr_c, number);
Expand All @@ -384,8 +384,9 @@ static int handle_packet(void *object, int number, uint8_t *data, uint16_t lengt
return -1;

if (data[0] == PACKET_ID_FRIEND_REQUESTS) {
if (fr_c->fr_request_callback)
fr_c->fr_request_callback(fr_c->fr_request_object, friend_con->real_public_key, data, length);
if (fr_c->fr_request_callback) {
fr_c->fr_request_callback(fr_c->fr_request_object, friend_con->real_public_key, data, length, userdata);
}

return 0;
} else if (data[0] == PACKET_ID_ALIVE) {
Expand Down Expand Up @@ -594,7 +595,8 @@ int get_friendcon_public_keys(uint8_t *real_pk, uint8_t *dht_temp_pk, Friend_Con
*/
void set_dht_temp_pk(Friend_Connections *fr_c, int friendcon_id, const uint8_t *dht_temp_pk)
{
dht_pk_callback(fr_c, friendcon_id, dht_temp_pk);
/* This is probably VERY bad, but group chats are VERY broken, and I'm not willing to fix something I plan to replace */
dht_pk_callback(fr_c, friendcon_id, dht_temp_pk, NULL);
}

/* Set the callbacks for the friend connection.
Expand All @@ -604,10 +606,10 @@ void set_dht_temp_pk(Friend_Connections *fr_c, int friendcon_id, const uint8_t *
* return -1 on failure
*/
int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsigned int index,
int (*status_callback)(void *object, int id, uint8_t status), int (*data_callback)(void *object, int id, uint8_t *data,
uint16_t length, void *userdata), int (*lossy_data_callback)(void *object, int id, const uint8_t *data,
uint16_t length), void *object,
int number)
int (*status_callback)(void *object, int id, uint8_t status, void *userdata),
int (*data_callback)(void *object, int id, uint8_t *data, uint16_t len, void *userdata),
int (*lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length),
void *object, int number)
{
Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);

Expand Down Expand Up @@ -717,7 +719,7 @@ int kill_friend_connection(Friend_Connections *fr_c, int friendcon_id)
* This function will be called every time a friend request packet is received.
*/
void set_friend_request_callback(Friend_Connections *fr_c, int (*fr_request_callback)(void *, const uint8_t *,
const uint8_t *, uint16_t), void *object)
const uint8_t *, uint16_t, void *), void *object)
{
fr_c->fr_request_callback = fr_request_callback;
fr_c->fr_request_object = object;
Expand Down Expand Up @@ -790,7 +792,7 @@ static void LANdiscovery(Friend_Connections *fr_c)
}

/* main friend_connections loop. */
void do_friend_connections(Friend_Connections *fr_c)
void do_friend_connections(Friend_Connections *fr_c, void *userdata)
{
uint32_t i;
uint64_t temp_time = unix_time();
Expand Down Expand Up @@ -831,7 +833,7 @@ void do_friend_connections(Friend_Connections *fr_c)
/* If we stopped receiving ping packets, kill it. */
crypto_kill(fr_c->net_crypto, friend_con->crypt_connection_id);
friend_con->crypt_connection_id = -1;
handle_status(fr_c, i, 0); /* Going offline. */
handle_status(fr_c, i, 0, userdata); /* Going offline. */
}
}
}
Expand Down
17 changes: 9 additions & 8 deletions toxcore/friend_connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ typedef struct {
uint64_t share_relays_lastsent;

struct {
int (*status_callback)(void *object, int id, uint8_t status);
int (*status_callback)(void *object, int id, uint8_t status, void *userdata);
void *status_callback_object;
int status_callback_id;

Expand Down Expand Up @@ -109,7 +109,8 @@ typedef struct {
Friend_Conn *conns;
uint32_t num_cons;

int (*fr_request_callback)(void *object, const uint8_t *source_pubkey, const uint8_t *data, uint16_t len);
int (*fr_request_callback)(void *object, const uint8_t *source_pubkey, const uint8_t *data, uint16_t len,
void *userdata);
void *fr_request_object;

uint64_t last_LANdiscovery;
Expand Down Expand Up @@ -158,10 +159,10 @@ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_
* return -1 on failure
*/
int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsigned int index,
int (*status_callback)(void *object, int id, uint8_t status), int (*data_callback)(void *object, int id, uint8_t *data,
uint16_t length, void *userdata), int (*lossy_data_callback)(void *object, int id, const uint8_t *data,
uint16_t length), void *object,
int number);
int (*status_callback)(void *object, int id, uint8_t status, void *userdata),
int (*data_callback)(void *object, int id, uint8_t *data, uint16_t len, void *userdata),
int (*lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length),
void *object, int number);

/* return the crypt_connection_id for the connection.
*
Expand Down Expand Up @@ -199,13 +200,13 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3
* This function will be called every time a friend request is received.
*/
void set_friend_request_callback(Friend_Connections *fr_c, int (*fr_request_callback)(void *, const uint8_t *,
const uint8_t *, uint16_t), void *object);
const uint8_t *, uint16_t, void *), void *object);

/* Create new friend_connections instance. */
Friend_Connections *new_friend_connections(Onion_Client *onion_c);

/* main friend_connections loop. */
void do_friend_connections(Friend_Connections *fr_c);
void do_friend_connections(Friend_Connections *fr_c, void *userdata);

/* Free everything related with friend_connections. */
void kill_friend_connections(Friend_Connections *fr_c);
Expand Down
9 changes: 4 additions & 5 deletions toxcore/friend_requests.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,11 @@ uint32_t get_nospam(const Friend_Requests *fr)

/* Set the function that will be executed when a friend request is received. */
void callback_friendrequest(Friend_Requests *fr, void (*function)(void *, const uint8_t *, const uint8_t *, size_t,
void *), void *object, void *userdata)
void *), void *object)
{
fr->handle_friendrequest = function;
fr->handle_friendrequest_isset = 1;
fr->handle_friendrequest_object = object;
fr->handle_friendrequest_userdata = userdata;
}
/* Set the function used to check if a friend request should be displayed to the user or not. */
void set_filter_function(Friend_Requests *fr, int (*function)(const uint8_t *, void *), void *userdata)
Expand Down Expand Up @@ -103,7 +102,8 @@ int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk)
}


static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length)
static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length,
void *userdata)
{
Friend_Requests *fr = object;

Expand Down Expand Up @@ -133,8 +133,7 @@ static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, co
memcpy(message, packet + sizeof(fr->nospam), message_len);
message[sizeof(message) - 1] = 0; /* Be sure the message is null terminated. */

(*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len,
fr->handle_friendrequest_userdata);
(*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata);
return 0;
}

Expand Down
3 changes: 1 addition & 2 deletions toxcore/friend_requests.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ typedef struct {
void (*handle_friendrequest)(void *, const uint8_t *, const uint8_t *, size_t, void *);
uint8_t handle_friendrequest_isset;
void *handle_friendrequest_object;
void *handle_friendrequest_userdata;

int (*filter_function)(const uint8_t *, void *);
void *filter_function_userdata;
Expand Down Expand Up @@ -62,7 +61,7 @@ int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk);
* Function format is function(uint8_t * public_key, uint8_t * data, size_t length, void * userdata)
*/
void callback_friendrequest(Friend_Requests *fr, void (*function)(void *, const uint8_t *, const uint8_t *, size_t,
void *), void *object, void *userdata);
void *), void *object);

/* Set the function used to check if a friend request should be displayed to the user or not.
* Function format is int function(uint8_t * public_key, void * userdata)
Expand Down
2 changes: 1 addition & 1 deletion toxcore/group.c
Original file line number Diff line number Diff line change
Expand Up @@ -598,7 +598,7 @@ static void set_conns_status_groups(Group_Chats *g_c, int friendcon_id, uint8_t
}
}

static int handle_status(void *object, int friendcon_id, uint8_t status)
static int handle_status(void *object, int friendcon_id, uint8_t status, void *userdata)
{
Group_Chats *g_c = object;

Expand Down
Loading

0 comments on commit 0bd1908

Please sign in to comment.