| | |
| | | return false;
|
| | | }
|
| | |
|
| | | int bus_client_reply_msg(void* handle, void* src, const struct crepmsg* msg){
|
| | | int bus_client_reply(void* handle, void* src, const struct crepmsg* msg){
|
| | |
|
| | | MsgRequestTopicReply msgR;
|
| | | auto err = msgR.mutable_errmsg();
|
| | |
| | | pbmsg.set_topic(topic, topicl);
|
| | | pbmsg.set_data(data, size);
|
| | | auto pbstr = pbmsg.SerializeAsString();
|
| | | return bus_client_pubmsg(handle, pbstr.data(), pbstr.size());
|
| | | return bus_client_publish_msg(handle, pbstr.data(), pbstr.size());
|
| | | }
|
| | |
|
| | | // test
|
| | | int bus_client_pubmsg(void* handle, const char* data, const size_t size){
|
| | | int bus_client_publish_msg(void* handle, const char* data, const size_t size){
|
| | | client* cli = ptr(handle);
|
| | | return bus_publish(cli->bus, data, size, 100);
|
| | | }
|
| | |
| | | /*
|
| | | 发布消息,data 是 MsgPublish protobuffer序列化后的数据
|
| | | */
|
| | | int bus_client_pubmsg(void* handle, const char* data, const size_t size);
|
| | | int bus_client_publish_msg(void* handle, const char* data, const size_t size);
|
| | | /*
|
| | | 发布消息,topic 是发布主题, data 是发布的消息体
|
| | | */
|
| | |
| | | 通过 message.h 的 make_reply_msg 创建时,有内存拷贝,必须通过 free_reply_msg 释放
|
| | | 或者通过填充 crepmsg 结构体构造,由调用者控制变量的内存和生命周期,可能不会拷贝内存,效率更高
|
| | | */
|
| | | int bus_client_reply_msg(void* handle, void* src, const struct crepmsg* msg);
|
| | | int bus_client_reply(void* handle, void* src, const struct crepmsg* msg);
|
| | | /*
|
| | | 同步的request请求,发送 creqmsg 获取 crepmsg 回复
|
| | | 通过 message.h 的 make_req_msg 创建 request 消息时,必须调用 free_reqmsg 释放
|
| | |
| | | bus_client_free; |
| | | bus_client_get_submsg; |
| | | bus_client_get_submsg_intime; |
| | | bus_client_pubmsg; |
| | | bus_client_publish_msg; |
| | | bus_client_publish; |
| | | bus_client_get_reqmsg; |
| | | bus_client_get_reqmsg_intime; |
| | | bus_client_reply_msg; |
| | | bus_client_reply; |
| | | bus_client_request; |
| | | |
| | | make_cproc; |
| | |
| | | void* src = NULL; |
| | | auto msg = bus_client_get_reqmsg(handle, &src); |
| | | auto repmsg = make_reply_msg(0, NULL, 0, "recv request", 12); |
| | | bus_client_reply_msg(handle, src, repmsg); |
| | | bus_client_reply(handle, src, repmsg); |
| | | free_reply_msg(repmsg); |
| | | printf("REPREQ msg [%s] \n", msg->msg); |
| | | |
| | |
| | | |
| | | const auto& pbstr = msgRT.SerializeAsString(); |
| | | tie(msg->msg, msg->msgl) = copymemory(pbstr); |
| | | auto doc = yyjson_read(msg->msg, msg->msgl, 0); |
| | | yyjson_val* root = yyjson_doc_get_root(doc); |
| | | |
| | | auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; |
| | | |
| | | auto jp = obj(root, "path"); |
| | | auto jb = obj(root, "body"); |
| | | if (jp && jb){ |
| | | tie(msg->path, msg->pathl) = copymemory(yyjson_get_str(jp), yyjson_get_len(jp)); |
| | | tie(msg->body, msg->bodyl) = copymemory(yyjson_get_str(jb), yyjson_get_len(jb)); |
| | | } |
| | | |
| | | yyjson_doc_free(doc); |
| | | |
| | | return msg; |
| | | } |
| | |
| | | if (msg){ |
| | | free(msg->procid); |
| | | free(msg->msg); |
| | | free(msg->path); |
| | | free(msg->body); |
| | | free(msg); |
| | | } |
| | | } |
| | | |
| | | static tuple<const char*, size_t> json2body(yyjson_doc* doc){ |
| | | ignoreT(json2body); |
| | | |
| | | yyjson_val* root = yyjson_doc_get_root(doc); |
| | | |
| | | auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; |
| | |
| | | if (!jp) return make_tuple((const char*)NULL, 0); |
| | | auto jb = obj(root, "body"); |
| | | if (!jb) return make_tuple((const char*)NULL, 0); |
| | | return make_tuple(yyjson_get_str(jb), yyjson_get_len(jp)); |
| | | return make_tuple(yyjson_get_str(jb), yyjson_get_len(jb)); |
| | | } |
| | | |
| | | struct cstackmsgerr* get_reqmsg_stackerr(struct creqmsg* msg){ |
| | | auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); |
| | | auto tpbody = json2body(doc0); |
| | | if (!get<0>(tpbody)) return NULL; |
| | | // auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); |
| | | // auto tpbody = json2body(doc0); |
| | | // if (!get<0>(tpbody)) return NULL; |
| | | // auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); |
| | | |
| | | auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); |
| | | auto doc = yyjson_read(msg->body, msg->bodyl, 0); |
| | | auto root = yyjson_doc_get_root(doc); |
| | | |
| | | auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; |
| | |
| | | tie(smsg->fileid, smsg->fileidl) = copymemory(yyjson_get_str(jfid), yyjson_get_len(jfid)); |
| | | yyjson_doc_free(doc); |
| | | |
| | | yyjson_doc_free(doc0); |
| | | // yyjson_doc_free(doc0); |
| | | |
| | | return smsg; |
| | | } |
| | |
| | | } |
| | | // decode success msg |
| | | struct cstackmsg* get_reqmsg_stack(struct creqmsg* msg){ |
| | | auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); |
| | | auto tpbody = json2body(doc0); |
| | | if (!get<0>(tpbody)) return NULL; |
| | | // auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); |
| | | // auto tpbody = json2body(doc0); |
| | | // if (!get<0>(tpbody)) return NULL; |
| | | // auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); |
| | | |
| | | auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); |
| | | auto doc = yyjson_read(msg->body, msg->bodyl, 0); |
| | | auto root = yyjson_doc_get_root(doc); |
| | | |
| | | auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; |
| | |
| | | smsg->files[i] = file; |
| | | } |
| | | yyjson_doc_free(doc); |
| | | yyjson_doc_free(doc0); |
| | | // yyjson_doc_free(doc0); |
| | | |
| | | return smsg; |
| | | } |
| | |
| | | size_t procidl; |
| | | char* msg; // request消息体 |
| | | size_t msgl; |
| | | char* path; |
| | | size_t pathl; |
| | | char* body; |
| | | size_t bodyl; |
| | | }; |
| | | // decode stack err msg |
| | | /* |