summaryrefslogblamecommitdiffstats
path: root/src/Bindings/LuaUDPEndpoint.cpp
blob: ffb21c0a691ca27b5574cf220ef8d4ede0398f2a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                                                                                        
                                                                          
                                           
 








                                                   

                                   
         
                                  













                                                                    
                                   










                                                                                                     

                                   




                             
                                                                  








                                              

                                   




                         
                                   








                                              

                                   





                                                        
                                  








                                                   

                                   
         
                                  












                                              

                                   
         
                                             






















                                                     
                            


                                                   

                                           
                 
                                          








                                           





                                     
 
                                                                                                                  







                                                                          

                                                                     
 
                                                    

                     

// 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();
}