本文整理汇总了C++中DatagramIterator::read_remainder方法的典型用法代码示例。如果您正苦于以下问题:C++ DatagramIterator::read_remainder方法的具体用法?C++ DatagramIterator::read_remainder怎么用?C++ DatagramIterator::read_remainder使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DatagramIterator
的用法示例。
在下文中一共展示了DatagramIterator::read_remainder方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handle_get_fields_resp
void DBStateServer::handle_get_fields_resp(DatagramIterator& dgi)
{
uint32_t db_context = dgi.read_uint32();
if(!is_expected_context(db_context)) {
return;
}
// Get the datagram from the db_context
DatagramPtr dg = m_context_datagrams[db_context];
m_context_datagrams.erase(db_context);
// Check to make sure the datagram is appropriate
DatagramIterator check_dgi = DatagramIterator(dg);
uint16_t resp_type = check_dgi.get_msg_type();
if(resp_type != STATESERVER_OBJECT_GET_FIELDS_RESP) {
if(resp_type == STATESERVER_OBJECT_GET_FIELD_RESP) {
m_log->warning() << "Received GetFieldResp, but expecting GetFieldsResp." << std::endl;
} else if(resp_type == STATESERVER_OBJECT_GET_ALL_RESP) {
m_log->warning() << "Received GetAllResp, but expecting GetFieldsResp." << std::endl;
}
return;
}
m_log->trace() << "Received GetFieldResp from database." << std::endl;
// Add database field payload to response (don't know dclass, so must copy payload).
if(dgi.read_bool() == true) {
dgi.read_uint16(); // Discard field count
dg->add_data(dgi.read_remainder());
}
route_datagram(dg);
}
示例2: handle_set_field
void DBStateServer::handle_set_field(DatagramIterator &dgi)
{
doid_t do_id = dgi.read_doid();
if(m_loading.find(do_id) != m_loading.end()) {
// Ignore this message for now, it'll be bounced back to us
// from the loading object if it succeeds or fails at loading.
return;
}
uint16_t field_id = dgi.read_uint16();
const Field* field = g_dcf->get_field_by_id(field_id);
if(field && field->has_keyword("db")) {
m_log->trace() << "Forwarding SetField for field \"" << field->get_name()
<< "\" on object with id " << do_id << " to database.\n";
DatagramPtr dg = Datagram::create(m_db_channel, do_id, DBSERVER_OBJECT_SET_FIELD);
dg->add_doid(do_id);
dg->add_uint16(field_id);
dg->add_data(dgi.read_remainder());
route_datagram(dg);
}
}
示例3: 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)
//.........这里部分代码省略.........