summaryrefslogtreecommitdiff
path: root/protocols/Tox/libtox/src/toxcore/tox.c
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2024-02-15 12:18:35 +0300
committerGeorge Hazan <george.hazan@gmail.com>2024-02-15 12:18:35 +0300
commit31e72718ee54867accf0b739a24adc86f8b7ab54 (patch)
treef964c10c5d97d9fe4fd2bd8187c250faedcb0fd7 /protocols/Tox/libtox/src/toxcore/tox.c
parent282e9c18d9d3b726cce3d2ef0babc88029661cb8 (diff)
libtox update
Diffstat (limited to 'protocols/Tox/libtox/src/toxcore/tox.c')
-rw-r--r--protocols/Tox/libtox/src/toxcore/tox.c496
1 files changed, 306 insertions, 190 deletions
diff --git a/protocols/Tox/libtox/src/toxcore/tox.c b/protocols/Tox/libtox/src/toxcore/tox.c
index 3f7dcc439d..085fab2ec1 100644
--- a/protocols/Tox/libtox/src/toxcore/tox.c
+++ b/protocols/Tox/libtox/src/toxcore/tox.c
@@ -8,24 +8,33 @@
*/
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 600
-#endif
+#endif /* _XOPEN_SOURCE */
#include "tox.h"
#include <assert.h>
-#include <stdlib.h>
#include <string.h>
+#include "DHT.h"
#include "Messenger.h"
+#include "TCP_client.h"
+#include "attributes.h"
#include "ccompat.h"
+#include "crypto_core.h"
+#include "friend_requests.h"
#include "group.h"
#include "group_chats.h"
-#include "group_moderation.h"
+#include "group_common.h"
#include "logger.h"
+#include "mem.h"
#include "mono_time.h"
+#include "net_crypto.h"
#include "network.h"
+#include "onion_client.h"
+#include "state.h"
#include "tox_private.h"
#include "tox_struct.h"
+#include "util.h"
#include "../toxencryptsave/defines.h"
@@ -42,6 +51,8 @@ static_assert(FILE_ID_LENGTH == CRYPTO_SYMMETRIC_KEY_SIZE,
"FILE_ID_LENGTH is assumed to be equal to CRYPTO_SYMMETRIC_KEY_SIZE");
static_assert(TOX_DHT_NODE_IP_STRING_SIZE == IP_NTOA_LEN,
"TOX_DHT_NODE_IP_STRING_SIZE is assumed to be equal to IP_NTOA_LEN");
+static_assert(TOX_GROUP_PEER_IP_STRING_MAX_LENGTH == IP_NTOA_LEN,
+ "TOX_GROUP_PEER_IP_STRING_MAX_LENGTH is assumed to be equal to IP_NTOA_LEN");
static_assert(TOX_DHT_NODE_PUBLIC_KEY_SIZE == CRYPTO_PUBLIC_KEY_SIZE,
"TOX_DHT_NODE_PUBLIC_KEY_SIZE is assumed to be equal to CRYPTO_PUBLIC_KEY_SIZE");
static_assert(TOX_FILE_ID_LENGTH == CRYPTO_SYMMETRIC_KEY_SIZE,
@@ -86,7 +97,9 @@ static void tox_self_connection_status_handler(Messenger *m, Onion_Connection_St
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->self_connection_status_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->self_connection_status_callback(tox_data->tox, (Tox_Connection)connection_status, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -98,7 +111,9 @@ static void tox_friend_name_handler(Messenger *m, uint32_t friend_number, const
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_name_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_name_callback(tox_data->tox, friend_number, name, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -110,7 +125,9 @@ static void tox_friend_status_message_handler(Messenger *m, uint32_t friend_numb
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_status_message_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_status_message_callback(tox_data->tox, friend_number, message, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -121,7 +138,9 @@ static void tox_friend_status_handler(Messenger *m, uint32_t friend_number, unsi
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_status_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_status_callback(tox_data->tox, friend_number, (Tox_User_Status)status, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -133,8 +152,10 @@ static void tox_friend_connection_status_handler(Messenger *m, uint32_t friend_n
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_connection_status_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_connection_status_callback(tox_data->tox, friend_number, (Tox_Connection)connection_status,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -145,7 +166,9 @@ static void tox_friend_typing_handler(Messenger *m, uint32_t friend_number, bool
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_typing_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_typing_callback(tox_data->tox, friend_number, is_typing, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -156,19 +179,23 @@ static void tox_friend_read_receipt_handler(Messenger *m, uint32_t friend_number
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_read_receipt_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_read_receipt_callback(tox_data->tox, friend_number, message_id, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
static m_friend_request_cb tox_friend_request_handler;
non_null(1, 2, 3) nullable(5)
-static void tox_friend_request_handler(Messenger *m, const uint8_t *public_key, const uint8_t *message, size_t length,
+static void tox_friend_request_handler(Messenger *m, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE], const uint8_t *message, size_t length,
void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_request_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_request_callback(tox_data->tox, public_key, message, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -180,8 +207,10 @@ static void tox_friend_message_handler(Messenger *m, uint32_t friend_number, uns
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->friend_message_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_message_callback(tox_data->tox, friend_number, (Tox_Message_Type)message_type, message, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -193,8 +222,10 @@ static void tox_file_recv_control_handler(Messenger *m, uint32_t friend_number,
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->file_recv_control_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->file_recv_control_callback(tox_data->tox, friend_number, file_number, (Tox_File_Control)control,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -206,8 +237,10 @@ static void tox_file_chunk_request_handler(Messenger *m, uint32_t friend_number,
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->file_chunk_request_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->file_chunk_request_callback(tox_data->tox, friend_number, file_number, position, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -219,8 +252,10 @@ static void tox_file_recv_handler(Messenger *m, uint32_t friend_number, uint32_t
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->file_recv_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->file_recv_callback(tox_data->tox, friend_number, file_number, kind, file_size, filename, filename_length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -232,8 +267,10 @@ static void tox_file_recv_chunk_handler(Messenger *m, uint32_t friend_number, ui
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->file_recv_chunk_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->file_recv_chunk_callback(tox_data->tox, friend_number, file_number, position, data, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -245,8 +282,10 @@ static void tox_conference_invite_handler(Messenger *m, uint32_t friend_number,
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->conference_invite_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->conference_invite_callback(tox_data->tox, friend_number, (Tox_Conference_Type)type, cookie, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -257,7 +296,9 @@ static void tox_conference_connected_handler(Messenger *m, uint32_t conference_n
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->conference_connected_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->conference_connected_callback(tox_data->tox, conference_number, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -269,8 +310,10 @@ static void tox_conference_message_handler(Messenger *m, uint32_t conference_num
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->conference_message_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->conference_message_callback(tox_data->tox, conference_number, peer_number, (Tox_Message_Type)type,
message, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -282,8 +325,10 @@ static void tox_conference_title_handler(Messenger *m, uint32_t conference_numbe
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->conference_title_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->conference_title_callback(tox_data->tox, conference_number, peer_number, title, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -295,8 +340,10 @@ static void tox_conference_peer_name_handler(Messenger *m, uint32_t conference_n
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->conference_peer_name_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->conference_peer_name_callback(tox_data->tox, conference_number, peer_number, name, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -307,7 +354,9 @@ static void tox_conference_peer_list_changed_handler(Messenger *m, uint32_t conf
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->conference_peer_list_changed_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->conference_peer_list_changed_callback(tox_data->tox, conference_number, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -322,9 +371,11 @@ static void tox_dht_get_nodes_response_handler(const DHT *dht, const Node_format
}
Ip_Ntoa ip_str;
+ tox_unlock(tox_data->tox);
tox_data->tox->dht_get_nodes_response_callback(
tox_data->tox, node->public_key, net_ip_ntoa(&node->ip_port.ip, &ip_str), net_ntohs(node->ip_port.port),
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
static m_friend_lossy_packet_cb tox_friend_lossy_packet_handler;
@@ -332,14 +383,16 @@ non_null(1, 4) nullable(6)
static void tox_friend_lossy_packet_handler(Messenger *m, uint32_t friend_number, uint8_t packet_id,
const uint8_t *data, size_t length, void *user_data)
{
+ struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
+
assert(data != nullptr);
assert(length > 0);
- struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
-
if (tox_data->tox->friend_lossy_packet_callback_per_pktid[packet_id] != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_lossy_packet_callback_per_pktid[packet_id](tox_data->tox, friend_number, data, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -348,49 +401,56 @@ non_null(1, 4) nullable(6)
static void tox_friend_lossless_packet_handler(Messenger *m, uint32_t friend_number, uint8_t packet_id,
const uint8_t *data, size_t length, void *user_data)
{
+ struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
+
assert(data != nullptr);
assert(length > 0);
- struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
-
if (tox_data->tox->friend_lossless_packet_callback_per_pktid[packet_id] != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->friend_lossless_packet_callback_per_pktid[packet_id](tox_data->tox, friend_number, data, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
-#ifndef VANILLA_NACL
non_null(1, 4) nullable(6)
-static void tox_group_peer_name_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id,
+static void tox_group_peer_name_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
const uint8_t *name, size_t length, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_peer_name_callback != nullptr) {
- tox_data->tox->group_peer_name_callback(tox_data->tox, group_number, peer_id, name, length, tox_data->user_data);
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_peer_name_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), name, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1) nullable(5)
-static void tox_group_peer_status_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id,
+static void tox_group_peer_status_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
unsigned int status, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_peer_status_callback != nullptr) {
- tox_data->tox->group_peer_status_callback(tox_data->tox, group_number, peer_id, (Tox_User_Status)status,
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_peer_status_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), (Tox_User_Status)status,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1, 4) nullable(6)
-static void tox_group_topic_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id, const uint8_t *topic,
+static void tox_group_topic_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id, const uint8_t *topic,
size_t length, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_topic_callback != nullptr) {
- tox_data->tox->group_topic_callback(tox_data->tox, group_number, peer_id, topic, length, tox_data->user_data);
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_topic_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), topic, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -401,8 +461,10 @@ static void tox_group_topic_lock_handler(const Messenger *m, uint32_t group_numb
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_topic_lock_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_topic_lock_callback(tox_data->tox, group_number, (Tox_Group_Topic_Lock)topic_lock,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -413,8 +475,10 @@ static void tox_group_voice_state_handler(const Messenger *m, uint32_t group_num
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_voice_state_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_voice_state_callback(tox_data->tox, group_number, (Tox_Group_Voice_State)voice_state,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -425,7 +489,9 @@ static void tox_group_peer_limit_handler(const Messenger *m, uint32_t group_numb
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_peer_limit_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_peer_limit_callback(tox_data->tox, group_number, peer_limit, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -436,8 +502,10 @@ static void tox_group_privacy_state_handler(const Messenger *m, uint32_t group_n
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_privacy_state_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_privacy_state_callback(tox_data->tox, group_number, (Tox_Group_Privacy_State)privacy_state,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -448,55 +516,64 @@ static void tox_group_password_handler(const Messenger *m, uint32_t group_number
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_password_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_password_callback(tox_data->tox, group_number, password, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1, 5) nullable(8)
-static void tox_group_message_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id, unsigned int type,
+static void tox_group_message_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id, unsigned int type,
const uint8_t *message, size_t length, uint32_t message_id, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_message_callback != nullptr) {
- tox_data->tox->group_message_callback(tox_data->tox, group_number, peer_id, (Tox_Message_Type)type, message, length,
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_message_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), (Tox_Message_Type)type, message, length,
message_id, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1, 5) nullable(7)
-static void tox_group_private_message_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id,
+static void tox_group_private_message_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
unsigned int type, const uint8_t *message, size_t length, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_private_message_callback != nullptr) {
- tox_data->tox->group_private_message_callback(tox_data->tox, group_number, peer_id, (Tox_Message_Type)type, message,
- length,
- tox_data->user_data);
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_private_message_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), (Tox_Message_Type)type, message,
+ length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1, 4) nullable(6)
-static void tox_group_custom_packet_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id,
+static void tox_group_custom_packet_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
const uint8_t *data, size_t length, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_custom_packet_callback != nullptr) {
- tox_data->tox->group_custom_packet_callback(tox_data->tox, group_number, peer_id, data, length, tox_data->user_data);
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_custom_packet_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), data, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1, 4) nullable(6)
-static void tox_group_custom_private_packet_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id,
+static void tox_group_custom_private_packet_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
const uint8_t *data, size_t length, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_custom_private_packet_callback != nullptr) {
- tox_data->tox->group_custom_private_packet_callback(tox_data->tox, group_number, peer_id, data, length,
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_custom_private_packet_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), data, length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -507,32 +584,38 @@ static void tox_group_invite_handler(const Messenger *m, uint32_t friend_number,
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_invite_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_invite_callback(tox_data->tox, friend_number, invite_data, length, group_name, group_name_length,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1) nullable(4)
-static void tox_group_peer_join_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id, void *user_data)
+static void tox_group_peer_join_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_peer_join_callback != nullptr) {
- tox_data->tox->group_peer_join_callback(tox_data->tox, group_number, peer_id, tox_data->user_data);
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_peer_join_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1, 5) nullable(7, 9)
-static void tox_group_peer_exit_handler(const Messenger *m, uint32_t group_number, uint32_t peer_id,
+static void tox_group_peer_exit_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
unsigned int exit_type, const uint8_t *name, size_t name_length,
const uint8_t *part_message, size_t length, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_peer_exit_callback != nullptr) {
- tox_data->tox->group_peer_exit_callback(tox_data->tox, group_number, peer_id, (Tox_Group_Exit_Type) exit_type, name,
- name_length,
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_peer_exit_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id),
+ (Tox_Group_Exit_Type)exit_type, name, name_length,
part_message, length, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -542,7 +625,9 @@ static void tox_group_self_join_handler(const Messenger *m, uint32_t group_numbe
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_self_join_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_self_join_callback(tox_data->tox, group_number, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
@@ -553,24 +638,27 @@ static void tox_group_join_fail_handler(const Messenger *m, uint32_t group_numbe
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_join_fail_callback != nullptr) {
+ tox_unlock(tox_data->tox);
tox_data->tox->group_join_fail_callback(tox_data->tox, group_number, (Tox_Group_Join_Fail)fail_type,
tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
non_null(1) nullable(6)
-static void tox_group_moderation_handler(const Messenger *m, uint32_t group_number, uint32_t source_peer_number,
- uint32_t target_peer_number, unsigned int mod_type, void *user_data)
+static void tox_group_moderation_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id source_peer_number,
+ GC_Peer_Id target_peer_number, unsigned int mod_type, void *user_data)
{
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
if (tox_data->tox->group_moderation_callback != nullptr) {
- tox_data->tox->group_moderation_callback(tox_data->tox, group_number, source_peer_number, target_peer_number,
- (Tox_Group_Mod_Event)mod_type,
- tox_data->user_data);
+ tox_unlock(tox_data->tox);
+ tox_data->tox->group_moderation_callback(tox_data->tox, group_number,
+ gc_peer_id_to_int(source_peer_number), gc_peer_id_to_int(target_peer_number),
+ (Tox_Group_Mod_Event)mod_type, tox_data->user_data);
+ tox_lock(tox_data->tox);
}
}
-#endif
bool tox_version_is_compatible(uint32_t major, uint32_t minor, uint32_t patch)
{
@@ -626,18 +714,6 @@ static int tox_load(Tox *tox, const uint8_t *data, uint32_t length)
Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
{
- Tox *tox = (Tox *)calloc(1, sizeof(Tox));
-
- if (tox == nullptr) {
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
- return nullptr;
- }
-
- Messenger_Options m_options = {0};
-
- bool load_savedata_sk = false;
- bool load_savedata_tox = false;
-
struct Tox_Options *default_options = nullptr;
if (options == nullptr) {
@@ -646,12 +722,12 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
switch (err) {
case TOX_ERR_OPTIONS_NEW_OK: {
+ assert(default_options != nullptr);
break;
}
case TOX_ERR_OPTIONS_NEW_MALLOC: {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
- free(tox);
return nullptr;
}
}
@@ -660,11 +736,29 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
const struct Tox_Options *const opts = options != nullptr ? options : default_options;
assert(opts != nullptr);
+ const Tox_System *sys = tox_options_get_operating_system(opts);
+ const Tox_System default_system = tox_default_system();
+
+ if (sys == nullptr) {
+ sys = &default_system;
+ }
+
+ if (sys->rng == nullptr || sys->ns == nullptr || sys->mem == nullptr) {
+ // TODO(iphydf): Not quite right, but similar.
+ SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ tox_options_free(default_options);
+ return nullptr;
+ }
+
+ Messenger_Options m_options = {false};
+
+ bool load_savedata_sk = false;
+ bool load_savedata_tox = false;
+
if (tox_options_get_savedata_type(opts) != TOX_SAVEDATA_TYPE_NONE) {
if (tox_options_get_savedata_data(opts) == nullptr || tox_options_get_savedata_length(opts) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
}
@@ -673,7 +767,6 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
if (tox_options_get_savedata_length(opts) != TOX_SECRET_KEY_SIZE) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
@@ -682,14 +775,12 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
if (tox_options_get_savedata_length(opts) < TOX_ENC_SAVE_MAGIC_LENGTH) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
if (memcmp(tox_options_get_savedata_data(opts), TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_ENCRYPTED);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
@@ -704,11 +795,20 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
m_options.hole_punching_enabled = tox_options_get_hole_punching_enabled(opts);
m_options.local_discovery_enabled = tox_options_get_local_discovery_enabled(opts);
m_options.dht_announcements_enabled = tox_options_get_dht_announcements_enabled(opts);
+ m_options.groups_persistence_enabled = tox_options_get_experimental_groups_persistence(opts);
if (m_options.udp_disabled) {
m_options.local_discovery_enabled = false;
}
+ Tox *tox = (Tox *)mem_alloc(sys->mem, sizeof(Tox));
+
+ if (tox == nullptr) {
+ SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ tox_options_free(default_options);
+ return nullptr;
+ }
+
tox->log_callback = tox_options_get_log_callback(opts);
m_options.log_callback = tox_log_handler;
m_options.log_context = tox;
@@ -732,35 +832,19 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
default: {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_TYPE);
+ mem_delete(sys->mem, tox);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
}
- const Tox_System *sys = tox_options_get_operating_system(opts);
- const Tox_System default_system = tox_default_system();
-
- if (sys == nullptr) {
- sys = &default_system;
- }
-
- if (sys->rng == nullptr || sys->ns == nullptr) {
- // TODO(iphydf): Not quite right, but similar.
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
- tox_options_free(default_options);
- free(tox);
- return nullptr;
- }
-
- tox->rng = *sys->rng;
- tox->ns = *sys->ns;
+ tox->sys = *sys;
if (m_options.proxy_info.proxy_type != TCP_PROXY_NONE) {
if (tox_options_get_proxy_port(opts) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_PORT);
+ mem_delete(sys->mem, tox);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
@@ -773,42 +857,39 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
const char *const proxy_host = tox_options_get_proxy_host(opts);
if (proxy_host == nullptr
- || !addr_resolve_or_parse_ip(&tox->ns, proxy_host, &m_options.proxy_info.ip_port.ip, nullptr)) {
+ || !addr_resolve_or_parse_ip(tox->sys.ns, proxy_host, &m_options.proxy_info.ip_port.ip, nullptr)) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_HOST);
// TODO(irungentoo): TOX_ERR_NEW_PROXY_NOT_FOUND if domain.
+ mem_delete(sys->mem, tox);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
m_options.proxy_info.ip_port.port = net_htons(tox_options_get_proxy_port(opts));
}
- tox->mono_time = mono_time_new(sys->mono_time_callback, sys->mono_time_user_data);
+ tox->mono_time = mono_time_new(tox->sys.mem, sys->mono_time_callback, sys->mono_time_user_data);
if (tox->mono_time == nullptr) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ mem_delete(sys->mem, tox);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
if (tox_options_get_experimental_thread_safety(opts)) {
- tox->mutex = (pthread_mutex_t *)calloc(1, sizeof(pthread_mutex_t));
+ pthread_mutex_t *mutex = (pthread_mutex_t *)mem_alloc(sys->mem, sizeof(pthread_mutex_t));
- if (tox->mutex == nullptr) {
+ if (mutex == nullptr) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ mem_delete(sys->mem, tox);
tox_options_free(default_options);
- free(tox);
return nullptr;
}
+ pthread_mutex_init(mutex, nullptr);
- pthread_mutexattr_t attr;
-
- pthread_mutexattr_init(&attr);
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(tox->mutex, &attr);
+ tox->mutex = mutex;
} else {
tox->mutex = nullptr;
}
@@ -816,56 +897,77 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
tox_lock(tox);
Messenger_Error m_error;
- tox->m = new_messenger(tox->mono_time, &tox->rng, &tox->ns, &m_options, &m_error);
+ tox->m = new_messenger(tox->mono_time, tox->sys.mem, tox->sys.rng, tox->sys.ns, &m_options, &m_error);
if (tox->m == nullptr) {
- if (m_error == MESSENGER_ERROR_PORT) {
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PORT_ALLOC);
- } else if (m_error == MESSENGER_ERROR_TCP_SERVER) {
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PORT_ALLOC);
- } else {
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ switch (m_error) {
+ case MESSENGER_ERROR_PORT:
+ case MESSENGER_ERROR_TCP_SERVER: {
+ SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PORT_ALLOC);
+ break;
+ }
+ case MESSENGER_ERROR_OTHER:
+ case MESSENGER_ERROR_NONE: {
+ SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ break;
+ }
}
- mono_time_free(tox->mono_time);
- tox_options_free(default_options);
+ mono_time_free(tox->sys.mem, tox->mono_time);
tox_unlock(tox);
if (tox->mutex != nullptr) {
pthread_mutex_destroy(tox->mutex);
}
- free(tox->mutex);
- free(tox);
+ mem_delete(sys->mem, tox->mutex);
+ mem_delete(sys->mem, tox);
+ tox_options_free(default_options);
return nullptr;
}
- if (new_groupchats(tox->mono_time, tox->m) == nullptr) {
+ tox->m->conferences_object = new_groupchats(tox->mono_time, tox->m);
+
+ if (tox->m->conferences_object == nullptr) {
kill_messenger(tox->m);
- mono_time_free(tox->mono_time);
- tox_options_free(default_options);
+ mono_time_free(tox->sys.mem, tox->mono_time);
tox_unlock(tox);
if (tox->mutex != nullptr) {
pthread_mutex_destroy(tox->mutex);
}
- free(tox->mutex);
- free(tox);
+ mem_delete(sys->mem, tox->mutex);
+ mem_delete(sys->mem, tox);
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
+ tox_options_free(default_options);
return nullptr;
}
if (load_savedata_tox
&& tox_load(tox, tox_options_get_savedata_data(opts), tox_options_get_savedata_length(opts)) == -1) {
+ kill_groupchats(tox->m->conferences_object);
+ kill_messenger(tox->m);
+
+ mono_time_free(tox->sys.mem, tox->mono_time);
+ tox_unlock(tox);
+
+ if (tox->mutex != nullptr) {
+ pthread_mutex_destroy(tox->mutex);
+ }
+
+ mem_delete(sys->mem, tox->mutex);
+ mem_delete(sys->mem, tox);
+
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
- } else if (load_savedata_sk) {
+ tox_options_free(default_options);
+ return nullptr;
+ }
+
+ if (load_savedata_sk) {
load_secret_key(tox->m->net_crypto, tox_options_get_savedata_data(opts));
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_OK);
- } else {
- SET_ERROR_PARAMETER(error, TOX_ERR_NEW_OK);
}
m_callback_namechange(tox->m, tox_friend_name_handler);
@@ -891,7 +993,6 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
custom_lossy_packet_registerhandler(tox->m, tox_friend_lossy_packet_handler);
custom_lossless_packet_registerhandler(tox->m, tox_friend_lossless_packet_handler);
-#ifndef VANILLA_NACL
m_callback_group_invite(tox->m, tox_group_invite_handler);
gc_callback_message(tox->m, tox_group_message_handler);
gc_callback_private_message(tox->m, tox_group_private_message_handler);
@@ -910,11 +1011,12 @@ Tox *tox_new(const struct Tox_Options *options, Tox_Err_New *error)
gc_callback_self_join(tox->m, tox_group_self_join_handler);
gc_callback_rejected(tox->m, tox_group_join_fail_handler);
gc_callback_voice_state(tox->m, tox_group_voice_state_handler);
-#endif
-
- tox_options_free(default_options);
tox_unlock(tox);
+
+ SET_ERROR_PARAMETER(error, TOX_ERR_NEW_OK);
+
+ tox_options_free(default_options);
return tox;
}
@@ -928,15 +1030,15 @@ void tox_kill(Tox *tox)
LOGGER_ASSERT(tox->m->log, tox->m->msi_packet == nullptr, "Attempted to kill tox while toxav is still alive");
kill_groupchats(tox->m->conferences_object);
kill_messenger(tox->m);
- mono_time_free(tox->mono_time);
+ mono_time_free(tox->sys.mem, tox->mono_time);
tox_unlock(tox);
if (tox->mutex != nullptr) {
pthread_mutex_destroy(tox->mutex);
- free(tox->mutex);
+ mem_delete(tox->sys.mem, tox->mutex);
}
- free(tox);
+ mem_delete(tox->sys.mem, tox);
}
static uint32_t end_size(void)
@@ -970,14 +1072,14 @@ void tox_get_savedata(const Tox *tox, uint8_t *savedata)
return;
}
- memset(savedata, 0, tox_get_savedata_size(tox));
+ memzero(savedata, tox_get_savedata_size(tox));
tox_lock(tox);
const uint32_t size32 = sizeof(uint32_t);
// write cookie
- memset(savedata, 0, size32);
+ memzero(savedata, size32);
savedata += size32;
host_to_lendian_bytes32(savedata, STATE_COOKIE_GLOBAL);
savedata += size32;
@@ -990,7 +1092,7 @@ void tox_get_savedata(const Tox *tox, uint8_t *savedata)
}
non_null(5) nullable(1, 2, 4, 6)
-static int32_t resolve_bootstrap_node(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key,
+static int32_t resolve_bootstrap_node(Tox *tox, const char *host, uint16_t port, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE],
IP_Port **root, Tox_Err_Bootstrap *error)
{
assert(tox != nullptr);
@@ -1006,11 +1108,11 @@ static int32_t resolve_bootstrap_node(Tox *tox, const char *host, uint16_t port,
return -1;
}
- const int32_t count = net_getipport(host, root, TOX_SOCK_DGRAM);
+ const int32_t count = net_getipport(tox->sys.mem, host, root, TOX_SOCK_DGRAM);
if (count < 1) {
LOGGER_DEBUG(tox->m->log, "could not resolve bootstrap node '%s'", host);
- net_freeipport(*root);
+ net_freeipport(tox->sys.mem, *root);
SET_ERROR_PARAMETER(error, TOX_ERR_BOOTSTRAP_BAD_HOST);
return -1;
}
@@ -1019,7 +1121,7 @@ static int32_t resolve_bootstrap_node(Tox *tox, const char *host, uint16_t port,
return count;
}
-bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, Tox_Err_Bootstrap *error)
+bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE], Tox_Err_Bootstrap *error)
{
IP_Port *root;
const int32_t count = resolve_bootstrap_node(tox, host, port, public_key, &root, error);
@@ -1035,6 +1137,11 @@ bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *pub
bool udp_success = tox->m->options.udp_disabled;
for (int32_t i = 0; i < count; ++i) {
+ if (!tox->m->options.ipv6enabled && net_family_is_ipv6(root[i].ip.family)) {
+ // We can't use ipv6 when it's disabled.
+ continue;
+ }
+
root[i].port = net_htons(port);
if (onion_add_bs_path_node(tox->m->onion_c, &root[i], public_key)) {
@@ -1054,7 +1161,7 @@ bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *pub
tox_unlock(tox);
- net_freeipport(root);
+ net_freeipport(tox->sys.mem, root);
if (count == 0 || !onion_success || !udp_success) {
LOGGER_DEBUG(tox->m->log, "bootstrap node '%s' resolved to %d IP_Ports%s (onion: %s, UDP: %s)",
@@ -1070,7 +1177,7 @@ bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *pub
return true;
}
-bool tox_add_tcp_relay(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key,
+bool tox_add_tcp_relay(Tox *tox, const char *host, uint16_t port, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE],
Tox_Err_Bootstrap *error)
{
IP_Port *root;
@@ -1091,7 +1198,7 @@ bool tox_add_tcp_relay(Tox *tox, const char *host, uint16_t port, const uint8_t
tox_unlock(tox);
- net_freeipport(root);
+ net_freeipport(tox->sys.mem, root);
if (count == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_BOOTSTRAP_BAD_HOST);
@@ -1124,7 +1231,6 @@ Tox_Connection tox_self_get_connection_status(const Tox *tox)
return TOX_CONNECTION_NONE;
}
-
void tox_callback_self_connection_status(Tox *tox, tox_self_connection_status_cb *callback)
{
assert(tox != nullptr);
@@ -1159,7 +1265,7 @@ void tox_iterate(Tox *tox, void *user_data)
tox_unlock(tox);
}
-void tox_self_get_address(const Tox *tox, uint8_t *address)
+void tox_self_get_address(const Tox *tox, uint8_t address[TOX_ADDRESS_SIZE])
{
assert(tox != nullptr);
@@ -1187,7 +1293,7 @@ uint32_t tox_self_get_nospam(const Tox *tox)
return ret;
}
-void tox_self_get_public_key(const Tox *tox, uint8_t *public_key)
+void tox_self_get_public_key(const Tox *tox, uint8_t public_key[TOX_PUBLIC_KEY_SIZE])
{
assert(tox != nullptr);
@@ -1198,7 +1304,7 @@ void tox_self_get_public_key(const Tox *tox, uint8_t *public_key)
}
}
-void tox_self_get_secret_key(const Tox *tox, uint8_t *secret_key)
+void tox_self_get_secret_key(const Tox *tox, uint8_t secret_key[TOX_SECRET_KEY_SIZE])
{
assert(tox != nullptr);
@@ -1359,7 +1465,7 @@ static void set_friend_error(const Logger *log, int32_t ret, Tox_Err_Friend_Add
}
}
-uint32_t tox_friend_add(Tox *tox, const uint8_t *address, const uint8_t *message, size_t length,
+uint32_t tox_friend_add(Tox *tox, const uint8_t address[TOX_ADDRESS_SIZE], const uint8_t *message, size_t length,
Tox_Err_Friend_Add *error)
{
assert(tox != nullptr);
@@ -1383,7 +1489,7 @@ uint32_t tox_friend_add(Tox *tox, const uint8_t *address, const uint8_t *message
return UINT32_MAX;
}
-uint32_t tox_friend_add_norequest(Tox *tox, const uint8_t *public_key, Tox_Err_Friend_Add *error)
+uint32_t tox_friend_add_norequest(Tox *tox, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE], Tox_Err_Friend_Add *error)
{
assert(tox != nullptr);
@@ -1423,7 +1529,7 @@ bool tox_friend_delete(Tox *tox, uint32_t friend_number, Tox_Err_Friend_Delete *
return true;
}
-uint32_t tox_friend_by_public_key(const Tox *tox, const uint8_t *public_key, Tox_Err_Friend_By_Public_Key *error)
+uint32_t tox_friend_by_public_key(const Tox *tox, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE], Tox_Err_Friend_By_Public_Key *error)
{
assert(tox != nullptr);
@@ -1446,7 +1552,7 @@ uint32_t tox_friend_by_public_key(const Tox *tox, const uint8_t *public_key, Tox
return (uint32_t)ret;
}
-bool tox_friend_get_public_key(const Tox *tox, uint32_t friend_number, uint8_t *public_key,
+bool tox_friend_get_public_key(const Tox *tox, uint32_t friend_number, uint8_t public_key[TOX_PUBLIC_KEY_SIZE],
Tox_Err_Friend_Get_Public_Key *error)
{
assert(tox != nullptr);
@@ -1772,7 +1878,7 @@ void tox_callback_friend_message(Tox *tox, tox_friend_message_cb *callback)
tox->friend_message_callback = callback;
}
-bool tox_hash(uint8_t *hash, const uint8_t *data, size_t length)
+bool tox_hash(uint8_t hash[TOX_HASH_LENGTH], const uint8_t *data, size_t length)
{
if (hash == nullptr || (data == nullptr && length != 0)) {
return false;
@@ -1902,7 +2008,7 @@ void tox_callback_file_recv_control(Tox *tox, tox_file_recv_control_cb *callback
tox->file_recv_control_callback = callback;
}
-bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_number, uint8_t *file_id,
+bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_number, uint8_t file_id[TOX_FILE_ID_LENGTH],
Tox_Err_File_Get *error)
{
assert(tox != nullptr);
@@ -1930,7 +2036,7 @@ bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_
return false;
}
-uint32_t tox_file_send(Tox *tox, uint32_t friend_number, uint32_t kind, uint64_t file_size, const uint8_t *file_id,
+uint32_t tox_file_send(Tox *tox, uint32_t friend_number, uint32_t kind, uint64_t file_size, const uint8_t file_id[TOX_FILE_ID_LENGTH],
const uint8_t *filename, size_t filename_length, Tox_Err_File_Send *error)
{
assert(tox != nullptr);
@@ -1944,7 +2050,7 @@ uint32_t tox_file_send(Tox *tox, uint32_t friend_number, uint32_t kind, uint64_t
if (file_id == nullptr) {
/* Tox keys are 32 bytes like FILE_ID_LENGTH. */
- new_symmetric_key(&tox->rng, f_id);
+ new_symmetric_key(tox->sys.rng, f_id);
file_id = f_id;
}
@@ -2099,7 +2205,7 @@ uint32_t tox_conference_new(Tox *tox, Tox_Err_Conference_New *error)
{
assert(tox != nullptr);
tox_lock(tox);
- const int ret = add_groupchat(tox->m->conferences_object, &tox->rng, GROUPCHAT_TYPE_TEXT);
+ const int ret = add_groupchat(tox->m->conferences_object, tox->sys.rng, GROUPCHAT_TYPE_TEXT);
tox_unlock(tox);
if (ret == -1) {
@@ -2192,7 +2298,7 @@ bool tox_conference_peer_get_name(const Tox *tox, uint32_t conference_number, ui
}
bool tox_conference_peer_get_public_key(const Tox *tox, uint32_t conference_number, uint32_t peer_number,
- uint8_t *public_key, Tox_Err_Conference_Peer_Query *error)
+ uint8_t public_key[TOX_PUBLIC_KEY_SIZE], Tox_Err_Conference_Peer_Query *error)
{
assert(tox != nullptr);
tox_lock(tox);
@@ -2313,7 +2419,7 @@ bool tox_conference_offline_peer_get_name(const Tox *tox, uint32_t conference_nu
bool tox_conference_offline_peer_get_public_key(const Tox *tox, uint32_t conference_number,
uint32_t offline_peer_number,
- uint8_t *public_key, Tox_Err_Conference_Peer_Query *error)
+ uint8_t public_key[TOX_PUBLIC_KEY_SIZE], Tox_Err_Conference_Peer_Query *error)
{
assert(tox != nullptr);
tox_lock(tox);
@@ -2364,12 +2470,12 @@ uint64_t tox_conference_offline_peer_get_last_active(const Tox *tox, uint32_t co
}
bool tox_conference_set_max_offline(Tox *tox, uint32_t conference_number,
- uint32_t max_offline_peers,
+ uint32_t max_offline,
Tox_Err_Conference_Set_Max_Offline *error)
{
assert(tox != nullptr);
tox_lock(tox);
- const int ret = group_set_max_frozen(tox->m->conferences_object, conference_number, max_offline_peers);
+ const int ret = group_set_max_frozen(tox->m->conferences_object, conference_number, max_offline);
tox_unlock(tox);
if (ret == -1) {
@@ -2606,7 +2712,7 @@ Tox_Conference_Type tox_conference_get_type(const Tox *tox, uint32_t conference_
return (Tox_Conference_Type)ret;
}
-bool tox_conference_get_id(const Tox *tox, uint32_t conference_number, uint8_t *id)
+bool tox_conference_get_id(const Tox *tox, uint32_t conference_number, uint8_t id[TOX_CONFERENCE_ID_SIZE])
{
assert(tox != nullptr);
tox_lock(tox);
@@ -2616,13 +2722,13 @@ bool tox_conference_get_id(const Tox *tox, uint32_t conference_number, uint8_t *
}
// TODO(iphydf): Delete in 0.3.0.
-bool tox_conference_get_uid(const Tox *tox, uint32_t conference_number, uint8_t *uid)
+bool tox_conference_get_uid(const Tox *tox, uint32_t conference_number, uint8_t uid[TOX_CONFERENCE_UID_SIZE])
{
assert(tox != nullptr);
return tox_conference_get_id(tox, conference_number, uid);
}
-uint32_t tox_conference_by_id(const Tox *tox, const uint8_t *id, Tox_Err_Conference_By_Id *error)
+uint32_t tox_conference_by_id(const Tox *tox, const uint8_t id[TOX_CONFERENCE_ID_SIZE], Tox_Err_Conference_By_Id *error)
{
assert(tox != nullptr);
@@ -2646,7 +2752,7 @@ uint32_t tox_conference_by_id(const Tox *tox, const uint8_t *id, Tox_Err_Confere
}
// TODO(iphydf): Delete in 0.3.0.
-uint32_t tox_conference_by_uid(const Tox *tox, const uint8_t *uid, Tox_Err_Conference_By_Uid *error)
+uint32_t tox_conference_by_uid(const Tox *tox, const uint8_t uid[TOX_CONFERENCE_UID_SIZE], Tox_Err_Conference_By_Uid *error)
{
assert(tox != nullptr);
Tox_Err_Conference_By_Id id_error;
@@ -2708,6 +2814,7 @@ static void set_custom_packet_error(int ret, Tox_Err_Friend_Custom_Packet *error
}
}
+// cppcheck-suppress constParameterPointer
bool tox_friend_send_lossy_packet(Tox *tox, uint32_t friend_number, const uint8_t *data, size_t length,
Tox_Err_Friend_Custom_Packet *error)
{
@@ -2747,6 +2854,7 @@ void tox_callback_friend_lossy_packet(Tox *tox, tox_friend_lossy_packet_cb *call
}
}
+// cppcheck-suppress constParameterPointer
bool tox_friend_send_lossless_packet(Tox *tox, uint32_t friend_number, const uint8_t *data, size_t length,
Tox_Err_Friend_Custom_Packet *error)
{
@@ -2780,7 +2888,7 @@ void tox_callback_friend_lossless_packet(Tox *tox, tox_friend_lossless_packet_cb
}
}
-void tox_self_get_dht_id(const Tox *tox, uint8_t *dht_id)
+void tox_self_get_dht_id(const Tox *tox, uint8_t dht_id[TOX_PUBLIC_KEY_SIZE])
{
assert(tox != nullptr);
@@ -2795,7 +2903,7 @@ uint16_t tox_self_get_udp_port(const Tox *tox, Tox_Err_Get_Port *error)
{
assert(tox != nullptr);
tox_lock(tox);
- const uint16_t port = net_htons(net_port(tox->m->net));
+ const uint16_t port = tox->m == nullptr || tox->m->net == nullptr ? 0 : net_htons(net_port(tox->m->net));
tox_unlock(tox);
if (port == 0) {
@@ -2812,7 +2920,7 @@ uint16_t tox_self_get_tcp_port(const Tox *tox, Tox_Err_Get_Port *error)
assert(tox != nullptr);
tox_lock(tox);
- if (tox->m->tcp_server != nullptr) {
+ if (tox->m != nullptr && tox->m->tcp_server != nullptr) {
SET_ERROR_PARAMETER(error, TOX_ERR_GET_PORT_OK);
const uint16_t ret = tox->m->options.tcp_server_port;
tox_unlock(tox);
@@ -2826,7 +2934,6 @@ uint16_t tox_self_get_tcp_port(const Tox *tox, Tox_Err_Get_Port *error)
/* GROUPCHAT FUNCTIONS */
-#ifndef VANILLA_NACL
void tox_callback_group_invite(Tox *tox, tox_group_invite_cb *callback)
{
assert(tox != nullptr);
@@ -2983,7 +3090,7 @@ uint32_t tox_group_new(Tox *tox, Tox_Group_Privacy_State privacy_state, const ui
return UINT32_MAX;
}
-uint32_t tox_group_join(Tox *tox, const uint8_t *chat_id, const uint8_t *name, size_t name_length,
+uint32_t tox_group_join(Tox *tox, const uint8_t chat_id[TOX_GROUP_CHAT_ID_SIZE], const uint8_t *name, size_t name_length,
const uint8_t *password, size_t password_length, Tox_Err_Group_Join *error)
{
assert(tox != nullptr);
@@ -3075,7 +3182,6 @@ bool tox_group_disconnect(const Tox *tox, uint32_t group_number, Tox_Err_Group_D
return false;
}
-
const bool ret = gc_disconnect_from_group(tox->m->group_handler, chat);
tox_unlock(tox);
@@ -3169,7 +3275,7 @@ bool tox_group_leave(Tox *tox, uint32_t group_number, const uint8_t *part_messag
return false;
}
-bool tox_group_self_set_name(const Tox *tox, uint32_t group_number, const uint8_t *name, size_t length,
+bool tox_group_self_set_name(Tox *tox, uint32_t group_number, const uint8_t *name, size_t length,
Tox_Err_Group_Self_Name_Set *error)
{
assert(tox != nullptr);
@@ -3253,7 +3359,7 @@ bool tox_group_self_get_name(const Tox *tox, uint32_t group_number, uint8_t *nam
return true;
}
-bool tox_group_self_set_status(const Tox *tox, uint32_t group_number, Tox_User_Status status,
+bool tox_group_self_set_status(Tox *tox, uint32_t group_number, Tox_User_Status status,
Tox_Err_Group_Self_Status_Set *error)
{
assert(tox != nullptr);
@@ -3342,13 +3448,13 @@ uint32_t tox_group_self_get_peer_id(const Tox *tox, uint32_t group_number, Tox_E
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SELF_QUERY_OK);
- const uint32_t ret = gc_get_self_peer_id(chat);
+ const GC_Peer_Id ret = gc_get_self_peer_id(chat);
tox_unlock(tox);
- return ret;
+ return gc_peer_id_to_int(ret);
}
-bool tox_group_self_get_public_key(const Tox *tox, uint32_t group_number, uint8_t *public_key,
+bool tox_group_self_get_public_key(const Tox *tox, uint32_t group_number, uint8_t public_key[TOX_PUBLIC_KEY_SIZE],
Tox_Err_Group_Self_Query *error)
{
assert(tox != nullptr);
@@ -3384,7 +3490,7 @@ size_t tox_group_peer_get_name_size(const Tox *tox, uint32_t group_number, uint3
return -1;
}
- const int ret = gc_get_peer_nick_size(chat, peer_id);
+ const int ret = gc_get_peer_nick_size(chat, gc_peer_id_from_int(peer_id));
tox_unlock(tox);
if (ret == -1) {
@@ -3410,7 +3516,7 @@ bool tox_group_peer_get_name(const Tox *tox, uint32_t group_number, uint32_t pee
return false;
}
- const bool ret = gc_get_peer_nick(chat, peer_id, name);
+ const bool ret = gc_get_peer_nick(chat, gc_peer_id_from_int(peer_id), name);
tox_unlock(tox);
if (!ret) {
@@ -3436,7 +3542,7 @@ Tox_User_Status tox_group_peer_get_status(const Tox *tox, uint32_t group_number,
return (Tox_User_Status) - 1;
}
- const uint8_t ret = gc_get_status(chat, peer_id);
+ const uint8_t ret = gc_get_status(chat, gc_peer_id_from_int(peer_id));
tox_unlock(tox);
if (ret == UINT8_MAX) {
@@ -3462,7 +3568,7 @@ Tox_Group_Role tox_group_peer_get_role(const Tox *tox, uint32_t group_number, ui
return (Tox_Group_Role) - 1;
}
- const uint8_t ret = gc_get_role(chat, peer_id);
+ const uint8_t ret = gc_get_role(chat, gc_peer_id_from_int(peer_id));
tox_unlock(tox);
if (ret == (uint8_t) -1) {
@@ -3474,7 +3580,7 @@ Tox_Group_Role tox_group_peer_get_role(const Tox *tox, uint32_t group_number, ui
return (Tox_Group_Role)ret;
}
-bool tox_group_peer_get_public_key(const Tox *tox, uint32_t group_number, uint32_t peer_id, uint8_t *public_key,
+bool tox_group_peer_get_public_key(const Tox *tox, uint32_t group_number, uint32_t peer_id, uint8_t public_key[TOX_PUBLIC_KEY_SIZE],
Tox_Err_Group_Peer_Query *error)
{
assert(tox != nullptr);
@@ -3488,7 +3594,7 @@ bool tox_group_peer_get_public_key(const Tox *tox, uint32_t group_number, uint32
return false;
}
- const int ret = gc_get_peer_public_key_by_peer_id(chat, peer_id, public_key);
+ const int ret = gc_get_peer_public_key_by_peer_id(chat, gc_peer_id_from_int(peer_id), public_key);
tox_unlock(tox);
if (ret == -1) {
@@ -3514,7 +3620,7 @@ Tox_Connection tox_group_peer_get_connection_status(const Tox *tox, uint32_t gro
return TOX_CONNECTION_NONE;
}
- const unsigned int ret = gc_get_peer_connection_status(chat, peer_id);
+ const unsigned int ret = gc_get_peer_connection_status(chat, gc_peer_id_from_int(peer_id));
tox_unlock(tox);
if (ret == 0) {
@@ -3526,7 +3632,7 @@ Tox_Connection tox_group_peer_get_connection_status(const Tox *tox, uint32_t gro
return (Tox_Connection)ret;
}
-bool tox_group_set_topic(const Tox *tox, uint32_t group_number, const uint8_t *topic, size_t length,
+bool tox_group_set_topic(Tox *tox, uint32_t group_number, const uint8_t *topic, size_t length,
Tox_Err_Group_Topic_Set *error)
{
assert(tox != nullptr);
@@ -3644,7 +3750,7 @@ size_t tox_group_get_name_size(const Tox *tox, uint32_t group_number, Tox_Err_Gr
return ret;
}
-bool tox_group_get_name(const Tox *tox, uint32_t group_number, uint8_t *group_name, Tox_Err_Group_State_Queries *error)
+bool tox_group_get_name(const Tox *tox, uint32_t group_number, uint8_t *name, Tox_Err_Group_State_Queries *error)
{
assert(tox != nullptr);
@@ -3657,7 +3763,7 @@ bool tox_group_get_name(const Tox *tox, uint32_t group_number, uint8_t *group_na
return false;
}
- gc_get_group_name(chat, group_name);
+ gc_get_group_name(chat, name);
tox_unlock(tox);
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_STATE_QUERIES_OK);
@@ -3665,7 +3771,7 @@ bool tox_group_get_name(const Tox *tox, uint32_t group_number, uint8_t *group_na
return true;
}
-bool tox_group_get_chat_id(const Tox *tox, uint32_t group_number, uint8_t *chat_id, Tox_Err_Group_State_Queries *error)
+bool tox_group_get_chat_id(const Tox *tox, uint32_t group_number, uint8_t chat_id[TOX_GROUP_CHAT_ID_SIZE], Tox_Err_Group_State_Queries *error)
{
assert(tox != nullptr);
@@ -3825,8 +3931,9 @@ bool tox_group_get_password(const Tox *tox, uint32_t group_number, uint8_t *pass
return true;
}
-bool tox_group_send_message(const Tox *tox, uint32_t group_number, Tox_Message_Type type, const uint8_t *message,
- size_t length, uint32_t *message_id, Tox_Err_Group_Send_Message *error)
+Tox_Group_Message_Id tox_group_send_message(
+ const Tox *tox, uint32_t group_number, Tox_Message_Type type, const uint8_t *message,
+ size_t length, Tox_Err_Group_Send_Message *error)
{
assert(tox != nullptr);
@@ -3836,54 +3943,55 @@ bool tox_group_send_message(const Tox *tox, uint32_t group_number, Tox_Message_T
if (chat == nullptr) {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_GROUP_NOT_FOUND);
tox_unlock(tox);
- return false;
+ return -1;
}
if (chat->connection_state == CS_DISCONNECTED) {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_DISCONNECTED);
tox_unlock(tox);
- return false;
+ return -1;
}
- const int ret = gc_send_message(chat, message, length, type, message_id);
+ uint32_t message_id = 0;
+ const int ret = gc_send_message(chat, message, length, type, &message_id);
tox_unlock(tox);
switch (ret) {
case 0: {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_OK);
- return true;
+ return message_id;
}
case -1: {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_TOO_LONG);
- return false;
+ return -1;
}
case -2: {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_EMPTY);
- return false;
+ return -1;
}
case -3: {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_BAD_TYPE);
- return false;
+ return -1;
}
case -4: {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS);
- return false;
+ return -1;
}
case -5: {
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_MESSAGE_FAIL_SEND);
- return false;
+ return -1;
}
}
/* can't happen */
LOGGER_FATAL(tox->m->log, "impossible return value: %d", ret);
- return false;
+ return -1;
}
bool tox_group_send_private_message(const Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Message_Type type,
@@ -3906,7 +4014,7 @@ bool tox_group_send_private_message(const Tox *tox, uint32_t group_number, uint3
return false;
}
- const int ret = gc_send_private_message(chat, peer_id, type, message, length);
+ const int ret = gc_send_private_message(chat, gc_peer_id_from_int(peer_id), type, message, length);
tox_unlock(tox);
switch (ret) {
@@ -3995,6 +4103,11 @@ bool tox_group_send_custom_packet(const Tox *tox, uint32_t group_number, bool lo
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_CUSTOM_PACKET_PERMISSIONS);
return false;
}
+
+ case -4: {
+ SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_CUSTOM_PACKET_FAIL_SEND);
+ return false;
+ }
}
/* can't happen */
@@ -4024,7 +4137,7 @@ bool tox_group_send_custom_private_packet(const Tox *tox, uint32_t group_number,
return false;
}
- const int ret = gc_send_custom_private_packet(chat, lossless, peer_id, data, length);
+ const int ret = gc_send_custom_private_packet(chat, lossless, gc_peer_id_from_int(peer_id), data, length);
tox_unlock(tox);
switch (ret) {
@@ -4181,7 +4294,7 @@ uint32_t tox_group_invite_accept(Tox *tox, uint32_t friend_number, const uint8_t
return UINT32_MAX;
}
-bool tox_group_founder_set_password(const Tox *tox, uint32_t group_number, const uint8_t *password, size_t length,
+bool tox_group_founder_set_password(Tox *tox, uint32_t group_number, const uint8_t *password, size_t length,
Tox_Err_Group_Founder_Set_Password *error)
{
assert(tox != nullptr);
@@ -4237,7 +4350,7 @@ bool tox_group_founder_set_password(const Tox *tox, uint32_t group_number, const
return false;
}
-bool tox_group_founder_set_privacy_state(const Tox *tox, uint32_t group_number, Tox_Group_Privacy_State privacy_state,
+bool tox_group_founder_set_privacy_state(Tox *tox, uint32_t group_number, Tox_Group_Privacy_State privacy_state,
Tox_Err_Group_Founder_Set_Privacy_State *error)
{
assert(tox != nullptr);
@@ -4284,7 +4397,7 @@ bool tox_group_founder_set_privacy_state(const Tox *tox, uint32_t group_number,
return false;
}
-bool tox_group_founder_set_topic_lock(const Tox *tox, uint32_t group_number, Tox_Group_Topic_Lock topic_lock,
+bool tox_group_founder_set_topic_lock(Tox *tox, uint32_t group_number, Tox_Group_Topic_Lock topic_lock,
Tox_Err_Group_Founder_Set_Topic_Lock *error)
{
assert(tox != nullptr);
@@ -4336,7 +4449,7 @@ bool tox_group_founder_set_topic_lock(const Tox *tox, uint32_t group_number, Tox
return false;
}
-bool tox_group_founder_set_voice_state(const Tox *tox, uint32_t group_number, Tox_Group_Voice_State voice_state,
+bool tox_group_founder_set_voice_state(Tox *tox, uint32_t group_number, Tox_Group_Voice_State voice_state,
Tox_Err_Group_Founder_Set_Voice_State *error)
{
assert(tox != nullptr);
@@ -4383,7 +4496,7 @@ bool tox_group_founder_set_voice_state(const Tox *tox, uint32_t group_number, To
return false;
}
-bool tox_group_founder_set_peer_limit(const Tox *tox, uint32_t group_number, uint16_t max_peers,
+bool tox_group_founder_set_peer_limit(Tox *tox, uint32_t group_number, uint16_t peer_limit,
Tox_Err_Group_Founder_Set_Peer_Limit *error)
{
assert(tox != nullptr);
@@ -4403,7 +4516,7 @@ bool tox_group_founder_set_peer_limit(const Tox *tox, uint32_t group_number, uin
return false;
}
- const int ret = gc_founder_set_max_peers(chat, max_peers);
+ const int ret = gc_founder_set_max_peers(chat, peer_limit);
tox_unlock(tox);
switch (ret) {
@@ -4434,7 +4547,7 @@ bool tox_group_founder_set_peer_limit(const Tox *tox, uint32_t group_number, uin
return false;
}
-bool tox_group_set_ignore(const Tox *tox, uint32_t group_number, uint32_t peer_id, bool ignore,
+bool tox_group_set_ignore(Tox *tox, uint32_t group_number, uint32_t peer_id, bool ignore,
Tox_Err_Group_Set_Ignore *error)
{
assert(tox != nullptr);
@@ -4448,7 +4561,7 @@ bool tox_group_set_ignore(const Tox *tox, uint32_t group_number, uint32_t peer_i
return false;
}
- const int ret = gc_set_ignore(chat, peer_id, ignore);
+ const int ret = gc_set_ignore(chat, gc_peer_id_from_int(peer_id), ignore);
tox_unlock(tox);
switch (ret) {
@@ -4474,13 +4587,13 @@ bool tox_group_set_ignore(const Tox *tox, uint32_t group_number, uint32_t peer_i
return false;
}
-bool tox_group_mod_set_role(const Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Group_Role role,
+bool tox_group_mod_set_role(Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Group_Role role,
Tox_Err_Group_Mod_Set_Role *error)
{
assert(tox != nullptr);
tox_lock(tox);
- const int ret = gc_set_peer_role(tox->m, group_number, peer_id, (Group_Role) role);
+ const int ret = gc_set_peer_role(tox->m, group_number, gc_peer_id_from_int(peer_id), (Group_Role) role);
tox_unlock(tox);
switch (ret) {
@@ -4532,7 +4645,7 @@ bool tox_group_mod_kick_peer(const Tox *tox, uint32_t group_number, uint32_t pee
assert(tox != nullptr);
tox_lock(tox);
- const int ret = gc_kick_peer(tox->m, group_number, peer_id);
+ const int ret = gc_kick_peer(tox->m, group_number, gc_peer_id_from_int(peer_id));
tox_unlock(tox);
switch (ret) {
@@ -4578,5 +4691,8 @@ bool tox_group_mod_kick_peer(const Tox *tox, uint32_t group_number, uint32_t pee
return false;
}
-#endif /* VANILLA_NACL */
-
+const Tox_System *tox_get_system(Tox *tox)
+{
+ assert(tox != nullptr);
+ return &tox->sys;
+}