From 4fc07d5d891c251a1fe09c17ee16467d961a8f74 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 14 十二月 2022 15:31:12 +0800
Subject: [PATCH] add interface creg add topic and export symbols

---
 main.cpp         |   25 +++++++-----
 message.cpp      |   30 ++++++++++++++
 message.h        |    7 +++
 exported_symbols |   31 ++++++++++-----
 cbhomeclient.cpp |    2 
 5 files changed, 71 insertions(+), 24 deletions(-)

diff --git a/cbhomeclient.cpp b/cbhomeclient.cpp
index 60140b2..1dac84e 100644
--- a/cbhomeclient.cpp
+++ b/cbhomeclient.cpp
@@ -194,7 +194,7 @@
         return tmp;
     };
     size_t tpcc = 0, pubc = 0;
-    char** tpc = creg_rep_topic(rinfo, &tpcc);
+    char** tpc = creg_reply_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);
diff --git a/exported_symbols b/exported_symbols
index 9f57710..653901c 100644
--- a/exported_symbols
+++ b/exported_symbols
@@ -8,21 +8,32 @@
     bus_client_get_reqmsg;
     bus_client_reply_msg;
     bus_client_request;
-    cstr_new;
-    cstr_free;
-    cstr_arr_new;
-    cstr_arr_add;
-    cstr_arr_free;
-    make_proc_info;
-    clone_proc_info;
-    free_proc_info;
-    free_creg;
+
+    make_cproc;
+    cproc_name;
+    cproc_id;
+    cproc_free;
+
+    make_creg;
+    make_creg_from_cproc;
+    creg_add_topic_reply;
+    creg_add_topic_pub;
+    creg_add_topic_sub;
+    creg_add_topic_subnet;
+    creg_proc;
+    creg_reply_topic;
+    creg_pub_topic;
+    creg_sub_topic;
+    creg_subnet_topic;
+    creg_free;
+
     to_submsg;
     free_submsg;
     get_submsg_db;
     free_submsg_db;
     get_submsg_proclist;
     free_submsg_proclist;
+
     to_reqmsg;
     make_req_msg;
     free_reqmsg;
@@ -30,7 +41,7 @@
     free_reqmsg_stackerr;
     get_reqmsg_stack;
     free_reqmsg_stack;
-    make_reply_msg_json;
+
     make_reply_msg;
     free_reply_msg;
 
diff --git a/main.cpp b/main.cpp
index 84f63fb..35b6ddf 100644
--- a/main.cpp
+++ b/main.cpp
@@ -18,11 +18,11 @@
 static void pub(const vector<string>& topics){
     ignoref(pub);
 
-    vector<const char*> pubtpc;
-    for(auto& t : topics) pubtpc.push_back(t.c_str());
+    vector<const char*> tpc;
+    for(auto& t : topics) tpc.push_back(t.c_str());
 
     creg* reg = make_creg(make_cproc("pub", "pubid"),
-        NULL, 0, &pubtpc[0], pubtpc.size(), NULL, 0, NULL, 0);
+        NULL, 0, &tpc[0], tpc.size(), NULL, 0, NULL, 0);
 
     void* handle = bus_client_init(NULL, 0, reg);
     creg_free(reg);
@@ -49,11 +49,11 @@
 static void sub(const vector<string>& topics){
     ignoref(sub);
 
-    vector<const char*> pubtpc;
-    for(auto& t : topics) pubtpc.push_back(t.c_str());
+    vector<const char*> tpc;
+    for(auto& t : topics) tpc.push_back(t.c_str());
 
     creg* reg = make_creg(make_cproc("sub", "subid"),
-        NULL, 0, NULL, 0, &pubtpc[0], pubtpc.size(), NULL, 0);
+        NULL, 0, NULL, 0, &tpc[0], tpc.size(), NULL, 0);
 
     void* handle = bus_client_init(NULL, 0, reg);
     creg_free(reg);
@@ -70,8 +70,7 @@
     ignoref(req);
 
     const auto topicl = strlen(topic);
-    creg* reg = make_creg(make_cproc("request", "requestid"),
-        NULL, 0, NULL, 0, NULL, 0, NULL, 0);
+    creg* reg = make_creg_from_cproc(make_cproc("request", "requestid"));
 
     void* handle = bus_client_init(NULL, 0, reg);
     creg_free(reg);
@@ -96,10 +95,14 @@
     ignoref(reply);
 
     const auto topicl = strlen(topic);
-    vector<const char*> pubtpc{topic};
+    vector<const char*> tpc{topic};
 
-    creg* reg = make_creg(make_cproc("reply", "replyid"),
-        &pubtpc[0], pubtpc.size(), &pubtpc[0], pubtpc.size(), NULL, 0, NULL, 0);
+    // creg* reg = make_creg(make_cproc("reply", "replyid"),
+    //     &tpc[0], tpc.size(), &tpc[0], tpc.size(), NULL, 0, NULL, 0);
+
+    creg* reg = make_creg_from_cproc(make_cproc("reply", "replyid"));
+    creg_add_topic_reply(reg, tpc.data(), tpc.size());
+    creg_add_topic_pub(reg, tpc.data(), tpc.size());
 
     void* handle = bus_client_init(NULL, 0, reg);
     creg_free(reg);
diff --git a/message.cpp b/message.cpp
index 614018c..8766730 100644
--- a/message.cpp
+++ b/message.cpp
@@ -122,13 +122,38 @@
     reg->sub_net_count = subnetcnt;
     return reg;
 }
+creg* make_creg_from_cproc(const cproc* proc){
+    auto reg = ptrT<struct creg>();
+    reg->proc = rmConst(proc);
+    return reg;
+}
+
+static inline void creg_add_topic(char*** dst, size_t* dstC, const char** src, const size_t srcC){
+    *dst = rmConst(src);
+    *dstC = srcC;
+}
+void creg_add_topic_reply(creg* reg, const char** topic, const size_t count){
+    creg_add_topic(&reg->channel, &reg->channel_count, topic, count);
+}
+
+void creg_add_topic_pub(creg* reg, const char** topic, const size_t count){
+    creg_add_topic(&reg->pub, &reg->pub_count, topic, count);
+}
+
+void creg_add_topic_sub(creg* reg, const char** topic, const size_t count){
+    creg_add_topic(&reg->sub, &reg->sub_count, topic, count);
+}
+
+void creg_add_topic_subnet(creg* reg, const char** topic, const size_t count){
+    creg_add_topic(&reg->sub_net, &reg->sub_net_count, topic, count);
+}
 
 const cproc* creg_proc(const creg* reg){
     if (!reg) return NULL;
     return reg->proc;
 }
 
-char** creg_rep_topic(const creg* reg, size_t* count){
+char** creg_reply_topic(const creg* reg, size_t* count){
     if (!reg) return NULL;
     *count = reg->channel_count;
     return reg->channel;
@@ -590,9 +615,12 @@
     }
 }
 
+template <class F> void ignoref(F&& f){}
 static struct cstr make_reply_msg_json(const int success, const char* msg, const size_t msgl,
                                 const char* data, const size_t datal)
 {
+    ignoref(make_reply_msg_json);
+
     auto doc = yyjson_mut_doc_new(NULL);
     auto root = yyjson_mut_obj(doc);
     yyjson_mut_obj_add_bool(doc, root, "success", !!success);
diff --git a/message.h b/message.h
index aa5b703..258c135 100644
--- a/message.h
+++ b/message.h
@@ -180,12 +180,17 @@
                                     const char** pub, const size_t pubcnt,
                                     const char** sub, const size_t subcnt,
                                     const char** subnet, const size_t subnetcnt);
+creg* make_creg_from_cproc(const cproc* proc);
+void creg_add_topic_reply(creg* reg, const char** topic, const size_t count);
+void creg_add_topic_pub(creg* reg, const char** topic, const size_t count);
+void creg_add_topic_sub(creg* reg, const char** topic, const size_t count);
+void creg_add_topic_subnet(creg* reg, const char** topic, const size_t count);
 /*
     鑾峰彇宸插瓨鍦ㄧ殑 creg 涓殑 cproc 鎴栬�呮敞鍐岀殑涓婚锛屾棤闇�閲婃斁
     鐢熷懡鍛ㄦ湡 < creg
 */
 const cproc* creg_proc(const creg* reg);
-char** creg_rep_topic(const creg* reg, size_t* count);
+char** creg_reply_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);

--
Gitblit v1.8.0