1
0
cuberite-2a/src/Bindings/LuaUDPEndpoint.cpp
peterbell10 13144a08e4
Enable some more clang-tidy linter checks (#4738)
* Avoid inefficient AString -> c_str() -> AString round trip

* Avoid redundant string init expressions

* Avoid unnecessary return, continue, etc.

* Add .clang-format to help with clang-tidy fix-its

* Avoid unnecessary passing by value

* Avoid unnecessary local copying

* Avoid copying in range-for loops

* Avoid over-complicated boolean expressions

* Some violations missed by my local clang-tidy

* Allow unnecessary continue statements

* Add brackets

* Another expression missed locally

* Move BindingsProcessor call into clang-tidy.sh and add space

* Fix pushd not found error

* Different grouping of CheckBlockInteractionRate
2020-05-14 22:15:35 +00:00

189 lines
2.8 KiB
C++

// LuaUDPEndpoint.cpp
// Implements the cLuaUDPEndpoint class representing a Lua wrapper for the cUDPEndpoint class and the callbacks it needs
#include "Globals.h"
#include "LuaUDPEndpoint.h"
cLuaUDPEndpoint::cLuaUDPEndpoint(cLuaState::cTableRefPtr && a_Callbacks):
m_Callbacks(std::move(a_Callbacks))
{
}
cLuaUDPEndpoint::~cLuaUDPEndpoint()
{
// If the endpoint is still open, close it:
auto endpoint = m_Endpoint;
if (endpoint != nullptr)
{
endpoint->Close();
}
Terminated();
}
bool cLuaUDPEndpoint::Open(UInt16 a_Port, cLuaUDPEndpointPtr a_Self)
{
ASSERT(m_Self == nullptr); // Must not be opened yet
ASSERT(m_Endpoint == nullptr);
m_Self = std::move(a_Self);
m_Endpoint = cNetwork::CreateUDPEndpoint(a_Port, *this);
return m_Endpoint->IsOpen();
}
bool cLuaUDPEndpoint::Send(const AString & a_Data, const AString & a_RemotePeer, UInt16 a_RemotePort)
{
// Safely grab a copy of the endpoint:
auto endpoint = m_Endpoint;
if (endpoint == nullptr)
{
return false;
}
// Send the data:
return endpoint->Send(a_Data, a_RemotePeer, a_RemotePort);
}
UInt16 cLuaUDPEndpoint::GetPort(void) const
{
// Safely grab a copy of the endpoint:
auto endpoint = m_Endpoint;
if (endpoint == nullptr)
{
return 0;
}
// Get the port:
return endpoint->GetPort();
}
bool cLuaUDPEndpoint::IsOpen(void) const
{
// Safely grab a copy of the endpoint:
auto endpoint = m_Endpoint;
if (endpoint == nullptr)
{
// No endpoint means that we're not open
return false;
}
// Get the state:
return endpoint->IsOpen();
}
void cLuaUDPEndpoint::Close(void)
{
// If the endpoint is still open, close it:
auto endpoint = m_Endpoint;
if (endpoint != nullptr)
{
endpoint->Close();
m_Endpoint.reset();
}
Terminated();
}
void cLuaUDPEndpoint::EnableBroadcasts(void)
{
// Safely grab a copy of the endpoint:
auto endpoint = m_Endpoint;
if (endpoint != nullptr)
{
endpoint->EnableBroadcasts();
}
}
void cLuaUDPEndpoint::Release(void)
{
// Close the endpoint, if not already closed:
Close();
// Allow self to deallocate:
m_Self.reset();
}
void cLuaUDPEndpoint::Terminated(void)
{
// Disable the callbacks:
m_Callbacks.reset();
// If the endpoint is still open, close it:
{
auto endpoint = m_Endpoint;
if (endpoint != nullptr)
{
endpoint->Close();
m_Endpoint.reset();
}
}
}
void cLuaUDPEndpoint::OnReceivedData(const char * a_Data, size_t a_NumBytes, const AString & a_RemotePeer, UInt16 a_RemotePort)
{
m_Callbacks->CallTableFn("OnReceivedData", this, AString(a_Data, a_NumBytes), a_RemotePeer, a_RemotePort);
}
void cLuaUDPEndpoint::OnError(int a_ErrorCode, const AString & a_ErrorMsg)
{
// Notify the plugin:
m_Callbacks->CallTableFn("OnError", a_ErrorCode, a_ErrorMsg);
// Terminate all processing on the endpoint:
Terminated();
}