lichao
2021-04-26 5bb28835d06e27dbd960916c9fb11a555fc5a9bc
src/bh_api.cpp
@@ -10,6 +10,7 @@
{
TopicNode &ProcNode()
{
   static bool init = GlobalInit(BHomeShm());
   static TopicNode node(BHomeShm());
   return node;
}
@@ -70,12 +71,10 @@
}
template <class MsgIn, class MsgOut = MsgCommonReply>
bool BHApiIn1Out1(bool (TopicNode::*mfunc)(MsgIn &, MsgOut &, const int),
                  const void *request,
                  const int request_len,
                  void **reply,
                  int *reply_len,
                  const int timeout_ms)
bool BHApi_In1_Out1(bool (TopicNode::*mfunc)(MsgIn &, MsgOut &, const int),
                    const void *request, const int request_len,
                    void **reply, int *reply_len,
                    const int timeout_ms)
{
   MsgIn input;
   if (!input.ParseFromArray(request, request_len)) {
@@ -84,6 +83,25 @@
   }
   MsgOut msg_reply;
   return (ProcNode().*mfunc)(input, msg_reply, timeout_ms) &&
          PackOutput(msg_reply, reply, reply_len);
}
template <class MsgIn0, class MsgIn1, class MsgOut = MsgCommonReply>
bool BHApi_In2_Out1(bool (TopicNode::*mfunc)(MsgIn0 &, MsgIn1 &, MsgOut &, const int),
                    const void *in0, const int in0_len,
                    const void *in1, const int in1_len,
                    void **reply, int *reply_len,
                    const int timeout_ms)
{
   MsgIn0 input0;
   MsgIn1 input1;
   if (!input0.ParseFromArray(in0, in0_len) ||
       !input1.ParseFromArray(in1, in1_len)) {
      SetLastError(eInvalidInput, "invalid input.");
      return false;
   }
   MsgOut msg_reply;
   return (ProcNode().*mfunc)(input0, input1, msg_reply, timeout_ms) &&
          PackOutput(msg_reply, reply, reply_len);
}
@@ -101,7 +119,11 @@
int BHRegister(const void *proc_info, const int proc_info_len, void **reply, int *reply_len, const int timeout_ms)
{
   return BHApiIn1Out1<ProcInfo>(&TopicNode::Register, proc_info, proc_info_len, reply, reply_len, timeout_ms);
   return BHApi_In1_Out1<ProcInfo>(&TopicNode::Register, proc_info, proc_info_len, reply, reply_len, timeout_ms);
}
int BHUnregister(const void *proc_info, const int proc_info_len, void **reply, int *reply_len, const int timeout_ms)
{
   return BHApi_In1_Out1<ProcInfo>(&TopicNode::Unregister, proc_info, proc_info_len, reply, reply_len, timeout_ms);
}
int BHHeartbeatEasy(const int timeout_ms)
@@ -111,17 +133,27 @@
int BHHeartbeat(const void *proc_info, const int proc_info_len, void **reply, int *reply_len, const int timeout_ms)
{
   return BHApiIn1Out1<ProcInfo>(&TopicNode::Heartbeat, proc_info, proc_info_len, reply, reply_len, timeout_ms);
   return BHApi_In1_Out1<ProcInfo>(&TopicNode::Heartbeat, proc_info, proc_info_len, reply, reply_len, timeout_ms);
}
int BHRegisterTopics(const void *topics, const int topics_len, void **reply, int *reply_len, const int timeout_ms)
{
   return BHApiIn1Out1<MsgTopicList>(&TopicNode::ServerRegisterRPC, topics, topics_len, reply, reply_len, timeout_ms);
   return BHApi_In1_Out1<MsgTopicList>(&TopicNode::ServerRegisterRPC, topics, topics_len, reply, reply_len, timeout_ms);
}
int BHQueryTopicAddress(const void *remote, const int remote_len,
                        const void *topic, const int topic_len,
                        void **reply, int *reply_len,
                        const int timeout_ms)
{
   return BHApi_In2_Out1<BHAddress, MsgQueryTopic, MsgQueryTopicReply>(
       &TopicNode::QueryTopicAddress,
       remote, remote_len, topic, topic_len, reply, reply_len, timeout_ms);
}
int BHSubscribeTopics(const void *topics, const int topics_len, void **reply, int *reply_len, const int timeout_ms)
{
   return BHApiIn1Out1<MsgTopicList>(&TopicNode::Subscribe, topics, topics_len, reply, reply_len, timeout_ms);
   return BHApi_In1_Out1<MsgTopicList>(&TopicNode::Subscribe, topics, topics_len, reply, reply_len, timeout_ms);
}
int BHPublish(const void *msgpub,
@@ -157,19 +189,23 @@
   return false;
}
int BHAsyncRequest(const void *request,
int BHAsyncRequest(const void *remote,
                   const int remote_len,
                   const void *request,
                   const int request_len,
                   void **msg_id,
                   int *msg_id_len)
{
   BHAddress dest;
   MsgRequestTopic req;
   if (!req.ParseFromArray(request, request_len)) {
   if (!dest.ParseFromArray(remote, remote_len) ||
       !req.ParseFromArray(request, request_len)) {
      SetLastError(eInvalidInput, "invalid input.");
      return false;
   }
   std::string str_msg_id;
   MsgRequestTopicReply out_msg;
   if (ProcNode().ClientAsyncRequest(req, str_msg_id)) {
   if (ProcNode().ClientAsyncRequest(dest, req, str_msg_id)) {
      if (!msg_id || !msg_id_len) {
         return true;
      }
@@ -184,7 +220,9 @@
   return false;
}
int BHRequest(const void *request,
int BHRequest(const void *remote,
              const int remote_len,
              const void *request,
              const int request_len,
              void **proc_id,
              int *proc_id_len,
@@ -192,14 +230,16 @@
              int *reply_len,
              const int timeout_ms)
{
   BHAddress dest;
   MsgRequestTopic req;
   if (!req.ParseFromArray(request, request_len)) {
   if (!dest.ParseFromArray(remote, remote_len) ||
       !req.ParseFromArray(request, request_len)) {
      SetLastError(eInvalidInput, "invalid input.");
      return false;
   }
   std::string proc;
   MsgRequestTopicReply out_msg;
   if (ProcNode().ClientSyncRequest(req, proc, out_msg, timeout_ms)) {
   if (ProcNode().ClientSyncRequest(dest, req, proc, out_msg, timeout_ms)) {
      TmpPtr pproc(proc);
      if (pproc && PackOutput(out_msg, reply, reply_len)) {
         pproc.ReleaseTo(proc_id, proc_id_len);