@ -1,24 +1,24 @@
# include "chat_sync.h"
# include "chat_sync.h"
# include "chat_core.h"
# include "chat_core.h"
# include "gui_bridge .h"
# include "chat_event .h"
# include "topo_node_sqlite.h"
# include "../routing_layer/ topo_node_sqlite.h"
# include "topo_group.h"
# include "../routing_layer/ topo_group.h"
# include "conn_mgr.h"
# include "../routing_layer/ conn_mgr.h"
# include "topo_group_connect.h"
# include "../routing_layer/ topo_group_connect.h"
# include "../../../ lib/json_flat.h"
# include "../../lib/json_flat.h"
# include "member_sync.h"
# include "member_sync.h"
# include "merkle_sync.h"
# include "merkle_sync.h"
# include "../../../src/ utun_instance.h"
# include "../utun_instance.h"
# include "etcp_api.h"
# include "../transport_layer/ etcp_api.h"
# include "etcp.h"
# include "../transport_layer/ etcp.h"
# include "secure_channel.h"
# include "../transport_layer/ secure_channel.h"
# include "../../../src/ ntp_time.h"
# include "../ntp_time.h"
# include "../../../ lib/u_async.h"
# include "../../lib/u_async.h"
# include "../../../ lib/ll_queue.h"
# include "../../lib/ll_queue.h"
# include "../../../ lib/debug_config.h"
# include "../../lib/debug_config.h"
# include "../../../ lib/mem.h"
# include "../../lib/mem.h"
# include "../../../ lib/platform_compat.h"
# include "../../lib/platform_compat.h"
# include <string.h>
# include <string.h>
# include <sqlite3.h>
# include <sqlite3.h>
@ -170,7 +170,7 @@ static void chat_sync_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) {
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: RECV ERROR from=%016llx ch=%s " , CS_ID , ( unsigned long long ) peer , ch_id ) ;
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: RECV ERROR from=%016llx ch=%s " , CS_ID , ( unsigned long long ) peer , ch_id ) ;
if ( g_cs - > info_req_timer ) { uasync_cancel_timeout ( g_cs - > inst - > ua , g_cs - > info_req_timer ) ; g_cs - > info_req_timer = NULL ; }
if ( g_cs - > info_req_timer ) { uasync_cancel_timeout ( g_cs - > inst - > ua , g_cs - > info_req_timer ) ; g_cs - > info_req_timer = NULL ; }
uint8_t err [ 20 ] ; memcpy ( err , & peer , 8 ) ; int r = CONN_MGR_ERR_NOT_FOUND ; memcpy ( err + 8 , & r , 4 ) ;
uint8_t err [ 20 ] ; memcpy ( err , & peer , 8 ) ; int r = CONN_MGR_ERR_NOT_FOUND ; memcpy ( err + 8 , & r , 4 ) ;
memcpy ( err + 12 , & g_cs - > pending_invite_ch_id , 8 ) ; gui_bridge_post ( GUI _EVT_CONNECT_RESULT, err , 20 ) ;
memcpy ( err + 12 , & g_cs - > pending_invite_ch_id , 8 ) ; chat_event_post ( CHAT _EVT_CONNECT_RESULT, err , 20 ) ;
g_cs - > pending_invite_node_id = 0 ; g_cs - > pending_invite_ch_id = 0 ;
g_cs - > pending_invite_node_id = 0 ; g_cs - > pending_invite_ch_id = 0 ;
break ;
break ;
}
}
@ -192,7 +192,7 @@ static void cs_info_req_timeout_cb(void* arg) {
uint8_t err [ 20 ] ; memcpy ( err , & cs - > pending_invite_node_id , 8 ) ;
uint8_t err [ 20 ] ; memcpy ( err , & cs - > pending_invite_node_id , 8 ) ;
int r = CONN_MGR_ERR_TIMEOUT ; memcpy ( err + 8 , & r , 4 ) ;
int r = CONN_MGR_ERR_TIMEOUT ; memcpy ( err + 8 , & r , 4 ) ;
memcpy ( err + 12 , & cs - > pending_invite_ch_id , 8 ) ;
memcpy ( err + 12 , & cs - > pending_invite_ch_id , 8 ) ;
gui_bridge_post ( GUI _EVT_CONNECT_RESULT, err , 20 ) ;
chat_event_post ( CHAT _EVT_CONNECT_RESULT, err , 20 ) ;
cs - > pending_invite_node_id = 0 ;
cs - > pending_invite_node_id = 0 ;
cs - > pending_invite_ch_id = 0 ;
cs - > pending_invite_ch_id = 0 ;
}
}
@ -207,7 +207,7 @@ static void cs_join_timeout_cb(void* arg) {
uint8_t err [ 20 ] ; memcpy ( err , & peer , 8 ) ;
uint8_t err [ 20 ] ; memcpy ( err , & peer , 8 ) ;
int r = CONN_MGR_ERR_TIMEOUT ; memcpy ( err + 8 , & r , 4 ) ;
int r = CONN_MGR_ERR_TIMEOUT ; memcpy ( err + 8 , & r , 4 ) ;
memcpy ( err + 12 , & cs - > pending_invite_ch_id , 8 ) ;
memcpy ( err + 12 , & cs - > pending_invite_ch_id , 8 ) ;
gui_bridge_post ( GUI _EVT_CONNECT_RESULT, err , 20 ) ;
chat_event_post ( CHAT _EVT_CONNECT_RESULT, err , 20 ) ;
cs - > pending_invite_node_id = 0 ;
cs - > pending_invite_node_id = 0 ;
cs - > pending_invite_ch_id = 0 ;
cs - > pending_invite_ch_id = 0 ;
}
}
@ -265,7 +265,7 @@ static void cs_post_channel_online(struct chat_sync* cs, const char* ch_id) {
uint8_t evt [ 66 ] ; evt [ 0 ] = ( uint8_t ) cl ;
uint8_t evt [ 66 ] ; evt [ 0 ] = ( uint8_t ) cl ;
memcpy ( evt + 1 , ch_id , cl ) ;
memcpy ( evt + 1 , ch_id , cl ) ;
uint16_t oc = ( uint16_t ) online ; memcpy ( evt + 1 + cl , & oc , 2 ) ;
uint16_t oc = ( uint16_t ) online ; memcpy ( evt + 1 + cl , & oc , 2 ) ;
gui_bridge_post ( GUI _EVT_CHANNEL_PEERS_ONLINE, evt , 1 + ( int ) cl + 2 ) ;
chat_event_post ( CHAT _EVT_CHANNEL_PEERS_ONLINE, evt , 1 + ( int ) cl + 2 ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: PEERS_ONLINE ch=%.*s total_online=%d " , CS_ID , ( int ) cl , ch_id , online ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: PEERS_ONLINE ch=%.*s total_online=%d " , CS_ID , ( int ) cl , ch_id , online ) ;
}
}
@ -315,7 +315,7 @@ static void cs_on_remote_status_changed(uint64_t peer, int online) {
if ( cl > 63 ) cl = 63 ;
if ( cl > 63 ) cl = 63 ;
uint8_t evt [ 65 ] ; evt [ 0 ] = ( uint8_t ) cl ;
uint8_t evt [ 65 ] ; evt [ 0 ] = ( uint8_t ) cl ;
memcpy ( evt + 1 , g_cs - > channels [ i ] . channel_id , cl ) ;
memcpy ( evt + 1 , g_cs - > channels [ i ] . channel_id , cl ) ;
gui_bridge_post ( GUI _EVT_MEMBERS_CHANGED, evt , 1 + ( int ) cl ) ;
chat_event_post ( CHAT _EVT_MEMBERS_CHANGED, evt , 1 + ( int ) cl ) ;
cs_post_channel_online ( g_cs , g_cs - > channels [ i ] . channel_id ) ;
cs_post_channel_online ( g_cs , g_cs - > channels [ i ] . channel_id ) ;
break ;
break ;
}
}
@ -337,7 +337,7 @@ static void cs_on_peer_status_changed(uint64_t peer, int online) {
if ( cl > 63 ) cl = 63 ;
if ( cl > 63 ) cl = 63 ;
uint8_t evt [ 65 ] ; evt [ 0 ] = ( uint8_t ) cl ;
uint8_t evt [ 65 ] ; evt [ 0 ] = ( uint8_t ) cl ;
memcpy ( evt + 1 , g_cs - > channels [ i ] . channel_id , cl ) ;
memcpy ( evt + 1 , g_cs - > channels [ i ] . channel_id , cl ) ;
gui_bridge_post ( GUI _EVT_MEMBERS_CHANGED, evt , 1 + ( int ) cl ) ;
chat_event_post ( CHAT _EVT_MEMBERS_CHANGED, evt , 1 + ( int ) cl ) ;
cs_post_channel_online ( g_cs , g_cs - > channels [ i ] . channel_id ) ;
cs_post_channel_online ( g_cs , g_cs - > channels [ i ] . channel_id ) ;
/* 3. Рассылка дельты всем synced-соседям */
/* 3. Рассылка дельты всем synced-соседям */
@ -523,9 +523,7 @@ static void refresh_timer_cb(void* arg) {
/* ── Public API ── */
/* ── Public API ── */
int chat_sync_init ( struct UTUN_INSTANCE * inst ,
int chat_sync_init ( struct UTUN_INSTANCE * inst ) {
void ( * gui_cb ) ( void * , int , const uint8_t * , int ) ) {
( void ) gui_cb ;
if ( ! inst ) return - 1 ;
if ( ! inst ) return - 1 ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: init " , CS_ID ) ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: init " , CS_ID ) ;
struct chat_sync * cs = u_calloc ( 1 , sizeof ( * cs ) ) ;
struct chat_sync * cs = u_calloc ( 1 , sizeof ( * cs ) ) ;
@ -674,7 +672,7 @@ void chat_sync_connect_from_invite(uint64_t channel_id, uint64_t node_id,
if ( ! g_cs | | ! g_cs - > inst | | ! g_cs - > inst - > ua ) {
if ( ! g_cs | | ! g_cs - > inst | | ! g_cs - > inst - > ua ) {
int r = - 7 ;
int r = - 7 ;
uint8_t err [ 12 ] ; memcpy ( err , & node_id , 8 ) ; memcpy ( err + 8 , & r , 4 ) ;
uint8_t err [ 12 ] ; memcpy ( err , & node_id , 8 ) ; memcpy ( err + 8 , & r , 4 ) ;
gui_bridge_post ( GUI _EVT_CONNECT_RESULT, err , 12 ) ;
chat_event_post ( CHAT _EVT_CONNECT_RESULT, err , 12 ) ;
return ;
return ;
}
}
@ -701,7 +699,7 @@ void chat_sync_connect_from_invite(uint64_t channel_id, uint64_t node_id,
struct cm_invite_wrap { struct chat_invite inv ; } * w = u_malloc ( sizeof ( struct cm_invite_wrap ) ) ;
struct cm_invite_wrap { struct chat_invite inv ; } * w = u_malloc ( sizeof ( struct cm_invite_wrap ) ) ;
w - > inv = * inv ; u_free ( inv ) ;
w - > inv = * inv ; u_free ( inv ) ;
gui_bridge_post_uasync_fn (
uasync_post ( g_cs - > inst - > ua ,
( void ( * ) ( void * ) ) cm_invite_trampoline , w ) ;
( void ( * ) ( void * ) ) cm_invite_trampoline , w ) ;
}
}
@ -1114,7 +1112,7 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer,
cs_refresh_channels ( cs ) ;
cs_refresh_channels ( cs ) ;
{ uint8_t evt [ 65 ] ; uint8_t cl = ( uint8_t ) strlen ( ch_id ) ; evt [ 0 ] = cl ; memcpy ( evt + 1 , ch_id , cl ) ;
{ uint8_t evt [ 65 ] ; uint8_t cl = ( uint8_t ) strlen ( ch_id ) ; evt [ 0 ] = cl ; memcpy ( evt + 1 , ch_id , cl ) ;
gui_bridge_post ( GUI _EVT_MEMBERS_CHANGED, evt , 1 + cl ) ; }
chat_event_post ( CHAT _EVT_MEMBERS_CHANGED, evt , 1 + cl ) ; }
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: JOIN calling cs_post_channel_online ch=%s " , CS_ID , ch_id ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: JOIN calling cs_post_channel_online ch=%s " , CS_ID , ch_id ) ;
cs_post_channel_online ( cs , ch_id ) ;
cs_post_channel_online ( cs , ch_id ) ;
@ -1251,9 +1249,9 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
uint8_t evt [ 65 ] ; uint8_t ch_id_len = ( uint8_t ) strlen ( ch_id ) ;
uint8_t evt [ 65 ] ; uint8_t ch_id_len = ( uint8_t ) strlen ( ch_id ) ;
evt [ 0 ] = ch_id_len ; memcpy ( evt + 1 , ch_id , ch_id_len ) ;
evt [ 0 ] = ch_id_len ; memcpy ( evt + 1 , ch_id , ch_id_len ) ;
gui_bridge_post ( GUI _EVT_CHANNEL_UPDATED, evt , 1 + ch_id_len ) ;
chat_event_post ( CHAT _EVT_CHANNEL_UPDATED, evt , 1 + ch_id_len ) ;
gui_bridge_post ( GUI _EVT_MEMBERS_CHANGED, evt , 1 + ch_id_len ) ;
chat_event_post ( CHAT _EVT_MEMBERS_CHANGED, evt , 1 + ch_id_len ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME calling cs_post_channel_online ch=%s " , CS_ID , ch_id ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME calling cs_post_channel_online ch=%s " , CS_ID , ch_id ) ;
cs_post_channel_online ( cs , ch_id ) ;
cs_post_channel_online ( cs , ch_id ) ;
@ -1264,8 +1262,8 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
if ( cs - > pending_invite_ch_id ! = 0 ) {
if ( cs - > pending_invite_ch_id ! = 0 ) {
uint64_t ch_id_num = strtoull ( ch_id , NULL , 10 ) ;
uint64_t ch_id_num = strtoull ( ch_id , NULL , 10 ) ;
uint8_t cevt [ 20 ] ; memcpy ( cevt , & peer , 8 ) ; int r = 0 ; memcpy ( cevt + 8 , & r , 4 ) ; memcpy ( cevt + 12 , & ch_id_num , 8 ) ;
uint8_t cevt [ 20 ] ; memcpy ( cevt , & peer , 8 ) ; int r = 0 ; memcpy ( cevt + 8 , & r , 4 ) ; memcpy ( cevt + 12 , & ch_id_num , 8 ) ;
gui_bridge_post ( GUI _EVT_CONNECT_RESULT, cevt , 20 ) ;
chat_event_post ( CHAT _EVT_CONNECT_RESULT, cevt , 20 ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME invite success ch=%s peer=%016llx — posted GUI _EVT_CONNECT_RESULT " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME invite success ch=%s peer=%016llx — posted CHAT _EVT_CONNECT_RESULT " ,
CS_ID , ch_id , ( unsigned long long ) peer ) ;
CS_ID , ch_id , ( unsigned long long ) peer ) ;
cs - > pending_invite_node_id = 0 ; cs - > pending_invite_ch_id = 0 ; if ( cs - > join_timer ) { uasync_cancel_timeout ( cs - > inst - > ua , cs - > join_timer ) ; cs - > join_timer = NULL ; }
cs - > pending_invite_node_id = 0 ; cs - > pending_invite_ch_id = 0 ; if ( cs - > join_timer ) { uasync_cancel_timeout ( cs - > inst - > ua , cs - > join_timer ) ; cs - > join_timer = NULL ; }
}
}
@ -1346,7 +1344,7 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer,
cs_refresh_channels ( cs ) ;
cs_refresh_channels ( cs ) ;
{ uint8_t mevt [ 65 ] ; uint8_t ml = ( uint8_t ) strlen ( ch_id ) ; mevt [ 0 ] = ml ; memcpy ( mevt + 1 , ch_id , ml ) ; gui_bridge_post ( GUI _EVT_MEMBERS_CHANGED, mevt , 1 + ml ) ; }
{ uint8_t mevt [ 65 ] ; uint8_t ml = ( uint8_t ) strlen ( ch_id ) ; mevt [ 0 ] = ml ; memcpy ( mevt + 1 , ch_id , ml ) ; chat_event_post ( CHAT _EVT_MEMBERS_CHANGED, mevt , 1 + ml ) ; }
/* propagate to others (except sender and the subject node) */
/* propagate to others (except sender and the subject node) */
cs_propagate ( cs , ch_id , peer , pl , len ) ;
cs_propagate ( cs , ch_id , peer , pl , len ) ;
@ -1366,7 +1364,7 @@ static void cs_handle_peer_remove(struct chat_sync* cs, uint64_t peer,
topo_node_sqlite_member_del ( db , ch_id , node_id ) ;
topo_node_sqlite_member_del ( db , ch_id , node_id ) ;
cs_refresh_channels ( cs ) ;
cs_refresh_channels ( cs ) ;
{ uint8_t mevt [ 65 ] ; uint8_t ml = ( uint8_t ) strlen ( ch_id ) ; mevt [ 0 ] = ml ; memcpy ( mevt + 1 , ch_id , ml ) ; gui_bridge_post ( GUI _EVT_MEMBERS_CHANGED, mevt , 1 + ml ) ; }
{ uint8_t mevt [ 65 ] ; uint8_t ml = ( uint8_t ) strlen ( ch_id ) ; mevt [ 0 ] = ml ; memcpy ( mevt + 1 , ch_id , ml ) ; chat_event_post ( CHAT _EVT_MEMBERS_CHANGED, mevt , 1 + ml ) ; }
cs_propagate ( cs , ch_id , peer , pl , len ) ;
cs_propagate ( cs , ch_id , peer , pl , len ) ;