2015-01-28 09:14:05 -05:00
|
|
|
|
|
|
|
// LuaTCPLink.h
|
|
|
|
|
|
|
|
// Declares the cLuaTCPLink class representing a Lua wrapper for the cTCPLink class and the callbacks it needs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../OSSupport/Network.h"
|
|
|
|
#include "PluginLua.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-30 15:24:02 -05:00
|
|
|
// fwd:
|
|
|
|
class cLuaServerHandle;
|
|
|
|
typedef WeakPtr<cLuaServerHandle> cLuaServerHandleWPtr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-28 09:14:05 -05:00
|
|
|
class cLuaTCPLink:
|
|
|
|
public cNetwork::cConnectCallbacks,
|
|
|
|
public cTCPLink::cCallbacks
|
|
|
|
{
|
|
|
|
public:
|
2015-01-29 05:09:56 -05:00
|
|
|
/** Creates a new instance of the link, attached to the specified plugin and wrapping the callbacks that are in a table at the specified stack pos. */
|
2015-01-28 09:14:05 -05:00
|
|
|
cLuaTCPLink(cPluginLua & a_Plugin, int a_CallbacksTableStackPos);
|
|
|
|
|
2015-01-30 15:24:02 -05:00
|
|
|
/** Creates a new instance of the link, attached to the specified plugin and wrapping the callbacks that are in the specified referenced table. */
|
|
|
|
cLuaTCPLink(cPluginLua & a_Plugin, cLuaState::cRef && a_CallbacksTableRef, cLuaServerHandleWPtr a_Server);
|
|
|
|
|
|
|
|
~cLuaTCPLink();
|
|
|
|
|
2015-01-28 09:14:05 -05:00
|
|
|
/** Sends the data contained in the string to the remote peer.
|
|
|
|
Returns true if successful, false on immediate failure (queueing the data failed or link not available). */
|
|
|
|
bool Send(const AString & a_Data);
|
|
|
|
|
|
|
|
/** Returns the IP address of the local endpoint of the connection. */
|
|
|
|
AString GetLocalIP(void) const;
|
|
|
|
|
|
|
|
/** Returns the port used by the local endpoint of the connection. */
|
|
|
|
UInt16 GetLocalPort(void) const;
|
|
|
|
|
|
|
|
/** Returns the IP address of the remote endpoint of the connection. */
|
|
|
|
AString GetRemoteIP(void) const;
|
|
|
|
|
|
|
|
/** Returns the port used by the remote endpoint of the connection. */
|
|
|
|
UInt16 GetRemotePort(void) const;
|
|
|
|
|
|
|
|
/** Closes the link gracefully.
|
|
|
|
The link will send any queued outgoing data, then it will send the FIN packet.
|
|
|
|
The link will still receive incoming data from remote until the remote closes the connection. */
|
|
|
|
void Shutdown(void);
|
|
|
|
|
|
|
|
/** Drops the connection without any more processing.
|
|
|
|
Sends the RST packet, queued outgoing and incoming data is lost. */
|
|
|
|
void Close(void);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/** The plugin for which the link is created. */
|
|
|
|
cPluginLua & m_Plugin;
|
|
|
|
|
|
|
|
/** The Lua table that holds the callbacks to be invoked. */
|
|
|
|
cLuaState::cRef m_Callbacks;
|
|
|
|
|
|
|
|
/** The underlying link representing the connection.
|
|
|
|
May be nullptr. */
|
|
|
|
cTCPLinkPtr m_Link;
|
|
|
|
|
2015-01-30 15:24:02 -05:00
|
|
|
/** The server that is responsible for this link, if any. */
|
|
|
|
cLuaServerHandleWPtr m_Server;
|
|
|
|
|
|
|
|
|
|
|
|
/** Common code called when the link is considered as terminated.
|
|
|
|
Releases m_Link, m_Callbacks and this from m_Server, each when applicable. */
|
|
|
|
void Terminated(void);
|
|
|
|
|
2015-01-28 09:14:05 -05:00
|
|
|
// cNetwork::cConnectCallbacks overrides:
|
|
|
|
virtual void OnConnected(cTCPLink & a_Link) override;
|
|
|
|
virtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;
|
|
|
|
|
|
|
|
// cTCPLink::cCallbacks overrides:
|
|
|
|
virtual void OnLinkCreated(cTCPLinkPtr a_Link) override;
|
|
|
|
virtual void OnReceivedData(const char * a_Data, size_t a_Length) override;
|
|
|
|
virtual void OnRemoteClosed(void) override;
|
|
|
|
// The OnError() callback is shared with cNetwork::cConnectCallbacks
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|