diff --git a/dap_chain_net_srv.c b/dap_chain_net_srv.c index 53c32b8a3494f9acd67196cd7e35aa9b74c10509..fc9b2f7e9015c9813b567a0b89bd284a33461a48 100755 --- a/dap_chain_net_srv.c +++ b/dap_chain_net_srv.c @@ -424,6 +424,43 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_cha return l_srv; } +/** + * @brief dap_chain_net_srv_set_ch_callbacks + * @param a_uid + * @param a_callback_stream_ch_opened + * @param a_callback_stream_ch_read + * @param a_callback_stream_ch_write + * @param a_callback_stream_ch_closed + * @return + */ +int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, dap_chain_net_srv_callback_t a_callback_stream_ch_opened, + dap_chain_net_srv_callback_data_t a_callback_stream_ch_read, + dap_chain_net_srv_callback_data_t a_callback_stream_ch_write, + dap_chain_net_srv_callback_t a_callback_stream_ch_closed + ) +{ + service_list_t *l_sdata = NULL; + int l_ret =0; + dap_chain_net_srv_t * l_srv = NULL; + dap_chain_net_srv_uid_t l_uid = {.uint64 = a_uid.uint64 }; // Copy to let then compiler to pass args via registers not stack + + pthread_mutex_lock(&s_srv_list_mutex); + HASH_FIND(hh, s_srv_list, &l_uid, sizeof(l_uid), l_sdata); + if( l_sdata ) { + l_srv = l_sdata->srv; + l_srv->callback_stream_ch_opened = a_callback_stream_ch_opened; + l_srv->callback_stream_ch_read = a_callback_stream_ch_read; + l_srv->callback_stream_ch_read = a_callback_stream_ch_write; + l_srv->callback_stream_ch_closed = a_callback_stream_ch_closed; + }else{ + log_it(L_ERROR, "Can't find service with 0x%016llX", a_uid.uint64); + l_ret= -1; + } + pthread_mutex_unlock(&s_srv_list_mutex); + return l_ret; +} + + /** * @brief dap_chain_net_srv_del * @param a_srv @@ -440,6 +477,52 @@ void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv) pthread_mutex_unlock(&s_srv_list_mutex); } +/** + * @brief dap_chain_net_srv_call_write_all + * @param a_client + */ +void dap_chain_net_srv_call_write_all(dap_stream_ch_t * a_client) +{ + service_list_t *l_sdata, *l_sdata_tmp; + pthread_mutex_lock(&s_srv_list_mutex); + HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp) + { + if ( l_sdata->srv->callback_stream_ch_write) + l_sdata->srv->callback_stream_ch_write(l_sdata->srv, a_client); + } + pthread_mutex_unlock(&s_srv_list_mutex); +} + +/** + * @brief dap_chain_net_srv_call_opened_all + * @param a_client + */ +void dap_chain_net_srv_call_opened_all(dap_stream_ch_t * a_client) +{ + service_list_t *l_sdata, *l_sdata_tmp; + pthread_mutex_lock(&s_srv_list_mutex); + HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp) + { + if ( l_sdata->srv->callback_stream_ch_opened) + l_sdata->srv->callback_stream_ch_opened(l_sdata->srv, a_client); + } + pthread_mutex_unlock(&s_srv_list_mutex); +} + +void dap_chain_net_srv_call_closed_all(dap_stream_ch_t * a_client) +{ + service_list_t *l_sdata, *l_sdata_tmp; + pthread_mutex_lock(&s_srv_list_mutex); + HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp) + { + if ( l_sdata->srv->callback_stream_ch_closed) + l_sdata->srv->callback_stream_ch_closed(l_sdata->srv, a_client); + } + pthread_mutex_unlock(&s_srv_list_mutex); +} + + + /** * @brief dap_chain_net_srv_del_all * @param a_srv diff --git a/dap_chain_net_srv.h b/dap_chain_net_srv.h index 0f704288f7679717c05a4a0c6a424ba82fc842df..1d40d3916ccb4038b3543694cb682ab850802328 100755 --- a/dap_chain_net_srv.h +++ b/dap_chain_net_srv.h @@ -33,6 +33,7 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_t; typedef void (*dap_chain_net_srv_callback_t)(dap_chain_net_srv_t *, dap_chain_net_srv_client_t *); typedef int (*dap_chain_net_srv_callback_data_t)(dap_chain_net_srv_t *, uint32_t, dap_chain_net_srv_client_t *, const void *, size_t ); +typedef void (*dap_chain_net_srv_callback_ch_t)(dap_chain_net_srv_t *, dap_stream_ch_t *); typedef struct dap_chain_net_srv { @@ -40,10 +41,26 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_abstract_t srv_common; dap_chain_net_srv_price_t *pricelist; dap_chain_callback_trafic_t callback_trafic; + + // Request for usage dap_chain_net_srv_callback_data_t callback_requested; + + // Receipt first sign successfull dap_chain_net_srv_callback_data_t callback_receipt_first_success; + + // Response error dap_chain_net_srv_callback_data_t callback_response_error; + + // Receipt next sign succesfull dap_chain_net_srv_callback_data_t callback_receipt_next_success; + + // Stream CH callbacks - channed opened,ready for read, ready for write and closed + dap_chain_net_srv_callback_ch_t callback_stream_ch_opened; + dap_chain_net_srv_callback_data_t callback_stream_ch_read; + dap_chain_net_srv_callback_ch_t callback_stream_ch_write; + dap_chain_net_srv_callback_ch_t callback_stream_ch_closed; + + // Pointer to inheritor object void * _inhertor; } dap_chain_net_srv_t; typedef void (*dap_chain_net_srv_callback_new_t)(dap_chain_net_srv_t *, dap_config_t *); @@ -56,8 +73,20 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_cha dap_chain_net_srv_callback_data_t a_callback_response_error, dap_chain_net_srv_callback_data_t a_callback_receipt_next_success ); + +int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, dap_chain_net_srv_callback_t a_callback_stream_ch_opened, + dap_chain_net_srv_callback_data_t a_callback_stream_ch_read, + dap_chain_net_srv_callback_t a_callback_stream_ch_write, + dap_chain_net_srv_callback_t a_callback_stream_ch_closed + ); + void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv); void dap_chain_net_srv_del_all(void); + +void dap_chain_net_srv_call_write_all(dap_stream_ch_t * a_client); +void dap_chain_net_srv_call_closed_all(dap_stream_ch_t * a_client); +void dap_chain_net_srv_call_opened_all(dap_stream_ch_t * a_client); + dap_chain_net_srv_t * dap_chain_net_srv_get(dap_chain_net_srv_uid_t a_uid); size_t dap_chain_net_srv_count(void); const dap_chain_net_srv_uid_t * dap_chain_net_srv_list(void); diff --git a/dap_chain_net_srv_common.h b/dap_chain_net_srv_common.h index b20a471bddaae7a0e35ced4cea6bcf69e70fa06d..3a41ae4602d2ab0047b38c1d3bbfd8ab96a6dbcc 100755 --- a/dap_chain_net_srv_common.h +++ b/dap_chain_net_srv_common.h @@ -95,11 +95,13 @@ typedef struct dap_chain_net_srv_price #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST 0x10 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE 0x11 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NOTIFY_STOPPED 0x20 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_DATA 0x30 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS 0xf0 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR 0xff #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNDEFINED 0x00000000 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND 0x00000100 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_CH_NOT_FOUND 0x00000101 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NOT_FOUND 0x00000200 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER 0x00000201 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_USAGE_CANT_ADD 0x00000300 @@ -111,8 +113,8 @@ typedef struct dap_chain_net_srv_price #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SIZE 0x00000405 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_CANT_FIND 0x00000500 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_NO_SIGN 0x00000501 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_WRONG_PKEY_HASH 0x00000502 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND 0x00000600 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_WRONG_PKEY_HASH 0x00000502 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNKNOWN 0xffffffff // TYPE_REQUEST @@ -128,6 +130,18 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_request{ uint8_t data[]; } DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_request_t; +// Custom service data packet +typedef struct dap_stream_ch_chain_net_srv_pkt_data_hdr{ + dap_chain_net_srv_uid_t srv_uid; + uint32_t usage_id; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_hdr_t; + +typedef struct dap_stream_ch_chain_net_srv_pkt_data{ + dap_stream_ch_chain_net_srv_pkt_data_hdr_t hdr; + uint8_t data[]; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_t; + + typedef struct dap_stream_ch_chain_net_srv_pkt_success_hdr{ uint32_t usage_id; dap_chain_net_id_t net_id;