2015-02-20 08:28:05 -05:00
|
|
|
|
|
|
|
// 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"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-07-06 14:52:04 -04:00
|
|
|
cLuaUDPEndpoint::cLuaUDPEndpoint(cLuaState::cTableRefPtr && a_Callbacks):
|
|
|
|
m_Callbacks(std::move(a_Callbacks))
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cLuaUDPEndpoint::~cLuaUDPEndpoint()
|
|
|
|
{
|
|
|
|
// If the endpoint is still open, close it:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint != nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
endpoint->Close();
|
2015-02-20 08:28:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
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 = 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:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint == nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Send the data:
|
2016-07-06 14:52:04 -04:00
|
|
|
return endpoint->Send(a_Data, a_RemotePeer, a_RemotePort);
|
2015-02-20 08:28:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UInt16 cLuaUDPEndpoint::GetPort(void) const
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the endpoint:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint == nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the port:
|
2016-07-06 14:52:04 -04:00
|
|
|
return endpoint->GetPort();
|
2015-02-20 08:28:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cLuaUDPEndpoint::IsOpen(void) const
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the endpoint:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint == nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
|
|
|
// No endpoint means that we're not open
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the state:
|
2016-07-06 14:52:04 -04:00
|
|
|
return endpoint->IsOpen();
|
2015-02-20 08:28:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaUDPEndpoint::Close(void)
|
|
|
|
{
|
|
|
|
// If the endpoint is still open, close it:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint != nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
endpoint->Close();
|
2015-02-20 08:28:05 -05:00
|
|
|
m_Endpoint.reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
Terminated();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaUDPEndpoint::EnableBroadcasts(void)
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the endpoint:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint != nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
endpoint->EnableBroadcasts();
|
2015-02-20 08:28:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks.reset();
|
2015-02-20 08:28:05 -05:00
|
|
|
|
|
|
|
// If the endpoint is still open, close it:
|
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
auto endpoint = m_Endpoint;
|
|
|
|
if (endpoint != nullptr)
|
2015-02-20 08:28:05 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
endpoint->Close();
|
2015-02-20 08:28:05 -05:00
|
|
|
m_Endpoint.reset();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaUDPEndpoint::OnReceivedData(const char * a_Data, size_t a_NumBytes, const AString & a_RemotePeer, UInt16 a_RemotePort)
|
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->CallTableFn("OnReceivedData", this, AString(a_Data, a_NumBytes), a_RemotePeer, a_RemotePort);
|
2015-02-20 08:28:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaUDPEndpoint::OnError(int a_ErrorCode, const AString & a_ErrorMsg)
|
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
// Notify the plugin:
|
|
|
|
m_Callbacks->CallTableFn("OnError", a_ErrorCode, a_ErrorMsg);
|
2015-02-20 08:28:05 -05:00
|
|
|
|
2016-07-06 14:52:04 -04:00
|
|
|
// Terminate all processing on the endpoint:
|
2015-02-20 08:28:05 -05:00
|
|
|
Terminated();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|