From f600bb176c1d2f0eeb5180637bdc09605b3d21bd Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 14 十二月 2022 14:58:28 +0800
Subject: [PATCH] restruct for easy use v1.1

---
 main.cpp         |   87 ++----
 message.cpp      |  396 +++++++++++++++++------------
 message.h        |  177 +++++++------
 cbhomeclient.cpp |   84 +++---
 cbhomeclient.h   |   12 
 5 files changed, 412 insertions(+), 344 deletions(-)

diff --git a/cbhomeclient.cpp b/cbhomeclient.cpp
index e4c80aa..60140b2 100644
--- a/cbhomeclient.cpp
+++ b/cbhomeclient.cpp
@@ -43,7 +43,7 @@
     void*                       bus{nullptr};
     cproc*                      pinfo{nullptr};
     ~client(){
-        free_proc_info(pinfo);
+        internal_cproc_free(pinfo);
 
         thrd_quit.store(true, memory_order_acq_rel);
         if (thrd_sub) thrd_sub->join();
@@ -52,7 +52,7 @@
         if (sub_q) sub_q->clear(freeMsg);
         if (readreq_q) readreq_q->clear(freeMsg);
 
-        if (bus) bus_cleanup(bus);
+        bus_cleanup(bus);
     }
 };
 
@@ -116,18 +116,16 @@
 }
 
 template <class F>
-MsgCR to_topic(client* cli, F&& f, const struct cstrarr& topic){
+MsgCR to_topic(client* cli, F&& f, char** topic, const size_t count){
     MsgCR msg(dummy());
-    if (topic.arr && topic.count){
-        MsgTopicList tlist;
-        for(size_t i = 0; i < topic.count; i++)
-            tlist.add_topic_list(topic.arr[i].str, topic.arr[i].size);
-        const auto& tpc = tlist.SerializeAsString();
-        void* replymsg = NULL;
-        int replysize = 0;
-        msg = std::move(to_center<2,3>(cli, std::forward<F>(f),
-            tpc.data(), tpc.size(), &replymsg, &replysize, sndto));
-    }
+    MsgTopicList tlist;
+    for(size_t i = 0; i < count; i++)
+        tlist.add_topic_list(topic[i]);
+    const auto& tpc = tlist.SerializeAsString();
+    void* replymsg = NULL;
+    int replysize = 0;
+    msg = std::move(to_center<2,3>(cli, std::forward<F>(f),
+        tpc.data(), tpc.size(), &replymsg, &replysize, sndto));
     return msg;
 }
 
@@ -168,14 +166,14 @@
 static void registered(client* cli, const creg* rinfo){
 
     ProcInfo pinfo;
-    auto tmp = rinfo->pinfo;
-    pinfo.set_name(tmp->name.str, tmp->name.size);
-    pinfo.set_proc_id(tmp->id.str, tmp->id.size);
-    const auto& reg = pinfo.SerializeAsString();
+    auto proc = creg_proc(rinfo);
+    pinfo.set_name(cproc_name(proc));
+    pinfo.set_proc_id(cproc_id(proc));
+    const auto& pbproc = pinfo.SerializeAsString();
     while (!cli->thrd_quit.load(memory_order_acquire)) {
         void* replymsg = NULL;
         int replysize = 0;
-        cli->bus = bus_register(reg.data(), reg.size(), &replymsg, &replysize, sndto);
+        cli->bus = bus_register(pbproc.data(), pbproc.size(), &replymsg, &replysize, sndto);
         bus_free(replymsg, replysize);
         if (cli->bus) break;
     }
@@ -184,24 +182,32 @@
 
     // request/reply鍜宲ub topic涓�璧峰鐞�
     // 鍙渶瑕佸皢瀛楃涓叉寚閽堟嫹璐濆氨琛岋紝涓嶉渶鍒涘缓瀛楃涓插唴瀛�
-    auto shallowMerge = [](const cstrarr& arr1, const cstrarr& arr2){
-        auto tmp = cstr_arr_new(arr1.count + arr2.count);
-        auto dst = tmp.arr;
-        auto cp2dst = [&dst](const cstr* src, const size_t cnt){
-            memcpy(dst, src, cnt * sizeof(cstr));
+    auto shallowMerge = [](char** a1, const size_t c1, char** a2, const size_t c2){
+        auto tmp = (char**)malloc((c1 + c2) * sizeof(char*));
+        auto dst = tmp;
+        auto cp2dst = [&dst](char** src, const size_t cnt){
+            memcpy(dst, src, cnt * sizeof(char*));
             dst += cnt;
         };
-        cp2dst(arr1.arr, arr1.count);
-        cp2dst(arr2.arr, arr2.count);
+        cp2dst(a1, c1);
+        cp2dst(a2, c2);
         return tmp;
     };
-    auto tmparr = shallowMerge(rinfo->channel, rinfo->topic_pub);
-    auto tpcmsg = to_topic(cli, bus_register_topics, tmparr);
-    free(tmparr.arr);
+    size_t tpcc = 0, pubc = 0;
+    char** tpc = creg_rep_topic(rinfo, &tpcc);
+    char** pub = creg_pub_topic(rinfo, &pubc);
+    auto tmparr = shallowMerge(tpc, tpcc, pub, pubc);
+    auto tpcmsg = to_topic(cli, bus_register_topics, tmparr, tpcc + pubc);
+    for(size_t i = 0; i < tpcc+pubc; i++){
+        printf("======>> proc [%s] topic %lu -> %s\n", cproc_name(proc), i, tmparr[i]);
+    }
+    free(tmparr);
 
     // if topic pub/sub[net] exist, register topics
-    auto submsg = to_topic(cli, bus_subscribe_topics, rinfo->topic_sub);
-    auto subnetmsg = to_topic(cli, bus_subscribe_topics_net, rinfo->topic_sub_net);
+    tpc = creg_sub_topic(rinfo, &tpcc);
+    auto submsg = to_topic(cli, bus_subscribe_topics, tpc, tpcc);
+    tpc = creg_subnet_topic(rinfo, &tpcc);
+    auto subnetmsg = to_topic(cli, bus_subscribe_topics_net, tpc, tpcc);
 
     if (get<0>(submsg) && !cli->thrd_sub)
         cli->thrd_sub.reset(new thread([cli]{ thread_sub(cli); }));
@@ -210,21 +216,21 @@
 
 static void unregistered(client* cli){
     ProcInfo pinfo;
-    auto tmp = cli->pinfo;
-    pinfo.set_name(tmp->name.str, tmp->name.size);
-    pinfo.set_proc_id(tmp->id.str, tmp->id.size);
-    const auto& reg = pinfo.SerializeAsString();
+    auto proc = cli->pinfo;
+    pinfo.set_name(cproc_name(proc));
+    pinfo.set_proc_id(cproc_id(proc));
+    const auto& pbproc = pinfo.SerializeAsString();
 
     void* rep;
     int repl;
-    to_center<2,3>(cli, bus_unregister, reg.data(), reg.size(), &rep, &repl, sndto);
+    to_center<2,3>(cli, bus_unregister, pbproc.data(), pbproc.size(), &rep, &repl, sndto);
 }
 
 static inline client* ptr(void* handle){ return static_cast<client*>(handle); }
 
 void* bus_client_init(const char* srvid, const size_t sidsize, const creg* rinfo){
     client* cli = new client;
-    cli->pinfo = clone_proc_info(rinfo->pinfo);
+    cli->pinfo = internal_clone_cproc(creg_proc(rinfo));
 
     auto pred = [cli]{ return cli->thrd_quit.load(memory_order_relaxed); };
     const size_t qsize = 5;
@@ -284,7 +290,7 @@
     void* procid = NULL, *reply = NULL;
     int pids = 0, replys = 0;
     auto vmsg = std::move(to_bus<4,5,6,7>(ptr(handle), bus_request, (void*)NULL, 0,
-                    msg->msg.str, msg->msg.size, &procid, &pids,
+                    msg->msg, msg->msgl, &procid, &pids,
                     &reply, &replys, sndto));
     if (!vmsg.empty()){
         void* procid = NULL, *data = NULL;
@@ -310,9 +316,9 @@
     MsgRequestTopicReply msgR;
     auto err = msgR.mutable_errmsg();
     err->set_errcode((ErrorCode)msg->errcode);
-    err->set_errstring(msg->errmsg.str, msg->errmsg.size);
+    err->set_errstring(msg->errmsg, msg->errmsgl);
 
-    msgR.set_data(msg->data.str, msg->data.size);
+    msgR.set_data(msg->data, msg->datal);
     auto pbstr = msgR.SerializeAsString();
 
     auto cli = ptr(handle);
diff --git a/cbhomeclient.h b/cbhomeclient.h
index fba5c9e..94ac29f 100644
--- a/cbhomeclient.h
+++ b/cbhomeclient.h
@@ -25,7 +25,8 @@
 
 /*
     鑾峰彇璁㈤槄鐨勬秷鎭紝璁㈤槄娑堟伅閫氳繃绾跨▼涓嶅仠璇诲彇锛屾澶勪粠缂撳瓨涓鍙�
-    鍙�氳繃 message.h 瀵瑰簲鐨� get_submsg_db get_submsg_proclist 鑾峰彇瀵瑰簲鐨勬秷鎭�
+    蹇呴』閫氳繃 message.h 鐨� free_reqmsg 閲婃斁
+    閫氳繃 get_submsg_db get_submsg_proclist 鑾峰彇瀵瑰簲鐨勬秷鎭�
 */
 struct csubmsg* bus_client_get_submsg(void* handle);
 /*
@@ -39,6 +40,7 @@
 
 /*
     鑾峰彇 request 娑堟伅锛岄�氳繃绾跨▼璇诲彇锛屾澶勪粠缂撳瓨涓鍙�
+    蹇呴』璋冪敤 free_reqmsg 閲婃斁
     鍙�氳繃 message.h 鐨� get_reqmsg_stackerr get_reqmsg_stack 鑾峰彇瀵瑰簲鐨勬秷鎭�
     src 鏄摢涓�涓繘绋嬭姹傜殑鏍囪瘑绗�
     鍙互鍝嶅簲澶氫釜request鍙戦�佺殑娑堟伅锛屽悓鏃堕渶瑕佹弧瓒冲紓姝ュ搷搴旓紝浣跨敤 src 杩涜鍖哄垎
@@ -47,13 +49,15 @@
 struct creqmsg* bus_client_get_reqmsg(void* handle, void** src);
 /*
     鍝嶅簲娑堟伅鍥炲锛宻rc鏄繛鎺ユ爣璇嗙锛宮sg鏄渶瑕佸洖澶嶇殑娑堟伅
-    閫氳繃 message.h 鐨� make_reply_msg 鍒涘缓
+    閫氳繃 message.h 鐨� make_reply_msg 鍒涘缓鏃讹紝鏈夊唴瀛樻嫹璐濓紝蹇呴』閫氳繃 free_reply_msg 閲婃斁
+    鎴栬�呴�氳繃濉厖 crepmsg 缁撴瀯浣撴瀯閫狅紝鐢辫皟鐢ㄨ�呮帶鍒跺彉閲忕殑鍐呭瓨鍜岀敓鍛藉懆鏈燂紝鍙兘涓嶄細鎷疯礉鍐呭瓨锛屾晥鐜囨洿楂�
 */
 int bus_client_reply_msg(void* handle, void* src, const struct crepmsg* msg);
 /*
     鍚屾鐨剅equest璇锋眰锛屽彂閫� creqmsg 鑾峰彇 crepmsg 鍥炲
-    閫氳繃 message.h 鐨� make_req_msg 鍒涘缓 request 娑堟伅
-    鑾峰彇鐨� crepmsg 鍥炲娑堟伅锛岄渶瑕佷娇鐢� free_reply_msg 閲婃斁
+    閫氳繃 message.h 鐨� make_req_msg 鍒涘缓 request 娑堟伅鏃讹紝蹇呴』璋冪敤 free_reqmsg 閲婃斁
+    鎴栬�呴�氳繃濉厖 creqmsg 缁撴瀯浣撴瀯閫狅紝鐢辫皟鐢ㄨ�呮帶鍒跺彉閲忕殑鍐呭瓨鍜岀敓鍛藉懆鏈燂紝鍙兘涓嶄細鎷疯礉鍐呭瓨锛屾晥鐜囨洿楂�
+    鑾峰彇鐨� crepmsg 鍥炲娑堟伅锛屽繀椤讳娇鐢� free_reply_msg 閲婃斁
 */
 int bus_client_request(void* handle, struct creqmsg* msg, struct crepmsg** repmsg);
 
diff --git a/main.cpp b/main.cpp
index 84578e5..84f63fb 100644
--- a/main.cpp
+++ b/main.cpp
@@ -13,33 +13,20 @@
 #include "bhome_msg_api.pb.h"
 using namespace bhome_msg;
 
-static cproc* make_proc(const char* name, const char* id){
-    cproc* pinfo = (cproc*)calloc(1,sizeof(cproc));
-    auto assign = [](char** d, size_t* l, const char* tmp){
-        *l = strlen(tmp);
-        *d = (char*)malloc(*l);
-        memcpy(*d, tmp, *l);
-    };
-    assign(&pinfo->name.str, &pinfo->name.size, name);
-    assign(&pinfo->id.str, &pinfo->id.size, id);
-
-    return pinfo;
-}
-
 template <class F> void ignoref(F&& f){}
 
 static void pub(const vector<string>& topics){
     ignoref(pub);
 
-    creg reg;
-    memset(&reg, 0, sizeof(reg));
-    reg.pinfo = make_proc("pub", "pubid");
-    reg.topic_pub = cstr_arr_new(topics.size());
-    size_t i = 0;
-    for(; i < topics.size(); i++){
-        cstr_arr_add(&reg.topic_pub, topics.at(0).data(), topics.at(0).size(), i);
-    }
-    void* handle = bus_client_init(NULL, 0, &reg);
+    vector<const char*> pubtpc;
+    for(auto& t : topics) pubtpc.push_back(t.c_str());
+
+    creg* reg = make_creg(make_cproc("pub", "pubid"),
+        NULL, 0, &pubtpc[0], pubtpc.size(), NULL, 0, NULL, 0);
+
+    void* handle = bus_client_init(NULL, 0, reg);
+    creg_free(reg);
+
     size_t count = 0;
     string base_msg("test_pub_sub==");
     this_thread::sleep_for(chrono::seconds(3));
@@ -62,21 +49,18 @@
 static void sub(const vector<string>& topics){
     ignoref(sub);
 
-    creg reg;
-    memset(&reg, 0, sizeof(reg));
-    reg.pinfo = make_proc("sub", "subid");
+    vector<const char*> pubtpc;
+    for(auto& t : topics) pubtpc.push_back(t.c_str());
 
-    reg.topic_sub = cstr_arr_new(topics.size());
-    size_t i = 0;
-    for(; i < topics.size(); i++){
-        cstr_arr_add(&reg.topic_sub, topics.at(0).data(), topics.at(0).size(), i);
-    }
+    creg* reg = make_creg(make_cproc("sub", "subid"),
+        NULL, 0, NULL, 0, &pubtpc[0], pubtpc.size(), NULL, 0);
 
-    void* handle = bus_client_init(NULL, 0, &reg);
+    void* handle = bus_client_init(NULL, 0, reg);
+    creg_free(reg);
 
     while (true) {
         auto msg = bus_client_get_submsg(handle);
-        printf("SUB msg topic [%s] data [%s]\n", msg->topic.str, msg->msg.str);
+        printf("SUB msg topic [%s] data [%s]\n", msg->topic, msg->msg);
     }
 
     bus_client_free(handle);
@@ -85,25 +69,22 @@
 static void req(const char* topic){
     ignoref(req);
 
-    string strtpc(topic);
-    creg reg;
-    memset(&reg, 0, sizeof(reg));
-    reg.pinfo = make_proc("request", "requestid");
-    // reg.channel = cstr_arr_new(1);
-    // size_t i = 0;
-    // for(; i < 1; i++){
-    //     cstr_arr_add(&reg.topic_pub, topic, strlen(topic), i);
-    // }
-    void* handle = bus_client_init(NULL, 0, &reg);
+    const auto topicl = strlen(topic);
+    creg* reg = make_creg(make_cproc("request", "requestid"),
+        NULL, 0, NULL, 0, NULL, 0, NULL, 0);
+
+    void* handle = bus_client_init(NULL, 0, reg);
+    creg_free(reg);
+
     size_t count = 0;
     string base_msg("test_request==");
     this_thread::sleep_for(chrono::seconds(3));
     while (true) {
         auto msg = base_msg + "request message -> msg-"+to_string(count++);
-        auto reqmsg = make_req_msg(strtpc.data(), strtpc.size(), msg.data(), msg.size());
+        auto reqmsg = make_req_msg(topic, topicl, msg.data(), msg.size());
         crepmsg* repmsg = NULL;
         if (bus_client_request(handle, reqmsg, &repmsg)){
-            printf("======>> bus_client_reqest [%s] get [%s]\n", msg.c_str(), repmsg->data.str);
+            printf("======>> bus_client_reqest [%s] get [%s]\n", msg.c_str(), repmsg->data);
         }
         free_reqmsg(reqmsg);
         free_reply_msg(repmsg);
@@ -114,15 +95,15 @@
 static void reply(const char* topic){
     ignoref(reply);
 
-    creg reg;
-    memset(&reg, 0, sizeof(reg));
-    reg.pinfo = make_proc("reply", "replyid");
-    reg.channel = cstr_arr_new(1);
-    cstr_arr_add(&reg.channel, topic, strlen(topic), 0);
-    reg.topic_pub = cstr_arr_new(1);
-    cstr_arr_add(&reg.topic_pub, topic, strlen(topic), 0);
+    const auto topicl = strlen(topic);
+    vector<const char*> pubtpc{topic};
 
-    void* handle = bus_client_init(NULL, 0, &reg);
+    creg* reg = make_creg(make_cproc("reply", "replyid"),
+        &pubtpc[0], pubtpc.size(), &pubtpc[0], pubtpc.size(), NULL, 0, NULL, 0);
+
+    void* handle = bus_client_init(NULL, 0, reg);
+    creg_free(reg);
+
     size_t count = 0;
     this_thread::sleep_for(chrono::seconds(3));
     while (true) {
@@ -131,7 +112,7 @@
         auto repmsg = make_reply_msg(0, NULL, 0, "recv request", 12);
         bus_client_reply_msg(handle, src, repmsg);
         free_reply_msg(repmsg);
-        printf("REPREQ msg [%s] \n", msg->msg.str);
+        printf("REPREQ msg [%s] \n", msg->msg);
 
         free_reqmsg(msg);
         this_thread::sleep_for(chrono::seconds{2});
diff --git a/message.cpp b/message.cpp
index 9699470..614018c 100644
--- a/message.cpp
+++ b/message.cpp
@@ -20,91 +20,140 @@
 
 using namespace std;
 
+struct cstr{
+    char*  str;         // 瀛楃涓插唴瀹�
+    size_t size;        // 瀛楃涓查暱搴�
+};
+
+// 杩涚▼淇℃伅
+struct cproc{
+    struct cstr name;   // 杩涚▼鍚嶅瓧
+    struct cstr id;     // 杩涚▼id
+    struct cstr info;   // 杩涚▼鍏朵粬淇℃伅锛岀洰鍓嶆病鐢�
+};
+
+struct creg{
+    cproc*  proc;                    // 闇�瑕佹敞鍐岀殑杩涚▼淇℃伅
+
+    char** channel;             // 杩涚▼鎻愪緵鐨勮姹傚搷搴旀湇鍔$殑涓婚
+    size_t channel_count;
+    char** pub;                 // 杩涚▼鎻愪緵鐨勫彂甯冭闃呯殑鍙戝竷涓婚
+    size_t pub_count;
+    char** sub;                 // 杩涚▼闇�瑕佽闃呯殑涓婚
+    size_t sub_count;
+    char** sub_net;             // 杩涚▼闇�瑕佽闃呯殑缃戠粶涓婚锛岀洰鍓嶆病鐢�
+    size_t sub_net_count;
+};
+
 template <class T> T* ptrT(const size_t l=1){ return (T*)calloc(l, sizeof(T)); }
 
-static inline struct cstr null_cstr(){
+template<class T> struct rmC : remove_const<T>{};
+template<class T> struct rmC<const T*>{ using type = typename rmC<T>::type*; };
+template<class T> struct rmC<const T**>{ using type = typename rmC<T>::type**; };
+template <class T, typename enable_if<is_pointer<T>::value>::type* = nullptr>
+typename rmC<T>::type rmConst(T t){ return const_cast<typename rmC<T>::type>(t); }
+
+static inline struct cstr cstr_ref(const char* str, const size_t len){
     struct cstr cs;
     memset(&cs, 0, sizeof(cs));
-    return cs;
-}
-static inline struct cstr cstr_ref(char* str, const size_t len){
-    struct cstr cs = null_cstr();
     cs.size = len;
-    cs.str = str;
+    cs.str = rmConst(str);
     return cs;
-}
-static inline struct cstr cstr_clone(const struct cstr old){
-    return cstr_new(old.str, old.size);
-}
-struct cstr cstr_new(const char* str, const size_t len){
-    struct cstr cs = null_cstr();
-    cs.size = len;
-    cs.str = ptrT<char>(len);
-    memcpy(cs.str, str, len);
-    return cs;
-}
-void cstr_free(struct cstr str){
-    if (str.str && str.size) free(str.str);
-}
-static inline struct cstrarr null_cstr_arr(){
-    struct cstrarr arr;
-    memset(&arr, 0, sizeof(arr));
-    return arr;
-}
-struct cstrarr cstr_arr_new(const size_t count){
-    struct cstrarr arr = null_cstr_arr();
-    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->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.count; i++){
-        auto & str = arr.arr[i];
-        cstr_free(str);
-    }
-    free(arr.arr);
 }
 
-struct cproc* make_proc_info(const struct cstr name, const struct cstr id, const struct cstr info){
+static inline struct cstr cstr_clone(const struct cstr* str){
+    struct cstr cs;
+    cs.size = str->size;
+    cs.str = ptrT<char>(cs.size);
+    memcpy(cs.str, str, cs.size);
+    return cs;
+}
+
+cproc* internal_clone_cproc(const cproc* proc){
+    auto nproc = ptrT<struct cproc>();
+    nproc->name = cstr_clone(&proc->name);
+    nproc->id = cstr_clone(&proc->id);
+    return nproc;
+}
+void internal_cproc_free(cproc* proc){
+    if (proc){
+        free(proc->name.str);
+        free(proc->id.str);
+        free(proc->info.str);
+        free(proc);
+    }
+}
+
+cproc* make_cproc(const char* name, const char* id){
     auto proc = ptrT<struct cproc>();
-    proc->name = cstr_clone(name);
-    proc->id = cstr_clone(id);
-    // proc->info = cstr_clone(info);
+    proc->name = cstr_ref(name, strlen(name));
+    proc->id = cstr_ref(id, strlen(id));
     return proc;
 }
-struct cproc* clone_proc_info(const struct cproc* pi){
-    if (!pi) return NULL;
-    auto newpi = ptrT<struct cproc>();
-    newpi->name = cstr_clone(newpi->name);
-    newpi->id = cstr_clone(newpi->id);
-    // todo: ignore info
 
-    return newpi;
+char* cproc_name(const cproc* proc){
+    if (!proc) return NULL;
+    return proc->name.str;
 }
 
-void free_proc_info(struct cproc* pi){
-    if (pi){
-        cstr_free(pi->name);
-        cstr_free(pi->id);
-        cstr_free(pi->info);
-        free(pi);
-    }
+char* cproc_id(const cproc* proc){
+    if (!proc) return NULL;
+    return proc->id.str;
 }
 
-void free_creg(struct creg* reg){
-    if (reg){
-        if (reg->pinfo) free_proc_info(reg->pinfo);
-        cstr_arr_free(reg->channel);
-        cstr_arr_free(reg->topic_pub);
-        cstr_arr_free(reg->topic_sub);
-        cstr_arr_free(reg->topic_sub_net);
-        free(reg);
-    }
+void cproc_free(cproc* proc){
+    free(proc);
+}
+
+creg* make_creg(const cproc* proc, const char** rep, const size_t repcnt,
+                                    const char** pub, const size_t pubcnt,
+                                    const char** sub, const size_t subcnt,
+                                    const char** subnet, const size_t subnetcnt)
+{
+    auto reg = ptrT<struct creg>();
+    reg->proc = rmConst(proc);
+    reg->channel = rmConst(rep);
+    reg->channel_count = repcnt;
+    reg->pub = rmConst(pub);
+    reg->pub_count = pubcnt;
+    reg->sub = rmConst(sub);
+    reg->sub_count = subcnt;
+    reg->sub_net = rmConst(subnet);
+    reg->sub_net_count = subnetcnt;
+    return reg;
+}
+
+const cproc* creg_proc(const creg* reg){
+    if (!reg) return NULL;
+    return reg->proc;
+}
+
+char** creg_rep_topic(const creg* reg, size_t* count){
+    if (!reg) return NULL;
+    *count = reg->channel_count;
+    return reg->channel;
+}
+
+char** creg_pub_topic(const creg* reg, size_t* count){
+    if (!reg) return NULL;
+    *count = reg->pub_count;
+    return reg->pub;
+}
+
+char** creg_sub_topic(const creg* reg, size_t* count){
+    if (!reg) return NULL;
+    *count = reg->sub_count;
+    return reg->sub;
+}
+
+char** creg_subnet_topic(const creg* reg, size_t* count){
+    if (!reg) return NULL;
+    *count = reg->sub_net_count;
+    return reg->sub_net;
+}
+
+void creg_free(creg* reg){
+    free(reg);
 }
 
 /////////////////////////////////////////////////////////////////////
@@ -154,28 +203,21 @@
     };
     msg->table = (TableChanged)yyjson_get_int(obj("table"));
     msg->action = (DbAction)yyjson_get_int(obj("action"));
-    assign("id", &msg->id.str, &msg->id.size);
-    assign("info", &msg->info.str, &msg->info.size);
+    assign("id", &msg->id, &msg->idl);
+    assign("info", &msg->info, &msg->infol);
     yyjson_doc_free(doc);
 
     return msg;
 }
 static inline void freeDbChangeMsg(struct DbChangeMsg* msg){
     if (msg){
-        cstr_free(msg->id);
-        cstr_free(msg->info);
+        free(msg->id);
+        free(msg->info);
         free(msg);
     }
 }
 
 ///////////////////////////////////////////////////////////////
-
-static inline tuple<char*, size_t> parseTopic(MsgPublish &msgp, const char* data, const size_t size){
-    if (!msgp.ParseFromArray(data, size)) return make_tuple(nullptr, 0);
-    auto tpc = ptrT<char>(msgp.topic().length()+1);
-    memcpy(tpc, msgp.topic().data(), msgp.topic().size());
-    return make_tuple(tpc, msgp.topic().size());
-}
 
 static inline void json2str(yyjson_val* v, char** d, size_t* l){
     *l = yyjson_get_len(v);
@@ -183,7 +225,7 @@
     memcpy(*d, yyjson_get_str(v), *l);
 }
 
-static struct creg* jsonval2creg(yyjson_val* v){
+static struct creg* json2creg(yyjson_val* v){
     auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);};
     auto rinfo = ptrT<struct creg>();
 
@@ -192,31 +234,47 @@
     json2str(obj(pval, "name"), &pinfo->name.str, &pinfo->name.size);
     json2str(obj(pval, "id"), &pinfo->id.str, &pinfo->id.size);
     json2str(obj(pval, "info"), &pinfo->info.str, &pinfo->info.size);
-    rinfo->pinfo = pinfo;
+    rinfo->proc = pinfo;
 
     auto assign_arr = [&obj](yyjson_val* v){
         const size_t count = yyjson_arr_size(v);
-        struct cstrarr arr = cstr_arr_new(count);
+        char** arr = ptrT<char*>(count);
         for(size_t i = 0; i < count; i++){
             auto sv = yyjson_arr_get(v, i);
             char* entry = NULL;
             size_t entry_size = 0;
             json2str(sv, &entry, &entry_size);
-            arr.arr[i] = cstr_new(entry, entry_size);
+            arr[i] = ptrT<char>(entry_size+1);
+            memcpy(arr[i], entry, entry_size);
         }
-        return arr;
+        return make_tuple(arr, count);
     };
 
-    rinfo->channel = assign_arr(obj(v, "channel"));
-    rinfo->topic_pub = assign_arr(obj(v, "pubTopic"));
-    rinfo->topic_sub = assign_arr(obj(v, "subTopic"));
-    rinfo->topic_sub_net = assign_arr(obj(v, "subNetTopic"));
+    tie(rinfo->channel, rinfo->channel_count) = assign_arr(obj(v, "channel"));
+    tie(rinfo->pub, rinfo->pub_count) = assign_arr(obj(v, "pubTopic"));
+    tie(rinfo->sub, rinfo->sub_count) = assign_arr(obj(v, "subTopic"));
+    tie(rinfo->sub_net, rinfo->sub_net_count) = assign_arr(obj(v, "subNetTopic"));
 
     return rinfo;
 }
 
-static inline void free_cclients(struct cclient* cli, const size_t size){
-    for(size_t i = 0; i < size; i++) if (cli[i].rinfo) free_creg(cli[i].rinfo);
+static inline void free_cclients(struct cclient* cli, const size_t count){
+    for(size_t i = 0; i < count; i++) {
+        if (cli[i].rinfo) {
+            auto tmp = cli[i].rinfo;
+            free(tmp->proc);
+            auto free_arr = [](char** arr, const size_t count){
+                for(size_t i = 0; i < count; i++){
+                    free(arr[i]);
+                }
+                free(arr);
+            };
+            free_arr(tmp->channel, tmp->channel_count);
+            free_arr(tmp->pub, tmp->pub_count);
+            free_arr(tmp->sub, tmp->sub_count);
+            free_arr(tmp->sub_net, tmp->sub_net_count);
+        };
+    }
     free(cli);
 }
 
@@ -235,7 +293,7 @@
         rc.hbcnt = yyjson_get_int(obj(one, "heartbeatCount"));
         rc.dcnt = yyjson_get_int(obj(one, "deadCount"));
         rc.status = yyjson_get_int(obj(one, "status"));
-        rc.rinfo = jsonval2creg(obj(one, "info"));
+        rc.rinfo = json2creg(obj(one, "info"));
 
         cli[i] = rc;
     }
@@ -320,8 +378,8 @@
         *d = ptrT<char>(s.size()+1);
         memcpy(*d, s.data(), *l);
     };
-    assign("id", &db->id.str, &db->id.size);
-    assign("info", &db->info.str, &db->info.size);
+    assign("id", &db->id, &db->idl);
+    assign("info", &db->info, &db->infol);
     // printf("table %d id %s act %d info %s\n", tbl, id.c_str(), act, info.c_str());
 
     // string json;
@@ -332,22 +390,31 @@
     return db;
 }
 
+static tuple<char*, size_t> copymemory(const char* src, const size_t size){
+    char* dst = ptrT<char>(size + 1);
+    memcpy(dst, src, size);
+    return make_tuple(dst, size);
+}
+static tuple<char*, size_t> copymemory(const string& src){
+    char* dst = ptrT<char>(src.size() + 1);
+    memcpy(dst, src.data(), src.size());
+    return make_tuple(dst, src.size());
+}
 struct csubmsg* to_submsg(const char* data, const size_t size){
+
     MsgPublish msg;
-    auto tp = parseTopic(msg, data, size);
+    if (!msg.ParseFromArray(data, size)) return NULL;
+    auto smsg = ptrT<struct csubmsg>();
+    tie(smsg->topic, smsg->topicl) = copymemory(msg.topic());
+    tie(smsg->msg, smsg->msgl) = copymemory(msg.data());
 
-    auto pmsg = ptrT<struct csubmsg>();
-    pmsg->topic = cstr_new(get<0>(tp), get<1>(tp));
-
-    pmsg->msg = cstr_new(msg.data().data(), msg.data().size());
-
-    return pmsg;
+    return smsg;
 }
 
 void free_submsg(struct csubmsg* msg){
     if (msg){
-        cstr_free(msg->topic);
-        cstr_free(msg->msg);
+        free(msg->topic);
+        free(msg->msg);
         free(msg);
     }
 }
@@ -355,15 +422,15 @@
 struct DbChangeMsg* get_submsg_db(struct csubmsg* msg){
     // string json = toJSON((const char*)msg->data, msg->size, "DbChangeMessage");
     // return json2DbChangeMsg(json);
-    return pb2DbChangeMsg((const char*)msg->msg.str, msg->msg.size);
+    return pb2DbChangeMsg((const char*)msg->msg, msg->msgl);
 }
 void free_submsg_db(struct DbChangeMsg* msg){
     if (msg) freeDbChangeMsg(msg);
 }
 
 struct cproclist* get_submsg_proclist(struct csubmsg* msg){
-    const char* data = msg->msg.str;
-    const size_t size = msg->msg.size;
+    const char* data = msg->msg;
+    const size_t size = msg->msgl;
 
     auto pl = ptrT<struct cproclist>();
     pl->cli = json2cclients(data, size, &pl->count);
@@ -371,30 +438,19 @@
 }
 void free_submsg_proclist(struct cproclist* pl){
     if (pl) if (pl->cli) free_cclients(pl->cli, pl->count);
+    free(pl);
 }
 
 //////////////////////////////////////////////////
-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);};
-
-    auto jp = obj(root, "path");
-    auto jb = obj(root, "body");
-    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 tp;
-}
 
 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);
+    tie(msg->procid, msg->procidl) = copymemory(pid, pids);
+
     MsgRequestTopic msgRT;
     if (!msgRT.ParseFromArray(data, size)) return NULL;
-    msg->msg = cstr_new(msgRT.data().data(), msgRT.data().size());
+    tie(msg->msg, msg->msgl) = copymemory(msgRT.data());
 
     return msg;
 }
@@ -408,68 +464,77 @@
     msgRT.set_data(data, datal);
 
     auto pbstr = msgRT.SerializeAsString();
-    msg->msg = cstr_new(pbstr.data(), pbstr.size());
+    tie(msg->msg, msg->msgl) = copymemory(pbstr);
 
     return msg;
 }
 
 void free_reqmsg(struct creqmsg* msg){
     if (msg){
-        cstr_free(msg->procid);
-        cstr_free(msg->msg);
+        free(msg->procid);
+        free(msg->msg);
         free(msg);
     }
 }
 
-struct cstackmsgerr* get_reqmsg_stackerr(struct creqmsg* msg){
-    struct cstr path = null_cstr();
-    struct cstr body = null_cstr();
-    tie(path, body) = json2reqmsg(msg->msg);
-    if (body.size == 0) return NULL;
+static tuple<const char*, size_t> json2body(yyjson_doc* doc){
+    yyjson_val* root = yyjson_doc_get_root(doc);
 
-    auto doc = yyjson_read(body.str, body.size, 0);
+    auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);};
+
+    auto jp = obj(root, "path");
+    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));
+}
+
+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 doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0);
     auto root = yyjson_doc_get_root(doc);
 
     auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);};
 
     auto jsid = obj(root, "stackId");
     auto jfid = obj(root, "fileId");
-    auto stkmsg = ptrT<struct cstackmsgerr>();
-    stkmsg->stackid = cstr_new(yyjson_get_str(jsid), yyjson_get_len(jsid));
-    stkmsg->fileid = cstr_new(yyjson_get_str(jfid), yyjson_get_len(jfid));
+    auto smsg = ptrT<struct cstackmsgerr>();
+    tie(smsg->stackid, smsg->stackidl) = copymemory(yyjson_get_str(jsid), yyjson_get_len(jsid));
+    tie(smsg->fileid, smsg->fileidl) = copymemory(yyjson_get_str(jfid), yyjson_get_len(jfid));
     yyjson_doc_free(doc);
 
-    cstr_free(path);
-    cstr_free(body);
+    yyjson_doc_free(doc0);
 
-    return stkmsg;
+    return smsg;
 }
 void free_reqmsg_stackerr(struct cstackmsgerr* msg){
     if (msg){
-        cstr_free(msg->stackid);
-        cstr_free(msg->fileid);
+        free(msg->stackid);
+        free(msg->fileid);
         free(msg);
     }
 }
 // decode success msg
 struct cstackmsg* get_reqmsg_stack(struct creqmsg* msg){
-    struct cstr path = null_cstr();
-    struct cstr body = null_cstr();
-    tie(path, body) = json2reqmsg(msg->msg);
-    if (body.size == 0) 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(body.str, body.size, 0);
+    auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0);
     auto root = yyjson_doc_get_root(doc);
 
     auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);};
     auto assign = [&obj](yyjson_val* v, const char* name){
         auto tmp(obj(v, name));
-        return cstr_new(yyjson_get_str(tmp), yyjson_get_len(tmp));
+        return copymemory(yyjson_get_str(tmp), yyjson_get_len(tmp));
     };
     auto smsg = ptrT<struct cstackmsg>();
     smsg->procnum = yyjson_get_int(obj(root, "procNum"));
-    smsg->stackid = assign(root, "stackId");
-    smsg->stackname = assign(root, "stackName");
+    tie(smsg->stackid, smsg->stackidl) = assign(root, "stackId");
+    tie(smsg->stackname, smsg->stacknamel) = assign(root, "stackName");
     smsg->type = yyjson_get_int(obj(root, "type"));
     smsg->width = yyjson_get_int(obj(root, "resolution_width"));
     smsg->width = yyjson_get_int(obj(root, "resolution_height"));
@@ -482,25 +547,26 @@
         struct cstackfile file;
         memset(&file, 0, sizeof(file));
         yyjson_val* one = yyjson_arr_get(arr, i);
-        file.id = assign(one, "id");
-        file.name = assign(one, "name");
-        file.path = assign(one, "path");
+        tie(file.id, file.idl) = assign(one, "id");
+        tie(file.name, file.namel) = assign(one, "name");
+        tie(file.path, file.pathl) = assign(one, "path");
         file.type = yyjson_get_int(obj(one, "type"));
 
         smsg->files[i] = file;
     }
     yyjson_doc_free(doc);
+    yyjson_doc_free(doc0);
 
     return smsg;
 }
 void free_reqmsg_stack(struct cstackmsg* msg){
     if (msg){
-        cstr_free(msg->stackid);
-        cstr_free(msg->stackname);
+        free(msg->stackid);
+        free(msg->stackname);
         for(size_t i = 0; i < msg->filescnt; i++){
-            cstr_free(msg->files[i].id);
-            cstr_free(msg->files[i].name);
-            cstr_free(msg->files[i].path);
+            free(msg->files[i].id);
+            free(msg->files[i].name);
+            free(msg->files[i].path);
         }
         free(msg);
     }
@@ -511,12 +577,20 @@
 {
     auto msg = ptrT<struct crepmsg>();
     msg->errcode = errcode;
-    msg->errmsg = cstr_new(errmsg, emsgl);
-    msg->data = cstr_new(data, datal);
+    tie(msg->errmsg, msg->errmsgl) = copymemory(errmsg, emsgl);
+    tie(msg->data, msg->datal) = copymemory(data, datal);
     return msg;
 }
 
-struct cstr make_reply_msg_json(const int success, const char* msg, const size_t msgl,
+void free_reply_msg(struct crepmsg* msg){
+    if (msg){
+        free(msg->errmsg);
+        free(msg->data);
+        free(msg);
+    }
+}
+
+static 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);
@@ -529,12 +603,4 @@
     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->errmsg);
-        cstr_free(msg->data);
-        free(msg);
-    }
 }
diff --git a/message.h b/message.h
index e22be44..aa5b703 100644
--- a/message.h
+++ b/message.h
@@ -3,42 +3,20 @@
 
 #include <stddef.h>
 
-struct cstr{
-    char*  str;         // 瀛楃涓插唴瀹�
-    size_t size;        // 瀛楃涓查暱搴�
-};
-// 杩涚▼淇℃伅
-struct cproc{
-    struct cstr name;   // 杩涚▼鍚嶅瓧
-    struct cstr id;     // 杩涚▼id
-    struct cstr info;   // 杩涚▼鍏朵粬淇℃伅锛岀洰鍓嶆病鐢�
-};
+/*
+    娉ㄥ唽杩涚▼鐨刾roc淇℃伅锛屽寘鎷繘绋嬪悕[name], 杩涚▼[id],绛�
+*/
+typedef struct cproc cproc;
+/*
+    杩涚▼娉ㄥ唽淇℃伅, 鍖呮嫭杩涚▼鐨刾roc淇℃伅 cproc
+    寰呮敞鍐岀殑鏈繘绋嬫彁渚涜姹傚搷搴旂殑涓婚 topics[s], char** rep, 涓婚鏁伴噺 repcnt
+    寰呮敞鍐岀殑鏈繘绋嬪彂甯冪殑涓婚 topics[s], char** pub, 涓婚鏁伴噺 pubcnt
+    寰呮敞鍐岀殑鏈繘绋嬭闃呯殑涓婚 topics[s], char** sub, 涓婚鏁伴噺 subcnt
+    寰呮敞鍐岀殑鏈繘绋嬭闃呯殑[缃戠粶銆佽繙绋嬩富鏈篯涓婚 topics[s], char** subnet, 涓婚鏁伴噺 subnetcnt
+*/
+typedef struct creg creg;
 
-struct cstrarr{
-    struct cstr* arr;   // 瀛楃涓叉暟缁�
-    size_t count;       // 瀛楃涓叉暟缁勯暱搴�
-};
-// 杩涚▼娉ㄥ唽淇℃伅
-struct creg{
-    struct cproc*  pinfo;       // 闇�瑕佹敞鍐岀殑杩涚▼淇℃伅
-
-    cstrarr channel;            // 杩涚▼鎻愪緵鐨勮姹傚搷搴旀湇鍔$殑涓婚
-    cstrarr topic_pub;          // 杩涚▼鎻愪緵鐨勫彂甯冭闃呯殑鍙戝竷涓婚
-    cstrarr topic_sub;          // 杩涚▼闇�瑕佽闃呯殑涓婚
-    cstrarr topic_sub_net;      // 杩涚▼闇�瑕佽闃呯殑缃戠粶涓婚锛岀洰鍓嶆病鐢�
-};
-
-// 鍏朵粬杩涚▼淇℃伅
-struct cclient{
-    struct creg*  rinfo;        // 浠h〃鍏朵粬杩涚▼鐨勮繘绋嬩俊鎭�
-
-    int replykey;               // 娌$敤锛屼笂涓�涓増鏈敤鍏变韩鍐呭瓨锛屾涓簁ey
-    int hbcnt;                  // 蹇冭烦娆℃暟锛熷彲鑳芥病鐢�
-    int dcnt;                   // deadcount锛屽彲鑳芥病鐢紵
-    int status;                 // 杩涚▼鐘舵�侊紝鍙兘娌$敤锛�
-};
-
-//TableChanged enum
+//TableChanged enum pollcontrol 鎺ユ敹鍒扮殑璁㈤槄娑堟伅锛屾暟鎹簱鐨勫彉鍖�
 enum TableChanged {
     T_Camera = 0,       //鎽勫儚鏈哄彉鍖�
     T_CameraRule = 1,       //鎽勫儚鏈轰换鍔″弬鏁板彉鍖�
@@ -58,6 +36,7 @@
     T_CameraPolygonRelation = 15,        //鎽勫儚鏈哄尯鍩熺殑鍏宠仈鍏崇郴
     T_Voice = 16,       //鎶ヨ澹伴煶鍙戠敓鍙樺寲
 };
+// pollcontrol 鎺ユ敹鍒扮殑璁㈤槄娑堟伅锛屾暟鎹簱鐨勬搷浣�
 enum DbAction {
     Insert = 0,     //Insert db
     Update = 1,     //Update db
@@ -66,19 +45,33 @@
 
 // 鏁版嵁搴撳彉鍖栦俊鎭�
 struct DbChangeMsg{
-    TableChanged table;     //鍙樺寲鐨勮〃
-    struct cstr   id;      //鍙樺寲鏁版嵁id
+    TableChanged    table;     //鍙樺寲鐨勮〃
+    char*           id;      //鍙樺寲鏁版嵁id
+    size_t          idl;     // id len
     DbAction action;        //action/ DbAction[Insert/Update/Delete]
-    struct cstr   info;    //鍙樺寲鍐呭
+    char*           info;    //鍙樺寲鍐呭
+    size_t          infol;
 };
 
-// 璁㈤槄娑堟伅
+// 璁㈤槄娑堟伅, 鍖呮嫭鏁版嵁搴撴秷鎭拰鍏朵粬杩涚▼鐨勬秷鎭�
 struct csubmsg{
-    struct cstr topic;      // 鏀跺埌鐨勮闃呮秷鎭殑涓婚锛屽尯鍒嗛偅绉嶈闃呮秷鎭�
+    char* topic;      // 鏀跺埌鐨勮闃呮秷鎭殑涓婚锛屽尯鍒嗛偅绉嶈闃呮秷鎭�
+    size_t topicl;
 
     // private
     // enum MsgT {NONE=0, DB, PROCLIST} type;
-    struct cstr msg;        // 鏀跺埌鐨勮闃呮秷鎭殑body
+    char* msg;        // 鏀跺埌鐨勮闃呮秷鎭殑body
+    size_t msgl;
+};
+
+// 鍏朵粬杩涚▼淇℃伅, pollcontrol鍙兘渚濊禆鍏朵粬杩涚▼鐨勬湇鍔★紝鍙兘闇�瑕佺瓑鍏朵粬杩涚▼鍚姩鍐嶅紑濮嬪伐浣�
+struct cclient{
+    creg*  rinfo;               // 浠h〃鍏朵粬杩涚▼鐨勮繘绋嬩俊鎭�
+
+    int replykey;               // 娌$敤锛屼笂涓�涓増鏈敤鍏变韩鍐呭瓨锛屾涓簁ey
+    int hbcnt;                  // 蹇冭烦娆℃暟锛熷彲鑳芥病鐢�
+    int dcnt;                   // deadcount锛屽彲鑳芥病鐢紵
+    int status;                 // 杩涚▼鐘舵�侊紝鍙兘娌$敤锛�
 };
 
 // 鍏朵粬娉ㄥ唽杩涚▼鍒楄〃锛屽鏁版嵁搴撹繘绋嬮渶瑕佸惎鍔ㄥ啀杩愯pollcontrol閫昏緫
@@ -94,16 +87,20 @@
     鎺ユ敹request娑堟伅浼氬甫鏈夊彂鍑簉equest娑堟伅鐨勮繘绋嬬殑id锛宲rocid
 */
 struct creqmsg{
-    struct cstr procid;     // 鍙戦�乺equest娑堟伅鐨勮繘绋媔d
-    struct cstr msg;        // request娑堟伅浣�
+    char* procid;     // 鍙戦�乺equest娑堟伅鐨勮繘绋媔d
+    size_t procidl;
+    char* msg;        // request娑堟伅浣�
+    size_t msgl;
 };
 // decode stack err msg
 /*
     pollcontrol浼氭帴鏀舵暟鎹爤瑙g爜鍙戦�佺殑瑙g爜澶辫触娑堟伅锛岀敤浜庣疆缃戦〉鐘舵��
 */
 struct cstackmsgerr{
-    struct cstr stackid;    // 瑙g爜澶辫触鐨勬暟鎹爤id
-    struct cstr fileid;     // 瑙g爜澶辫触鐨勬枃浠秈d
+    char* stackid;    // 瑙g爜澶辫触鐨勬暟鎹爤id
+    size_t stackidl;
+    char* fileid;     // 瑙g爜澶辫触鐨勬枃浠秈d
+    size_t fileidl;
 };
 // stack file
 /*
@@ -111,9 +108,13 @@
     鐪嬩唬鐮佸簲璇ュ彧闇�瑕佽В鏋愬嚭鐨勫嚑涓�
 */
 struct cstackfile{
-    struct cstr id;         // 鏂囦欢id
-    struct cstr name;       // 鏂囦欢name
-    struct cstr path;       // 鏂囦欢璺緞
+    char* id;         // 鏂囦欢id
+    size_t idl;
+    char* name;       // 鏂囦欢name
+    size_t namel;
+    char* path;       // 鏂囦欢璺緞
+    size_t pathl;
+
     int type;               // 鏂囦欢绫诲瀷 1锛歷ideo锛�2锛歱icture
     void* noused;           // 鏈娇鐢�
 };
@@ -123,8 +124,10 @@
 */
 struct cstackmsg{
     int procnum;                // decoder 鍚姩鐨勮繘绋嬪彿锛屾暟鎹爤鍙兘浼氭湁鏁颁釜decoder鍚屾椂杩愯
-    struct cstr stackid;        // 鏁版嵁鏍� id
-    struct cstr stackname;      // 鏁版嵁鏍� name
+    char* stackid;        // 鏁版嵁鏍� id
+    size_t stackidl;
+    char* stackname;      // 鏁版嵁鏍� name
+    size_t stacknamel;
     int type;                   // 鏁版嵁鏍堢被鍨� video picture
     int shmkey;                 // 鏁版嵁鏍堜娇鐢ㄧ殑鍏变韩鍐呭瓨key
     int width;                  // 鍒嗚鲸鐜�
@@ -138,45 +141,59 @@
 // 瀵瑰簲 bhome_msg.MsgRequestTopicReply
 struct crepmsg{
     int errcode;                // 鐩稿簲request璇锋眰鐨勬秷鎭紝閿欒鐮�
-    struct cstr errmsg;         // 閿欒娑堟伅
-    struct cstr data;           // 娑堟伅浣�
+    char* errmsg;         // 閿欒娑堟伅
+    size_t errmsgl;
+    char* data;           // 娑堟伅浣�
+    size_t datal;
 };
 
 #ifdef __cplusplus
 extern "C"{
 #endif
-/*
-    灏佽浜咰鎺ュ彛鐨剆tring
-    cstr_new 鍒涘缓涓�涓猻tring锛屽寘鎷唴瀛樺湴鍧�鍜岄暱搴︼紝浼氭嫹璐濆弬鏁�
-    蹇呴』浣跨敤cstr_free閲婃斁
-*/
-struct cstr cstr_new(const char* str, const size_t len);
-void cstr_free(struct cstr str);
-/*
-    灏佽瀛楃涓叉暟缁勶紝鍏朵腑鏄竴涓猻truct cstr鏁扮粍锛屽寘鎷寚鍚戞暟缁勭殑鎸囬拡鍜宑ount
-    閫氳繃cstr_arr_add娣诲姞瀛楃涓诧紝鍐呴儴浼氭嫹璐濆瓧绗︿覆
-    蹇呴』浣跨敤cstr_arr_free閲婃斁
-*/
-struct cstrarr cstr_arr_new(const size_t count);
-void cstr_arr_add(struct cstrarr* arr, const char* data, const size_t len, const size_t idx);
-void cstr_arr_free(struct cstrarr arr);
 
 /*
-    鍒涘缓struct cproc 缁撴瀯锛屽搴攑rocinfo锛屼繚瀛榩roc鐨刵ame锛宨d锛宨nfo[褰撳墠娌℃湁浣跨敤]
-    蹇呴』浣跨敤free_proc_info閲婃斁
+    鍐呴儴浣跨敤锛屾繁鎷疯礉 cproc
 */
-struct cproc* make_proc_info(const struct cstr name, const struct cstr id, const struct cstr info);
+cproc* internal_clone_cproc(const cproc* proc);
+void internal_cproc_free(cproc* proc);
 /*
-    浠庡凡瀛樺湪鐨刾roc鍏嬮殕锛屼細鎷疯礉锛屼娇鐢╢ree_proc_info閲婃斁
+    杩斿洖涓�涓� cproc 缁撴瀯锛屼粎鎷疯礉杈撳叆鍙傛暟
+    鐢熷懡鍛ㄦ湡 cproc < name[id]
 */
-struct cproc* clone_proc_info(const struct cproc* pi);
-void free_proc_info(struct cproc* pi);
+cproc* make_cproc(const char* name, const char* id);
+/*
+    浠庡凡瀛樺湪鐨� cproc 涓幏鍙� name 鍜� id锛屼粎浠呮槸 cproc 鍐呴儴鐨勫紩鐢紝鏃犻渶閲婃斁
+    鐢熷懡鍛ㄦ湡 name[id] < cproc
+*/
+char* cproc_name(const cproc* proc);
+char* cproc_id(const cproc* proc);
+/*
+    閲婃斁 cproc 鎸囬拡
+*/
+void cproc_free(cproc* proc);
 
 /*
-    閲婃斁creg缁撴瀯鎸囬拡
-    creg缁撴瀯鍙互浣跨敤涓婅堪make_proc_info銆乧str_arr_new銆乧str_new鍑芥暟鍒涘缓
+    杩斿洖涓�涓� creg 缁撴瀯锛屼粎鎷疯礉杈撳叆鍙傛暟
+    杈撳叆鍙傛暟鐢熷懡鍛ㄦ湡闇�瑕嗙洊杩斿洖鍊肩敓鍛藉懆鏈�
 */
-void free_creg(struct creg* reg);
+creg* make_creg(const cproc* proc, const char** rep, const size_t repcnt,
+                                    const char** pub, const size_t pubcnt,
+                                    const char** sub, const size_t subcnt,
+                                    const char** subnet, const size_t subnetcnt);
+/*
+    鑾峰彇宸插瓨鍦ㄧ殑 creg 涓殑 cproc 鎴栬�呮敞鍐岀殑涓婚锛屾棤闇�閲婃斁
+    鐢熷懡鍛ㄦ湡 < creg
+*/
+const cproc* creg_proc(const creg* reg);
+char** creg_rep_topic(const creg* reg, size_t* count);
+char** creg_pub_topic(const creg* reg, size_t* count);
+char** creg_sub_topic(const creg* reg, size_t* count);
+char** creg_subnet_topic(const creg* reg, size_t* count);
+/*
+    閲婃斁 creg 鎸囬拡
+*/
+void creg_free(creg* reg);
+
 // 璁㈤槄娑堟伅鐩稿叧锛岃闃呮暟鎹簱db娑堟伅鍜岃繘绋嬪垪琛╬roclist娑堟伅
 /*
     cbhomeclient.cpp涓娇鐢紝灏嗘帴鏀跺埌鐨剆ubmsg瑙e寘鎴恈submsg
@@ -248,14 +265,8 @@
 
 // reply msg
 /*
-    no use 灏唕eply娑堟伅搴忓垪鍖栦负json锛岀洰鍓嶆病鏈変娇鐢�
-    浣跨敤 cstr_free 閲婃斁
-*/
-struct cstr make_reply_msg_json(const int success, const char* msg, const size_t msgl,
-                                const char* data, const size_t datal);
-/*
     鍒涘缓 creqmsg 鍖呮嫭errcode銆乪rrmsg鍜屾秷鎭綋data
-    浣跨敤 free_reply_msg 閲婃斁
+    蹇呴』浣跨敤 free_reply_msg 閲婃斁
 */
 struct crepmsg* make_reply_msg(const int errcode, const char* errmsg, const size_t emsgl,
                                 const char* data, const size_t datal);

--
Gitblit v1.8.0