Arcus::PythonMessage::PythonMessage(const MessagePtr& message) { _shared_message = message; _message = message.get(); _reflection = message->GetReflection(); _descriptor = message->GetDescriptor(); }
void onPubSubMessage( const TcpConnectionPtr& connectionPtr, const MessagePtr& messagePtr, Timestamp) { const PubSubMessage& message = *dynamic_cast<PubSubMessage*>(messagePtr.get()); counters_.incrementInBoundMessage(); switch(message.op()) { case Op::PUB: distributePublish( string(message.topic().data()), string(message.content().data()) ); break; case Op::SUB: doSubscribe(connectionPtr, string(message.topic().data())); break; case Op::UNSUB: doUnsubscribe(connectionPtr, string(message.topic().data())); break; default: LOG(ERROR) << "Unsupported message op: " << message.op(); connectionPtr->shutdown(); break; } }
//FUZZ: disable check_for_lack_ACE_OS size_t recv (void* msg, size_t size) { //FUZZ: enable check_for_lack_ACE_OS AutoLock lock (mutex_); while (true) { throw_if_failed (); if (!in_recv_data_.empty ()) { MessagePtr m (in_recv_data_.front ()); in_recv_data_.pop (); std::type_info const* exp = &typeid (*m); if (exp == typeid (Recv)) { Recv* data = dynamic_cast<Recv*> (m.get ()); if (size < data->size ()) throw Group::InsufficienSpace (); ACE_OS::memcpy (msg, data->payload (), data->size ()); return data->size (); } else { // cerr << "recv: group-scheduler messaging protocol violation. " // << "unexpected message " << typeid (*m).name () << endl; ACE_OS::abort (); } } recv_cond_.wait (); } }
void execute () { try { sock_.join (addr_); auto_ptr<LinkListener> ll (new LinkListener (sock_, in_link_data_)); { AutoLock lock (mutex_); // Loop // // while (true) { cond_.wait (&sync_schedule); // "Loop of Fairness" bool done = false; do { // control message // // if (!in_control_.empty ()) { done = true; break; } // outsync // // if (sync_schedule < ACE_OS::gettimeofday ()) { // OUTSYNC outsync (); // schedule next outsync sync_schedule = ACE_OS::gettimeofday () + ACE_Time_Value (0, Protocol::SYNC_PERIOD); } // link message // // if (!in_link_data_.empty ()) { MessagePtr m (in_link_data_.front ()); in_link_data_.pop (); std::type_info const* exp = &typeid (*m); if (exp == typeid (LinkFailure)) { // cerr << "link failure" << endl; throw false; } else if (exp == typeid (LinkData)) { LinkData* data = dynamic_cast<LinkData*> (m.get ()); // INSYNC, TL, CT // Filter out loopback. // if (ACE_OS::strcmp (data->header().member_id.id, id_) != 0) { insync (); transaction_list (); current_transaction (data->header().current, data->payload (), data->size ()); } } else { // cerr << "unknown message type from link listener: " // << typeid (*m).name () << endl; ACE_OS::abort (); } } // api message // // if (!in_data_.empty ()) { // API api (); } } while (!in_link_data_.empty() || sync_schedule < ACE_OS::gettimeofday ()); if (done) break; } } } catch (...) { // cerr << "Exception in scheduler loop." << endl; MessageQueueAutoLock lock (out_control_); out_control_.push (MessagePtr (new Failure)); } }
void ClientGame::processMessage(MessagePtr msg) { switch(msg->getType()) { case MessageType::SRV_ASTEROID_SPAWN: { print("ClientGame: spawning asteroid\n"); AsteroidSpawnMessage *spawn_msg = static_cast<AsteroidSpawnMessage*>(msg.get()); AsteroidPtr ast(new Asteroid(this, spawn_msg->getData(), asteroid_data)); entities.push_back(ast); asteroids.push_back(ast); } break; case MessageType::SRV_SHIP_SPAWN: { ShipSpawnMessage *spawn_msg = static_cast<ShipSpawnMessage*>(msg.get()); const ShipSpawnData &d = spawn_msg->getData(); ShipPtr ship(new Ship(this, d)); entities.push_back(ship); ships.push_back(ship); print(format("ClientGame: spawning ship id=%1% name=%2%\n") % ship->getID() % ship->getName()); } break; case MessageType::SRV_BULLET_SPAWN: { BulletSpawnMessage *spawn_msg = static_cast<BulletSpawnMessage*>(msg.get()); const BulletSpawnData &d = spawn_msg->getData(); BulletPtr bullet(new Bullet(this, d)); entities.push_back(bullet); if(Audio::distToListener(d.state.position) < 200.0f) Audio::playSFX("sounds/laser0.wav", false, d.state.position, 0.5f, 10.0f); print(format("ClientGame: spawning bullet id=%1%\n") % bullet->getID()); } break; case MessageType::SRV_SHIP_STATE: { ShipStateMessage *state_msg = static_cast<ShipStateMessage*>(msg.get()); int id = state_msg->getEntityID(); //print(format("ClientGame: received ship state data for ship id=%1%\n") % id); //TODO use a map? for(unsigned int i = 0; i < ships.size(); i++) if(ships[i]->getID() == id) { ships[i]->setStateData(state_msg->getData()); break; } } break; case MessageType::SRV_SHIP_OWNER: { ShipOwnerMessage *owner_msg = static_cast<ShipOwnerMessage*>(msg.get()); print("owner message\n"); for(unsigned int i = 0; i < ships.size(); i++) if(ships[i]->getID() == owner_msg->getData().ship_id) { print("owner message\n"); player_ship = ships[i]; ship_cam->setShip(player_ship); break; } } case MessageType::SRV_ASTEROID_STATE: { AsteroidStateMessage *state_msg = static_cast<AsteroidStateMessage*>(msg.get()); int id = state_msg->getEntityID(); //print(format("ClientGame: received asteroid state data for asteroid id=%1%\n") % id); for(unsigned int i = 0; i < asteroids.size(); i++) if(asteroids[i]->getID() == id) { asteroids[i]->setStateData(state_msg->getData()); break; } } break; case MessageType::SRV_ENTITY_DELETE: { print("ClientGame: deleting entity\n"); EntityDeleteMessage *delete_msg = static_cast<EntityDeleteMessage*>(msg.get()); int id = delete_msg->getData().entity_id; for(unsigned int i = 0; i < entities.size(); i++) if(entities[i]->getID() == id) { entities[i]->die(); entities.erase(entities.begin()+i); break; } if(player_ship && id == player_ship->getID()) player_ship.reset(); //TODO do this properly for(unsigned int i = 0; i < ships.size(); i++) if(ships[i]->getID() == id) { cml::vector2f pos = ships[i]->getPosition(); cml::vector3f col1(ships[i]->getBodyColor().data()); cml::vector3f col2 = cml::vector3f(0.0f, 0.0f, 0.0f); ExplosionEmitterPtr e(new ExplosionEmitter(pos, col1, col2, 40, 50.0f, 1.6f)); particle_system->addEmitter(e); if(Audio::distToListener(pos) < 200.0f) Audio::playSFX("sounds/explosion0.wav", false, pos, 0.1f, 10.0f); ships.erase(ships.begin()+i); break; } for(unsigned int i = 0; i < asteroids.size(); i++) if(asteroids[i]->getID() == id) { AsteroidPtr a = asteroids[i]; if(a->getBounds().intersects(game_bounds)) { cml::vector2f pos = a->getPosition(); cml::vector3f col1 = cml::vector3f(1.0f, 0.0f, 0.0f); cml::vector3f col2 = cml::vector3f(0.1f, 0.0f, 0.0f); ExplosionEmitterPtr e(new ExplosionEmitter(pos, col1, col2, 50, 30.0f, 1.6f)); particle_system->addEmitter(e); col1.set(0.2f, 0.2f, 0.0f); col2.set(0.0f, 0.0f, 0.0f); ExplosionEmitterQuadsPtr e2(new ExplosionEmitterQuads(pos, col1, col2, 30, 20.0f, 1.6f)); particle_system->addEmitter(e2); if(Audio::distToListener(pos) < 300.0f) Audio::playSFX(asteroid_explosions[rand()%asteroid_explosions.size()], false, pos, 0.01f, 1.0f); } asteroids.erase(asteroids.begin()+i); break; } /* for(unsigned int i = 0; i < bullets.size(); i++) if(bullets[i]->getID() == id) { bullets.erase(bullets.begin()+i); break; } */ } break; case MessageType::SRV_SCORE: { ScoreMessage *score_msg = static_cast<ScoreMessage*>(msg.get()); scores = score_msg->getData(); } break; default: break; } }
void protobuf_codec::send(conn_weak_ptr& conn, const MessagePtr& msg) { send(conn, msg.get()); }