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
|
||||
}, -- 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
|
||||
}, -- 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
|
||||
DeprecatedBindings.cpp
|
||||
LuaChunkStay.cpp
|
||||
LuaNameLookup.cpp
|
||||
LuaState.cpp
|
||||
LuaTCPLink.cpp
|
||||
LuaWindow.cpp
|
||||
@ -25,6 +26,7 @@ SET (HDRS
|
||||
DeprecatedBindings.h
|
||||
LuaChunkStay.h
|
||||
LuaFunctions.h
|
||||
LuaNameLookup.h
|
||||
LuaState.h
|
||||
LuaTCPLink.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
|
||||
|
||||
#include "../OSSupport/Network.h"
|
||||
#include "LuaState.h"
|
||||
#include "PluginLua.h"
|
||||
|
||||
|
||||
@ -22,7 +21,7 @@ class cLuaTCPLink:
|
||||
public cTCPLink::cCallbacks
|
||||
{
|
||||
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);
|
||||
|
||||
/** Sends the data contained in the string to the remote peer.
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "tolua++/include/tolua++.h"
|
||||
#include "LuaState.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):
|
||||
|
||||
@ -258,9 +339,9 @@ void ManualBindings::BindNetwork(lua_State * tolua_S)
|
||||
// Fill in the functions (alpha-sorted):
|
||||
tolua_beginmodule(tolua_S, "cNetwork");
|
||||
tolua_function(tolua_S, "Connect", tolua_cNetwork_Connect);
|
||||
/*
|
||||
tolua_function(tolua_S, "HostnameToIP", tolua_cNetwork_HostnameToIP);
|
||||
tolua_function(tolua_S, "IPToHostname", tolua_cNetwork_IPToHostname);
|
||||
/*
|
||||
tolua_function(tolua_S, "Listen", tolua_cNetwork_Listen);
|
||||
*/
|
||||
tolua_endmodule(tolua_S);
|
||||
|
Loading…
Reference in New Issue
Block a user