117 lines
4.2 KiB
C++
Executable File
117 lines
4.2 KiB
C++
Executable File
#include "precompile.h"
|
|
|
|
#include <google/protobuf/message.h>
|
|
#include <google/protobuf/descriptor.pb.h>
|
|
|
|
#include "global.h"
|
|
#include "cs_proto.pb.h"
|
|
|
|
time_t Global::BetweenDays(time_t time1, time_t time2)
|
|
{
|
|
return (time1 + g_time_zone*3600)/3600/24 - (time2 + g_time_zone*3600)/3600/24;
|
|
}
|
|
|
|
time_t Global::GetDaySeconds(time_t time, int incdays)
|
|
{
|
|
return time_t((time + g_time_zone * 3600)/3600/24 + incdays) * 3600 * 24 - 3600 * g_time_zone;
|
|
}
|
|
|
|
int Global::g_nowtime = time(nullptr);
|
|
int Global::g_time_zone = 8;
|
|
bool Global::g_shutdown = false;
|
|
|
|
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:
|
|
{
|
|
int fixed_len = field_desc->options().GetExtension(cs::fixed_len);
|
|
if (field_desc->type() == google::protobuf::FieldDescriptor::TYPE_BYTES && fixed_len > 0) {
|
|
if ((size_t)hdr.offset + fixed_len > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
} else {
|
|
if ((size_t)hdr.offset > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
std::string val(&hdr.buf[hdr.offset]);
|
|
reflection->SetString(msg, field_desc, val);
|
|
hdr.offset += val.size() + 1;
|
|
}
|
|
}
|
|
break;
|
|
case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
|
|
{
|
|
if (hdr.offset + sizeof(int) > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
int* p_val = (int*)&hdr.buf[hdr.offset];
|
|
reflection->SetInt32(msg, field_desc, *p_val);
|
|
hdr.offset += sizeof(*p_val);
|
|
}
|
|
break;
|
|
case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
|
|
{
|
|
if (hdr.offset + sizeof(unsigned int) > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
unsigned int* p_val = (unsigned int*)&hdr.buf[hdr.offset];
|
|
reflection->SetUInt32(msg, field_desc, *p_val);
|
|
hdr.offset += sizeof(*p_val);
|
|
}
|
|
break;
|
|
case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
|
|
{
|
|
if (hdr.offset + sizeof(long long) > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
long long* p_val = (long long*)&hdr.buf[hdr.offset];
|
|
reflection->SetInt64(msg, field_desc, *p_val);
|
|
hdr.offset += sizeof(*p_val);
|
|
}
|
|
break;
|
|
case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
|
|
{
|
|
if (hdr.offset + sizeof(unsigned long long) > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
unsigned long long* p_val = (unsigned long long*)&hdr.buf[hdr.offset];
|
|
reflection->SetUInt64(msg, field_desc, *p_val);
|
|
hdr.offset += sizeof(*p_val);
|
|
}
|
|
break;
|
|
case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
|
|
{
|
|
if (hdr.offset + sizeof(float) > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
float* p_val = (float*)&hdr.buf[hdr.offset];
|
|
reflection->SetFloat(msg, field_desc, *p_val);
|
|
hdr.offset += sizeof(*p_val);
|
|
}
|
|
break;
|
|
case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
|
|
{
|
|
if (hdr.offset + sizeof(double) > (size_t)hdr.buflen) {
|
|
abort();
|
|
}
|
|
double* p_val = (double*)&hdr.buf[hdr.offset];
|
|
reflection->SetFloat(msg, field_desc, *p_val);
|
|
hdr.offset += sizeof(*p_val);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
abort();
|
|
}
|
|
break;
|
|
}//end switch
|
|
}
|
|
return true;
|
|
}
|