From 47aa7d49ae3f12cef4d3d60b4a3fc07671ca767d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 17 Sep 2019 00:11:27 +0800 Subject: [PATCH] 1 --- cpp/netmsghandler.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cpp/netmsghandler.h b/cpp/netmsghandler.h index a1b7777..d83cfaf 100644 --- a/cpp/netmsghandler.h +++ b/cpp/netmsghandler.h @@ -12,11 +12,13 @@ namespace f8 const unsigned short MAX_MSG_ID = 2000; struct MsgHdr; + typedef bool (*CUSTOM_PARSER)(MsgHdr&, google::protobuf::Message*); struct NetMsgHandler { int handlerid; const ::google::protobuf::Message* prototype = nullptr; + CUSTOM_PARSER custom_parser = nullptr; }; struct NetMsgHandlerObject @@ -38,7 +40,12 @@ namespace f8 static void NetMsgHandlerWrapper(InstanceType* instance, MsgHdr& hdr, NetMsgHandler* handler) { MsgType msg; - bool ok = msg.ParseFromArray(hdr.buf + hdr.offset, hdr.buflen - hdr.offset); + bool ok = false; + if (handler->custom_parser) { + ok = handler->custom_parser(hdr, &msg); + } else { + ok = msg.ParseFromArray(hdr.buf + hdr.offset, hdr.buflen - hdr.offset); + } assert(ok); if (ok) { struct Invoker: public NetMsgHandler @@ -54,7 +61,8 @@ namespace f8 template static void RegisterNetMsgHandler(NetMsgHandlerObject* msghandler, - void (InstanceType::*ptr)(MsgHdr&, const MsgType&) + void (InstanceType::*ptr)(MsgHdr&, const MsgType&), + CUSTOM_PARSER custom_parser = nullptr ) { MsgType dumy_msg; @@ -71,6 +79,7 @@ namespace f8 Invoker *p = new Invoker(); p->wrapper = &NetMsgHandlerWrapper; p->func = ptr; + p->custom_parser = custom_parser; p->handlerid = InstanceType::HID; p->prototype = ::google::protobuf::MessageFactory::generated_factory()->GetPrototype(MsgType::descriptor()); msghandler->handlers[msgid] = p;