コード例 #1
0
ファイル: io_handler.cpp プロジェクト: fanfeixiang/minotaur
void IOHandler::Handle(const EventMessage& message) {
  MI_LOG_TRACE(logger, "IOHandler::Handle " << message);

  switch (message.type_id) {
    case minotaur::MessageType::kIOEvent:
      {
        if (message.payload & event::EventType::EV_READ) {
          HandleIOReadEvent(message);
        }
        if (message.payload & event::EventType::EV_WRITE) {
          HandleIOWriteEvent(message);
        }
        if (message.payload & event::EventType::EV_CLOSE) {
          HandleIOCloseEvent(message);
        }
        break;
      }
    case minotaur::MessageType::kIOMessageEvent:
      return HandleIOMessageEvent(message);
    case minotaur::MessageType::kIOActiveCloseEvent:
      return HandleIOActiveCloseEvent(message);
    default:
      MI_LOG_ERROR(logger, "IOHanlder unknown message:" << message.type_id);
      return;
  }
}
コード例 #2
0
ファイル: io_handler.cpp プロジェクト: fanfeixiang/minotaur
void IOHandler::HandleIOMessageEvent(const EventMessage& message) {
  MI_LOG_TRACE(logger, "HandleIOMessageEvent");
  IODescriptor* descriptor = 
      IODescriptorFactory::GetIODescriptor(message.descriptor_id);
  if (!descriptor) {
    MI_LOG_DEBUG(logger, "HandleIOCloseEvent descriptor not found:"
        << message.descriptor_id);
    HandleIOMessageFailure(message);
    return;
  }

  Channel* channel = dynamic_cast<Channel*>(descriptor);
  if (!channel) {
    MI_LOG_ERROR(logger, "IOHandler::HandleIOMessageEvent descriptor is not channel");
    HandleIOMessageFailure(message);
    return;
  }

  ProtocolMessage* protocol_message = message.GetProtocolMessage();
  if (0 != channel->EncodeMessage(protocol_message)) {
    HandleIOMessageFailure(message);
    return;    
  }

  descriptor->OnWrite();
}
コード例 #3
0
ファイル: io_handler.cpp プロジェクト: fanfeixiang/minotaur
void IOHandler::HandleIOActiveCloseEvent(const EventMessage& message) {
  MI_LOG_TRACE(logger, "HandleIOActiveCloseEvent");
  IODescriptor* descriptor = 
      IODescriptorFactory::GetIODescriptor(message.descriptor_id);
  if (!descriptor) {
    MI_LOG_DEBUG(logger, "HandleIOActiveCloseEvent descriptor not found:"
        << message.descriptor_id);
    return;
  }

  descriptor->OnActiveClose();
}
コード例 #4
0
ファイル: io_handler.cpp プロジェクト: fanfeixiang/minotaur
void IOHandler::HandleIOWriteEvent(const EventMessage& message) {
  IODescriptor* descriptor = 
      IODescriptorFactory::GetIODescriptor(message.descriptor_id);
  if (!descriptor) {
    MI_LOG_DEBUG(logger, "HandleWriteEvent descriptor not found:"
        << message.descriptor_id);
    return;
  }

  MI_LOG_TRACE(logger, "HandleIOWriteEvent:" << *descriptor);

  descriptor->OnWrite();
}
コード例 #5
0
void SyncClientChannel::OnDecodeMessage(ProtocolMessage* message) {
  ProtocolMessage* keeper_message = sequence_keeper_.Fetch();
  if (!keeper_message) {
    MI_LOG_WARN(logger, "SyncClientChannel::OnDecodeMessage keeper not found, might timeout"
        << ", client_channel:" << GetDiagnositicInfo());
    MessageFactory::Destroy(message);
    BreakChannel();
    return;
  } 

  if (keeper_message->type_id == MessageType::kHeartBeatMessage
      || keeper_message->direction == ProtocolMessage::kOneway) {
    MI_LOG_TRACE(logger, "SyncClientChannel::OnDecodeMessage heartbeat or oneway:" << *message);
    MessageFactory::Destroy(message);
    MessageFactory::Destroy(keeper_message);
    TryFireMessage();
    return;
  }

  message->status = ProtocolMessage::kStatusOK;
  message->direction = ProtocolMessage::kIncomingResponse;
  message->handler_id = keeper_message->handler_id;
  message->sequence_id = keeper_message->sequence_id;
  message->descriptor_id = GetDescriptorId();
  message->payload.data = keeper_message->payload.data;

  MI_LOG_TRACE(logger, "SyncClientChannel::OnDecodeMessage " << *message);

  MessageFactory::Destroy(keeper_message);

  if (!GetIOService()->GetServiceStage()->Send(message)) {
    MI_LOG_WARN(logger, "SyncClientChannel::OnDecodeMessage Send message fail");
    MessageFactory::Destroy(message);
    return;
  }

  TryFireMessage();
}