📄 scripting.cpp
字号:
// we need the socket to be non-blocking
pSock->SetFlags(wxSOCKET_NOWAIT);
// make some input and output stream wrappers, then add it to the list
AddScript(new wxSocketInputStream(*pSock), new wxSocketOutputStream(*pSock), pSock);
}
}
m_mtxServers.Unlock();
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief Pump everything
///
//////////////////////////////////////////////////////////////////////////////
void Scripting::Pump()
{
PumpScripts();
PumpServers();
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief Run a script from a file
///
//////////////////////////////////////////////////////////////////////////////
bool Scripting::RunFromFile(wxString strFilename)
{
wxFFileInputStream * pStream;
pStream = new wxFFileInputStream(strFilename);
AddScript(pStream, NULL, NULL);
return false;
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief Listen on a TCP port for connection for scripting commands
///
//////////////////////////////////////////////////////////////////////////////
bool Scripting::AddTCPServer(int iPort, bool bLocalConnectionsOnly)
{
wxSocketServer * pServer;
wxIPV4address addr;
if (bLocalConnectionsOnly)
addr.LocalHost();
else
addr.AnyAddress();
addr.Service(iPort);
pServer = new wxSocketServer(addr);
if (!pServer->Ok())
{
delete pServer;
return true;
}
AddServer(pServer);
return false;
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief Delete all TCP servers
///
//////////////////////////////////////////////////////////////////////////////
void Scripting::DeleteAllTCPServers()
{
vector<wxSocketServer *>::iterator i2;
m_mtxServers.Lock();
for (i2 = m_vServers.begin(); i2 != m_vServers.end(); i2++)
{
delete (*i2);
}
m_vServers.clear();
m_mtxServers.Unlock();
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief Low level function to perform the command in a string
///
//////////////////////////////////////////////////////////////////////////////
std::list<wxString> Scripting::ExecuteCommand(wxString strCmdAndArgs)
{
list<wxString> vCmdAndArgs;
wxStringTokenizer tkz(strCmdAndArgs, wxT("\t"), wxTOKEN_RET_EMPTY_ALL);
while (tkz.HasMoreTokens())
vCmdAndArgs.push_back(tkz.GetNextToken());
return ExecuteCommand(vCmdAndArgs);
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief Low level function to perform the command in a list (command and
/// arguments).
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::ExecuteCommand(list<wxString> vCmdAndArgs)
{
wxString strCmd;
list<wxString> rtn;
if (vCmdAndArgs.size() == 0)
{
rtn.push_back(wxT("Invalid number of arguments"));
return rtn;
}
strCmd = vCmdAndArgs.front().Upper();
vCmdAndArgs.pop_front();
if (strCmd == wxT("ADD_WAYPOINT"))
return CommandAddWaypoint(strCmd, vCmdAndArgs);
if (strCmd == wxT("GET_WAYPOINT"))
return CommandGetWaypoint(strCmd, vCmdAndArgs);
if (strCmd == wxT("DELETE_WAYPOINT"))
return CommandDeleteWaypoint(strCmd, vCmdAndArgs);
rtn.push_back(wxT("Unrecognized command"));
return rtn;
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief add_waypoint command
///
/// add_waypoint <name> <visible> <call_out> <small_label> <icon_filename> <long> <lat>
///
/// add_waypoint <name> <visible> <call_out> <small_label> <icon_filename> <street_#> <street name> <street type> <city> <state>
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::CommandAddWaypoint(wxString strCmd, std::list<wxString> vArgs)
{
list<wxString> rtn;
wxString strWaypointName;
bool bCallout;
bool bSmallLabel;
wxString strIconFilename;
bool bVisible;
if (vArgs.size() < 5)
{
rtn.push_back(wxT("Invalid number of arguments"));
return rtn;
}
strWaypointName = PopFrontAndReturn(vArgs);
bVisible = wxtoi(PopFrontAndReturn(vArgs)) ? true : false;
bCallout = wxtoi(PopFrontAndReturn(vArgs)) ? true : false;
bSmallLabel = wxtoi(PopFrontAndReturn(vArgs)) ? true : false;
strIconFilename = PopFrontAndReturn(vArgs);
switch (vArgs.size())
{
case 2:
{
double fLong = 0;
double fLat = 0;
Address cAddr;
vector<bool> bVisibility;
PopFrontAndReturn(vArgs).ToDouble(&fLong);
PopFrontAndReturn(vArgs).ToDouble(&fLat);
cAddr = FindCoordinates(Point(fLong, fLat), bVisibility);
if (cAddr.m_bValid)
{
MapMarker cMarker(strWaypointName, &cAddr, -1, bCallout, bSmallLabel, true, strIconFilename, 1, bVisible);
m_pctlMap->SetMarker(cMarker, false);
rtn.push_back(wxT("OK"));
}
else
{
rtn.push_back(wxT("Look up failure"));
}
return rtn;
}
case 5:
{
int iSearchNumber;
wxString strSearchStreet;
wxString strSearchType;
wxString strCity;
wxString strState;
Address cAddr;
std::vector<bool> bVisibility;
iSearchNumber = wxtoi(PopFrontAndReturn(vArgs));
strSearchStreet = PopFrontAndReturn(vArgs);
strSearchType = PopFrontAndReturn(vArgs);
strCity = PopFrontAndReturn(vArgs);
strState = PopFrontAndReturn(vArgs);
cAddr = FindAddress(iSearchNumber, strSearchStreet, strSearchType, strCity, strState, bVisibility);
if (cAddr.m_bValid)
{
MapMarker cMarker(strWaypointName, &cAddr, -1, bCallout, bSmallLabel, true, strIconFilename, 1, bVisible);
m_pctlMap->SetMarker(cMarker, false);
rtn.push_back(wxT("OK"));
}
else
{
rtn.push_back(wxT("Look up failure"));
}
}
}
rtn.push_back(wxT("Invalid number of arguments"));
return rtn;
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief delete_waypoint command
///
/// delete_waypoint <name>
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::CommandDeleteWaypoint(wxString strCmd, std::list<wxString> vArgs)
{
list<wxString> rtn;
wxString strWaypointName;
if (vArgs.size() != 1)
{
rtn.push_back(wxT("Invalid number of arguments"));
return rtn;
}
strWaypointName = PopFrontAndReturn(vArgs);
m_pctlMap->ClearMarker(strWaypointName);
rtn.push_back(wxT("OK"));
return rtn;
}
//////////////////////////////////////////////////////////////////////////////
///
/// \brief get_waypoint command
///
/// get_waypoint <name>
///
/// Will return the address and coordinates of waypoint
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::CommandGetWaypoint(wxString strCmd, std::list<wxString> vArgs)
{
list<wxString> rtn;
wxString strWaypointName;
if (vArgs.size() != 1)
{
rtn.push_back(wxT("Invalid number of arguments"));
return rtn;
}
strWaypointName = PopFrontAndReturn(vArgs);
MapMarker & cMarker = m_pctlMap->GetMarker(strWaypointName);
rtn.push_back(wxT("OK"));
rtn.push_back(cMarker.m_cAddress.FormatAddress(true, true, false));
return rtn;
}
wxString Scripting::CompileCommand(list<wxString> vCmdAndArgs)
{
wxString strRtn;
list<wxString>::iterator i;
for (i = vCmdAndArgs.begin(); i != vCmdAndArgs.end(); i++)
{
if (i != vCmdAndArgs.begin())
strRtn += wxT("\t");
strRtn += *i;
}
return strRtn;
}
bool Scripting::WriteWaypointToFile(wxString strFilename, bool bAppend, const MapMarker & cMarker)
{
wxFFile fFile;
list<wxString> vCmdAndArgs;
if (!fFile.Open(strFilename, bAppend ? wxT("a+b") : wxT("wb")))
return true;
vCmdAndArgs.push_back(wxT("add_waypoint"));
vCmdAndArgs.push_back(cMarker.m_strName);
vCmdAndArgs.push_back(wxString::Format(wxT("%d"), cMarker.m_bVisible));
vCmdAndArgs.push_back(wxString::Format(wxT("%d"), cMarker.m_bCalloutBox));
vCmdAndArgs.push_back(wxString::Format(wxT("%d"), cMarker.m_bSmallLabel));
vCmdAndArgs.push_back(wxString::Format(cMarker.m_strIcon));
vCmdAndArgs.push_back(wxString::Format(wxT("%.10f"), cMarker.m_cAddress.m_ptCoordinates.m_fLong));
vCmdAndArgs.push_back(wxString::Format(wxT("%.10f"), cMarker.m_cAddress.m_ptCoordinates.m_fLat));
fFile.Write(CompileCommand(vCmdAndArgs) + wxT("\n"));
fFile.Close();
return false;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -