diff options
-rw-r--r-- | core/Messenger.c | 31 | ||||
-rw-r--r-- | core/Messenger.h | 4 |
2 files changed, 28 insertions, 7 deletions
diff --git a/core/Messenger.c b/core/Messenger.c index ede8f718..90dfe48d 100644 --- a/core/Messenger.c +++ b/core/Messenger.c | |||
@@ -55,6 +55,8 @@ static Friend *friendlist; | |||
55 | static uint32_t numfriends; | 55 | static uint32_t numfriends; |
56 | 56 | ||
57 | 57 | ||
58 | static void set_friend_status(int friendnumber, uint8_t status); | ||
59 | |||
58 | /* 1 if we are online | 60 | /* 1 if we are online |
59 | 0 if we are offline | 61 | 0 if we are offline |
60 | static uint8_t online; */ | 62 | static uint8_t online; */ |
@@ -134,7 +136,7 @@ int m_addfriend(uint8_t *client_id, uint8_t *data, uint16_t length) | |||
134 | for (i = 0; i <= numfriends; ++i) { | 136 | for (i = 0; i <= numfriends; ++i) { |
135 | if (friendlist[i].status == NOFRIEND) { | 137 | if (friendlist[i].status == NOFRIEND) { |
136 | DHT_addfriend(client_id); | 138 | DHT_addfriend(client_id); |
137 | friendlist[i].status = FRIEND_ADDED; | 139 | set_friend_status(i, FRIEND_ADDED); |
138 | friendlist[i].crypt_connection_id = -1; | 140 | friendlist[i].crypt_connection_id = -1; |
139 | friendlist[i].friend_request_id = -1; | 141 | friendlist[i].friend_request_id = -1; |
140 | memcpy(friendlist[i].client_id, client_id, CLIENT_ID_SIZE); | 142 | memcpy(friendlist[i].client_id, client_id, CLIENT_ID_SIZE); |
@@ -165,7 +167,7 @@ int m_addfriend_norequest(uint8_t * client_id) | |||
165 | for (i = 0; i <= numfriends; ++i) { | 167 | for (i = 0; i <= numfriends; ++i) { |
166 | if(friendlist[i].status == NOFRIEND) { | 168 | if(friendlist[i].status == NOFRIEND) { |
167 | DHT_addfriend(client_id); | 169 | DHT_addfriend(client_id); |
168 | friendlist[i].status = FRIEND_REQUESTED; | 170 | set_friend_status(i, FRIEND_REQUESTED); |
169 | friendlist[i].crypt_connection_id = -1; | 171 | friendlist[i].crypt_connection_id = -1; |
170 | friendlist[i].friend_request_id = -1; | 172 | friendlist[i].friend_request_id = -1; |
171 | memcpy(friendlist[i].client_id, client_id, CLIENT_ID_SIZE); | 173 | memcpy(friendlist[i].client_id, client_id, CLIENT_ID_SIZE); |
@@ -477,6 +479,21 @@ void m_callback_read_receipt(void (*function)(int, uint32_t)) | |||
477 | read_receipt_isset = 1; | 479 | read_receipt_isset = 1; |
478 | } | 480 | } |
479 | 481 | ||
482 | static void (*friend_statuschange)(int, uint8_t); | ||
483 | static uint8_t friend_statuschange_isset = 0; | ||
484 | void m_callback_friend_status(void (*function)(int, uint8_t)) | ||
485 | { | ||
486 | friend_statuschange = function; | ||
487 | friend_statuschange_isset = 1; | ||
488 | } | ||
489 | |||
490 | static void set_friend_status(int friendnumber, uint8_t status) | ||
491 | { | ||
492 | if (friendlist[friendnumber].status != status && friend_statuschange_isset) | ||
493 | friend_statuschange(friendnumber, status); | ||
494 | friendlist[friendnumber].status = status; | ||
495 | } | ||
496 | |||
480 | #define PORT 33445 | 497 | #define PORT 33445 |
481 | /* run this at startup */ | 498 | /* run this at startup */ |
482 | int initMessenger(void) | 499 | int initMessenger(void) |
@@ -504,9 +521,9 @@ static void doFriends(void) | |||
504 | if (friendlist[i].status == FRIEND_ADDED) { | 521 | if (friendlist[i].status == FRIEND_ADDED) { |
505 | int fr = send_friendrequest(friendlist[i].client_id, friendlist[i].info, friendlist[i].info_size); | 522 | int fr = send_friendrequest(friendlist[i].client_id, friendlist[i].info, friendlist[i].info_size); |
506 | if (fr == 0) /* TODO: This needs to be fixed so that it sends the friend requests a couple of times in case of packet loss */ | 523 | if (fr == 0) /* TODO: This needs to be fixed so that it sends the friend requests a couple of times in case of packet loss */ |
507 | friendlist[i].status = FRIEND_REQUESTED; | 524 | set_friend_status(i, FRIEND_REQUESTED); |
508 | else if (fr > 0) | 525 | else if (fr > 0) |
509 | friendlist[i].status = FRIEND_REQUESTED; | 526 | set_friend_status(i, FRIEND_REQUESTED); |
510 | } | 527 | } |
511 | if (friendlist[i].status == FRIEND_REQUESTED || friendlist[i].status == FRIEND_CONFIRMED) { /* friend is not online */ | 528 | if (friendlist[i].status == FRIEND_REQUESTED || friendlist[i].status == FRIEND_CONFIRMED) { /* friend is not online */ |
512 | if (friendlist[i].status == FRIEND_REQUESTED) { | 529 | if (friendlist[i].status == FRIEND_REQUESTED) { |
@@ -522,7 +539,7 @@ static void doFriends(void) | |||
522 | friendlist[i].crypt_connection_id = crypto_connect(friendlist[i].client_id, friendip); | 539 | friendlist[i].crypt_connection_id = crypto_connect(friendlist[i].client_id, friendip); |
523 | break; | 540 | break; |
524 | case 3: /* Connection is established */ | 541 | case 3: /* Connection is established */ |
525 | friendlist[i].status = FRIEND_ONLINE; | 542 | set_friend_status(i, FRIEND_ONLINE); |
526 | break; | 543 | break; |
527 | case 4: | 544 | case 4: |
528 | crypto_kill(friendlist[i].crypt_connection_id); | 545 | crypto_kill(friendlist[i].crypt_connection_id); |
@@ -604,7 +621,7 @@ static void doFriends(void) | |||
604 | if (is_cryptoconnected(friendlist[i].crypt_connection_id) == 4) { /* if the connection timed out, kill it */ | 621 | if (is_cryptoconnected(friendlist[i].crypt_connection_id) == 4) { /* if the connection timed out, kill it */ |
605 | crypto_kill(friendlist[i].crypt_connection_id); | 622 | crypto_kill(friendlist[i].crypt_connection_id); |
606 | friendlist[i].crypt_connection_id = -1; | 623 | friendlist[i].crypt_connection_id = -1; |
607 | friendlist[i].status = FRIEND_CONFIRMED; | 624 | set_friend_status(i, FRIEND_CONFIRMED); |
608 | } | 625 | } |
609 | break; | 626 | break; |
610 | } | 627 | } |
@@ -625,7 +642,7 @@ static void doInbound(void) | |||
625 | friendlist[friend_id].crypt_connection_id = | 642 | friendlist[friend_id].crypt_connection_id = |
626 | accept_crypto_inbound(inconnection, public_key, secret_nonce, session_key); | 643 | accept_crypto_inbound(inconnection, public_key, secret_nonce, session_key); |
627 | 644 | ||
628 | friendlist[friend_id].status = FRIEND_CONFIRMED; | 645 | set_friend_status(friend_id, FRIEND_CONFIRMED); |
629 | } | 646 | } |
630 | } | 647 | } |
631 | } | 648 | } |
diff --git a/core/Messenger.h b/core/Messenger.h index 3a9a56df..3044122b 100644 --- a/core/Messenger.h +++ b/core/Messenger.h | |||
@@ -201,6 +201,10 @@ void m_callback_userstatus(void (*function)(int, USERSTATUS)); | |||
201 | in that case, you should discard it. */ | 201 | in that case, you should discard it. */ |
202 | void m_callback_read_receipt(void (*function)(int, uint32_t)); | 202 | void m_callback_read_receipt(void (*function)(int, uint32_t)); |
203 | 203 | ||
204 | /* set the callback for friend status changes | ||
205 | function(int friendnumber, uint8_t status) */ | ||
206 | void m_callback_friendstatus(void (*function)(int, uint8_t)); | ||
207 | |||
204 | /* run this at startup | 208 | /* run this at startup |
205 | returns 0 if no connection problems | 209 | returns 0 if no connection problems |
206 | returns -1 if there are problems */ | 210 | returns -1 if there are problems */ |