cNetwork: Exported lookup functions to Lua API.
Also added an example in the NetworkTest plugin.
This commit is contained in:
parent
04347084d6
commit
17498a97a2
@ -36,6 +36,27 @@ g_PluginInfo =
|
|||||||
},
|
},
|
||||||
}, -- ParameterCombinations
|
}, -- ParameterCombinations
|
||||||
}, -- client
|
}, -- client
|
||||||
|
|
||||||
|
lookup =
|
||||||
|
{
|
||||||
|
HelpString = "Looks up the IP addresses corresponding to the given hostname (google.com by default)",
|
||||||
|
Handler = HandleConsoleNetLookup,
|
||||||
|
ParameterCombinations =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Params = "",
|
||||||
|
Help = "Looks up the IP addresses of google.com.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Params = "Hostname",
|
||||||
|
Help = "Looks up the IP addresses of the specified hostname.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Params = "IP",
|
||||||
|
Help = "Looks up the canonical name of the specified IP.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, -- lookup
|
||||||
}, -- Subcommands
|
}, -- Subcommands
|
||||||
}, -- net
|
}, -- net
|
||||||
},
|
},
|
||||||
|
@ -61,3 +61,45 @@ end
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function HandleConsoleNetLookup(a_Split)
|
||||||
|
-- Get the name to look up:
|
||||||
|
local Addr = a_Split[3] or "google.com"
|
||||||
|
|
||||||
|
-- Create the callbacks "personalised" for the host:
|
||||||
|
local Callbacks =
|
||||||
|
{
|
||||||
|
OnNameResolved = function (a_Hostname, a_IP)
|
||||||
|
LOG(a_Hostname .. " resolves to " .. a_IP)
|
||||||
|
end,
|
||||||
|
|
||||||
|
OnError = function (a_Query, a_ErrorCode, a_ErrorMsg)
|
||||||
|
LOG("Failed to retrieve information for " .. a_Query .. ": " .. a_ErrorCode .. " (" .. a_ErrorMsg .. ")")
|
||||||
|
assert(a_Query == Addr)
|
||||||
|
end,
|
||||||
|
|
||||||
|
OnFinished = function (a_Query)
|
||||||
|
LOG("Resolving " .. a_Query .. " has finished.")
|
||||||
|
assert(a_Query == Addr)
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Queue both name and IP DNS queries;
|
||||||
|
-- we don't distinguish between an IP and a hostname in this command so we don't know which one to use:
|
||||||
|
local res = cNetwork:HostnameToIP(Addr, Callbacks)
|
||||||
|
if not(res) then
|
||||||
|
LOGWARNING("cNetwork:HostnameToIP call failed immediately")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
res = cNetwork:IPToHostname(Addr, Callbacks)
|
||||||
|
if not(res) then
|
||||||
|
LOGWARNING("cNetwork:IPToHostname call failed immediately")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return true, "DNS query has been queued."
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ SET (SRCS
|
|||||||
Bindings.cpp
|
Bindings.cpp
|
||||||
DeprecatedBindings.cpp
|
DeprecatedBindings.cpp
|
||||||
LuaChunkStay.cpp
|
LuaChunkStay.cpp
|
||||||
|
LuaNameLookup.cpp
|
||||||
LuaState.cpp
|
LuaState.cpp
|
||||||
LuaTCPLink.cpp
|
LuaTCPLink.cpp
|
||||||
LuaWindow.cpp
|
LuaWindow.cpp
|
||||||
@ -25,6 +26,7 @@ SET (HDRS
|
|||||||
DeprecatedBindings.h
|
DeprecatedBindings.h
|
||||||
LuaChunkStay.h
|
LuaChunkStay.h
|
||||||
LuaFunctions.h
|
LuaFunctions.h
|
||||||
|
LuaNameLookup.h
|
||||||
LuaState.h
|
LuaState.h
|
||||||
LuaTCPLink.h
|
LuaTCPLink.h
|
||||||
LuaWindow.h
|
LuaWindow.h
|
||||||
|
88
src/Bindings/LuaNameLookup.cpp
Normal file
88
src/Bindings/LuaNameLookup.cpp
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
// LuaNameLookup.cpp
|
||||||
|
|
||||||
|
// Implements the cLuaNameLookup class used as the cNetwork API callbacks for name and IP lookups from Lua
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "LuaNameLookup.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cLuaNameLookup::cLuaNameLookup(const AString & a_Query, cPluginLua & a_Plugin, int a_CallbacksTableStackPos):
|
||||||
|
m_Plugin(a_Plugin),
|
||||||
|
m_Callbacks(a_Plugin.GetLuaState(), a_CallbacksTableStackPos),
|
||||||
|
m_Query(a_Query)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cLuaNameLookup::OnNameResolved(const AString & a_Name, const AString & a_IP)
|
||||||
|
{
|
||||||
|
// Check if we're still valid:
|
||||||
|
if (!m_Callbacks.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the callback:
|
||||||
|
cPluginLua::cOperation Op(m_Plugin);
|
||||||
|
if (!Op().Call(cLuaState::cTableRef(m_Callbacks, "OnNameResolved"), a_Name, a_IP))
|
||||||
|
{
|
||||||
|
LOGINFO("cNetwork name lookup OnNameResolved callback failed in plugin %s looking up %s. %s resolves to %s.",
|
||||||
|
m_Plugin.GetName().c_str(), m_Query.c_str(), a_Name.c_str(), a_IP.c_str()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cLuaNameLookup::OnError(int a_ErrorCode, const AString & a_ErrorMsg)
|
||||||
|
{
|
||||||
|
// Check if we're still valid:
|
||||||
|
if (!m_Callbacks.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the callback:
|
||||||
|
cPluginLua::cOperation Op(m_Plugin);
|
||||||
|
if (!Op().Call(cLuaState::cTableRef(m_Callbacks, "OnError"), m_Query, a_ErrorCode, a_ErrorMsg))
|
||||||
|
{
|
||||||
|
LOGINFO("cNetwork name lookup OnError callback failed in plugin %s looking up %s. The error is %d (%s)",
|
||||||
|
m_Plugin.GetName().c_str(), m_Query.c_str(), a_ErrorCode, a_ErrorMsg.c_str()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cLuaNameLookup::OnFinished(void)
|
||||||
|
{
|
||||||
|
// Check if we're still valid:
|
||||||
|
if (!m_Callbacks.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the callback:
|
||||||
|
cPluginLua::cOperation Op(m_Plugin);
|
||||||
|
if (!Op().Call(cLuaState::cTableRef(m_Callbacks, "OnFinished"), m_Query))
|
||||||
|
{
|
||||||
|
LOGINFO("cNetwork name lookup OnFinished callback failed in plugin %s, looking up %s.",
|
||||||
|
m_Plugin.GetName().c_str(), m_Query.c_str()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
46
src/Bindings/LuaNameLookup.h
Normal file
46
src/Bindings/LuaNameLookup.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
// LuaNameLookup.h
|
||||||
|
|
||||||
|
// Declares the cLuaNameLookup class used as the cNetwork API callbacks for name and IP lookups from Lua
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../OSSupport/Network.h"
|
||||||
|
#include "PluginLua.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cLuaNameLookup:
|
||||||
|
public cNetwork::cResolveNameCallbacks
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/** Creates a new instance of the lookup callbacks for the specified query,
|
||||||
|
attached to the specified lua plugin and wrapping the callbacks that are in a table at the specified stack pos. */
|
||||||
|
cLuaNameLookup(const AString & a_Query, cPluginLua & a_Plugin, int a_CallbacksTableStackPos);
|
||||||
|
|
||||||
|
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 query used to start the lookup (either hostname or IP). */
|
||||||
|
AString m_Query;
|
||||||
|
|
||||||
|
|
||||||
|
// cNetwork::cResolveNameCallbacks overrides:
|
||||||
|
virtual void OnNameResolved(const AString & a_Name, const AString & a_IP) override;
|
||||||
|
virtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;
|
||||||
|
virtual void OnFinished(void) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../OSSupport/Network.h"
|
#include "../OSSupport/Network.h"
|
||||||
#include "LuaState.h"
|
|
||||||
#include "PluginLua.h"
|
#include "PluginLua.h"
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +21,7 @@ class cLuaTCPLink:
|
|||||||
public cTCPLink::cCallbacks
|
public cTCPLink::cCallbacks
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** Creates a new instance of the link, attached to the specified lua state and wrapping the callbacks that are in a table at the specified stack pos. */
|
/** 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. */
|
||||||
cLuaTCPLink(cPluginLua & a_Plugin, int a_CallbacksTableStackPos);
|
cLuaTCPLink(cPluginLua & a_Plugin, int a_CallbacksTableStackPos);
|
||||||
|
|
||||||
/** Sends the data contained in the string to the remote peer.
|
/** Sends the data contained in the string to the remote peer.
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "tolua++/include/tolua++.h"
|
#include "tolua++/include/tolua++.h"
|
||||||
#include "LuaState.h"
|
#include "LuaState.h"
|
||||||
#include "LuaTCPLink.h"
|
#include "LuaTCPLink.h"
|
||||||
|
#include "LuaNameLookup.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -71,6 +72,86 @@ static int tolua_cNetwork_Connect(lua_State * L)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int tolua_cNetwork_HostnameToIP(lua_State * L)
|
||||||
|
{
|
||||||
|
// Function signature:
|
||||||
|
// cNetwork:HostnameToIP(Host, Callbacks) -> bool
|
||||||
|
|
||||||
|
cLuaState S(L);
|
||||||
|
if (
|
||||||
|
!S.CheckParamUserTable(1, "cNetwork") ||
|
||||||
|
!S.CheckParamString(2) ||
|
||||||
|
!S.CheckParamTable(3) ||
|
||||||
|
!S.CheckParamEnd(4)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the plugin instance:
|
||||||
|
cPluginLua * Plugin = GetLuaPlugin(L);
|
||||||
|
if (Plugin == nullptr)
|
||||||
|
{
|
||||||
|
// An error message has been already printed in GetLuaPlugin()
|
||||||
|
S.Push(false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the params:
|
||||||
|
AString Host;
|
||||||
|
S.GetStackValue(2, Host);
|
||||||
|
|
||||||
|
// Try to look up:
|
||||||
|
bool res = cNetwork::HostnameToIP(Host, std::make_shared<cLuaNameLookup>(Host, *Plugin, 3));
|
||||||
|
S.Push(res);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int tolua_cNetwork_IPToHostname(lua_State * L)
|
||||||
|
{
|
||||||
|
// Function signature:
|
||||||
|
// cNetwork:IPToHostname(IP, Callbacks) -> bool
|
||||||
|
|
||||||
|
cLuaState S(L);
|
||||||
|
if (
|
||||||
|
!S.CheckParamUserTable(1, "cNetwork") ||
|
||||||
|
!S.CheckParamString(2) ||
|
||||||
|
!S.CheckParamTable(3) ||
|
||||||
|
!S.CheckParamEnd(4)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the plugin instance:
|
||||||
|
cPluginLua * Plugin = GetLuaPlugin(L);
|
||||||
|
if (Plugin == nullptr)
|
||||||
|
{
|
||||||
|
// An error message has been already printed in GetLuaPlugin()
|
||||||
|
S.Push(false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the params:
|
||||||
|
AString Host;
|
||||||
|
S.GetStackValue(2, Host);
|
||||||
|
|
||||||
|
// Try to look up:
|
||||||
|
bool res = cNetwork::IPToHostName(Host, std::make_shared<cLuaNameLookup>(Host, *Plugin, 3));
|
||||||
|
S.Push(res);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cTCPLink bindings (routed through cLuaTCPLink):
|
// cTCPLink bindings (routed through cLuaTCPLink):
|
||||||
|
|
||||||
@ -258,9 +339,9 @@ void ManualBindings::BindNetwork(lua_State * tolua_S)
|
|||||||
// Fill in the functions (alpha-sorted):
|
// Fill in the functions (alpha-sorted):
|
||||||
tolua_beginmodule(tolua_S, "cNetwork");
|
tolua_beginmodule(tolua_S, "cNetwork");
|
||||||
tolua_function(tolua_S, "Connect", tolua_cNetwork_Connect);
|
tolua_function(tolua_S, "Connect", tolua_cNetwork_Connect);
|
||||||
/*
|
|
||||||
tolua_function(tolua_S, "HostnameToIP", tolua_cNetwork_HostnameToIP);
|
tolua_function(tolua_S, "HostnameToIP", tolua_cNetwork_HostnameToIP);
|
||||||
tolua_function(tolua_S, "IPToHostname", tolua_cNetwork_IPToHostname);
|
tolua_function(tolua_S, "IPToHostname", tolua_cNetwork_IPToHostname);
|
||||||
|
/*
|
||||||
tolua_function(tolua_S, "Listen", tolua_cNetwork_Listen);
|
tolua_function(tolua_S, "Listen", tolua_cNetwork_Listen);
|
||||||
*/
|
*/
|
||||||
tolua_endmodule(tolua_S);
|
tolua_endmodule(tolua_S);
|
||||||
|
Loading…
Reference in New Issue
Block a user