From b9d72ba79592e36752bf0cb06eb0373488ffd23b Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Mon, 8 Aug 2022 15:46:55 +0700
Subject: [PATCH] Carried over changes from the July 18th master.

---
 modules/net/srv/dap_chain_net_srv.c         | 74 +++++----------------
 modules/net/srv/include/dap_chain_net_srv.h | 64 +++++++++---------
 2 files changed, 49 insertions(+), 89 deletions(-)

diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index 76bc3f3fdd..4a4967a584 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -122,6 +122,10 @@ int dap_chain_net_srv_init()
         );
 
     s_load_all();
+
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY, dap_chain_net_srv_pay_verificator, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE, dap_chain_ledger_fee_verificator, NULL);
+
     return 0;
 }
 
@@ -467,8 +471,8 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 dap_chain_net_srv_uid_t l_srv_uid={{0}};
                 dap_chain_node_addr_t l_node_addr={0};
                 dap_chain_hash_fast_t l_tx_cond_hash={{0}};
-                dap_time_t l_expires=0; // TS when the service expires
-                uint256_t l_price = {};
+                dap_time_t l_expires = 0; // TS when the service expires
+                uint256_t l_price = {0};
                 char l_price_token[DAP_CHAIN_TICKER_SIZE_MAX]={0};
                 dap_chain_net_srv_price_unit_uid_t l_price_unit={{0}};
                 dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED;
@@ -512,7 +516,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 }
                 // create order
                 char * l_order_new_hash_str = dap_chain_net_srv_order_create(
-                            l_net,l_direction, l_srv_uid, l_node_addr,l_tx_cond_hash, l_price, l_price_unit,
+                            l_net,l_direction, l_srv_uid, l_node_addr,l_tx_cond_hash, &l_price, l_price_unit,
                             l_price_token, l_expires, (uint8_t *)l_ext, l_ext_len, l_region_str, l_continent_num, l_key);
                 if(l_cert)
                     dap_cert_delete(l_cert);
@@ -596,8 +600,9 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
     return ret;
 }
 
-bool dap_chain_net_srv_pay_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner)
+bool dap_chain_net_srv_pay_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner)
 {
+    UNUSED(a_ledger);
     if (!a_owner)
         return false;
     dap_chain_datum_tx_receipt_t *l_receipt = (dap_chain_datum_tx_receipt_t *)
@@ -710,11 +715,7 @@ int dap_chain_net_srv_parse_pricelist(dap_chain_net_srv_t *a_srv, const char *a_
  */
 dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,
                                            const char *a_config_section,
-                                           dap_chain_net_srv_callback_data_t a_callback_request,
-                                           dap_chain_net_srv_callback_data_t a_callback_response_success,
-                                           dap_chain_net_srv_callback_data_t a_callback_response_error,
-                                           dap_chain_net_srv_callback_data_t a_callback_receipt_next_success,
-                                           dap_chain_net_srv_callback_custom_data_t a_callback_custom_data)
+                                           dap_chain_net_srv_callbacks_t* a_callbacks)
 
 {
     service_list_t *l_sdata = NULL;
@@ -725,11 +726,8 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,
     if(l_sdata == NULL) {
         l_srv = DAP_NEW_Z(dap_chain_net_srv_t);
         l_srv->uid.uint64 = a_uid.uint64;
-        l_srv->callback_requested = a_callback_request;
-        l_srv->callback_response_success = a_callback_response_success;
-        l_srv->callback_response_error = a_callback_response_error;
-        l_srv->callback_receipt_next_success = a_callback_receipt_next_success;
-        l_srv->callback_custom_data = a_callback_custom_data;
+        if (a_callbacks)
+            memcpy(&l_srv->callbacks, a_callbacks, sizeof(*a_callbacks));
         pthread_mutex_init(&l_srv->banlist_mutex, NULL);
         l_sdata = DAP_NEW_Z(service_list_t);
         memcpy(&l_sdata->uid, &l_uid, sizeof(l_uid));
@@ -744,42 +742,6 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,
     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_ch_t a_callback_stream_ch_opened,
-                                       dap_chain_net_srv_callback_ch_t a_callback_stream_ch_closed,
-                                       dap_chain_net_srv_callback_ch_t a_callback_stream_ch_write
-                                       )
-{
-    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_closed = a_callback_stream_ch_closed;
-        l_srv->callback_stream_ch_write = a_callback_stream_ch_write;
-    }else{
-        log_it(L_ERROR, "Can't find service with 0x%016"DAP_UINT64_FORMAT_X, 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
@@ -810,8 +772,8 @@ void dap_chain_net_srv_call_write_all(dap_stream_ch_t * a_client)
     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);
+        if (l_sdata->srv->callbacks.stream_ch_write)
+            l_sdata->srv->callbacks.stream_ch_write(l_sdata->srv, a_client);
     }
     pthread_mutex_unlock(&s_srv_list_mutex);
 }
@@ -826,8 +788,8 @@ void dap_chain_net_srv_call_opened_all(dap_stream_ch_t * a_client)
     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);
+        if (l_sdata->srv->callbacks.stream_ch_opened)
+            l_sdata->srv->callbacks.stream_ch_opened(l_sdata->srv, a_client);
     }
     pthread_mutex_unlock(&s_srv_list_mutex);
 }
@@ -838,8 +800,8 @@ void dap_chain_net_srv_call_closed_all(dap_stream_ch_t * a_client)
     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);
+        if (l_sdata->srv->callbacks.stream_ch_closed)
+            l_sdata->srv->callbacks.stream_ch_closed(l_sdata->srv, a_client);
     }
     pthread_mutex_unlock(&s_srv_list_mutex);
 }
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index 771b664af4..302780c367 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -24,6 +24,8 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 */
 #pragma once
 
+#include "dap_chain_common.h"
+#include "dap_chain_datum_decree.h"
 #include "dap_chain_net.h"
 #include "dap_chain_net_remote.h"
 #include "dap_chain_wallet.h"
@@ -209,6 +211,9 @@ typedef int  (*dap_chain_net_srv_callback_data_t)(dap_chain_net_srv_t *, uint32_
 typedef void* (*dap_chain_net_srv_callback_custom_data_t)(dap_chain_net_srv_t *, dap_chain_net_srv_usage_t *, const void *, size_t, size_t *);
 typedef void (*dap_chain_net_srv_callback_ch_t)(dap_chain_net_srv_t *, dap_stream_ch_t *);
 
+// Process service decree
+typedef void (*dap_chain_net_srv_callback_decree_t)(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net, dap_chain_t* a_chain, dap_chain_datum_decree_t* a_decree, size_t a_decree_size);
+
 typedef struct dap_chain_net_srv_banlist_item {
     dap_chain_hash_fast_t client_pkey_hash;
     pthread_mutex_t *ht_mutex;
@@ -216,6 +221,29 @@ typedef struct dap_chain_net_srv_banlist_item {
     UT_hash_handle hh;
 } dap_chain_net_srv_banlist_item_t;
 
+typedef struct dap_chain_net_srv_callbacks {
+    // For traffic control
+    dap_chain_callback_trafic_t traffic;
+    // Request for usage
+    dap_chain_net_srv_callback_data_t requested;
+    // Receipt first sign successfull
+    dap_chain_net_srv_callback_data_t response_success;
+    // Response error
+    dap_chain_net_srv_callback_data_t response_error;
+    // Receipt next sign succesfull
+    dap_chain_net_srv_callback_data_t receipt_next_success;
+    // Custom data processing
+    dap_chain_net_srv_callback_custom_data_t custom_data;
+
+    // Decree processing
+    dap_chain_net_srv_callback_decree_t decree;
+
+    // Stream CH callbacks - channel opened, closed and write
+    dap_chain_net_srv_callback_ch_t stream_ch_opened;
+    dap_chain_net_srv_callback_ch_t stream_ch_closed;
+    dap_chain_net_srv_callback_ch_t stream_ch_write;
+} dap_chain_net_srv_callbacks_t;
+
 typedef struct dap_chain_net_srv
 {
     dap_chain_net_srv_uid_t uid; // Unique ID for service.
@@ -226,27 +254,8 @@ typedef struct dap_chain_net_srv
     pthread_mutex_t banlist_mutex;
     dap_chain_net_srv_banlist_item_t *ban_list;
 
-    dap_chain_callback_trafic_t callback_trafic;
+    dap_chain_net_srv_callbacks_t callbacks;
 
-    // Request for usage
-    dap_chain_net_srv_callback_data_t callback_requested;
-
-    // Receipt first sign successfull
-    dap_chain_net_srv_callback_data_t callback_response_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;
-
-    // Custom data processing
-    dap_chain_net_srv_callback_custom_data_t callback_custom_data;
-
-    // Stream CH callbacks - channel opened, closed and write
-    dap_chain_net_srv_callback_ch_t callback_stream_ch_opened;
-    dap_chain_net_srv_callback_ch_t callback_stream_ch_closed;
-    dap_chain_net_srv_callback_ch_t callback_stream_ch_write;
     // Pointer to inheritor object
     void *_inheritor;
     // Pointer to internal server structure
@@ -255,21 +264,10 @@ typedef struct dap_chain_net_srv
 
 int dap_chain_net_srv_init();
 void dap_chain_net_srv_deinit(void);
-bool dap_chain_net_srv_pay_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner);
+bool dap_chain_net_srv_pay_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner);
 dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,
                                            const char *a_config_section,
-                                           dap_chain_net_srv_callback_data_t a_callback_requested,
-                                           dap_chain_net_srv_callback_data_t a_callback_response_success,
-                                           dap_chain_net_srv_callback_data_t a_callback_response_error,
-                                           dap_chain_net_srv_callback_data_t a_callback_receipt_next_success,
-                                           dap_chain_net_srv_callback_custom_data_t a_callback_custom_data
-                                           );
-
-int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid,
-                                       dap_chain_net_srv_callback_ch_t a_callback_stream_ch_opened,
-                                       dap_chain_net_srv_callback_ch_t a_callback_stream_ch_closed,
-                                       dap_chain_net_srv_callback_ch_t a_callback_stream_ch_write
-                                       );
+                                           dap_chain_net_srv_callbacks_t* a_callbacks);
 
 void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv);
 void dap_chain_net_srv_del_all(void);
-- 
GitLab