From 99e2abfc688bc3ea3f1bb54b9c02fcceb656a863 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 14 Sep 2019 20:55:05 +0800 Subject: [PATCH] 1 --- server/gameserver/handlermgr.cc | 81 ++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index 9363a96..e5c16bf 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -26,6 +26,85 @@ static void _GMOpsReload(f8::JsonHttpRequest* request) a8::UdpLog::Instance()->Warning("reload config files", {}); } +static bool CustomParser(f8::MsgHdr& hdr, google::protobuf::Message* msg) +{ + const google::protobuf::Descriptor* descriptor = msg->GetDescriptor(); + const google::protobuf::Reflection* reflection = msg->GetReflection(); + + for (int i = 0; i < descriptor->field_count(); ++i) { + const google::protobuf::FieldDescriptor* field_desc = descriptor->field(i); + switch (field_desc->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: + { + #if 0 + reflection->SetString(msg, field_desc, reader.GetValue(field_name)); + #endif + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: + { + if (hdr.offset + sizeof(int) < hdr.buflen) { + abort(); + } + int* p_val = (int*)&hdr.buf[hdr.offset]; + reflection->SetInt32(msg, field_desc, *p_val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: + { + if (hdr.offset + sizeof(unsigned int) < hdr.buflen) { + abort(); + } + unsigned int* p_val = (unsigned int*)&hdr.buf[hdr.offset]; + reflection->SetUInt32(msg, field_desc, *p_val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: + { + if (hdr.offset + sizeof(long long) < hdr.buflen) { + abort(); + } + long long* p_val = (long long*)&hdr.buf[hdr.offset]; + reflection->SetInt64(msg, field_desc, *p_val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: + { + if (hdr.offset + sizeof(unsigned long long) < hdr.buflen) { + abort(); + } + unsigned long long* p_val = (unsigned long long*)&hdr.buf[hdr.offset]; + reflection->SetUInt64(msg, field_desc, *p_val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: + { + if (hdr.offset + sizeof(float) < hdr.buflen) { + abort(); + } + float* p_val = (float*)&hdr.buf[hdr.offset]; + reflection->SetFloat(msg, field_desc, *p_val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: + { + if (hdr.offset + sizeof(double) < hdr.buflen) { + abort(); + } + double* p_val = (double*)&hdr.buf[hdr.offset]; + reflection->SetFloat(msg, field_desc, *p_val); + } + break; + default: + { + abort(); + } + break; + }//end switch + } + return true; +} + void HandlerMgr::Init() { RegisterNetMsgHandlers(); @@ -39,7 +118,7 @@ void HandlerMgr::UnInit() void HandlerMgr::RegisterNetMsgHandlers() { - RegisterNetMsgHandler(&gcmsghandler, &PlayerMgr::_CMAuthSession); + RegisterNetMsgHandler(&gcmsghandler, &PlayerMgr::_CMAuthSession, CustomParser); } void HandlerMgr::ProcGMMsg(unsigned long saddr, int sockhandle,