add utils.*
This commit is contained in:
parent
c4f3714a97
commit
5e6482a41c
@ -24,9 +24,9 @@ int Net_GetMessageId(::google::protobuf::Message& msg)
|
||||
}
|
||||
std::string msgid_enum_name;
|
||||
if (msgname[0] == 'C' && msgname[1] == 'M') {
|
||||
msgid_enum_name = "kingsomevs.CMMessageId_e";
|
||||
msgid_enum_name = "cs.CMMessageId_e";
|
||||
} else if (msgname[0] == 'S' && msgname[1] == 'M') {
|
||||
msgid_enum_name = "kingsomevs.SMMessageId_e";
|
||||
msgid_enum_name = "cs.SMMessageId_e";
|
||||
} else if (msgname[0] == 'S' && msgname[1] == 'S') {
|
||||
msgid_enum_name = "ss.SSMessageId_e";
|
||||
} else {
|
||||
@ -59,11 +59,11 @@ void Net_PackMsg(unsigned short msgid, ::google::protobuf::Message& msg, std::st
|
||||
PackHead* head = (PackHead*)buff;
|
||||
head->packlen = packlen;
|
||||
head->msgid = msgid;
|
||||
head->magiccode = MAGIC_CODE;
|
||||
head->magic_code = MAGIC_CODE;
|
||||
msg.SerializeToArray(buff + sizeof(PackHead), packlen);
|
||||
}
|
||||
|
||||
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid, ::google::protobuf::Message& msg)
|
||||
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned seqid, unsigned short msgid, ::google::protobuf::Message& msg)
|
||||
{
|
||||
int packlen = msg.ByteSize();
|
||||
|
||||
@ -71,14 +71,15 @@ int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid, ::google::proto
|
||||
PackHead* head = (PackHead*)buff;
|
||||
head->packlen = packlen;
|
||||
head->msgid = msgid;
|
||||
head->magiccode = MAGIC_CODE;
|
||||
head->seqid = seqid;
|
||||
head->magic_code = MAGIC_CODE;
|
||||
msg.SerializeToArray(buff + sizeof(PackHead), packlen);
|
||||
tcp_client->SendBuff(buff, sizeof(PackHead) + packlen);
|
||||
free(buff);
|
||||
return sizeof(PackHead) + packlen;
|
||||
}
|
||||
|
||||
int Net_SendMsg(a8::TcpListener* tcp_listener, unsigned short socket_handle,
|
||||
int Net_SendMsg(a8::TcpListener* tcp_listener, unsigned short socket_handle, unsigned int seqid,
|
||||
unsigned short msgid, ::google::protobuf::Message& msg)
|
||||
{
|
||||
int packlen = msg.ByteSize();
|
||||
@ -87,9 +88,33 @@ int Net_SendMsg(a8::TcpListener* tcp_listener, unsigned short socket_handle,
|
||||
PackHead* head = (PackHead*)buff;
|
||||
head->packlen = packlen;
|
||||
head->msgid = msgid;
|
||||
head->magiccode = MAGIC_CODE;
|
||||
head->seqid = seqid;
|
||||
head->magic_code = MAGIC_CODE;
|
||||
msg.SerializeToArray(buff + sizeof(PackHead), packlen);
|
||||
tcp_listener->SendClientMsg(socket_handle, buff, sizeof(PackHead) + packlen);
|
||||
free(buff);
|
||||
return sizeof(PackHead) + packlen;
|
||||
}
|
||||
|
||||
int Net_SendProxyMsg(a8::TcpListener* tcp_listener, int socket_handle, unsigned int seqid, unsigned short error_code,
|
||||
unsigned short msgid, ::google::protobuf::Message& msg)
|
||||
{
|
||||
unsigned short parent_socket_handle = (socket_handle >> 16) & 0xFFFF;
|
||||
unsigned short child_socket_handle = socket_handle & 0xFFFF;
|
||||
|
||||
int packlen = msg.ByteSize();
|
||||
|
||||
char* buff = (char*)malloc(sizeof(WSProxyPackHead_S) + packlen);
|
||||
WSProxyPackHead_S* head = (WSProxyPackHead_S*)buff;
|
||||
head->packlen = packlen;
|
||||
head->msgid = msgid;
|
||||
head->seqid = seqid;
|
||||
head->magic_code = MAGIC_CODE;
|
||||
head->rpc_error_code = error_code;
|
||||
head->socket_handle = child_socket_handle;
|
||||
|
||||
msg.SerializeToArray(buff + sizeof(WSProxyPackHead_S), packlen);
|
||||
tcp_listener->SendClientMsg(parent_socket_handle, buff, sizeof(WSProxyPackHead_S) + packlen);
|
||||
free(buff);
|
||||
return sizeof(WSProxyPackHead_S) + packlen;
|
||||
}
|
||||
|
@ -1,12 +1,13 @@
|
||||
#ifndef COMMON_PROTOUTILS_H
|
||||
#define COMMON_PROTOUTILS_H
|
||||
#pragma once
|
||||
|
||||
//普通消息头部
|
||||
struct PackHead
|
||||
{
|
||||
unsigned short packlen;
|
||||
unsigned short msgid;
|
||||
unsigned int magiccode;
|
||||
unsigned int seqid;
|
||||
unsigned short magic_code;
|
||||
unsigned short rpc_error_code;
|
||||
};
|
||||
|
||||
//转发类消息头部
|
||||
@ -21,6 +22,28 @@ struct ForwardPackHead
|
||||
unsigned int sign;
|
||||
};
|
||||
|
||||
struct WSProxyPackHead_C
|
||||
{
|
||||
unsigned short packlen;
|
||||
unsigned short msgid;
|
||||
unsigned int seqid;
|
||||
unsigned short magic_code;
|
||||
|
||||
unsigned short socket_handle;
|
||||
unsigned long ip_saddr;
|
||||
};
|
||||
|
||||
struct WSProxyPackHead_S
|
||||
{
|
||||
unsigned short packlen;
|
||||
unsigned short msgid;
|
||||
unsigned int seqid;
|
||||
unsigned short magic_code;
|
||||
unsigned short rpc_error_code;
|
||||
|
||||
unsigned short socket_handle;
|
||||
};
|
||||
|
||||
class Player;
|
||||
struct MsgHdr
|
||||
{
|
||||
@ -35,7 +58,7 @@ struct MsgHdr
|
||||
const void* user_data = nullptr;
|
||||
};
|
||||
|
||||
const unsigned int MAGIC_CODE = 0xAABBCCAA;
|
||||
const unsigned short MAGIC_CODE = (((unsigned short)'S') << 8) | ((unsigned short)'K');
|
||||
|
||||
namespace google
|
||||
{
|
||||
@ -54,10 +77,12 @@ namespace a8
|
||||
int Net_GetMessageId(::google::protobuf::Message& msg);
|
||||
|
||||
void Net_PackMsg(unsigned short msgid, ::google::protobuf::Message& msg, std::string& out);
|
||||
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid, ::google::protobuf::Message& msg);
|
||||
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid,
|
||||
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned int seqid,
|
||||
unsigned short msgid, ::google::protobuf::Message& msg);
|
||||
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned int seqid, unsigned short msgid,
|
||||
const char* msgbody, int msgbody_len);
|
||||
int Net_SendMsg(a8::TcpListener* tcp_tlistener, unsigned short socket_handle,
|
||||
int Net_SendMsg(a8::TcpListener* tcp_tlistener, unsigned short socket_handle, unsigned int seqid,
|
||||
unsigned short msgid, ::google::protobuf::Message& msg);
|
||||
|
||||
#endif
|
||||
int Net_SendProxyMsg(a8::TcpListener* tcp_tlistener, int socket_handle, unsigned int seqid, unsigned short error_code,
|
||||
unsigned short msgid, ::google::protobuf::Message& msg);
|
||||
|
75
cpp/utils.cc
Normal file
75
cpp/utils.cc
Normal file
@ -0,0 +1,75 @@
|
||||
#include <a8/a8.h>
|
||||
|
||||
#include <a8/stringlist.h>
|
||||
#include <a8/csvreader.h>
|
||||
|
||||
#include <google/protobuf/message.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
|
||||
bool ReadCsvMetaFile(const std::string& filename,
|
||||
google::protobuf::Message* prototype,
|
||||
std::function<void (google::protobuf::Message*)> push_back_func)
|
||||
{
|
||||
const google::protobuf::Descriptor* descriptor = prototype->GetDescriptor();
|
||||
const google::protobuf::Reflection* reflection = prototype->GetReflection();
|
||||
|
||||
a8::CsvReader reader;
|
||||
reader.Load(filename);
|
||||
while (reader.NextLine()) {
|
||||
google::protobuf::Message* msg = prototype->New();
|
||||
|
||||
for (int i = 0; i < descriptor->field_count(); ++i) {
|
||||
const google::protobuf::FieldDescriptor* field_desc = descriptor->field(i);
|
||||
const std::string& field_name = field_desc->name();
|
||||
|
||||
switch (field_desc->cpp_type()) {
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
|
||||
{
|
||||
reflection->SetString(msg, field_desc, reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
|
||||
{
|
||||
reflection->SetInt32(msg, field_desc, reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
|
||||
{
|
||||
reflection->SetUInt32(msg, field_desc, reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
|
||||
{
|
||||
reflection->SetInt64(msg, field_desc, reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
|
||||
{
|
||||
reflection->SetUInt64(msg, field_desc, reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
|
||||
{
|
||||
reflection->SetFloat(msg, field_desc, (double)reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
|
||||
{
|
||||
reflection->SetDouble(msg, field_desc, reader.GetValue(field_name));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
abort();
|
||||
}
|
||||
break;
|
||||
}//end switch
|
||||
push_back_func(msg);
|
||||
delete msg;
|
||||
}//end for
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
28
cpp/utils.h
Normal file
28
cpp/utils.h
Normal file
@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
namespace google
|
||||
{
|
||||
namespace protobuf
|
||||
{
|
||||
class Descriptor;
|
||||
class Message;
|
||||
}
|
||||
}
|
||||
|
||||
bool ReadCsvMetaFile(const std::string& filename,
|
||||
google::protobuf::Message* prototype,
|
||||
std::function<void (google::protobuf::Message*)> push_back_func);
|
||||
|
||||
template <typename T>
|
||||
bool ReadCsvMetaFile(const std::string& filename, std::list<T>& meta_list)
|
||||
{
|
||||
T dummy;
|
||||
return ReadCsvMetaFile(filename,
|
||||
&dummy,
|
||||
[&meta_list] (google::protobuf::Message* msg)
|
||||
{
|
||||
T t;
|
||||
t.CopyFrom(*msg);
|
||||
meta_list.emplace_back(t);
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user