#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "cWebPlugin_Lua.h"
#include "cPlugin_NewLua.h"
#include "tolua++.h"
#include "cWebAdmin.h"
extern bool report_errors(lua_State* lua, int status);
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
struct cWebPlugin_Lua::sWebPluginTab
{
std::string Title;
std::string SafeTitle;
int Reference;
};
cWebPlugin_Lua::cWebPlugin_Lua( cPlugin_NewLua* a_Plugin )
: cWebPlugin( a_Plugin->GetLuaState() )
, m_Plugin( a_Plugin )
{
}
cWebPlugin_Lua::~cWebPlugin_Lua()
{
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
delete *itr;
}
m_Tabs.clear();
}
bool cWebPlugin_Lua::AddTab( const char* a_Title, lua_State * a_LuaState, int a_FunctionReference )
{
if( a_LuaState != m_Plugin->GetLuaState() )
{
LOGERROR("Only allowed to add a tab to a WebPlugin of your own Plugin!");
return false;
}
sWebPluginTab* Tab = new sWebPluginTab();
Tab->Title = a_Title;
Tab->SafeTitle = a_Title; // TODO - Convert all non alphabet/digit letters to underscores
Tab->Reference = a_FunctionReference;
m_Tabs.push_back( Tab );
return true;
}
std::string cWebPlugin_Lua::HandleRequest( HTTPRequest* a_Request )
{
lua_State* LuaState = m_Plugin->GetLuaState();
std::string RetVal = "";
std::string TabName = GetTabNameForRequest(a_Request);
if( TabName.empty() )
return "";
sWebPluginTab* Tab = 0;
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
if( (*itr)->Title.compare( TabName ) == 0 ) // This is the one! Rawr
{
Tab = *itr;
break;
}
}
if( Tab )
{
//LOGINFO("1. Stack size: %i", lua_gettop(LuaState) );
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, Tab->Reference); // same as lua_getref()
//LOGINFO("2. Stack size: %i", lua_gettop(LuaState) );
// Push HTTPRequest
tolua_pushusertype( LuaState, a_Request, "HTTPRequest" );
//LOGINFO("Calling bound function! :D");
int s = lua_pcall( LuaState, 1, 1, 0);
if ( s != 0 )
{
std::string err = lua_tostring(LuaState, -1);
LOGERROR("-- %s", err.c_str() );
lua_pop(LuaState, 1);
LOGINFO("error. Stack size: %i", lua_gettop(LuaState) );
return err; // Show the error message in the web page, looks cool
}
if( !lua_isstring( LuaState, -1 ) )
{
LOGWARN("WARNING: WebPlugin tab '%s' did not return a string!", Tab->Title.c_str() );
lua_pop(LuaState, 1); // Pop return value
return std::string("WARNING: WebPlugin tab '") + Tab->Title + std::string("' did not return a string!");
}
RetVal += tolua_tostring(LuaState, -1, 0);
lua_pop(LuaState, 1); // Pop return value
//LOGINFO("ok. Stack size: %i", lua_gettop(LuaState) );
}
return RetVal;
}
void cWebPlugin_Lua::Initialize()
{
}
std::string cWebPlugin_Lua::GetTabNameForRequest( HTTPRequest* a_Request )
{
std::vector<std::string> Split = StringSplit( a_Request->Path, "/" );
if( Split.size() > 1 )
{
sWebPluginTab* Tab = 0;
if( Split.size() > 2 ) // If we got the tab name, show that page
{
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
if( (*itr)->SafeTitle.compare( Split[2] ) == 0 ) // This is the one! Rawr
{
Tab = *itr;
break;
}
}
}
else // Otherwise show the first tab
{
if( m_Tabs.size() > 0 )
Tab = *m_Tabs.begin();
}
if( Tab )
{
return Tab->Title;
}
}
return "";
}
std::list< std::string > cWebPlugin_Lua::GetTabNames()
{
std::list< std::string > NameList;
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
NameList.push_back( (*itr)->Title );
}
return NameList;
}