server/db/src/PeerBase.cpp

146 lines
2.7 KiB
C++

#include "stdafx.h"
#include "PeerBase.h"
#include <event2/buffer.h>
CPeerBase::CPeerBase() : m_bufferevent(nullptr)
{
}
CPeerBase::~CPeerBase()
{
Destroy();
}
void CPeerBase::Destroy()
{
if (m_bufferevent) {
bufferevent_free(m_bufferevent);
m_bufferevent = nullptr;
}
}
bool CPeerBase::Accept(bufferevent* bufev, sockaddr* addr)
{
if (!bufev) {
sys_err("Cannot accept empty bufferevent!");
return false;
}
if (m_bufferevent != nullptr) {
sys_err("Peer is already initialized");
return false;
}
// Save the bufferevent
m_bufferevent = bufev;
// Get the address of the conected peer
sockaddr_in* peer;
sockaddr_in6* peer6;
switch (addr->sa_family) {
case AF_INET:
peer = (sockaddr_in*) addr;
inet_ntop(AF_INET, &(peer->sin_addr), m_host, INET_ADDRSTRLEN);
break;
case AF_INET6:
peer6 = (sockaddr_in6*) addr;
inet_ntop(AF_INET, &(peer6->sin6_addr), m_host, INET6_ADDRSTRLEN);
break;
default:
break;
}
// Trigger the OnAccept event
OnAccept();
sys_log(0, "ACCEPT FROM %s", m_host);
return true;
}
void CPeerBase::Close()
{
OnClose();
}
void CPeerBase::EncodeBYTE(BYTE b)
{
Encode(&b, sizeof(b));
}
void CPeerBase::EncodeWORD(WORD w)
{
Encode(&w, sizeof(w));
}
void CPeerBase::EncodeDWORD(DWORD dw)
{
Encode(&dw, sizeof(dw));
}
void CPeerBase::Encode(const void* data, size_t size)
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
return;
}
if (bufferevent_write(m_bufferevent, data, size) != 0) {
sys_err("Buffer write error!");
return;
}
}
void CPeerBase::RecvEnd(size_t proceed_bytes)
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
return;
}
evbuffer *input = bufferevent_get_input(m_bufferevent);
evbuffer_drain(input, proceed_bytes);
}
size_t CPeerBase::GetRecvLength()
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
return 0;
}
evbuffer *input = bufferevent_get_input(m_bufferevent);
return evbuffer_get_length(input);
}
const void * CPeerBase::GetRecvBuffer(ssize_t ensure_bytes)
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
return nullptr;
}
evbuffer *input = bufferevent_get_input(m_bufferevent);
return evbuffer_pullup(input, ensure_bytes);
}
size_t CPeerBase::GetSendLength()
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
return 0;
}
evbuffer *output = bufferevent_get_output(m_bufferevent);
return evbuffer_get_length(output);
}