From ecf23f882ca1b8aaf0863980fc4781c515da1695 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期一, 12 十二月 2022 16:49:03 +0800 Subject: [PATCH] add req rep --- message.cpp | 106 ++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 72 insertions(+), 34 deletions(-) diff --git a/message.cpp b/message.cpp index 591b50a..394e1d4 100644 --- a/message.cpp +++ b/message.cpp @@ -25,7 +25,13 @@ static struct cstr cstr_clone(const struct cstr old){ return cstr_new(old.str, old.size); } - +static struct cstr cstr_ref(char* str, const size_t len){ + struct cstr cs; + memset(&cs, 0, sizeof(cs)); + cs.size = len; + cs.str = str; + return cs; +} struct cstr cstr_new(const char* str, const size_t len){ struct cstr cs; memset(&cs, 0, sizeof(cs)); @@ -37,20 +43,20 @@ void cstr_free(struct cstr str){ if (str.str && str.size) free(str.str); } -struct cstrarr cstr_arr_new(const size_t len){ +struct cstrarr cstr_arr_new(const size_t count){ struct cstrarr arr; memset(&arr, 0, sizeof(arr)); - arr.arr = (struct cstr*)calloc(len, sizeof(struct cstr)); - arr.size = len; + arr.arr = (struct cstr*)calloc(count, sizeof(struct cstr)); + arr.count = count; return arr; } void cstr_arr_add(struct cstrarr* arr, const char* data, const size_t len, const size_t idx){ - if (arr->arr && arr->size && idx < arr->size){ + if (arr->arr && arr->count && idx < arr->count){ arr->arr[idx] = cstr_new(data, len); } } void cstr_arr_free(struct cstrarr arr){ - for(size_t i = 0; i < arr.size; i++){ + for(size_t i = 0; i < arr.count; i++){ auto & str = arr.arr[i]; cstr_free(str); } @@ -176,11 +182,11 @@ rinfo->pinfo = pinfo; auto assign_arr = [&obj](yyjson_val* v){ - const size_t size = yyjson_arr_size(v); + const size_t count = yyjson_arr_size(v); struct cstrarr arr; memset(&arr, 0, sizeof(arr)); - arr.size = size; - for(size_t i = 0; i < size; i++){ + arr.count = count; + for(size_t i = 0; i < count; i++){ auto sv = yyjson_arr_get(v, i); char* entry = NULL; size_t entry_size = 0; @@ -357,49 +363,60 @@ } ////////////////////////////////////////////////// -struct creq json2creq(const char* data, const size_t size){ - yyjson_doc* doc = yyjson_read(data, size, 0); +static tuple<struct cstr, struct cstr> json2reqmsg(const struct cstr msg){ + yyjson_doc* doc = yyjson_read(msg.str, msg.size, 0); yyjson_val* root = yyjson_doc_get_root(doc); auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; - struct creq req; - memset(&req, 0, sizeof(req)); - auto jp = obj(root, "path"); auto jb = obj(root, "body"); - req.path = cstr_new(yyjson_get_str(jp), yyjson_get_len(jp)); - req.body = cstr_new(yyjson_get_raw(jb), yyjson_get_len(jb)); - + auto tp = make_tuple(cstr_new(yyjson_get_str(jp), yyjson_get_len(jp)), + cstr_new(yyjson_get_raw(jb), yyjson_get_len(jb))); yyjson_doc_free(doc); - return req; + return tp; } -struct creqmsg* to_reqmsg(const char* pid, const size_t pids, - const char* data, const size_t size, void* src) +struct creqmsg* to_reqmsg(const char* pid, const size_t pids, const char* data, const size_t size) { auto msg = ptrT<struct creqmsg>(); msg->procid = cstr_new(pid, pids); MsgRequestTopic msgRT; if (!msgRT.ParseFromArray(data, size)) return NULL; + msg->msg = cstr_new(msgRT.data().data(), msgRT.data().size()); - // creg = msgRT.data(); - msg->msg = json2creq(data, size); - msg->src = src; + return msg; +} + +struct creqmsg* make_req_msg(const char* topic, const size_t topics, + const char* data, const size_t datal) +{ + auto msg = ptrT<struct creqmsg>(); + MsgRequestTopic msgRT; + msgRT.set_topic(topic, topics); + msgRT.set_data(data, datal); + + auto pbstr = msgRT.SerializeAsString(); + msg->msg = cstr_new(pbstr.data(), pbstr.size()); + return msg; } void free_reqmsg(struct creqmsg* msg){ if (msg){ cstr_free(msg->procid); - cstr_free(msg->msg.path); - cstr_free(msg->msg.body); + cstr_free(msg->msg); free(msg); } } struct cstackmsgerr* get_reqmsg_stackerr(struct creqmsg* msg){ - auto &body = msg->msg.body; + struct cstr path, body; + memset(&path, 0, sizeof(path)); + memset(&body, 0, sizeof(body)); + tie(path, body) = json2reqmsg(msg->msg); + if (body.size == 0) return NULL; + auto doc = yyjson_read(body.str, body.size, 0); auto root = yyjson_doc_get_root(doc); @@ -411,6 +428,10 @@ stkmsg->stackid = cstr_new(yyjson_get_str(jsid), yyjson_get_len(jsid)); stkmsg->fileid = cstr_new(yyjson_get_str(jfid), yyjson_get_len(jfid)); yyjson_doc_free(doc); + + cstr_free(path); + cstr_free(body); + return stkmsg; } void free_reqmsg_stackerr(struct cstackmsgerr* msg){ @@ -422,7 +443,12 @@ } // decode success msg struct cstackmsg* get_reqmsg_stack(struct creqmsg* msg){ - auto &body = msg->msg.body; + struct cstr path, body; + memset(&path, 0, sizeof(path)); + memset(&body, 0, sizeof(body)); + tie(path, body) = json2reqmsg(msg->msg); + if (body.size == 0) return NULL; + auto doc = yyjson_read(body.str, body.size, 0); auto root = yyjson_doc_get_root(doc); @@ -471,22 +497,34 @@ } } -struct crepmsg* make_reply_msg(const int success, const char* msg, const size_t msgl, +struct crepmsg* make_reply_msg(const int errcode, const char* errmsg, const size_t emsgl, const char* data, const size_t datal) { - auto rmsg = ptrT<struct crepmsg>(); - // rmsg->success = success; - // rmsg->msg = cstr_new(msg, msgl); - // rmsg->data = cstr_new(msg, msgl); + auto msg = ptrT<struct crepmsg>(); + msg->errcode = errcode; + msg->errmsg = cstr_new(errmsg, emsgl); + msg->data = cstr_new(data, datal); + return msg; +} +struct cstr make_reply_msg_json(const int success, const char* msg, const size_t msgl, + const char* data, const size_t datal) +{ auto doc = yyjson_mut_doc_new(NULL); + auto root = yyjson_mut_obj(doc); + yyjson_mut_obj_add_bool(doc, root, "success", !!success); + yyjson_mut_obj_add_strn(doc, root, "msg", msg, msgl); + yyjson_mut_obj_add_strn(doc, root, "data", data, datal); - return rmsg; + size_t jsonl = 0; + char* json = yyjson_mut_val_write(root, 0, &jsonl); + yyjson_mut_doc_free(doc); + return cstr_ref(json, jsonl); } void free_reply_msg(struct crepmsg* msg){ if (msg){ - cstr_free(msg->msg); + cstr_free(msg->errmsg); cstr_free(msg->data); free(msg); } -- Gitblit v1.8.0