Пример #1
0
bool_t PacketHandler::OnRead(serial_t uidx, Session *sess)
{
	bool_t  ret  = FALSE;
	int32_t iret = 0;

	RingBuffer *rbuffer    = sess->RecvBuffer();
	char_t     *context    = rbuffer->GetOutPtr();
	int32_t    context_len = rbuffer->Length();


	iret = HttpReqComplete(context, context_len);
	if(iret == -2) { ECILA_TRACE(); return FALSE; } // request format error
	if(iret == -1) { return TRUE; }                 // skip (more context)


	ret = rbuffer->ForwardOutPtr(context_len);
	if(!ret) { ECILA_TRACE(); return FALSE; }


	Buffer *buffer = buff_pool_->Acquire();
	if(!buffer) { ECILA_TRACE(); return FALSE; }

	PacketHeader pkt_header;
	pkt_header.kind_ = PKT_KIND_USERAPP;
	pkt_header.cmd_  = PKT_CMD_RECV;
	pkt_header.size_ = context_len;
	pkt_header.uidx_ = uidx;

	ret = buffer->PutBinary((char_t*)&pkt_header, sizeof(pkt_header));
	if(!ret) { ECILA_TRACE(); goto _ERROR; }

	ret = buffer->PutBinary(context, context_len);
	if(!ret) { ECILA_TRACE(); goto _ERROR; }

	dispatch_q_->Push(buffer);
	return TRUE;


_ERROR:
	buff_pool_->Release(buffer);
	return FALSE;
}