bool ChannelService::EventSunk(ChannelPipeline* pipeline, MessageEvent<DatagramPacket>& e) { DatagramPacket* packet = e.GetMessage(); Channel* ch = e.GetChannel(); DatagramChannel* sc = (DatagramChannel*) ch; return sc->Send(packet->GetInetAddress(), &(packet->GetBuffer())) > 0; }
bool ChannelService::EventSunk(ChannelPipeline* pipeline, MessageEvent<Buffer>& e) { Buffer* buffer = e.GetMessage(); RETURN_FALSE_IF_NULL(buffer); uint32 len = buffer->ReadableBytes(); int32 ret = e.GetChannel()->WriteNow(buffer); return ret >= 0 ? (len == (uint32) ret) : false; }
void MessageReceived(ChannelHandlerContext& ctx, MessageEvent<Buffer>& e) { Buffer* input = e.GetMessage(); if (m_cumulation.Readable()) { m_cumulation.DiscardReadedBytes(); m_cumulation.Write(input, input->ReadableBytes()); CallDecode(ctx, e.GetChannel(), m_cumulation); } else { CallDecode(ctx, e.GetChannel(), *input); if (input->Readable()) { m_cumulation.Write(input, input->ReadableBytes()); } } }
void ServiceIPCEventHandler::MessageReceived(ChannelHandlerContext& ctx, MessageEvent<IPCEvent>& e) { #define CHECK_SEVICE_HANDLER() do{ \ if (NULL == m_handler) \ { \ if( GetServiceProcess()->GetServiceType() == DISPATCHER_SERVICE_PROCESS_TYPE) return; \ WARN_LOG("ServiceHandler is NULL for handling IPC event."); \ return; \ } \ }while(0) IPCEvent* ipc_event = e.GetMessage(); IPCEventType type = ipc_event->GetType(); switch (type) { case SOCKET_MSG: { CHECK_SEVICE_HANDLER(); SocketMessageEvent* msg = (SocketMessageEvent*) ipc_event; uint32 reportSocketChannelID = msg->GetChannelID(); if (m_has_dispatcher) { uint32 realID = msg->GetChannelID(); Channel* src_channel = e.GetChannel(); VirtualChannelHelper::GetVirtualSocketID(src_channel, realID, reportSocketChannelID); } if (NULL != msg->GetContent()) { if (NULL != msg->GetSocketInetAddress()) { m_handler->OnSocketMessage(reportSocketChannelID, *(msg->GetContent()), *(msg->GetSocketInetAddress())); } else { m_handler->OnSocketMessage(reportSocketChannelID, *(msg->GetContent())); } } break; } case IPC_MSG: { CHECK_SEVICE_HANDLER(); IPCMessageEvent* msg = (IPCMessageEvent*) ipc_event; if (NULL != msg->GetContent()) { m_handler->OnIPCMessage(msg->GetSrcType(), msg->GetSrcIndex(), *(msg->GetContent())); } break; } case ADMIN: { CHECK_SEVICE_HANDLER(); IPCMessageEvent* msg = (IPCMessageEvent*) ipc_event; if (NULL != msg->GetContent()) { AdminCommand cmd; if (0 == AdminCommandHandler::DecodeCommand(cmd, msg->GetContent())) { std::string result; Buffer tmp; if (AdminCommandHandler::HandleCommand(cmd, result) >= 0) { tmp.EnsureWritableBytes(result.size() + 2); tmp.Printf("%s\r\n", result.c_str()); } else { tmp.Printf("Failed to handler command:%s\r\n", cmd.name.c_str()); } VirtualChannelHelper::WriteSocket(cmd.admin_channel_id, tmp); } } break; } case IPC_CTRL: { IPCCtrlEvent* event = (IPCCtrlEvent*) ipc_event; switch (event->GetIPCCtrlType()) { case SERV_PROC_STARTED: { CHECK_SEVICE_HANDLER(); m_handler->OnServiceProcessStarted(event->GetSrcType(), event->GetSrcIndex()); break; } case SERV_PROC_STOPED: { CHECK_SEVICE_HANDLER(); m_handler->OnServiceProcessStoped(event->GetSrcType(), event->GetSrcIndex()); break; } default: { break; } } break; } case SOCKET_CTRL: { CHECK_SEVICE_HANDLER(); SocketCtrlEvent* event = (SocketCtrlEvent*) ipc_event; uint32 reportSocketChannelID = event->GetSocketChannelID(); if (m_has_dispatcher) { uint32 realID = event->GetSocketChannelID(); Channel* src_channel = ctx.GetChannel(); VirtualChannelHelper::GetVirtualSocketID(src_channel, realID, reportSocketChannelID); } switch (event->GetSocketCtrlType()) { case SOCKET_OPENED: { m_handler->OnSocketOpened(reportSocketChannelID); break; } case SOCKET_CONNECTED: { if (NULL != event->GetAddress()) { m_handler->OnSocketConnected(reportSocketChannelID, *(event->GetAddress())); } else if (NULL != event->GetUnixAddress()) { m_handler->OnSocketConnected(reportSocketChannelID, *(event->GetUnixAddress())); } break; } case SOCKET_CLOSED: { m_handler->OnSocketClosed(reportSocketChannelID); if (m_has_dispatcher) { VirtualChannelHelper::ClearTable(ctx.GetChannel(), event->GetSocketChannelID()); } break; } case SOCKET_CONNECT_FAILED: { if (NULL != event->GetAddress()) { m_handler->OnSocketConnectFailed(reportSocketChannelID, *(event->GetAddress())); } else if (NULL != event->GetUnixAddress()) { m_handler->OnSocketConnectFailed(reportSocketChannelID, *(event->GetUnixAddress())); } if (m_has_dispatcher) { VirtualChannelHelper::ClearTable(ctx.GetChannel(), event->GetSocketChannelID()); } break; } default: { ERROR_LOG( "Unknown socket ctrl type %u", event->GetSocketCtrlType()); break; } } break; } default: { ERROR_LOG("Unknown ipc event type %u", ipc_event->GetType()); break; } } }