diff --git a/dap_chain_net_srv.c b/dap_chain_net_srv.c index fc9b2f7e9015c9813b567a0b89bd284a33461a48..8941972a885d55f74fc879b262377eaad0896af2 100755 --- a/dap_chain_net_srv.c +++ b/dap_chain_net_srv.c @@ -181,10 +181,117 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) dap_string_t *l_string_ret = dap_string_new(""); const char *l_order_str = NULL; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "order", &l_order_str); - if ( l_order_str == NULL){ - dap_string_append_printf( l_string_ret, "Expected subcommand. Variants: find, dump, create, delete\n"); - ret=-3; - } else if ( strcmp( l_order_str, "find" ) == 0 ){ + + // Order direction + const char *l_direction_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-direction", &l_direction_str); + + const char* l_srv_uid_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-srv_uid", &l_srv_uid_str); + + const char* l_srv_class_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-srv_class", &l_srv_class_str); + + const char* l_node_addr_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-node_addr", &l_node_addr_str); + + const char* l_tx_cond_hash_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx_cond", &l_tx_cond_hash_str); + + const char* l_price_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price", &l_price_str); + + const char* l_expires_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-expires", &l_expires_str); + + const char* l_price_unit_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_unit", &l_price_unit_str); + + const char* l_price_token_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_token", &l_price_token_str); + + const char* l_ext = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-ext", &l_ext); + + const char *l_order_hash_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str); + + const char* l_region_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-region", &l_region_str); + const char* l_continent_str = NULL; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-continent", &l_continent_str); + + int8_t l_continent_num = dap_chain_net_srv_order_continent_to_num(l_continent_str); + + if(l_continent_str && l_continent_num <= 0) { + dap_string_t *l_string_err = dap_string_new("Unrecognized \"-continent\" option="); + dap_string_append_printf(l_string_err, "\"%s\". Variants: ", l_continent_str); + int i = 0; + while(1) { + const char *l_continent = dap_chain_net_srv_order_continent_to_str(i); + if(!l_continent) + break; + if(!i) + dap_string_append_printf(l_string_err, "\"%s\"", l_continent); + else + dap_string_append_printf(l_string_err, ", \"%s\"", l_continent); + i++; + } + dap_string_append_printf(l_string_ret, "%s\n", l_string_err->str); + dap_string_free(l_string_err, true); + ret = -1; + } + // Update order + else if(dap_strcmp(l_order_str, "update") == 0) { + + if(!l_order_hash_str) { + ret = -1; + dap_string_append(l_string_ret, "Can't find option '-hash'\n"); + } + else { + dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str); + if(!l_order) { + ret = -2; + dap_string_append_printf(l_string_ret, "Can't find order with hash %s\n", l_order_hash_str); + } + else { + if(l_ext) { + l_order->ext_size = strlen(l_ext) + 1; + l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size); + strncpy(l_order->ext, l_ext, l_order->ext_size); + } + else + dap_chain_net_srv_order_set_continent_region(&l_order, l_continent_num, l_region_str); + /*if(l_region_str) { + strncpy(l_order->region, l_region_str, min(sizeof(l_order->region) - 1, strlen(l_region_str) + 1)); + } + if(l_continent_num>=0) + l_order->continent = l_continent_num;*/ + + + ret = dap_chain_net_srv_order_save(l_net, l_order); + if(!ret) + ret = 0; + if(!ret) { + dap_chain_hash_fast_t l_new_order_hash; + size_t l_new_order_size = dap_chain_net_srv_order_get_size(l_order); + dap_hash_fast(l_order, l_new_order_size, &l_new_order_hash); + char * l_new_order_hash_str = dap_chain_hash_fast_to_str_new(&l_new_order_hash); + // delete prev order + if(dap_strcmp(l_new_order_hash_str, l_order_hash_str)) + dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_str); + DAP_DELETE(l_new_order_hash_str); + dap_string_append_printf(l_string_ret, "order updated\n"); + } + else + dap_string_append_printf(l_string_ret, "order did not updated\n"); + + DAP_DELETE(l_order); + } + } + + } + else if ( dap_strcmp( l_order_str, "find" ) == 0 ){ // Order direction const char *l_direction_str = NULL; @@ -235,11 +342,14 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) l_price_unit.uint32 = (uint32_t) atol ( l_price_unit_str ); dap_chain_net_srv_order_t * l_orders; - size_t l_orders_size =0; - if( dap_chain_net_srv_order_find_all_by( l_net, l_direction,l_srv_uid,l_price_unit,l_price_token_str,l_price_min, l_price_max,&l_orders,&l_orders_size) == 0 ){ - dap_string_append_printf(l_string_ret,"Found %u orders:\n",l_orders_size); - for (size_t i = 0; i< l_orders_size; i++){ - dap_chain_net_srv_order_dump_to_string(l_orders+i,l_string_ret); + size_t l_orders_num = 0; + if( dap_chain_net_srv_order_find_all_by( l_net, l_direction,l_srv_uid,l_price_unit,l_price_token_str,l_price_min, l_price_max,&l_orders,&l_orders_num) == 0 ){ + dap_string_append_printf(l_string_ret,"Found %u orders:\n",l_orders_num); + size_t l_orders_size = 0; + for (size_t i = 0; i< l_orders_num; i++){ + dap_chain_net_srv_order_t *l_order = (char*) l_orders + l_orders_size; + dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret); + l_orders_size += dap_chain_net_srv_order_get_size(l_order); dap_string_append(l_string_ret,"\n"); } ret = 0; @@ -247,11 +357,10 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) ret = -5 ; dap_string_append(l_string_ret,"Can't get orders: some internal error or wrong params\n"); } + DAP_DELETE(l_orders); - }else if( strcmp( l_order_str, "dump" ) == 0 ){ + }else if( dap_strcmp( l_order_str, "dump" ) == 0 ){ // Select with specified service uid - const char *l_order_hash_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str); if ( l_order_hash_str ){ dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_str ); if (l_order){ @@ -264,68 +373,47 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) } else{ dap_chain_net_srv_order_t * l_orders = NULL; - size_t l_orders_size =0; + size_t l_orders_num =0; dap_chain_net_srv_uid_t l_srv_uid={{0}}; uint64_t l_price_min=0, l_price_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; - if( dap_chain_net_srv_order_find_all_by( l_net,l_direction,l_srv_uid,l_price_unit, NULL, l_price_min, l_price_max,&l_orders,&l_orders_size) == 0 ){ - dap_string_append_printf(l_string_ret,"Found %zd orders:\n",l_orders_size); - for (size_t i = 0; i< l_orders_size; i++){ - dap_chain_net_srv_order_dump_to_string(&l_orders[i],l_string_ret); - dap_string_append(l_string_ret,"\n"); + if( dap_chain_net_srv_order_find_all_by( l_net,l_direction,l_srv_uid,l_price_unit, NULL, l_price_min, l_price_max,&l_orders,&l_orders_num) == 0 ){ + dap_string_append_printf(l_string_ret,"Found %zd orders:\n",l_orders_num); + size_t l_orders_size = 0; + for(size_t i = 0; i < l_orders_num; i++) { + dap_chain_net_srv_order_t *l_order = (char*) l_orders + l_orders_size; + dap_chain_net_srv_order_dump_to_string(l_order, l_string_ret); + l_orders_size += dap_chain_net_srv_order_get_size(l_order); + dap_string_append(l_string_ret, "\n"); } ret = 0; }else{ ret = -5 ; dap_string_append(l_string_ret,"Can't get orders: some internal error or wrong params\n"); } + DAP_DELETE(l_orders); } - }else if( strcmp( l_order_str, "delete" ) == 0 ){ + }else if( dap_strcmp( l_order_str, "delete" ) == 0 ){ // Select with specified service uid const char *l_order_hash_str = NULL; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-hash", &l_order_hash_str); if ( l_order_hash_str ){ - if (dap_chain_net_srv_order_delete_by_hash_str(l_net,l_order_hash_str) == 0){ + dap_chain_net_srv_order_t * l_order = dap_chain_net_srv_order_find_by_hash_str( l_net, l_order_hash_str ); + if (l_order && dap_chain_net_srv_order_delete_by_hash_str(l_net,l_order_hash_str) == 0){ ret = 0 ; dap_string_append_printf(l_string_ret,"Deleted order %s\n", l_order_hash_str ); }else{ ret = -8 ; dap_string_append_printf(l_string_ret,"Can't find order with hash %s\n", l_order_hash_str ); } + DAP_DELETE(l_order); } else{ ret = -9 ; dap_string_append(l_string_ret,"need -hash param to obtain what the order we need to dump\n"); } - }else if( strcmp( l_order_str, "create" ) == 0 ){ - // Order direction - const char *l_direction_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-direction", &l_direction_str); - - const char* l_srv_uid_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-srv_uid", &l_srv_uid_str); - - const char* l_node_addr_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-node_addr", &l_node_addr_str); - - const char* l_tx_cond_hash_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx_cond", &l_tx_cond_hash_str); - - const char* l_price_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price", &l_price_str); - - const char* l_expires_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-expires", &l_expires_str); - - const char* l_price_unit_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_unit", &l_price_unit_str); - - const char* l_price_token_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-price_token", &l_price_token_str); - - const char* l_ext = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-ext", &l_ext); + }else if( dap_strcmp( l_order_str, "create" ) == 0 ){ if ( l_srv_uid_str && l_price_str && l_price_token_str && l_price_unit_str) { dap_chain_net_srv_uid_t l_srv_uid={{0}}; @@ -365,7 +453,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) 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_price_token, l_expires,l_ext); + l_price_token, l_expires,l_ext, l_region_str, l_continent_num); if (l_order_new_hash_str) dap_string_append_printf( l_string_ret, "Created order %s\n", l_order_new_hash_str); else{ diff --git a/dap_chain_net_srv_order.c b/dap_chain_net_srv_order.c index 86187a6ad90cc175823bb28ee538a69b3a1cb453..8ac6e2c6c5991b20b78b13c0867a2f705000866c 100644 --- a/dap_chain_net_srv_order.c +++ b/dap_chain_net_srv_order.c @@ -29,6 +29,15 @@ #define LOG_TAG "dap_chain_net_srv_order" +char *s_server_continents[]={ + "None", + "Africa", + "Europe", + "North America", + "South America", + "Southeast Asia", + "Near East", + }; /** * @brief dap_chain_net_srv_order_init @@ -48,6 +57,114 @@ void dap_chain_net_srv_order_deinit() } +size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order) +{ + return a_order ? sizeof(dap_chain_net_srv_order_t) + a_order->ext_size : 0; +} + +/** + * @brief dap_chain_net_srv_order_get_region_continent + * @param a_continent_num [in] + * @param a_region [in] + */ +bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region) +{ + dap_chain_net_srv_order_t *l_order = *a_order; + if(!l_order || (!a_continent_num && !a_region)) + return false; + uint8_t l_continent_num_prev = 0; + char *l_region_prev = NULL; + dap_chain_net_srv_order_get_continent_region(*a_order, &l_continent_num_prev, &l_region_prev); + uint32_t l_ext_size = 1 + sizeof(uint8_t); + if(a_region) + l_ext_size += strlen(a_region) + 1; + else if(l_region_prev) + l_ext_size += strlen(l_region_prev) + 1; + + l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_ext_size); + l_order->ext[0] =0x52; + if(a_continent_num > 0) + memcpy(l_order->ext + 1, &a_continent_num, sizeof(uint8_t)); + else + memcpy(l_order->ext + 1, &l_continent_num_prev, sizeof(uint8_t)); + if(a_region) + memcpy(l_order->ext + 1 + sizeof(uint8_t), a_region, strlen(a_region) + 1); + else if(l_region_prev) + memcpy(l_order->ext + 1 + sizeof(uint8_t), l_region_prev, strlen(l_region_prev) + 1); + //dap_sprintf(l_order->ext, "\52%d-%s", a_continent_num, a_region); + l_order->ext_size = l_ext_size; + *a_order = l_order; + DAP_DELETE(l_region_prev); + return true; +} + +/** + * @brief dap_chain_net_srv_order_get_region_continent + * @param a_continent_num [out] + * @param a_region [out] + */ +bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region) +{ + if(!a_order || !a_order->ext_size || !a_order->ext || a_order->ext[0]!=0x52) + return false; + if(a_continent_num) { + memcpy(a_continent_num, a_order->ext + 1, sizeof(uint8_t)); + } + else + a_continent_num = 0; + if(a_region) { + size_t l_size = a_order->ext_size - sizeof(uint8_t) - 1; + if(l_size > 0) { + *a_region = DAP_NEW_SIZE(char, l_size); + memcpy(*a_region, a_order->ext + 1 + sizeof(uint8_t), l_size); + } + else + *a_region = NULL; + } + return true; +} + + +/** + * @brief dap_chain_net_srv_order_continents_count + */ +size_t dap_chain_net_srv_order_continents_count(void) +{ + size_t l_count = sizeof(s_server_continents) / sizeof(char*); + return l_count; +} + +/** + * @brief dap_chain_net_srv_order_get_continent_str + */ +const char* dap_chain_net_srv_order_continent_to_str(int8_t a_num) +{ + int8_t l_count = dap_chain_net_srv_order_continents_count(); + if(a_num >= l_count) + return NULL; + return s_server_continents[a_num]; +} + +/** + * @brief dap_chain_net_srv_order_get_continent_num + */ +int8_t dap_chain_net_srv_order_continent_to_num(const char *a_continent_str) +{ + int8_t l_count = dap_chain_net_srv_order_continents_count(); + char *l_continent_str = dap_strup(a_continent_str, -1); + for(int8_t i = 1; i < l_count; i++) { + char *l_server_continents = dap_strup(s_server_continents[i], -1); + if(!dap_strcmp(l_continent_str, l_server_continents)) { + DAP_DELETE(l_server_continents); + DAP_DELETE(l_continent_str); + return i; + } + DAP_DELETE(l_server_continents); + } + DAP_DELETE(l_continent_str); + return -1; +} + char* dap_chain_net_srv_order_create( dap_chain_net_t * a_net, dap_chain_net_srv_order_direction_t a_direction, @@ -58,7 +175,9 @@ char* dap_chain_net_srv_order_create( dap_chain_net_srv_price_unit_uid_t a_price_unit, // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], dap_chain_time_t a_expires, // TS when the service expires - const char * a_ext + const char *a_ext, + const char *a_region, + int8_t a_continent_num ) { if (a_net) { @@ -69,6 +188,11 @@ char* dap_chain_net_srv_order_create( l_order->direction = a_direction; l_order->ts_created = (dap_chain_time_t) time(NULL); + if(a_ext) + strncpy(l_order->ext, a_ext, strlen(l_order->ext) + 1); + else + dap_chain_net_srv_order_set_continent_region(&l_order, a_continent_num, a_region); + if ( a_node_addr.uint64) l_order->node_addr.uint64 = a_node_addr.uint64; @@ -79,13 +203,11 @@ char* dap_chain_net_srv_order_create( if ( a_price_ticker) strncpy(l_order->price_ticker, a_price_ticker,sizeof(l_order->price_ticker)-1); - if ( a_ext) - strncpy(l_order->ext, a_ext, sizeof ( l_order->ext)-1 ); - - dap_hash_fast( l_order, sizeof ( *l_order), l_order_hash ); + size_t l_order_size = dap_chain_net_srv_order_get_size(l_order); + dap_hash_fast( l_order, l_order_size, l_order_hash ); char * l_order_hash_str = dap_chain_hash_fast_to_str_new( l_order_hash ); char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net); - if ( !dap_chain_global_db_gr_set( dap_strdup(l_order_hash_str), l_order, sizeof (*l_order), l_gdb_group_str ) ){ + if ( !dap_chain_global_db_gr_set( dap_strdup(l_order_hash_str), l_order, l_order_size, l_gdb_group_str ) ){ DAP_DELETE( l_order ); DAP_DELETE( l_order_hash ); DAP_DELETE( l_order_hash_str ); @@ -93,13 +215,37 @@ char* dap_chain_net_srv_order_create( return NULL; } DAP_DELETE( l_order_hash ); - DAP_DELETE(l_order_hash_str ); + //DAP_DELETE(l_order_hash_str ); DAP_DELETE( l_gdb_group_str ); return l_order_hash_str; }else return NULL; } +/** + * @brief dap_chain_net_srv_order_update + * @param a_net + * @param a_order + * @return + */ +int dap_chain_net_srv_order_save(dap_chain_net_t * a_net, dap_chain_net_srv_order_t *a_order) +{ + if (!a_net || !a_order) + return -1; + + dap_chain_hash_fast_t l_order_hash; + size_t l_order_size = dap_chain_net_srv_order_get_size(a_order); + dap_hash_fast( a_order, l_order_size, &l_order_hash ); + char * l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_order_hash); + char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net); + if ( !dap_chain_global_db_gr_set(l_order_hash_str, a_order, l_order_size, l_gdb_group_str ) ){ + DAP_DELETE( l_gdb_group_str ); + return -1; + } + DAP_DELETE( l_gdb_group_str ); + return 0; +} + /** * @brief dap_chain_net_srv_order_find_by_hash_str * @param a_net @@ -113,7 +259,8 @@ dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash_str(dap_chain_n char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net); size_t l_order_size =0; l_order = (dap_chain_net_srv_order_t *) dap_chain_global_db_gr_get(a_hash_str, &l_order_size, l_gdb_group_str ); - if (l_order_size != sizeof (dap_chain_net_srv_order_t) ){ + // check order size + if(l_order_size != dap_chain_net_srv_order_get_size(l_order)) { log_it( L_ERROR, "Found wrong size order"); DAP_DELETE( l_order ); DAP_DELETE( l_gdb_group_str ); @@ -148,9 +295,11 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ dap_global_db_obj_t * l_orders = dap_chain_global_db_gr_load(l_gdb_group_str,&l_orders_count); log_it( L_DEBUG ,"Loaded %zd orders", l_orders_count); bool l_order_pass_first=true; - size_t l_order_passed_index; + size_t l_order_passed_index = 0; + size_t l_orders_size = 0; lb_order_pass: - l_order_passed_index =0; + l_order_passed_index = 0; + l_orders_size = 0; for (size_t i=0; i< l_orders_count; i++){ dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *) l_orders[i].value; // Check direction @@ -179,8 +328,14 @@ lb_order_pass: if ( strcmp( l_order->price_ticker, a_price_ticker) != 0 ) continue; - if( !l_order_pass_first ) - memcpy( *a_output_orders+l_order_passed_index, l_order, sizeof (dap_chain_net_srv_order_t)); + if( !l_order_pass_first ){ + size_t l_order_size = dap_chain_net_srv_order_get_size(l_order); + memcpy((char*)*a_output_orders + l_orders_size, l_order, l_order_size); + l_orders_size += l_order_size; + } + else + // calc size of all orders + l_orders_size += dap_chain_net_srv_order_get_size(l_order); l_order_passed_index++; } @@ -188,7 +343,7 @@ lb_order_pass: if (l_order_pass_first) { l_order_pass_first = false; *a_output_orders_count = l_order_passed_index; - *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, sizeof (dap_chain_net_srv_order_t)*l_order_passed_index ); + *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_orders_size); goto lb_order_pass; } // If we here - its the second pass through @@ -228,7 +383,7 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d if (a_order && a_str_out ){ dap_chain_hash_fast_t l_hash; char l_hash_str[DAP_CHAIN_HASH_FAST_SIZE * 2 + 4]; - dap_hash_fast(a_order,sizeof (*a_order),&l_hash ); + dap_hash_fast(a_order, dap_chain_net_srv_order_get_size(a_order), &l_hash); dap_chain_hash_fast_to_str(&l_hash,l_hash_str,sizeof(l_hash_str)-1); dap_string_append_printf(a_str_out, "== Order %s ==\n", l_hash_str); dap_string_append_printf(a_str_out, " version: %u\n", a_order->version ); @@ -240,14 +395,29 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d } dap_string_append_printf(a_str_out, " srv_uid: 0x%016llX\n", a_order->srv_uid.uint64 ); - dap_string_append_printf(a_str_out, " price: \u00a0%.7Lf (%llu)\n", dap_chain_balance_to_coins(a_order->price) , a_order->price); + dap_string_append_printf(a_str_out, " price: \u00a0%.7Lf (%llu)\n", dap_chain_balance_to_coins(a_order->price) , a_order->price); if( a_order->price_unit.uint32 ) - dap_string_append_printf(a_str_out, " price_unit: 0x%016llX\n", dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit) ); + dap_string_append_printf(a_str_out, " price_unit: %s\n", dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit) ); if ( a_order->node_addr.uint64) dap_string_append_printf(a_str_out, " node_addr: "NODE_ADDR_FP_STR"\n", NODE_ADDR_FP_ARGS_S(a_order->node_addr) ); - dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str,sizeof(l_hash_str)-1); - dap_string_append_printf(a_str_out, " tx_cond_hash: %s\n", l_hash_str ); - dap_string_append_printf(a_str_out, " ext: \"%s\"\n", a_order->ext ); + char *l_region = NULL; + uint8_t l_continent_num = 0; + const char *l_continent_str = NULL; + if(dap_chain_net_srv_order_get_continent_region(a_order, &l_continent_num, &l_region)) + l_continent_str = dap_chain_net_srv_order_continent_to_str(l_continent_num); + dap_string_append_printf(a_str_out, " node_location: %s - %s\n", l_continent_str ? l_continent_str : "None" , l_region ? l_region : "None"); + DAP_DELETE(l_region); + + dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str, sizeof(l_hash_str)-1); + dap_string_append_printf(a_str_out, " tx_cond_hash: %s\n", l_hash_str ); + char *l_ext_out = a_order->ext_size ? DAP_NEW_Z_SIZE(char, a_order->ext_size * 2 + 1) : NULL; + dap_bin2hex(l_ext_out, a_order->ext, a_order->ext_size); + if(l_ext_out) + dap_string_append_printf(a_str_out, " ext: 0x%s\n", l_ext_out); + else + dap_string_append_printf(a_str_out, " ext: 0x0\n"); + + DAP_DELETE(l_ext_out); } } diff --git a/dap_chain_net_srv_order.h b/dap_chain_net_srv_order.h index b45274fca1f4ba5d4248e6b337289f08ed5fcac2..3aa88fd18145045a68c158a1edd97bd760588f22 100644 --- a/dap_chain_net_srv_order.h +++ b/dap_chain_net_srv_order.h @@ -42,13 +42,25 @@ typedef struct dap_chain_net_srv_order dap_chain_time_t ts_expires; uint64_t price; // service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service - char ext[128]; + //uint8_t continent; + //char region[32]; + uint32_t ext_size; + char ext[]; } DAP_ALIGN_PACKED dap_chain_net_srv_order_t; // Init/deinit should be call only if private int dap_chain_net_srv_order_init(void); void dap_chain_net_srv_order_deinit(void); +size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order); + +bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region); +bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region); + +size_t dap_chain_net_srv_order_continents_count(void); +const char* dap_chain_net_srv_order_continent_to_str(int8_t a_num); +int8_t dap_chain_net_srv_order_continent_to_num(const char *l_continent_str); + dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash_str(dap_chain_net_t * a_net, const char * a_hash_str); DAP_STATIC_INLINE dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash(dap_chain_net_t * a_net, dap_chain_hash_fast_t * a_hash) @@ -88,9 +100,12 @@ char* dap_chain_net_srv_order_create( dap_chain_net_srv_price_unit_uid_t a_price_unit, // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], dap_chain_time_t a_expires, // TS when the service expires - const char * a_comments + const char *a_ext, + const char *a_region, + int8_t a_continent_num ); +int dap_chain_net_srv_order_save(dap_chain_net_t * a_net, dap_chain_net_srv_order_t *a_order); void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out); /**