link_t link_key(mesh_t mesh, lob_t key) { uint8_t csid; hashname_t hn; link_t link; if(!mesh || !key) return LOG("invalid args"); csid = hashname_id(mesh->keys,key); if(!csid) return LOG("no supported key"); hn = hashname_key(key); if(!hn) return LOG("invalid key"); link = link_get(mesh, hn->hashname); if(link) { hashname_free(hn); }else{ link = link_new(mesh,hn); } // load key if it's not yet if(!link->key) return link_load(link, csid, key); return link; }
link_t mesh_add(mesh_t mesh, lob_t json, pipe_t pipe) { link_t link; lob_t keys, paths; uint8_t csid; if(!mesh || !json) return LOG("bad args"); LOG("mesh add %s",lob_json(json)); link = link_get(mesh, hashname_vchar(lob_get(json,"hashname"))); keys = lob_get_json(json,"keys"); paths = lob_get_array(json,"paths"); if(!link) link = link_keys(mesh, keys); if(!link) LOG("no hashname"); LOG("loading keys/paths"); if(keys && (csid = hashname_id(mesh->keys,keys))) link_load(link, csid, keys); // handle any pipe/paths if(pipe) link_pipe(link, pipe); lob_t path; for(path=paths;path;path = lob_next(path)) link_path(link,path); lob_free(keys); lob_freeall(paths); return link; }
link_t link_keys(mesh_t mesh, lob_t keys) { uint8_t csid; if(!mesh || !keys) return LOG("invalid args"); csid = hashname_id(mesh->keys,keys); if(!csid) return LOG("no supported key"); return link_key(mesh, hashname_im(keys,csid)); }
int main(int argc, char **argv) { hashname_t hn; fail_unless(e3x_init(NULL) == 0); hn = hashname_vchar("uvabrvfqacyvgcu8kbrrmk9apjbvgvn2wjechqr3vf9c1zm3hv7g"); fail_unless(!hn); hn = hashname_vchar("jvdoio6kjvf3yqnxfvck43twaibbg4pmb7y3mqnvxafb26rqllwa"); fail_unless(hn); fail_unless(strlen(hashname_char(hn)) == 52); hashname_free(hn); // create intermediate fixture lob_t im = lob_new(); lob_set(im,"1a","ym7p66flpzyncnwkzxv2qk5dtosgnnstgfhw6xj2wvbvm7oz5oaq"); lob_set(im,"3a","bmxelsxgecormqjlnati6chxqua7wzipxliw5le35ifwxlge2zva"); hn = hashname_vkey(im, 0); fail_unless(hn); fail_unless(util_cmp(hashname_char(hn),"jvdoio6kjvf3yqnxfvck43twaibbg4pmb7y3mqnvxafb26rqllwa") == 0); lob_t keys = lob_new(); lob_set(keys,"1a","vgjz3yjb6cevxjomdleilmzasbj6lcc7"); lob_set(keys,"3a","hp6yglmmqwcbw5hno37uauh6fn6dx5oj7s5vtapaifrur2jv6zha"); hn = hashname_vkeys(keys); fail_unless(hn); fail_unless(util_cmp(hashname_char(hn),"jvdoio6kjvf3yqnxfvck43twaibbg4pmb7y3mqnvxafb26rqllwa") == 0); fail_unless(hashname_id(NULL,NULL) == 0); fail_unless(hashname_id(im,keys) == 0x3a); lob_t test = lob_new(); lob_set(test,"1a","test"); lob_set(test,"2a","test"); fail_unless(hashname_id(keys,test) == 0x1a); // check short utils hn = hashname_schar("uvabrvfq"); fail_unless(hn); fail_unless(hashname_isshort(hn)); fail_unless(util_cmp(hashname_short(hn),"uvabrvfq") == 0); return 0; }
link_t link_get_keys(mesh_t mesh, lob_t keys) { uint8_t csid; if(!mesh || !keys) return LOG("invalid args"); csid = hashname_id(mesh->keys,keys); if(!csid) return LOG("no supported key"); lob_t key = hashname_im(keys,csid); link_t ret = link_get_key(mesh, key, csid); lob_free(key); return ret; }
link_t link_get_key(mesh_t mesh, lob_t key, uint8_t csid) { link_t link; if(!mesh || !key) return LOG("invalid args"); if(hashname_id(mesh->keys,key) > csid) return LOG("invalid csid"); link = link_get(mesh, hashname_vkey(key, csid)); if(!link) return LOG("invalid key"); // load key if it's not yet if(!link->key) return link_load(link, csid, key); return link; }