void marketmaker_pendingupdate(char *exchange,char *base,char *rel) { char *retstr; cJSON *retjson,*obj; int32_t i; struct mmpending_order *ptr; for (i=0; i<Num_Pending; i++) { ptr = &Pending_orders[i]; if ( strcmp(exchange,ptr->exchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) continue; if ( ptr->completed == 0 && (retstr= DEX_orderstatus(exchange,ptr->orderid)) != 0 ) { //printf("%s status.(%s)\n",ptr->orderid,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { obj = jobj(retjson,"result"); if ( is_cJSON_Array(obj) != 0 ) obj = jitem(retjson,0); if ( jdouble(obj,"QuantityRemaining") == 0. || is_cJSON_True(jobj(obj,"IsOpen")) == 0 ) { //{"Uuid":null,"OrderUuid":"e7b0789c-0c4e-413b-a768-3d5734d9cbe5","Exchange":"BTC-KMD","OrderType":"LIMIT_SELL","Quantity":877.77700000,"QuantityRemaining":462.50512234,"Limit":0.00011770,"CommissionPaid":0.00012219,"Price":0.04887750,"PricePerUnit":0.00011769,"Opened":"2017-02-20T13:16:22.29","Closed":null,"CancelInitiated":false,"ImmediateOrCancel":false,"IsConditional":false,"Condition":"NONE","ConditionTarget":null} printf("uuid.(%s) finished.(%s)\n",ptr->orderid,jprint(retjson,0)); ptr->completed = (uint32_t)time(NULL); ptr->pending = 0; } free_json(retjson); } free(retstr); } } }
static int32_t process_json(char *retbuf,int32_t max,struct plugin_info *plugin,char *jsonargs,int32_t initflag) { void *loadfile(uint64_t *allocsizep,char *fname); struct destbuf tokenstr,filename; char *myipaddr,*jsonstr = 0; cJSON *obj=0,*tmp,*json = 0; uint64_t allocsize,nxt64bits,tag = 0; int32_t retval = 0; //printf("call process_json.(%s)\n",jsonargs); if ( jsonargs != 0 && (json= cJSON_Parse(jsonargs)) != 0 ) { if ( is_cJSON_Array(json) != 0 && cJSON_GetArraySize(json) == 2 ) { obj = cJSON_GetArrayItem(json,0); copy_cJSON(&tokenstr,cJSON_GetArrayItem(json,1)); } else obj = json, tokenstr.buf[0] = 0; copy_cJSON(&filename,cJSON_GetObjectItem(obj,"filename")); if ( filename.buf[0] != 0 && (jsonstr= loadfile(&allocsize,filename.buf)) != 0 ) { if ( (tmp= cJSON_Parse(jsonstr)) != 0 ) obj = tmp; else free(jsonstr), jsonstr = 0; } if ( jsonstr == 0 ) jsonstr = cJSON_Print(obj); stripwhite2(jsonstr,' '); } if ( obj != 0 ) { //printf("jsonargs.(%s)\n",jsonargs); tag = get_API_nxt64bits(cJSON_GetObjectItem(obj,"tag")); if ( initflag > 0 ) { if ( (nxt64bits= get_API_nxt64bits(cJSON_GetObjectItem(obj,"NXT"))) != 0 ) { plugin->nxt64bits = nxt64bits; expand_nxt64bits(plugin->NXTADDR,plugin->nxt64bits); } if ( (nxt64bits= get_API_nxt64bits(cJSON_GetObjectItem(obj,"serviceNXT"))) != 0 ) expand_nxt64bits(plugin->SERVICENXT,nxt64bits); myipaddr = cJSON_str(cJSON_GetObjectItem(obj,"ipaddr")); if ( is_ipaddr(myipaddr) != 0 ) strcpy(plugin->ipaddr,myipaddr); plugin->port = get_API_int(cJSON_GetObjectItem(obj,"port"),0); } } //fprintf(stderr,"tag.%llu initflag.%d got jsonargs.(%s) [%s] %p\n",(long long)tag,initflag,jsonargs,jsonstr,obj); if ( jsonstr != 0 && obj != 0 ) retval = PLUGNAME(_process_json)(0,0,1,plugin,tag,retbuf,max,jsonstr,obj,initflag,tokenstr.buf); else printf("error with JSON.(%s)\n",jsonstr);//, getchar(); //fprintf(stderr,"done tag.%llu initflag.%d got jsonargs.(%p) %p %p\n",(long long)tag,initflag,jsonargs,jsonstr,obj); if ( jsonstr != 0 ) free(jsonstr); if ( json != 0 ) free_json(json); printf("%s\n",retbuf), fflush(stdout); return(retval); }
char *PARSEBALANCE(struct exchange_info *exchange,double *balancep,char *coinstr) { //[[{"type":"deposit","currency":"btc","amount":"0.0","available":"0.0"},{"type":"deposit","currency":"usd","amount":"0.0","available":"0.0"},{"type":"exchange","currency":"btc","amount":"0.01065851","available":"0.01065851"},{"type":"exchange","currency":"usd","amount":"23386.37278962","available":"0.00378962"},{"type":"trading","currency":"btc","amount":"0.0","available":"0.0"},{"type":"trading","currency":"usd","amount":"0.0","available":"0.0"}]] int32_t i,n,ind; char field[64],*str,*typestr,*itemstr = 0; cJSON *item,*obj,*array; double amounts[3],avail[3],val0,val1; *balancep = 0.; strcpy(field,coinstr), tolowercase(field); memset(amounts,0,sizeof(amounts)); memset(avail,0,sizeof(avail)); if ( exchange->balancejson != 0 && is_cJSON_Array(exchange->balancejson) != 0 && (n= cJSON_GetArraySize(exchange->balancejson)) > 0 ) { for (i=0; i<n; i++) { if ( (item= jitem(exchange->balancejson,i)) != 0 ) { if ( (str= jstr(item,"currency")) != 0 && strcmp(field,str) == 0 ) { val0 = jdouble(item,"amount"); val1 = jdouble(item,"available"); if ( (typestr= jstr(item,"type")) != 0 ) { if ( strcmp(typestr,"deposit") == 0 ) ind = 0; else if ( strcmp(typestr,"exchange") == 0 ) ind = 1; else if ( strcmp(typestr,"trading") == 0 ) ind = 2; else ind = -1; if ( ind >= 0 ) { amounts[ind] = val0; avail[ind] = val1; } } } } } if ( (obj= cJSON_CreateObject()) != 0 ) { touppercase(field); *balancep = avail[0] + avail[1] + avail[2]; jaddstr(obj,"base",field); jaddnum(obj,"balance",*balancep); jaddnum(obj,"total",amounts[0]+amounts[1]+amounts[2]); array = cJSON_CreateArray(), jaddinum(array,avail[0]), jaddinum(array,amounts[0]), jadd(obj,"deposit",array); array = cJSON_CreateArray(), jaddinum(array,avail[1]), jaddinum(array,amounts[1]), jadd(obj,"exchange",array); array = cJSON_CreateArray(), jaddinum(array,avail[2]), jaddinum(array,amounts[2]), jadd(obj,"trading",array); itemstr = jprint(obj,1); } } if ( itemstr == 0 ) return(clonestr("{\"error\":\"cant find coin balance\"}")); return(itemstr); }
cJSON *jarray(int32_t *nump,cJSON *json,char *field) { cJSON *array; if ( json != 0 ) { if ( field == 0 ) array = json; else array = cJSON_GetObjectItem(json,field); if ( array != 0 && is_cJSON_Array(array) != 0 && (*nump= cJSON_GetArraySize(array)) > 0 ) return(array); } *nump = 0; return(0); }
void ram_parse_MGWpingstr(struct mgw777 *mgw,char *sender,char *pingstr) { void save_MGW_status(char *NXTaddr,char *jsonstr); char name[512],coinstr[MAX_JSON_FIELD],*jsonstr = 0; struct MGWstate S; int32_t gatewayid; cJSON *json,*array; if ( (array= cJSON_Parse(pingstr)) != 0 && is_cJSON_Array(array) != 0 ) { json = cJSON_GetArrayItem(array,0); if ( mgw == 0 ) { copy_cJSON(coinstr,cJSON_GetObjectItem(json,"coin")); if ( coinstr[0] != 0 ) mgw = get_MGW_info(coinstr); } if ( Debuglevel > 2 || (mgw != 0 && mgw->remotemode != 0) ) printf("[%s] parse.(%s)\n",coinstr,pingstr); if ( mgw != 0 ) { cJSON_DeleteItemFromObject(json,"ipaddr"); if ( (gatewayid= (int32_t)get_API_int(cJSON_GetObjectItem(json,"gatewayid"),-1)) >= 0 && gatewayid < mgw->numgateways ) { if ( strcmp(mgw->special_NXTaddrs[gatewayid],sender) == 0 ) ram_parse_MGWstate(&mgw->otherS[gatewayid],json,mgw->coinstr,sender); else printf("ram_parse_MGWpingstr: got wrong address.(%s) for gatewayid.%d expected.(%s)\n",sender,gatewayid,mgw->special_NXTaddrs[gatewayid]); } else { //printf("call parse.(%s)\n",cJSON_Print(json)); ram_parse_MGWstate(&S,json,mgw->coinstr,sender); ram_update_remotesrc(mgw,&S); } jsonstr = cJSON_Print(json); if ( gatewayid >= 0 && gatewayid < 3 && strcmp(mgw->mgwstrs[gatewayid],jsonstr) != 0 ) { safecopy(mgw->mgwstrs[gatewayid],jsonstr,sizeof(mgw->mgwstrs[gatewayid])); //sprintf(name,"%s.%s",mgw->coinstr,Server_ipaddrs[gatewayid]); sprintf(name,"%s.%d",mgw->coinstr,gatewayid); //printf("name is (%s) + (%s) -> (%s)\n",mgw->coinstr,Server_ipaddrs[gatewayid],name); save_MGW_status(name,jsonstr); } } if ( jsonstr != 0 ) free(jsonstr); free_json(array); } //printf("parsed\n"); }
static int32_t process_plugin_json(char *retbuf,int32_t max,int32_t *sendflagp,struct plugin_info *plugin,int32_t permanentflag,uint64_t daemonid,uint64_t myid,char *jsonstr) { int32_t valid = -11,len = (int32_t)strlen(jsonstr); cJSON *json,*obj,*tokenobj; uint64_t tag = 0; struct destbuf name,destname,forwarder,tokenstr,sender; retbuf[0] = *sendflagp = 0; //printf("PLUGIN.(%s) process_plugin_json (%s)\n",plugin->name,jsonstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { if ( is_cJSON_Array(json) != 0 ) { obj = cJSON_GetArrayItem(json,0); jsonstr = cJSON_Print(obj), stripwhite2(jsonstr,' '); tokenobj = cJSON_GetArrayItem(json,1), stripwhite2(tokenstr.buf,' '); copy_cJSON(&tokenstr,tokenobj); copy_cJSON(&forwarder,cJSON_GetObjectItem(tokenobj,"forwarder")); copy_cJSON(&sender,cJSON_GetObjectItem(tokenobj,"sender")); valid = get_API_int(cJSON_GetObjectItem(tokenobj,"valid"),valid); } else obj = json, tokenstr.buf[0] = forwarder.buf[0] = sender.buf[0] = 0; copy_cJSON(&name,cJSON_GetObjectItem(obj,"plugin")); if ( name.buf[0] == 0 ) copy_cJSON(&name,cJSON_GetObjectItem(obj,"agent")); copy_cJSON(&destname,cJSON_GetObjectItem(obj,"destplugin")); if ( destname.buf[0] == 0 ) copy_cJSON(&destname,cJSON_GetObjectItem(obj,"destagent")); tag = get_API_nxt64bits(cJSON_GetObjectItem(obj,"tag")); if ( (strcmp(name.buf,plugin->name) == 0 || strcmp(destname.buf,plugin->name) == 0) && (len= PLUGNAME(_process_json)(forwarder.buf,sender.buf,valid,plugin,tag,retbuf,max,jsonstr,obj,0,tokenstr.buf)) > 0 ) { *sendflagp = 1; if ( retbuf[0] == 0 ) sprintf(retbuf,"{\"result\":\"no response\"}"); append_stdfields(retbuf,max,plugin,tag,0); return((int32_t)strlen(retbuf)); } //else printf("(%s) -> no return.%d (%s) vs (%s):(%s) len.%d\n",jsonstr,strcmp(name,plugin->name),name,destname,plugin->name,len); } else { printf("process_plugin_json: couldnt parse.(%s)\n",jsonstr); if ( jsonstr[len-1] == '\r' || jsonstr[len-1] == '\n' || jsonstr[len-1] == '\t' || jsonstr[len-1] == ' ' ) jsonstr[--len] = 0; sprintf(retbuf,"{\"result\":\"unparseable\",\"message\":\"%s\"}",jsonstr); } if ( *sendflagp != 0 && retbuf[0] != 0 ) append_stdfields(retbuf,max,plugin,tag,0); else retbuf[0] = *sendflagp = 0; return((int32_t)strlen(retbuf)); }
uint32_t *conv_addrjson(int32_t *nump,struct coin777 *coin,cJSON *addrjson) { uint32_t firstblocknum,*addrinds = 0; int32_t i; if ( is_cJSON_String(addrjson) != 0 ) { *nump = 1; addrinds = malloc(sizeof(*addrinds)); addrinds[0] = coin777_addrind(&firstblocknum,coin,cJSON_str(addrjson)); } else if ( is_cJSON_Array(addrjson) != 0 && (*nump= cJSON_GetArraySize(addrjson)) > 0 ) { addrinds = calloc(*nump,sizeof(*addrinds)); for (i=0; i<*nump; i++) addrinds[i] = coin777_addrind(&firstblocknum,coin,cJSON_str(cJSON_GetArrayItem(addrjson,i))); } return(addrinds); }
int32_t in_jsonarray(cJSON *array,char *value) { int32_t i,n; struct destbuf remote; if ( array != 0 && is_cJSON_Array(array) != 0 ) { n = cJSON_GetArraySize(array); for (i=0; i<n; i++) { if ( array == 0 || n == 0 ) break; copy_cJSON(&remote,cJSON_GetArrayItem(array,i)); if ( strcmp(remote.buf,value) == 0 ) return(1); } } return(0); }
char *transporterstatus_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t value; cJSON *array; struct coin_info *cp; int32_t minage; uint8_t sharenrs[255]; uint32_t totalcrc,status,i,sharei,M,N,height,ind,num,n=0,*crcs = 0; char NXTACCTSECRET[1024],sharenrsbuf[1024],otherpubaddr[512],coinstr[512],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); status = get_API_int(objs[2],0); copy_cJSON(coinstr,objs[3]); totalcrc = get_API_uint(objs[4],0); value = (SATOSHIDEN * get_API_float(objs[5])); num = get_API_int(objs[6],0); minage = get_API_int(objs[7],0); height = get_API_int(objs[8],0); array = objs[9]; if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { crcs = calloc(n,sizeof(*crcs)); for (i=0; i<n; i++) crcs[i] = get_API_uint(cJSON_GetArrayItem(array,i),0); } sharei = get_API_int(objs[9],0); M = get_API_int(objs[11],0); N = get_API_int(objs[12],0); copy_cJSON(sharenrsbuf,objs[13]); memset(sharenrs,0,sizeof(sharenrs)); if ( M <= N && N < 0xff && M > 0 ) decode_hex(sharenrs,N,sharenrsbuf); else M = N = 1; ind = get_API_int(objs[14],0); copy_cJSON(otherpubaddr,objs[15]); //printf("transporterstatus_func sharei.%d M.%d N.%d other.(%s)\n",sharei,M,N,otherpubaddr); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 && num > 0 ) retstr = got_transporter_status(NXTACCTSECRET,sender,coinstr,status,totalcrc,value,num,crcs,ind,minage,height,sharei,M,N,sharenrs,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid incoming transporter status\"}"); if ( crcs != 0 ) free(crcs); return(retstr); }
cJSON *InstantDEX_lottostats() { char cmdstr[1024],NXTaddr[64],buf[1024],*jsonstr; struct destbuf receiverstr; cJSON *json,*array,*txobj; int32_t i,n,totaltickets = 0; uint64_t amount,senderbits; uint32_t timestamp = 0; if ( timestamp == 0 ) timestamp = 38785003; sprintf(cmdstr,"requestType=getAccountTransactions&account=%s×tamp=%u&type=0&subtype=0",INSTANTDEX_ACCT,timestamp); //printf("cmd.(%s)\n",cmdstr); if ( (jsonstr= issue_NXTPOST(cmdstr)) != 0 ) { // printf("jsonstr.(%s)\n",jsonstr); // mm string.({"requestProcessingTime":33,"transactions":[{"fullHash":"2a2aab3b84dadf092cf4cedcd58a8b5a436968e836338e361c45651bce0ef97e","confirmations":203,"signatureHash":"52a4a43d9055fe4861b3d13fbd03a42fecb8c9ad4ac06a54da7806a8acd9c5d1","transaction":"711527527619439146","amountNQT":"1100000000","transactionIndex":2,"ecBlockHeight":360943,"block":"6797727125503999830","recipientRS":"NXT-74VC-NKPE-RYCA-5LMPT","type":0,"feeNQT":"100000000","recipient":"4383817337783094122","version":1,"sender":"423766016895692955","timestamp":38929220,"ecBlockId":"10121077683890606382","height":360949,"subtype":0,"senderPublicKey":"4e5bbad625df3d536fa90b1e6a28c3f5a56e1fcbe34132391c8d3fd7f671cb19","deadline":1440,"blockTimestamp":38929430,"senderRS":"NXT-8E6V-YBWH-5VMR-26ESD","signature":"4318f36d9cf68ef0a8f58303beb0ed836b670914065a868053da5fe8b096bc0c268e682c0274e1614fc26f81be4564ca517d922deccf169eafa249a88de58036"}]}) if ( (json= cJSON_Parse(jsonstr)) != 0 ) { if ( (array= cJSON_GetObjectItem(json,"transactions")) != 0 && is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { for (i=0; i<n; i++) { txobj = cJSON_GetArrayItem(array,i); copy_cJSON(&receiverstr,cJSON_GetObjectItem(txobj,"recipient")); if ( strcmp(receiverstr.buf,INSTANTDEX_ACCT) == 0 ) { if ( (senderbits = get_API_nxt64bits(cJSON_GetObjectItem(txobj,"sender"))) != 0 ) { expand_nxt64bits(NXTaddr,senderbits); amount = get_API_nxt64bits(cJSON_GetObjectItem(txobj,"amountNQT")); if ( amount == INSTANTDEX_FEE ) totaltickets++; else if ( amount >= 2*INSTANTDEX_FEE ) totaltickets += 2; } } } } free_json(json); } free(jsonstr); } sprintf(buf,"{\"result\":\"lottostats\",\"totaltickets\":\"%d\"}",totaltickets); return(cJSON_Parse(buf)); }
int64_t get_asset_quantity(int64_t *unconfirmedp,char *NXTaddr,char *assetidstr) { char cmd[4096],assetid[512]; union NXTtype retval; int32_t i,n,iter; cJSON *array,*item,*obj; int64_t quantity,qty; quantity = *unconfirmedp = 0; sprintf(cmd,"%s=getAccount&account=%s",_NXTSERVER,NXTaddr); retval = extract_NXTfield(0,0,cmd,0,0); if ( retval.json != 0 ) { for (iter=0; iter<2; iter++) { qty = 0; array = cJSON_GetObjectItem(retval.json,iter==0?"assetBalances":"unconfirmedAssetBalances"); if ( is_cJSON_Array(array) != 0 ) { n = cJSON_GetArraySize(array); for (i=0; i<n; i++) { item = cJSON_GetArrayItem(array,i); obj = cJSON_GetObjectItem(item,"asset"); copy_cJSON(assetid,obj); //printf("i.%d of %d: %s(%s)\n",i,n,assetid,cJSON_Print(item)); if ( strcmp(assetid,assetidstr) == 0 ) { qty = get_cJSON_int(item,iter==0?"balanceQNT":"unconfirmedBalanceQNT"); break; } } } if ( iter == 0 ) quantity = qty; else *unconfirmedp = qty; } } return(quantity); }
char *transporter_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t value; struct coin_info *cp; uint8_t sharenrs[255]; uint32_t totalcrc,M,N,minage,height,i,n=0,*crcs = 0; char NXTACCTSECRET[1024],sharenrsbuf[1024],coinstr[512],otherpubaddr[512],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); copy_cJSON(coinstr,objs[2]); height = get_API_uint(objs[3],0); minage = get_API_uint(objs[4],0); value = (SATOSHIDEN * get_API_float(objs[5])); totalcrc = get_API_uint(objs[6],0); if ( is_cJSON_Array(objs[7]) != 0 && (n= cJSON_GetArraySize(objs[7])) > 0 ) { crcs = calloc(n,sizeof(*crcs)); for (i=0; i<n; i++) crcs[i] = get_API_uint(cJSON_GetArrayItem(objs[7],i),0); } M = get_API_int(objs[8],0); N = get_API_int(objs[9],0); copy_cJSON(sharenrsbuf,objs[10]); memset(sharenrs,0,sizeof(sharenrs)); if ( M <= N && N < 0xff && M > 0 ) decode_hex(sharenrs,N,sharenrsbuf); else M = N = 1; copy_cJSON(otherpubaddr,objs[11]); printf("transporterstatus_func M.%d N.%d [%s] otherpubaddr.(%s)\n",M,N,sharenrsbuf,otherpubaddr); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 && n > 0 ) retstr = transporter_received(sender,NXTACCTSECRET,coinstr,totalcrc,height,value,minage,crcs,n,M,N,sharenrs,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid incoming transporter bundle\"}"); if ( crcs != 0 ) free(crcs); return(retstr); }
int32_t PLUGNAME(_process_json)(char *forwarder,char *sender,int32_t valid,struct plugin_info *plugin,uint64_t tag,char *retbuf,int32_t maxlen,char *origjsonstr,cJSON *origjson,int32_t initflag,char *tokenstr) { char *resultstr,*retstr = 0,*methodstr,*jsonstr,*destplugin,*submethod; struct destbuf tagstr,endpoint; cJSON *retjson,*json,*tokenobj; uint32_t nonce; struct applicant_info apply; retbuf[0] = 0; if ( tokenstr == 0 ) tokenstr = ""; if ( is_cJSON_Array(origjson) != 0 && cJSON_GetArraySize(origjson) == 2 ) json = cJSON_GetArrayItem(origjson,0), jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); else json = origjson, jsonstr = origjsonstr; if ( Debuglevel > 2 ) printf("<<<<<<<<<<<< INSIDE relays PLUGIN! process %s [(%s).(%s)]\n",plugin->name,jsonstr,tokenstr); if ( initflag > 0 ) { // configure settings RELAYS.readyflag = 1; plugin->allowremote = 1; strcpy(retbuf,"{\"result\":\"initflag > 0\"}"); } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); methodstr = cJSON_str(cJSON_GetObjectItem(json,"method")); destplugin = cJSON_str(cJSON_GetObjectItem(json,"destplugin")); submethod = cJSON_str(cJSON_GetObjectItem(json,"submethod")); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } //fprintf(stderr,"RELAYS methodstr.(%s) (%s)\n",methodstr,jsonstr); if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } #ifdef INSIDE_MGW else if ( strcmp(methodstr,"msigaddr") == 0 ) { char *devMGW_command(char *jsonstr,cJSON *json); if ( SUPERNET.gatewayid >= 0 ) retstr = devMGW_command(jsonstr,json); } #endif else { strcpy(retbuf,"{\"result\":\"relay command under construction\"}"); if ( strcmp(methodstr,"list") == 0 ) retstr = relays_jsonstr(jsonstr,json); else if ( strcmp(methodstr,"telepathy") == 0 ) { sprintf(retbuf,"%s",jsonstr); } else if ( strcmp(methodstr,"busdata") == 0 ) { retstr = busdata_sync(&nonce,jsonstr,cJSON_str(cJSON_GetObjectItem(json,"broadcast")),0); // {"plugin":"relay","method":"busdata","destplugin":"relay","submethod":"join","broadcast":"join","endpoint":""} } else if ( strcmp(methodstr,"allservices") == 0 ) { if ( (retjson= serviceprovider_json()) != 0 ) { retstr = cJSON_Print(retjson), _stripwhite(retstr,' '); free_json(retjson); //printf("got.(%s)\n",retstr); } else printf("null serviceprovider_json()\n"); } else if ( strcmp(methodstr,"protocol") == 0 || strcmp(methodstr,"allprotocols") == 0 ) { if ( strcmp(methodstr,"protocol") == 0 && valid > 0 ) protocols_register(sender,jstr(json,"protocol"),jstr(json,"endpoint"),jint(json,"disconnect")); if ( (retjson= protocols_json(jstr(json,"protocol"))) != 0 ) { retstr = cJSON_Print(retjson), _stripwhite(retstr,' '); free_json(retjson); } else printf("null protocols_json()\n"); } else if ( strcmp(methodstr,"join") == 0 ) { if ( SUPERNET.noncing == 0 ) { copy_cJSON(&tagstr,cJSON_GetObjectItem(json,"tag")); copy_cJSON(&endpoint,cJSON_GetObjectItem(json,"endpoint")); SUPERNET.noncing = 1; if ( SUPERNET.iamrelay != 0 ) { portable_thread_create((void *)calc_nonces,clonestr(endpoint.buf)); sprintf(retbuf,"{\"result\":\"noncing\",\"endpoint\":\"%s\"}",endpoint.buf); } //fprintf(stderr,"join or nonce.(%s)\n",retbuf); } } else if ( strcmp(methodstr,"nonce") == 0 ) { struct destbuf endpoint,sender,destpoint,relaypoint,globalpoint,noncestr; memset(&apply,0,sizeof(apply)); copy_cJSON(&destpoint,cJSON_GetObjectItem(json,"destpoint")); copy_cJSON(&endpoint,cJSON_GetObjectItem(json,"lbendpoint")); copy_cJSON(&relaypoint,cJSON_GetObjectItem(json,"relaypoint")); copy_cJSON(&globalpoint,cJSON_GetObjectItem(json,"globalpoint")); copy_cJSON(&sender,cJSON_GetObjectItem(json,"NXT")); if ( SUPERNET.noncing != 0 && strcmp(SUPERNET.lbendpoint,destpoint.buf) == 0 ) { if ( endpoint.buf[0] != 0 && tokenstr[0] != 0 && (tokenobj= cJSON_Parse(tokenstr)) != 0 ) { strcpy(apply.lbendpoint,endpoint.buf); strcpy(apply.relayendpoint,relaypoint.buf); strcpy(apply.globalendpoint,globalpoint.buf); apply.senderbits = calc_nxt64bits(sender.buf); copy_cJSON(&noncestr,cJSON_GetObjectItem(tokenobj,"nonce")); if ( noncestr.buf[0] != 0 ) apply.nonce = (uint32_t)calc_nxt64bits(noncestr.buf); //printf("tokenobj.(%s) -> nonce.%u\n",tokenstr,apply.nonce); free_json(tokenobj); recv_nonces(&apply); } } } } } return(plugin_copyretstr(retbuf,maxlen,retstr)); }
char *InstantDEX_parser(char *forwarder,char *sender,int32_t valid,char *origargstr,cJSON *origargjson) { static char *allorderbooks[] = { (char *)allorderbooks_func, "allorderbooks", "", 0 }; static char *orderbook[] = { (char *)orderbook_func, "orderbook", "", "baseid", "relid", "allfields", "oldest", "maxdepth", "base", "rel", "gui", "showall", "exchange", 0 }; static char *lottostats[] = { (char *)lottostats_func, "lottostats", "", "timestamp", 0 }; static char *cancelquote[] = { (char *)cancelquote_func, "cancelquote", "", "quoteid", 0 }; static char *openorders[] = { (char *)openorders_func, "openorders", "", 0 }; static char *placebid[] = { (char *)placebid_func, "placebid", "", "baseid", "relid", "volume", "price", "timestamp", "baseamount", "relamount", "gui", "automatch", "minperc", "duration", "exchange", "offerNXT", 0 }; static char *placeask[] = { (char *)placeask_func, "placeask", "", "baseid", "relid", "volume", "price", "timestamp", "baseamount", "relamount", ",gui", "automatch", "minperc", "duration", "exchange", "offerNXT", 0 }; static char *bid[] = { (char *)bid_func, "bid", "", "baseid", "relid", "volume", "price", "timestamp", "baseamount", "relamount", "gui", "automatch", "minperc", "duration", "exchange", "offerNXT", 0 }; static char *ask[] = { (char *)ask_func, "ask", "", "baseid", "relid", "volume", "price", "timestamp", "baseamount", "relamount", "gui", "automatch", "minperc", "duration", "exchange", "offerNXT", 0 }; static char *makeoffer3[] = { (char *)makeoffer3_func, "makeoffer3", "", "baseid", "relid", "quoteid", "perc", "deprecated", "baseiQ", "reliQ", "askoffer", "price", "volume", "exchange", "baseamount", "relamount", "offerNXT", "minperc", "jumpasset", 0 }; static char *respondtx[] = { (char *)respondtx_func, "respondtx", "", "cmd", "assetid", "quantityQNT", "priceNQT", "triggerhash", "quoteid", "sig", "data", "minperc", "offerNXT", "otherassetid", "otherqty", 0 }; static char *jumptrades[] = { (char *)jumptrades_func, "jumptrades", "", 0 }; static char *tradehistory[] = { (char *)tradehistory_func, "tradehistory", "", "timestamp", 0 }; static char **commands[] = { allorderbooks, lottostats, cancelquote, respondtx, jumptrades, tradehistory, openorders, makeoffer3, placebid, bid, placeask, ask, orderbook }; int32_t i,j,localaccess = 0; cJSON *argjson,*obj,*nxtobj,*secretobj,*objs[64]; char NXTaddr[MAX_JSON_FIELD],NXTACCTSECRET[MAX_JSON_FIELD],command[MAX_JSON_FIELD],offerNXT[MAX_JSON_FIELD],**cmdinfo,*argstr,*retstr=0; memset(objs,0,sizeof(objs)); command[0] = 0; valid = 1; memset(NXTaddr,0,sizeof(NXTaddr)); if ( is_cJSON_Array(origargjson) != 0 ) { argjson = cJSON_GetArrayItem(origargjson,0); argstr = cJSON_Print(argjson), _stripwhite(argstr,' '); } else argjson = origargjson, argstr = origargstr; NXTACCTSECRET[0] = 0; if ( argjson != 0 ) { if ( (obj= cJSON_GetObjectItem(argjson,"requestType")) == 0 ) obj = cJSON_GetObjectItem(argjson,"method"); nxtobj = cJSON_GetObjectItem(argjson,"NXT"); secretobj = cJSON_GetObjectItem(argjson,"secret"); copy_cJSON(NXTaddr,nxtobj); copy_cJSON(offerNXT,cJSON_GetObjectItem(argjson,"offerNXT")); if ( NXTaddr[0] == 0 && offerNXT[0] == 0 ) { strcpy(NXTaddr,SUPERNET.NXTADDR); strcpy(offerNXT,SUPERNET.NXTADDR); strcpy(sender,SUPERNET.NXTADDR); ensure_jsonitem(argjson,"NXT",NXTaddr); ensure_jsonitem(argjson,"offerNXT",offerNXT); } else if ( offerNXT[0] == 0 && strcmp(NXTaddr,SUPERNET.NXTADDR) == 0 ) { strcpy(offerNXT,SUPERNET.NXTADDR); strcpy(sender,SUPERNET.NXTADDR); ensure_jsonitem(argjson,"offerNXT",offerNXT); } else strcpy(sender,offerNXT); if ( strcmp(offerNXT,SUPERNET.NXTADDR) == 0 ) localaccess = 1; if ( localaccess != 0 && strcmp(NXTaddr,SUPERNET.NXTADDR) != 0 ) { strcpy(NXTaddr,SUPERNET.NXTADDR); ensure_jsonitem(argjson,"NXT",NXTaddr); //printf("subsititute NXT.%s\n",NXTaddr); } //printf("localaccess.%d myaddr.(%s) NXT.(%s) offerNXT.(%s)\n",localaccess,SUPERNET.NXTADDR,NXTaddr,offerNXT); copy_cJSON(command,obj); copy_cJSON(NXTACCTSECRET,secretobj); if ( NXTACCTSECRET[0] == 0 ) { if ( localaccess != 0 || strcmp(command,"findnode") != 0 ) { safecopy(NXTACCTSECRET,SUPERNET.NXTACCTSECRET,sizeof(NXTACCTSECRET)); strcpy(NXTaddr,SUPERNET.NXTADDR); } } //printf("(%s) argstr.(%s) command.(%s) NXT.(%s) valid.%d\n",cJSON_Print(argjson),argstr,command,NXTaddr,valid); //fprintf(stderr,"SuperNET_json_commands sender.(%s) valid.%d | size.%d | command.(%s) orig.(%s)\n",sender,valid,(int32_t)(sizeof(commands)/sizeof(*commands)),command,origargstr); for (i=0; i<(int32_t)(sizeof(commands)/sizeof(*commands)); i++) { cmdinfo = commands[i]; if ( strcmp(cmdinfo[1],command) == 0 ) { //printf("needvalid.(%c) valid.%d %d of %d: cmd.(%s) vs command.(%s)\n",cmdinfo[2][0],valid,i,(int32_t)(sizeof(commands)/sizeof(*commands)),cmdinfo[1],command); if ( cmdinfo[2][0] != 0 && valid <= 0 ) return(0); for (j=3; cmdinfo[j]!=0&&j<3+(int32_t)(sizeof(objs)/sizeof(*objs)); j++) objs[j-3] = cJSON_GetObjectItem(argjson,cmdinfo[j]); retstr = (*(json_handler)cmdinfo[0])(localaccess,valid,sender,objs,j-3,argstr); break; } } } else printf("not JSON to parse?\n"); if ( argstr != origargstr ) free(argstr); return(retstr); }
cJSON *jitem(cJSON *array,int32_t i) { if ( array != 0 && is_cJSON_Array(array) != 0 && cJSON_GetArraySize(array) > i ) return(cJSON_GetArrayItem(array,i)); return(0); }