本文整理汇总了C++中Datagram::add_uint16方法的典型用法代码示例。如果您正苦于以下问题:C++ Datagram::add_uint16方法的具体用法?C++ Datagram::add_uint16怎么用?C++ Datagram::add_uint16使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Datagram
的用法示例。
在下文中一共展示了Datagram::add_uint16方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handle_datagram
//.........这里部分代码省略.........
}
catch(std::exception &e)
{
m_log->error() << "Error while unpacking fields, msg may be truncated. e.what(): "
<< e.what() << std::endl;
resp.add_uint32(0);
send(resp);
return;
}
// Check for required fields, and populate with defaults
m_log->spam() << "Checking all required fields exist..." << std::endl;
for(int i = 0; i < dcc->get_num_inherited_fields(); ++i)
{
DCField *field = dcc->get_inherited_field(i);
if(field->is_required() && field->is_db() && !field->as_molecular_field())
{
if(dbo.fields.find(field) == dbo.fields.end())
{
if(!field->has_default_value())
{
m_log->error() << "Field " << field->get_name() << " missing when trying to create "
"object of type " << dcc->get_name();
resp.add_uint32(0);
send(resp);
return;
}
else
{
dbo.fields[field] = field->get_default_value();
}
}
}
}
// Create object in database
m_log->spam() << "Creating stored object..." << std::endl;
unsigned int do_id = m_db_engine->create_object(dbo);
if(do_id == 0 || do_id < m_min_id || do_id > m_max_id)
{
m_log->error() << "Ran out of DistributedObject ids while creating new object." << std::endl;
resp.add_uint32(0);
send(resp);
return;
}
m_log->spam() << "... created with ID: " << do_id << std::endl;
resp.add_uint32(do_id);
send(resp);
}
break;
case DBSERVER_SELECT_STORED_OBJECT_ALL:
{
unsigned int context = dgi.read_uint32();
Datagram resp;
resp.add_server_header(sender, m_control_channel, DBSERVER_SELECT_STORED_OBJECT_ALL_RESP);
resp.add_uint32(context);
unsigned int do_id = dgi.read_uint32();
DatabaseObject dbo;
if(m_db_engine->get_object(do_id, dbo))
{
resp.add_uint8(1);
resp.add_uint16(dbo.dc_id);
resp.add_uint16(dbo.fields.size());
for(auto it = dbo.fields.begin(); it != dbo.fields.end(); ++it)
{
resp.add_uint16(it->first->get_number());
resp.add_data(it->second);
}
}
else
{
resp.add_uint8(0);
}
send(resp);
}
break;
case DBSERVER_DELETE_STORED_OBJECT:
{
if(dgi.read_uint32() == DBSERVER_DELETE_STORED_OBJECT_VERIFY_CODE)
{
unsigned int do_id = dgi.read_uint32();
m_db_engine->delete_object(do_id);
m_log->debug() << "Deleted object with ID: " << do_id << std::endl;
}
else
{
m_log->warning() << "Wrong delete verify code." << std::endl;
}
}
break;
default:
m_log->error() << "Recieved unknown MsgType: " << msg_type << std::endl;
};
}
示例2: add_interest
void Client::add_interest(Interest &i, uint32_t context)
{
std::unordered_set<uint32_t> new_zones;
for(auto it = i.zones.begin(); it != i.zones.end(); ++it)
{
if(lookup_interests(i.parent, *it).empty())
{
new_zones.insert(*it);
}
}
if(m_interests.find(i.id) != m_interests.end())
{
// This is an already-open interest that is actually being altered.
// Therefore, we need to delete the objects that the client can see
// through this interest only.
Interest previous_interest = m_interests[i.id];
std::unordered_set<uint32_t> killed_zones;
for(auto it = previous_interest.zones.begin(); it != previous_interest.zones.end(); ++it)
{
if(lookup_interests(previous_interest.parent, *it).size() > 1)
{
// An interest other than the altered one can see this parent/zone,
// so we don't care about it.
continue;
}
// If we've gotten here: parent,*it is unique, so if the new interest
// doesn't cover it, we add it to the killed zones.
if(i.parent != previous_interest.parent || i.zones.find(*it) == i.zones.end())
{
killed_zones.insert(*it);
}
}
// Now that we know what zones to kill, let's get to it:
close_zones(previous_interest.parent, killed_zones);
}
m_interests[i.id] = i;
if(new_zones.empty())
{
// We aren't requesting any new zones with this operation, so don't
// bother firing off a State Server request. Instead, let the client
// know we're already done:
handle_interest_done(i.id, context);
return;
}
InterestOperation *iop = new InterestOperation(i.id, context, i.parent, new_zones);
uint32_t request_context = m_next_context++;
m_pending_interests.insert(std::pair<uint32_t, InterestOperation*>(request_context, iop));
Datagram resp;
resp.add_server_header(i.parent, m_channel, STATESERVER_OBJECT_GET_ZONES_OBJECTS);
resp.add_uint32(request_context);
resp.add_uint32(i.parent);
resp.add_uint16(new_zones.size());
for(auto it = new_zones.begin(); it != new_zones.end(); ++it)
{
resp.add_uint32(*it);
subscribe_channel(LOCATION2CHANNEL(i.parent, *it));
}
send(resp);
}
示例3: DBException
static void bson2bamboo(const dclass::DistributedType *type,
const BSONElement &element,
Datagram &dg)
{
switch(type->get_type()) {
case dclass::Type::T_INT8: {
dg.add_int8(element.Int());
}
break;
case dclass::Type::T_INT16: {
dg.add_int16(element.Int());
}
break;
case dclass::Type::T_INT32: {
dg.add_int32(element.Int());
}
break;
case dclass::Type::T_INT64: {
dg.add_int64(element.Int());
}
break;
case dclass::Type::T_UINT8: {
dg.add_uint8(element.Int());
}
break;
case dclass::Type::T_UINT16: {
dg.add_uint16(element.Int());
}
break;
case dclass::Type::T_UINT32: {
dg.add_uint32(element.Int());
}
break;
case dclass::Type::T_UINT64: {
dg.add_uint64(element.Int());
}
break;
case dclass::Type::T_CHAR: {
string str = element.String();
if(str.size() != 1) {
throw mongo::DBException("Expected single-length string for char field", 0);
}
dg.add_uint8(str[0]);
}
break;
case dclass::Type::T_FLOAT32: {
dg.add_float32(element.Number());
}
break;
case dclass::Type::T_FLOAT64: {
dg.add_float64(element.Number());
}
break;
case dclass::Type::T_STRING: {
dg.add_data(element.String());
}
break;
case dclass::Type::T_VARSTRING: {
dg.add_string(element.String());
}
break;
case dclass::Type::T_BLOB: {
int len;
const uint8_t *rawdata = (const uint8_t *)element.binData(len);
dg.add_data(rawdata, len);
}
break;
case dclass::Type::T_VARBLOB: {
int len;
const uint8_t *rawdata = (const uint8_t *)element.binData(len);
dg.add_blob(rawdata, len);
}
break;
case dclass::Type::T_ARRAY: {
const dclass::ArrayType *array = type->as_array();
std::vector<BSONElement> data = element.Array();
for(auto it = data.begin(); it != data.end(); ++it) {
bson2bamboo(array->get_element_type(), *it, dg);
}
}
break;
case dclass::Type::T_VARARRAY: {
const dclass::ArrayType *array = type->as_array();
std::vector<BSONElement> data = element.Array();
DatagramPtr newdg = Datagram::create();
for(auto it = data.begin(); it != data.end(); ++it) {
bson2bamboo(array->get_element_type(), *it, *newdg);
}
dg.add_blob(newdg->get_data(), newdg->size());
}
break;
case dclass::Type::T_STRUCT: {
const dclass::Struct *s = type->as_struct();
size_t fields = s->get_num_fields();
for(unsigned int i = 0; i < fields; ++i) {
const dclass::Field *field = s->get_field(i);
//.........这里部分代码省略.........
示例4: handle_datagram
void DBStateServer::handle_datagram(Datagram &in_dg, DatagramIterator &dgi)
{
channel_t sender = dgi.read_uint64();
uint16_t msgtype = dgi.read_uint16();
switch(msgtype)
{
case DBSS_OBJECT_ACTIVATE_WITH_DEFAULTS:
{
handle_activate(dgi, false);
break;
}
case DBSS_OBJECT_ACTIVATE_WITH_DEFAULTS_OTHER:
{
handle_activate(dgi, true);
break;
}
case DBSS_OBJECT_DELETE_DISK:
{
uint32_t do_id = dgi.read_uint32();
// If object exists broadcast the delete message
auto obj_keyval = m_objs.find(do_id);
if(obj_keyval != m_objs.end())
{
DistributedObject* obj = obj_keyval->second;
std::set<channel_t> targets;
// Add location to broadcast
if(obj->get_location())
{
targets.insert(obj->get_location());
}
// Add AI to broadcast
if(obj->get_ai())
{
targets.insert(obj->get_ai());
}
// Add owner to broadcast
if(obj->get_owner())
{
targets.insert(obj->get_owner());
}
// Build and send datagram
Datagram dg(targets, sender, DBSS_OBJECT_DELETE_DISK);
dg.add_uint32(do_id);
send(dg);
}
// Send delete to database
Datagram dg(m_db_channel, do_id, DBSERVER_OBJECT_DELETE);
dg.add_uint32(do_id);
send(dg);
break;
}
case STATESERVER_OBJECT_SET_FIELD:
{
uint32_t do_id = dgi.read_uint32();
uint32_t field_id = dgi.read_uint16();
DCField* field = g_dcf->get_field_by_index(field_id);
if(field && field->is_db())
{
m_log->trace() << "Forwarding SetField for field with id " << field_id
<< ", on object " << do_id << " to database." << std::endl;
Datagram dg(m_db_channel, do_id, DBSERVER_OBJECT_SET_FIELD);
dg.add_uint32(do_id);
dg.add_uint16(field_id);
dg.add_data(dgi.read_remainder());
send(dg);
}
break;
}
case STATESERVER_OBJECT_SET_FIELDS:
{
uint32_t do_id = dgi.read_uint32();
uint16_t field_count = dgi.read_uint16();
std::unordered_map<DCField*, std::vector<uint8_t> > db_fields;
for(uint16_t i = 0; i < field_count; ++i)
{
uint16_t field_id = dgi.read_uint16();
DCField* field = g_dcf->get_field_by_index(field_id);
if(!field)
{
m_log->warning() << "Received invalid field in SetFields"
" with id " << field_id << std::endl;
break;
}
if(field->is_db())
{
dgi.unpack_field(field, db_fields[field]);
}
}
if(db_fields.size() > 0)
//.........这里部分代码省略.........