Exemple #1
0
Arcus::PythonMessage::PythonMessage(const MessagePtr& message)
{
    _shared_message = message;
    _message = message.get();
    _reflection = message->GetReflection();
    _descriptor = message->GetDescriptor();
}
Exemple #2
0
 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;
     }
 }
Exemple #3
0
    //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 ();
      }
    }
Exemple #4
0
    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;
    }
}
Exemple #6
0
void protobuf_codec::send(conn_weak_ptr& conn, const MessagePtr& msg)
{
	send(conn, msg.get());
}