From 19410795f6070bc77cbfa5d39ec0f5ebacdefbb0 Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Fri, 22 Feb 2019 16:26:28 +0700
Subject: [PATCH] [*] New callbacks and API for downlaying objects

---
 dap_chain_cs_dag.c       | 75 ++++++++++++++++++++++++++++++++--------
 dap_chain_cs_dag.h       | 17 +++++----
 dap_chain_cs_dag_event.c |  9 -----
 dap_chain_cs_dag_event.h |  2 --
 4 files changed, 72 insertions(+), 31 deletions(-)

diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c
index d2b2953..5da2f0c 100644
--- a/dap_chain_cs_dag.c
+++ b/dap_chain_cs_dag.c
@@ -33,6 +33,10 @@ typedef struct dap_chain_cs_dag_pvt {
 
 #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt )
 
+static int s_chain_callback_element_add(dap_chain_t * a_chain, void * a_data, size_t a_data_size);// Accept new element in chain
+static int s_chain_callback_element_get_first(dap_chain_t * a_chain, void ** a_data, size_t * a_data_size ); // Get the fisrt element from chain
+static int s_chain_callback_element_get_next( dap_chain_t * a_chain, void ** a_data, size_t * a_data_size ); // Get the next element from chain from the current one
+
 /**
  * @brief dap_chain_cs_dag_init
  * @return
@@ -53,14 +57,21 @@ void dap_chain_cs_dag_deinit()
 /**
  * @brief dap_chain_cs_dag_new
  * @param a_chain
- * @return
+ * @param a_chain_cfg
  */
-dap_chain_cs_dag_t *dap_chain_cs_dag_new(dap_chain_t * a_chain)
+void dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
-    dap_chain_cs_dag_t * l_ret = DAP_NEW_Z(dap_chain_cs_dag_t);
-    l_ret->_pvt = DAP_NEW_Z(dap_chain_cs_dag_pvt_t);
-    l_ret->chain = a_chain;
-    return l_ret;
+    dap_chain_cs_dag_t * l_chain_cs_dag = DAP_NEW_Z(dap_chain_cs_dag_t);
+    l_chain_cs_dag->_pvt = DAP_NEW_Z(dap_chain_cs_dag_pvt_t);
+    l_chain_cs_dag->chain = a_chain;
+
+    a_chain->callback_delete = dap_chain_cs_dag_delete;
+    a_chain->callback_element_add = s_chain_callback_element_add; // Accept new element in chain
+    a_chain->callback_element_get_first = s_chain_callback_element_get_first; // Get the fisrt element from chain
+    a_chain->callback_element_get_next = s_chain_callback_element_get_next; // Get the next element from chain from the current one
+    a_chain->_inheritor = l_chain_cs_dag;
+
+    log_it (L_NOTICE, "DAG chain initialized");
 }
 
 /**
@@ -68,13 +79,49 @@ dap_chain_cs_dag_t *dap_chain_cs_dag_new(dap_chain_t * a_chain)
  * @param a_dag
  * @return
  */
-void dap_chain_cs_dag_delete(dap_chain_cs_dag_t * a_dag)
+void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
+{
+    dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain );
+    if(l_dag->callback_delete )
+        l_dag->callback_delete(l_dag);
+    if(l_dag->_inheritor)
+        DAP_DELETE(l_dag->_inheritor);
+    if(l_dag->_pvt)
+        DAP_DELETE(l_dag->_pvt);
+    DAP_DELETE(l_dag);
+}
+
+/**
+ * @brief s_chain_callback_element_add Accept new element in chain
+ * @param a_chain
+ * @param a_data
+ * @param a_data_size
+ */
+static int s_chain_callback_element_add(dap_chain_t * a_chain, void * a_data, size_t a_data_size)
+{
+    return -1; // TODO
+}
+
+/**
+ * @brief s_chain_callback_element_get_first Get the fisrt element from chain
+ * @param a_chain
+ * @param a_data
+ * @param a_data_size
+ * @return 0 if ok
+ */
+static int s_chain_callback_element_get_first(dap_chain_t * a_chain, void ** a_data, size_t * a_data_size )
+{
+    return -1; // TODO
+}
+
+/**
+ * @brief s_chain_callback_element_get_next Get the next element from chain from the current one
+ * @param a_chain
+ * @param a_data
+ * @param a_data_size
+ * @return 0 if ok
+ */
+static int s_chain_callback_element_get_next( dap_chain_t * a_chain, void ** a_data, size_t * a_data_size )
 {
-    if(a_dag->callback_delete )
-        a_dag->callback_delete(a_dag->chain);
-    if(a_dag->_inheritor)
-        DAP_DELETE(a_dag->_inheritor);
-    if(a_dag->_pvt)
-        DAP_DELETE(a_dag->_pvt);
-    DAP_DELETE(a_dag);
+    return -1; // TODO
 }
diff --git a/dap_chain_cs_dag.h b/dap_chain_cs_dag.h
index 9ac2d6b..d56cffd 100644
--- a/dap_chain_cs_dag.h
+++ b/dap_chain_cs_dag.h
@@ -24,12 +24,18 @@
 #pragma once
 #include "dap_chain.h"
 #include "dap_chain_cs_dag_event.h"
+
+typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
+
+typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *);
+typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *);
+
 typedef struct dap_chain_cs_dag
 {
     dap_chain_t * chain;
-    dap_chain_callback_new_t callback_new;
-    dap_chain_callback_t callback_delete;
-    dap_chain_cs_dag_event_callback_ptr_t callback_event_input;
+    dap_chain_cs_dag_callback_t callback_delete;
+    dap_chain_cs_dag_callback_event_t callback_event_input;
+    dap_chain_cs_dag_callback_event_t callback_event_verify;
 
     void * _pvt;
     void * _inheritor;
@@ -40,6 +46,5 @@ typedef struct dap_chain_cs_dag
 int dap_chain_cs_dag_init();
 void dap_chain_cs_dag_deinit();
 
-dap_chain_cs_dag_t *dap_chain_cs_dag_new(dap_chain_t * a_chain);
-void dap_chain_cs_dag_delete(dap_chain_cs_dag_t * a_dag);
-
+void dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
+void dap_chain_cs_dag_delete(dap_chain_t * a_chain);
diff --git a/dap_chain_cs_dag_event.c b/dap_chain_cs_dag_event.c
index d0d375a..4987b27 100644
--- a/dap_chain_cs_dag_event.c
+++ b/dap_chain_cs_dag_event.c
@@ -69,15 +69,6 @@ void dap_chain_cs_dag_event_delete(dap_chain_cs_dag_t * a_dag,dap_chain_cs_dag_e
 
 }
 
-/**
- * @brief dap_chain_cs_dag_event_verify
- * @return
- */
-int dap_chain_cs_dag_event_verify(dap_chain_cs_dag_event_t * a_event)
-{
-    return 0;
-
-}
 
 /**
  * @brief dap_chain_cs_dag_event_get_datum
diff --git a/dap_chain_cs_dag_event.h b/dap_chain_cs_dag_event.h
index 419320d..5833783 100644
--- a/dap_chain_cs_dag_event.h
+++ b/dap_chain_cs_dag_event.h
@@ -39,13 +39,11 @@ typedef struct dap_chain_cs_dag_event {
     uint8_t hashes_n_signs_n_datum[]; // Hashes, signes and datum
 } dap_chain_cs_dag_event_t;
 
-typedef int (*dap_chain_cs_dag_event_callback_ptr_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *);
 
 dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
                                                 dap_enc_key_t * a_key,
                                                 dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count);
 void dap_chain_cs_dag_event_delete(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event);
 
-int dap_chain_cs_dag_event_verify(dap_chain_cs_dag_event_t * a_event);
 dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event);
 
-- 
GitLab