本文整理汇总了C++中DatagramPtr::add_uint32方法的典型用法代码示例。如果您正苦于以下问题:C++ DatagramPtr::add_uint32方法的具体用法?C++ DatagramPtr::add_uint32怎么用?C++ DatagramPtr::add_uint32使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DatagramPtr
的用法示例。
在下文中一共展示了DatagramPtr::add_uint32方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handle_get_activated
void DBStateServer::handle_get_activated(channel_t sender, DatagramIterator& dgi)
{
uint32_t r_context = dgi.read_uint32();
doid_t r_do_id = dgi.read_doid();
if(m_loading.find(r_do_id) != m_loading.end()) {
return;
}
m_log->trace() << "Received GetActivated for id " << r_do_id << "\n";
if(m_objs.find(r_do_id) != m_objs.end()) {
// If object is active return true
DatagramPtr dg = Datagram::create(sender, r_do_id, DBSS_OBJECT_GET_ACTIVATED_RESP);
dg->add_uint32(r_context);
dg->add_doid(r_do_id);
dg->add_bool(true);
route_datagram(dg);
} else {
// If object isn't active or loading, we can return false
DatagramPtr dg = Datagram::create(sender, r_do_id, DBSS_OBJECT_GET_ACTIVATED_RESP);
dg->add_uint32(r_context);
dg->add_doid(r_do_id);
dg->add_bool(false);
route_datagram(dg);
}
}
示例2: handle_get_field
void DBStateServer::handle_get_field(channel_t sender, DatagramIterator &dgi)
{
uint32_t r_context = dgi.read_uint32();
doid_t r_do_id = dgi.read_doid();
uint16_t field_id = dgi.read_uint16();
if(is_activated_object(r_do_id)) {
return;
}
m_log->trace() << "Received GetField for field with id " << field_id
<< " on inactive object with id " << r_do_id << "\n";
// Check field is "ram db" or "required"
const Field* field = g_dcf->get_field_by_id(field_id);
if(!field || !(field->has_keyword("required") || field->has_keyword("ram"))) {
DatagramPtr dg = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_FIELD_RESP);
dg->add_uint32(r_context);
dg->add_bool(false);
route_datagram(dg);
return;
}
if(field->has_keyword("db")) {
// Get context for db query
uint32_t db_context = m_next_context++;
// Prepare reponse datagram
DatagramPtr dg_resp = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_FIELD_RESP);
dg_resp->add_uint32(r_context);
m_context_datagrams[db_context] = dg_resp;
// Send query to database
DatagramPtr dg = Datagram::create(m_db_channel, r_do_id, DBSERVER_OBJECT_GET_FIELD);
dg->add_uint32(db_context);
dg->add_doid(r_do_id);
dg->add_uint16(field_id);
route_datagram(dg);
} else if(field->has_default_value()) { // Field is required and not-db
DatagramPtr dg = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_FIELD_RESP);
dg->add_uint32(r_context);
dg->add_bool(true);
dg->add_uint16(field_id);
dg->add_data(field->get_default_value());
route_datagram(dg);
} else {
DatagramPtr dg = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_FIELD_RESP);
dg->add_uint32(r_context);
dg->add_bool(false);
route_datagram(dg);
}
}
示例3: handle_get_all
void DBStateServer::handle_get_all(channel_t sender, DatagramIterator &dgi)
{
uint32_t r_context = dgi.read_uint32();
doid_t r_do_id = dgi.read_doid();
if(is_activated_object(r_do_id)) {
return;
}
m_log->trace() << "Received GetAll for inactive object with id " << r_do_id << std::endl;
// Get context for db query, and remember caller with it
uint32_t db_context = m_next_context++;
DatagramPtr resp_dg = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_ALL_RESP);
resp_dg->add_uint32(r_context);
resp_dg->add_doid(r_do_id);
resp_dg->add_channel(INVALID_CHANNEL); // Location
m_context_datagrams[db_context] = resp_dg;
// Cache the do_id --> context in case we get a dbss_activate
m_inactive_loads[r_do_id].insert(db_context);
// Send query to database
DatagramPtr dg = Datagram::create(m_db_channel, r_do_id, DBSERVER_OBJECT_GET_ALL);
dg->add_uint32(db_context);
dg->add_doid(r_do_id);
route_datagram(dg);
}
示例4: on_criteria_mismatch
void DBOperationUpdate::on_criteria_mismatch(DBObjectSnapshot *snapshot)
{
DatagramPtr resp = Datagram::create();
resp->add_server_header(m_sender, m_dbserver->m_control_channel,
m_resp_msgtype);
resp->add_uint32(m_context);
resp->add_uint8(FAILURE);
// Calculate the fields that we are sending in our response:
FieldValues mismatched_fields;
for(auto it = m_criteria_fields.begin(); it != m_criteria_fields.end(); ++it) {
auto it2 = snapshot->m_fields.find(it->first);
if(it2 != snapshot->m_fields.end() && !it2->second.empty()) {
mismatched_fields[it2->first] = it2->second;
}
}
if(m_resp_msgtype == DBSERVER_OBJECT_SET_FIELDS_IF_EQUALS_RESP) {
resp->add_uint16(mismatched_fields.size());
}
for(auto it = mismatched_fields.begin(); it != mismatched_fields.end(); ++it) {
resp->add_uint16(it->first->get_id());
resp->add_data(it->second);
}
m_dbserver->route_datagram(resp);
delete snapshot;
cleanup();
}
示例5: wake_children
void DistributedObject::wake_children()
{
DatagramPtr dg = Datagram::create(parent_to_children(m_do_id), m_do_id,
STATESERVER_OBJECT_GET_LOCATION);
dg->add_uint32(STATESERVER_CONTEXT_WAKE_CHILDREN);
route_datagram(dg);
}
示例6: send_get_object
void LoadingObject::send_get_object(doid_t do_id)
{
DatagramPtr dg = Datagram::create(m_dbss->m_db_channel, do_id, DBSERVER_OBJECT_GET_ALL);
dg->add_uint32(m_context); // Context
dg->add_doid(do_id);
route_datagram(dg);
}
示例7: on_complete
void DBOperationGet::on_complete(DBObjectSnapshot *snapshot)
{
DatagramPtr resp = Datagram::create();
resp->add_server_header(m_sender, m_dbserver->m_control_channel,
m_resp_msgtype);
resp->add_uint32(m_context);
resp->add_uint8(SUCCESS);
// Calculate the fields that we are sending in our response:
FieldValues response_fields;
if(m_resp_msgtype == DBSERVER_OBJECT_GET_ALL_RESP) {
// Send everything:
response_fields = snapshot->m_fields;
} else {
// Send only what was requested:
for(auto it = m_get_fields.begin(); it != m_get_fields.end(); ++it) {
auto it2 = snapshot->m_fields.find(*it);
if(it2 != snapshot->m_fields.end()) {
response_fields[it2->first] = it2->second;
}
}
}
// WHAT we send depends on our m_resp_msgtype, so:
if(m_resp_msgtype == DBSERVER_OBJECT_GET_FIELD_RESP) {
if(response_fields.empty()) {
// We did not find the field we were looking for.
// Therefore, this is a failure.
on_failure();
return;
}
resp->add_uint16(response_fields.begin()->first->get_id());
resp->add_data(response_fields.begin()->second);
// And that's it. We're done.
m_dbserver->route_datagram(resp);
delete snapshot;
cleanup();
return;
}
if(m_resp_msgtype == DBSERVER_OBJECT_GET_ALL_RESP) {
resp->add_uint16(snapshot->m_dclass->get_id());
}
resp->add_uint16(response_fields.size());
for(auto it = response_fields.begin(); it != response_fields.end(); ++it) {
resp->add_uint16(it->first->get_id());
resp->add_data(it->second);
}
m_dbserver->route_datagram(resp);
delete snapshot;
cleanup();
}
示例8: on_failure
void DBOperationUpdate::on_failure()
{
DatagramPtr resp = Datagram::create();
resp->add_server_header(m_sender, m_dbserver->m_control_channel,
m_resp_msgtype);
resp->add_uint32(m_context);
resp->add_uint8(FAILURE);
m_dbserver->route_datagram(resp);
cleanup();
}
示例9: send_interest_entry
void DistributedObject::send_interest_entry(channel_t location, uint32_t context)
{
DatagramPtr dg = Datagram::create(location, m_do_id, m_ram_fields.size() ?
STATESERVER_OBJECT_ENTER_INTEREST_WITH_REQUIRED_OTHER :
STATESERVER_OBJECT_ENTER_INTEREST_WITH_REQUIRED);
dg->add_uint32(context);
append_required_data(dg, true);
if(m_ram_fields.size()) {
append_other_data(dg, true);
}
route_datagram(dg);
}
示例10: handle_datagram
//.........这里部分代码省略.........
}
m_fields_sendable[do_id] = fields;
}
break;
case CLIENTAGENT_ADD_SESSION_OBJECT: {
doid_t do_id = dgi.read_doid();
if(m_session_objects.find(do_id) != m_session_objects.end()) {
m_log->warning() << "Received add session object for existing session object "
<< do_id << ".\n";
return;
}
m_log->debug() << "Added session object with id " << do_id << ".\n";
m_session_objects.insert(do_id);
}
break;
case CLIENTAGENT_REMOVE_SESSION_OBJECT: {
doid_t do_id = dgi.read_doid();
if(m_session_objects.find(do_id) == m_session_objects.end()) {
m_log->warning() << "Received remove session object for non-session object "
<< do_id << ".\n";
return;
}
m_log->debug() << "Removed session object with id " << do_id << ".\n";
m_session_objects.erase(do_id);
}
break;
case CLIENTAGENT_GET_NETWORK_ADDRESS: {
DatagramPtr resp = Datagram::create(sender, m_channel, CLIENTAGENT_GET_NETWORK_ADDRESS_RESP);
resp->add_uint32(dgi.read_uint32()); // Context
resp->add_string(get_remote_address());
resp->add_uint16(get_remote_port());
resp->add_string(get_local_address());
resp->add_uint16(get_local_port());
route_datagram(resp);
}
break;
case STATESERVER_OBJECT_SET_FIELD: {
doid_t do_id = dgi.read_doid();
if(!lookup_object(do_id)) {
if(try_queue_pending(do_id, in_dg)) {
return;
}
m_log->warning() << "Received server-side field update for unknown object "
<< do_id << ".\n";
return;
}
if(sender != m_channel) {
uint16_t field_id = dgi.read_uint16();
handle_set_field(do_id, field_id, dgi);
}
}
break;
case STATESERVER_OBJECT_SET_FIELDS: {
doid_t do_id = dgi.read_doid();
if(!lookup_object(do_id)) {
if(try_queue_pending(do_id, in_dg)) {
return;
}
m_log->warning() << "Received server-side multi-field update for unknown object "
<< do_id << ".\n";
return;
示例11: add_interest
// add_interest will start a new interest operation and retrieve all the objects an interest
// from the server, subscribing to each zone in the interest. If the interest already
// exists, the interest will be updated with the new zones passed in by the argument.
void Client::add_interest(Interest &i, uint32_t context, channel_t caller)
{
unordered_set<zone_t> new_zones;
for(const auto& it : i.zones) {
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];
unordered_set<zone_t> killed_zones;
for(const auto& it : previous_interest.zones) {
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:
notify_interest_done(i.id, caller);
handle_interest_done(i.id, context);
return;
}
uint32_t request_context = m_next_context++;
InterestOperation *iop = new InterestOperation(this, m_client_agent->m_interest_timeout,
i.id, context, request_context, i.parent, new_zones, caller);
m_pending_interests.emplace(request_context, iop);
DatagramPtr resp = Datagram::create();
resp->add_server_header(i.parent, m_channel, STATESERVER_OBJECT_GET_ZONES_OBJECTS);
resp->add_uint32(request_context);
resp->add_doid(i.parent);
resp->add_uint16(new_zones.size());
for(const auto& it : new_zones) {
resp->add_zone(it);
subscribe_channel(location_as_channel(i.parent, it));
}
route_datagram(resp);
}
示例12: handle_get_fields
void DBStateServer::handle_get_fields(channel_t sender, DatagramIterator &dgi)
{
uint32_t r_context = dgi.read_uint32();
doid_t r_do_id = dgi.read_doid();
uint16_t field_count = dgi.read_uint16();
if(is_activated_object(r_do_id)) {
return;
}
m_log->trace() << "Received GetFields for inactive object with id " << r_do_id << std::endl;
// Read requested fields from datagram
std::vector<const Field*> db_fields; // Ram|required db fields in request
std::vector<const Field*> ram_fields; // Ram|required but not-db fields in request
for(uint16_t i = 0; i < field_count; ++i) {
uint16_t field_id = dgi.read_uint16();
const Field* field = g_dcf->get_field_by_id(field_id);
if(!field) {
DatagramPtr dg = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_FIELDS_RESP);
dg->add_uint32(r_context);
dg->add_uint8(false);
route_datagram(dg);
} else if(field->has_keyword("ram") || field->has_keyword("required")) {
if(field->has_keyword("db")) {
db_fields.push_back(field);
} else {
ram_fields.push_back(field);
}
}
}
if(db_fields.size()) {
// Get context for db query
uint32_t db_context = m_next_context++;
// Prepare reponse datagram
if(m_context_datagrams.find(db_context) == m_context_datagrams.end()) {
m_context_datagrams[db_context] = Datagram::create(sender, r_do_id,
STATESERVER_OBJECT_GET_FIELDS_RESP);
}
m_context_datagrams[db_context]->add_uint32(r_context);
m_context_datagrams[db_context]->add_bool(true);
m_context_datagrams[db_context]->add_uint16(ram_fields.size() + db_fields.size());
for(const auto& it : ram_fields) {
m_context_datagrams[db_context]->add_uint16(it->get_id());
m_context_datagrams[db_context]->add_data(it->get_default_value());
}
// Send query to database
DatagramPtr dg = Datagram::create(m_db_channel, r_do_id, DBSERVER_OBJECT_GET_FIELDS);
dg->add_uint32(db_context);
dg->add_doid(r_do_id);
dg->add_uint16(db_fields.size());
for(const auto& it : db_fields) {
dg->add_uint16(it->get_id());
}
route_datagram(dg);
} else { // If no database fields exist
DatagramPtr dg = Datagram::create(sender, r_do_id, STATESERVER_OBJECT_GET_FIELDS_RESP);
dg->add_uint32(r_context);
dg->add_bool(true);
dg->add_uint16(ram_fields.size());
for(const auto& it : ram_fields) {
dg->add_uint16(it->get_id());
dg->add_data(it->get_default_value());
}
route_datagram(dg);
}
}
示例13: handle_datagram
void DistributedObject::handle_datagram(DatagramHandle, DatagramIterator &dgi)
{
channel_t sender = dgi.read_channel();
uint16_t msgtype = dgi.read_uint16();
switch(msgtype) {
case STATESERVER_DELETE_AI_OBJECTS: {
if(m_ai_channel != dgi.read_channel()) {
m_log->warning() << " received reset for wrong AI channel.\n";
break; // Not my AI!
}
annihilate(sender);
break;
}
case STATESERVER_OBJECT_DELETE_RAM: {
if(m_do_id != dgi.read_doid()) {
break; // Not meant for me!
}
// Delete object
annihilate(sender);
break;
}
case STATESERVER_OBJECT_DELETE_CHILDREN: {
doid_t r_do_id = dgi.read_doid();
if(r_do_id == m_do_id) {
delete_children(sender);
} else if(r_do_id == m_parent_id) {
annihilate(sender, false);
}
break;
}
case STATESERVER_OBJECT_SET_FIELD: {
if(m_do_id != dgi.read_doid()) {
break; // Not meant for me!
}
handle_one_update(dgi, sender);
break;
}
case STATESERVER_OBJECT_SET_FIELDS: {
if(m_do_id != dgi.read_doid()) {
break; // Not meant for me!
}
uint16_t field_count = dgi.read_uint16();
for(int16_t i = 0; i < field_count; ++i) {
if(!handle_one_update(dgi, sender)) {
break;
}
}
break;
}
case STATESERVER_OBJECT_CHANGING_AI: {
doid_t r_parent_id = dgi.read_doid();
channel_t new_channel = dgi.read_channel();
m_log->trace() << "Received ChangingAI notification from " << r_parent_id << ".\n";
if(r_parent_id != m_parent_id) {
m_log->warning() << "Received AI channel from " << r_parent_id
<< " but my parent_id is " << m_parent_id << ".\n";
break;
}
if(m_ai_explicitly_set) {
break;
}
handle_ai_change(new_channel, sender, false);
break;
}
case STATESERVER_OBJECT_SET_AI: {
channel_t new_channel = dgi.read_channel();
m_log->trace() << "Updating AI to " << new_channel << ".\n";
handle_ai_change(new_channel, sender, true);
break;
}
case STATESERVER_OBJECT_GET_AI: {
m_log->trace() << "Received AI query from " << sender << ".\n";
DatagramPtr dg = Datagram::create(sender, m_do_id, STATESERVER_OBJECT_GET_AI_RESP);
dg->add_uint32(dgi.read_uint32()); // Get context
dg->add_doid(m_do_id);
dg->add_channel(m_ai_channel);
route_datagram(dg);
break;
}
case STATESERVER_OBJECT_GET_AI_RESP: {
dgi.read_uint32(); // Discard context
doid_t r_parent_id = dgi.read_doid();
m_log->trace() << "Received AI query response from " << r_parent_id << ".\n";
if(r_parent_id != m_parent_id) {
m_log->warning() << "Received AI channel from " << r_parent_id
<< " but my parent_id is " << m_parent_id << ".\n";
break;
}
channel_t new_ai = dgi.read_channel();
if(m_ai_explicitly_set) {
break;
}
//.........这里部分代码省略.........
示例14: handle_location_change
void DistributedObject::handle_location_change(doid_t new_parent, zone_t new_zone, channel_t sender)
{
doid_t old_parent = m_parent_id;
zone_t old_zone = m_zone_id;
// Set of channels that must be notified about location_change
unordered_set<channel_t> targets;
// Notify AI of changing location
if(m_ai_channel) {
targets.insert(m_ai_channel);
}
// Notify Owner of changing location
if(m_owner_channel) {
targets.insert(m_owner_channel);
}
if(new_parent == m_do_id) {
m_log->warning() << "Object cannot be parented to itself.\n";
return;
}
// Handle parent change
if(new_parent != old_parent) {
// Unsubscribe from the old parent's child-broadcast channel.
if(old_parent) { // If we have an old parent
unsubscribe_channel(parent_to_children(m_parent_id));
// Notify old parent of changing location
targets.insert(old_parent);
// Notify old location of changing location
targets.insert(location_as_channel(old_parent, old_zone));
}
m_parent_id = new_parent;
m_zone_id = new_zone;
// Subscribe to new one...
if(new_parent) { // If we have a new parent
subscribe_channel(parent_to_children(m_parent_id));
if(!m_ai_explicitly_set) {
// Ask the new parent what its AI is.
DatagramPtr dg = Datagram::create(m_parent_id, m_do_id, STATESERVER_OBJECT_GET_AI);
dg->add_uint32(m_next_context++);
route_datagram(dg);
}
targets.insert(new_parent); // Notify new parent of changing location
} else if(!m_ai_explicitly_set) {
m_ai_channel = 0;
}
} else if(new_zone != old_zone) {
m_zone_id = new_zone;
// Notify parent of changing zone
targets.insert(m_parent_id);
// Notify old location of changing location
targets.insert(location_as_channel(m_parent_id, old_zone));
} else {
return; // Not actually changing location, no need to handle.
}
// Send changing location message
DatagramPtr dg = Datagram::create(targets, sender, STATESERVER_OBJECT_CHANGING_LOCATION);
dg->add_doid(m_do_id);
dg->add_location(new_parent, new_zone);
dg->add_location(old_parent, old_zone);
route_datagram(dg);
// At this point, the new parent (which may or may not be the same as the
// old parent) is unaware of our existence in this zone.
m_parent_synchronized = false;
// Send enter location message
if(new_parent) {
send_location_entry(location_as_channel(new_parent, new_zone));
}
}