1
0

WebAdmin should not cause crashes anymore

Got rid of cWebPlugin_Lua
cPlugin_Lua is also a cWebPlugin now, so plugins don't need a separate cWebPlugin object
Changed some stuff to use AString instead of char*

git-svn-id: http://mc-server.googlecode.com/svn/trunk@777 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
faketruth 2012-08-22 14:22:21 +00:00
parent 0da4f7eaa2
commit 7c84349990
17 changed files with 369 additions and 378 deletions

View File

@ -135,14 +135,12 @@ function Initialize( Plugin )
end end
end end
local WebPlugin = Plugin:CreateWebPlugin() Plugin:AddWebTab( "Server Settings", HandleRequest_ServerSettings )
WebPlugin:SetName( Plugin:GetName() ) Plugin:AddWebTab( "Chat", HandleRequest_Chat )
WebPlugin:AddTab( "Server Settings", HandleRequest_ServerSettings ) Plugin:AddWebTab( "Playerlist", HandleRequest_PlayerList )
WebPlugin:AddTab( "Chat", HandleRequest_Chat ) Plugin:AddWebTab( "Whitelist", HandleRequest_WhiteList )
WebPlugin:AddTab( "Playerlist", HandleRequest_PlayerList ) Plugin:AddWebTab( "Permissions", HandleRequest_Permissions )
WebPlugin:AddTab( "Whitelist", HandleRequest_WhiteList ) Plugin:AddWebTab( "Manage Plugins", HandleRequest_ManagePlugins )
WebPlugin:AddTab( "Permissions", HandleRequest_Permissions )
WebPlugin:AddTab( "Manage Plugins", HandleRequest_ManagePlugins )
LOG( "Initialized " .. Plugin:GetName() .. " v." .. Plugin:GetVersion() ) LOG( "Initialized " .. Plugin:GetName() .. " v." .. Plugin:GetVersion() )
return true return true

View File

@ -1912,14 +1912,6 @@
RelativePath="..\source\cStringMap.h" RelativePath="..\source\cStringMap.h"
> >
</File> </File>
<File
RelativePath="..\source\cWebPlugin_Lua.cpp"
>
</File>
<File
RelativePath="..\source\cWebPlugin_Lua.h"
>
</File>
<File <File
RelativePath="..\source\LuaFunctions.h" RelativePath="..\source\LuaFunctions.h"
> >

View File

@ -32,7 +32,6 @@ $cfile "cInventory.h"
$cfile "cItem.h" $cfile "cItem.h"
$cfile "cWebAdmin.h" $cfile "cWebAdmin.h"
$cfile "cWebPlugin.h" $cfile "cWebPlugin.h"
$cfile "cWebPlugin_Lua.h"
$cfile "cPickup.h" $cfile "cPickup.h"
$cfile "cRoot.h" $cfile "cRoot.h"
$cfile "cTCPLink.h" $cfile "cTCPLink.h"

View File

@ -1,6 +1,6 @@
/* /*
** Lua binding: AllToLua ** Lua binding: AllToLua
** Generated automatically by tolua++-1.0.92 on 08/19/12 21:46:45. ** Generated automatically by tolua++-1.0.92 on 08/22/12 16:11:06.
*/ */
#ifndef __cplusplus #ifndef __cplusplus
@ -41,7 +41,6 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S);
#include "cItem.h" #include "cItem.h"
#include "cWebAdmin.h" #include "cWebAdmin.h"
#include "cWebPlugin.h" #include "cWebPlugin.h"
#include "cWebPlugin_Lua.h"
#include "cPickup.h" #include "cPickup.h"
#include "cRoot.h" #include "cRoot.h"
#include "cTCPLink.h" #include "cTCPLink.h"
@ -180,36 +179,35 @@ static void tolua_reg_types (lua_State* tolua_S)
tolua_usertype(tolua_S,"cRoot"); tolua_usertype(tolua_S,"cRoot");
tolua_usertype(tolua_S,"cLuaItems"); tolua_usertype(tolua_S,"cLuaItems");
tolua_usertype(tolua_S,"cCraftingGrid"); tolua_usertype(tolua_S,"cCraftingGrid");
tolua_usertype(tolua_S,"cLuaChunk");
tolua_usertype(tolua_S,"cPlugin::CommandStruct"); tolua_usertype(tolua_S,"cPlugin::CommandStruct");
tolua_usertype(tolua_S,"cPickup"); tolua_usertype(tolua_S,"cPickup");
tolua_usertype(tolua_S,"cItems"); tolua_usertype(tolua_S,"cItems");
tolua_usertype(tolua_S,"cGroup"); tolua_usertype(tolua_S,"cLuaChunk");
tolua_usertype(tolua_S,"cClientHandle"); tolua_usertype(tolua_S,"cClientHandle");
tolua_usertype(tolua_S,"cTracer"); tolua_usertype(tolua_S,"cGroup");
tolua_usertype(tolua_S,"cFurnaceRecipe"); tolua_usertype(tolua_S,"cFurnaceRecipe");
tolua_usertype(tolua_S,"cMCLogger"); tolua_usertype(tolua_S,"cTracer");
tolua_usertype(tolua_S,"cChatColor"); tolua_usertype(tolua_S,"cChatColor");
tolua_usertype(tolua_S,"cCuboid"); tolua_usertype(tolua_S,"cMCLogger");
tolua_usertype(tolua_S,"cPacket_PickupSpawn"); tolua_usertype(tolua_S,"cPacket_PickupSpawn");
tolua_usertype(tolua_S,"Lua__cWebPlugin"); tolua_usertype(tolua_S,"Lua__cWebPlugin");
tolua_usertype(tolua_S,"Lua__cPawn"); tolua_usertype(tolua_S,"Lua__cPawn");
tolua_usertype(tolua_S,"Vector3i"); tolua_usertype(tolua_S,"cCuboid");
tolua_usertype(tolua_S,"cItem"); tolua_usertype(tolua_S,"cItem");
tolua_usertype(tolua_S,"Vector3f"); tolua_usertype(tolua_S,"Vector3f");
tolua_usertype(tolua_S,"cPlugin_Lua"); tolua_usertype(tolua_S,"cPlugin_Lua");
tolua_usertype(tolua_S,"cWebPlugin_Lua");
tolua_usertype(tolua_S,"Lua__cPlugin_NewLua");
tolua_usertype(tolua_S,"cPawn");
tolua_usertype(tolua_S,"Lua__cTCPLink");
tolua_usertype(tolua_S,"cWebAdmin");
tolua_usertype(tolua_S,"cTCPLink");
tolua_usertype(tolua_S,"cCraftingRecipes"); tolua_usertype(tolua_S,"cCraftingRecipes");
tolua_usertype(tolua_S,"Lua__cPlugin_NewLua");
tolua_usertype(tolua_S,"Vector3i");
tolua_usertype(tolua_S,"cPawn");
tolua_usertype(tolua_S,"cWebAdmin");
tolua_usertype(tolua_S,"Lua__cTCPLink");
tolua_usertype(tolua_S,"cTCPLink");
tolua_usertype(tolua_S,"cGroupManager"); tolua_usertype(tolua_S,"cGroupManager");
tolua_usertype(tolua_S,"Lua__cPickup"); tolua_usertype(tolua_S,"Lua__cPickup");
tolua_usertype(tolua_S,"Lua__cPlugin"); tolua_usertype(tolua_S,"Lua__cPlugin");
tolua_usertype(tolua_S,"Lua__cEntity");
tolua_usertype(tolua_S,"cPluginManager"); tolua_usertype(tolua_S,"cPluginManager");
tolua_usertype(tolua_S,"Lua__cEntity");
tolua_usertype(tolua_S,"cLadder"); tolua_usertype(tolua_S,"cLadder");
tolua_usertype(tolua_S,"Lua__cPlayer"); tolua_usertype(tolua_S,"Lua__cPlayer");
tolua_usertype(tolua_S,"cWebPlugin"); tolua_usertype(tolua_S,"cWebPlugin");
@ -7189,7 +7187,7 @@ static int tolua_AllToLua_cPluginManager_GetPlugin00(lua_State* tolua_S)
tolua_Error tolua_err; tolua_Error tolua_err;
if ( if (
!tolua_isusertype(tolua_S,1,"const cPluginManager",0,&tolua_err) || !tolua_isusertype(tolua_S,1,"const cPluginManager",0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_iscppstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err) !tolua_isnoobj(tolua_S,3,&tolua_err)
) )
goto tolua_lerror; goto tolua_lerror;
@ -7197,16 +7195,17 @@ static int tolua_AllToLua_cPluginManager_GetPlugin00(lua_State* tolua_S)
#endif #endif
{ {
const cPluginManager* self = (const cPluginManager*) tolua_tousertype(tolua_S,1,0); const cPluginManager* self = (const cPluginManager*) tolua_tousertype(tolua_S,1,0);
const char* a_Plugin = ((const char*) tolua_tostring(tolua_S,2,0)); const AString a_Plugin = ((const AString) tolua_tocppstring(tolua_S,2,0));
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetPlugin'", NULL); if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetPlugin'", NULL);
#endif #endif
{ {
cPlugin* tolua_ret = (cPlugin*) self->GetPlugin(a_Plugin); cPlugin* tolua_ret = (cPlugin*) self->GetPlugin(a_Plugin);
tolua_pushusertype(tolua_S,(void*)tolua_ret,"cPlugin"); tolua_pushusertype(tolua_S,(void*)tolua_ret,"cPlugin");
tolua_pushcppstring(tolua_S,(const char*)a_Plugin);
} }
} }
return 1; return 2;
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_lerror: tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'GetPlugin'.",&tolua_err); tolua_error(tolua_S,"#ferror in function 'GetPlugin'.",&tolua_err);
@ -8376,8 +8375,8 @@ static int tolua_AllToLua_cPlugin_GetName00(lua_State* tolua_S)
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetName'", NULL); if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetName'", NULL);
#endif #endif
{ {
const char* tolua_ret = (const char*) self->GetName(); const AString tolua_ret = (const AString) self->GetName();
tolua_pushstring(tolua_S,(const char*)tolua_ret); tolua_pushcppstring(tolua_S,(const char*)tolua_ret);
} }
} }
return 1; return 1;
@ -8397,7 +8396,7 @@ static int tolua_AllToLua_cPlugin_SetName00(lua_State* tolua_S)
tolua_Error tolua_err; tolua_Error tolua_err;
if ( if (
!tolua_isusertype(tolua_S,1,"cPlugin",0,&tolua_err) || !tolua_isusertype(tolua_S,1,"cPlugin",0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_iscppstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err) !tolua_isnoobj(tolua_S,3,&tolua_err)
) )
goto tolua_lerror; goto tolua_lerror;
@ -8405,15 +8404,16 @@ static int tolua_AllToLua_cPlugin_SetName00(lua_State* tolua_S)
#endif #endif
{ {
cPlugin* self = (cPlugin*) tolua_tousertype(tolua_S,1,0); cPlugin* self = (cPlugin*) tolua_tousertype(tolua_S,1,0);
const char* a_Name = ((const char*) tolua_tostring(tolua_S,2,0)); const AString a_Name = ((const AString) tolua_tocppstring(tolua_S,2,0));
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetName'", NULL); if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetName'", NULL);
#endif #endif
{ {
self->SetName(a_Name); self->SetName(a_Name);
tolua_pushcppstring(tolua_S,(const char*)a_Name);
} }
} }
return 0; return 1;
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_lerror: tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'SetName'.",&tolua_err); tolua_error(tolua_S,"#ferror in function 'SetName'.",&tolua_err);
@ -8906,6 +8906,14 @@ public:
return ( bool ) cPlugin:: OnWeatherChanged(a_World); return ( bool ) cPlugin:: OnWeatherChanged(a_World);
}; };
}; };
void SetName( const AString& a_Name) {
if (push_method("SetName", tolua_AllToLua_cPlugin_SetName00)) {
tolua_pushcppstring(lua_state, (const char*)a_Name);
ToluaBase::dbcall(lua_state, 2, 0);
} else {
return ( void ) cPlugin:: SetName(a_Name);
};
};
void cPlugin__OnDisable( void ) { void cPlugin__OnDisable( void ) {
return ( void )cPlugin::OnDisable(); return ( void )cPlugin::OnDisable();
@ -8972,6 +8980,9 @@ public:
}; };
bool cPlugin__OnWeatherChanged( cWorld* a_World) { bool cPlugin__OnWeatherChanged( cWorld* a_World) {
return ( bool )cPlugin::OnWeatherChanged(a_World); return ( bool )cPlugin::OnWeatherChanged(a_World);
};
void cPlugin__SetName( const AString& a_Name) {
return ( void )cPlugin::SetName(a_Name);
}; };
Lua__cPlugin( void ): cPlugin(){}; Lua__cPlugin( void ): cPlugin(){};
}; };
@ -9856,6 +9867,40 @@ static int tolua_AllToLua_Lua__cPlugin_cPlugin__OnWeatherChanged00(lua_State* to
} }
#endif //#ifndef TOLUA_DISABLE #endif //#ifndef TOLUA_DISABLE
/* method: cPlugin__SetName of class Lua__cPlugin */
#ifndef TOLUA_DISABLE_tolua_AllToLua_Lua__cPlugin_cPlugin__SetName00
static int tolua_AllToLua_Lua__cPlugin_cPlugin__SetName00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"Lua__cPlugin",0,&tolua_err) ||
!tolua_iscppstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
Lua__cPlugin* self = (Lua__cPlugin*) tolua_tousertype(tolua_S,1,0);
const AString a_Name = ((const AString) tolua_tocppstring(tolua_S,2,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'cPlugin__SetName'", NULL);
#endif
{
self->cPlugin__SetName(a_Name);
tolua_pushcppstring(tolua_S,(const char*)a_Name);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'cPlugin__SetName'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: new of class Lua__cPlugin */ /* method: new of class Lua__cPlugin */
#ifndef TOLUA_DISABLE_tolua_AllToLua_Lua__cPlugin_new00 #ifndef TOLUA_DISABLE_tolua_AllToLua_Lua__cPlugin_new00
static int tolua_AllToLua_Lua__cPlugin_new00(lua_State* tolua_S) static int tolua_AllToLua_Lua__cPlugin_new00(lua_State* tolua_S)
@ -10070,8 +10115,8 @@ static int tolua_AllToLua_cPlugin_NewLua_CreateWebPlugin00(lua_State* tolua_S)
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'CreateWebPlugin'", NULL); if (!self) tolua_error(tolua_S,"invalid 'self' in function 'CreateWebPlugin'", NULL);
#endif #endif
{ {
cWebPlugin_Lua* tolua_ret = (cWebPlugin_Lua*) self->CreateWebPlugin(a_LuaState); OBSOLETE cPlugin_NewLua* tolua_ret = (OBSOLETE cPlugin_NewLua*) self->CreateWebPlugin(a_LuaState);
tolua_pushusertype(tolua_S,(void*)tolua_ret,"cWebPlugin_Lua"); tolua_pushusertype(tolua_S,(void*)tolua_ret,"cPlugin_NewLua");
} }
} }
return 1; return 1;
@ -10081,6 +10126,23 @@ static int tolua_AllToLua_cPlugin_NewLua_CreateWebPlugin00(lua_State* tolua_S)
return 0; return 0;
#endif #endif
} }
#endif //#ifndef TOLUA_DISABLE
/* get function: __cWebPlugin__ of class cPlugin_NewLua */
#ifndef TOLUA_DISABLE_tolua_get_cPlugin_NewLua___cWebPlugin__
static int tolua_get_cPlugin_NewLua___cWebPlugin__(lua_State* tolua_S)
{
cPlugin_NewLua* self = (cPlugin_NewLua*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in accessing variable '__cWebPlugin__'",NULL);
#endif
#ifdef __cplusplus
tolua_pushusertype(tolua_S,(void*)static_cast<cWebPlugin*>(self), "cWebPlugin");
#else
tolua_pushusertype(tolua_S,(void*)((cWebPlugin*)self), "cWebPlugin");
#endif
return 1;
}
#endif //#ifndef TOLUA_DISABLE #endif //#ifndef TOLUA_DISABLE
class Lua__cPlugin_NewLua : public cPlugin_NewLua, public ToluaBase { class Lua__cPlugin_NewLua : public cPlugin_NewLua, public ToluaBase {
@ -10366,6 +10428,14 @@ public:
return ( bool ) cPlugin_NewLua:: OnWeatherChanged(a_World); return ( bool ) cPlugin_NewLua:: OnWeatherChanged(a_World);
}; };
}; };
void SetName( const AString& a_Name) {
if (push_method("SetName", tolua_AllToLua_cPlugin_SetName00)) {
tolua_pushcppstring(lua_state, (const char*)a_Name);
ToluaBase::dbcall(lua_state, 2, 0);
} else {
return ( void ) cPlugin_NewLua:: SetName(a_Name);
};
};
void cPlugin_NewLua__OnDisable( void ) { void cPlugin_NewLua__OnDisable( void ) {
return ( void )cPlugin_NewLua::OnDisable(); return ( void )cPlugin_NewLua::OnDisable();
@ -10436,6 +10506,9 @@ public:
bool cPlugin_NewLua__OnWeatherChanged( cWorld* a_World) { bool cPlugin_NewLua__OnWeatherChanged( cWorld* a_World) {
return ( bool )cPlugin_NewLua::OnWeatherChanged(a_World); return ( bool )cPlugin_NewLua::OnWeatherChanged(a_World);
}; };
void cPlugin_NewLua__SetName( const AString& a_Name) {
return ( void )cPlugin_NewLua::SetName(a_Name);
};
}; };
/* method: tolua__set_instance of class Lua__cPlugin_NewLua */ /* method: tolua__set_instance of class Lua__cPlugin_NewLua */
@ -13460,9 +13533,9 @@ static int tolua_AllToLua_cWebPlugin_GetName00(lua_State* tolua_S)
} }
#endif //#ifndef TOLUA_DISABLE #endif //#ifndef TOLUA_DISABLE
/* method: HandleRequest of class cWebPlugin */ /* method: HandleWebRequest of class cWebPlugin */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWebPlugin_HandleRequest00 #ifndef TOLUA_DISABLE_tolua_AllToLua_cWebPlugin_HandleWebRequest00
static int tolua_AllToLua_cWebPlugin_HandleRequest00(lua_State* tolua_S) static int tolua_AllToLua_cWebPlugin_HandleWebRequest00(lua_State* tolua_S)
{ {
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_Error tolua_err; tolua_Error tolua_err;
@ -13478,48 +13551,48 @@ static int tolua_AllToLua_cWebPlugin_HandleRequest00(lua_State* tolua_S)
cWebPlugin* self = (cWebPlugin*) tolua_tousertype(tolua_S,1,0); cWebPlugin* self = (cWebPlugin*) tolua_tousertype(tolua_S,1,0);
HTTPRequest* a_Request = ((HTTPRequest*) tolua_tousertype(tolua_S,2,0)); HTTPRequest* a_Request = ((HTTPRequest*) tolua_tousertype(tolua_S,2,0));
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'HandleRequest'", NULL); if (!self) tolua_error(tolua_S,"invalid 'self' in function 'HandleWebRequest'", NULL);
#endif #endif
{ {
std::string tolua_ret = (std::string) self->HandleRequest(a_Request); std::string tolua_ret = (std::string) self->HandleWebRequest(a_Request);
tolua_pushcppstring(tolua_S,(const char*)tolua_ret); tolua_pushcppstring(tolua_S,(const char*)tolua_ret);
} }
} }
return 1; return 1;
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_lerror: tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'HandleRequest'.",&tolua_err); tolua_error(tolua_S,"#ferror in function 'HandleWebRequest'.",&tolua_err);
return 0; return 0;
#endif #endif
} }
#endif //#ifndef TOLUA_DISABLE #endif //#ifndef TOLUA_DISABLE
/* method: Initialize of class cWebPlugin */ /* method: SafeString of class cWebPlugin */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWebPlugin_Initialize00 #ifndef TOLUA_DISABLE_tolua_AllToLua_cWebPlugin_SafeString00
static int tolua_AllToLua_cWebPlugin_Initialize00(lua_State* tolua_S) static int tolua_AllToLua_cWebPlugin_SafeString00(lua_State* tolua_S)
{ {
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_Error tolua_err; tolua_Error tolua_err;
if ( if (
!tolua_isusertype(tolua_S,1,"cWebPlugin",0,&tolua_err) || !tolua_isusertable(tolua_S,1,"cWebPlugin",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err) !tolua_iscppstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
) )
goto tolua_lerror; goto tolua_lerror;
else else
#endif #endif
{ {
cWebPlugin* self = (cWebPlugin*) tolua_tousertype(tolua_S,1,0); const AString a_String = ((const AString) tolua_tocppstring(tolua_S,2,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'Initialize'", NULL);
#endif
{ {
self->Initialize(); AString tolua_ret = (AString) cWebPlugin::SafeString(a_String);
tolua_pushcppstring(tolua_S,(const char*)tolua_ret);
tolua_pushcppstring(tolua_S,(const char*)a_String);
} }
} }
return 0; return 2;
#ifndef TOLUA_RELEASE #ifndef TOLUA_RELEASE
tolua_lerror: tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'Initialize'.",&tolua_err); tolua_error(tolua_S,"#ferror in function 'SafeString'.",&tolua_err);
return 0; return 0;
#endif #endif
} }
@ -13527,8 +13600,8 @@ static int tolua_AllToLua_cWebPlugin_Initialize00(lua_State* tolua_S)
class Lua__cWebPlugin : public cWebPlugin, public ToluaBase { class Lua__cWebPlugin : public cWebPlugin, public ToluaBase {
public: public:
std::string HandleRequest( HTTPRequest* a_Request) { std::string HandleWebRequest( HTTPRequest* a_Request) {
if (push_method("HandleRequest", tolua_AllToLua_cWebPlugin_HandleRequest00)) { if (push_method("HandleWebRequest", tolua_AllToLua_cWebPlugin_HandleWebRequest00)) {
tolua_pushusertype(lua_state, (void*)a_Request, "HTTPRequest"); tolua_pushusertype(lua_state, (void*)a_Request, "HTTPRequest");
ToluaBase::dbcall(lua_state, 2, 1); ToluaBase::dbcall(lua_state, 2, 1);
std::string tolua_ret = ( std::string )tolua_tocppstring(lua_state, -1, 0); std::string tolua_ret = ( std::string )tolua_tocppstring(lua_state, -1, 0);
@ -13536,29 +13609,16 @@ public:
return tolua_ret; return tolua_ret;
} else { } else {
if (lua_state) if (lua_state)
LOG("pure-virtual method cWebPlugin::HandleRequest not implemented."); LOG("pure-virtual method cWebPlugin::HandleWebRequest not implemented.");
else { else {
LOG("pure-virtual method cWebPlugin::HandleRequest called with no lua_state. Aborting"); LOG("pure-virtual method cWebPlugin::HandleWebRequest called with no lua_state. Aborting");
::abort(); ::abort();
}; };
return ""; return "";
}; };
}; };
void Initialize( void ) {
if (push_method("Initialize", tolua_AllToLua_cWebPlugin_Initialize00)) {
ToluaBase::dbcall(lua_state, 1, 0);
} else {
if (lua_state)
LOG("pure-virtual method cWebPlugin::Initialize not implemented.");
else {
LOG("pure-virtual method cWebPlugin::Initialize called with no lua_state. Aborting");
::abort();
};
return ( void )0;
};
};
Lua__cWebPlugin( lua_State* L): cWebPlugin(L){}; Lua__cWebPlugin( void ): cWebPlugin(){};
}; };
/* method: tolua__set_instance of class Lua__cWebPlugin */ /* method: tolua__set_instance of class Lua__cWebPlugin */
@ -13608,9 +13668,8 @@ static int tolua_AllToLua_Lua__cWebPlugin_new00(lua_State* tolua_S)
else else
#endif #endif
{ {
lua_State* L = tolua_S;
{ {
Lua__cWebPlugin* tolua_ret = (Lua__cWebPlugin*) Mtolua_new((Lua__cWebPlugin)(L)); Lua__cWebPlugin* tolua_ret = (Lua__cWebPlugin*) Mtolua_new((Lua__cWebPlugin)());
tolua_pushusertype(tolua_S,(void*)tolua_ret,"Lua__cWebPlugin"); tolua_pushusertype(tolua_S,(void*)tolua_ret,"Lua__cWebPlugin");
} }
} }
@ -13637,9 +13696,8 @@ static int tolua_AllToLua_Lua__cWebPlugin_new00_local(lua_State* tolua_S)
else else
#endif #endif
{ {
lua_State* L = tolua_S;
{ {
Lua__cWebPlugin* tolua_ret = (Lua__cWebPlugin*) Mtolua_new((Lua__cWebPlugin)(L)); Lua__cWebPlugin* tolua_ret = (Lua__cWebPlugin*) Mtolua_new((Lua__cWebPlugin)());
tolua_pushusertype(tolua_S,(void*)tolua_ret,"Lua__cWebPlugin"); tolua_pushusertype(tolua_S,(void*)tolua_ret,"Lua__cWebPlugin");
tolua_register_gc(tolua_S,lua_gettop(tolua_S)); tolua_register_gc(tolua_S,lua_gettop(tolua_S));
} }
@ -21411,6 +21469,13 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_cclass(tolua_S,"cEntity","cEntity","",NULL); tolua_cclass(tolua_S,"cEntity","cEntity","",NULL);
#endif #endif
tolua_beginmodule(tolua_S,"cEntity"); tolua_beginmodule(tolua_S,"cEntity");
tolua_constant(tolua_S,"ENTITY_STATUS_HURT",cEntity::ENTITY_STATUS_HURT);
tolua_constant(tolua_S,"ENTITY_STATUS_DEAD",cEntity::ENTITY_STATUS_DEAD);
tolua_constant(tolua_S,"ENTITY_STATUS_WOLF_TAMING",cEntity::ENTITY_STATUS_WOLF_TAMING);
tolua_constant(tolua_S,"ENTITY_STATUS_WOLF_TAMED",cEntity::ENTITY_STATUS_WOLF_TAMED);
tolua_constant(tolua_S,"ENTITY_STATUS_WOLF_SHAKING",cEntity::ENTITY_STATUS_WOLF_SHAKING);
tolua_constant(tolua_S,"ENTITY_STATUS_EATING_ACCEPTED",cEntity::ENTITY_STATUS_EATING_ACCEPTED);
tolua_constant(tolua_S,"ENTITY_STATUS_SHEEP_EATING",cEntity::ENTITY_STATUS_SHEEP_EATING);
tolua_function(tolua_S,"delete",tolua_AllToLua_cEntity_delete00); tolua_function(tolua_S,"delete",tolua_AllToLua_cEntity_delete00);
tolua_function(tolua_S,"Initialize",tolua_AllToLua_cEntity_Initialize00); tolua_function(tolua_S,"Initialize",tolua_AllToLua_cEntity_Initialize00);
tolua_constant(tolua_S,"eEntityType_Entity",cEntity::eEntityType_Entity); tolua_constant(tolua_S,"eEntityType_Entity",cEntity::eEntityType_Entity);
@ -21651,6 +21716,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"cPlugin__OnUpdatedSign",tolua_AllToLua_Lua__cPlugin_cPlugin__OnUpdatedSign00); tolua_function(tolua_S,"cPlugin__OnUpdatedSign",tolua_AllToLua_Lua__cPlugin_cPlugin__OnUpdatedSign00);
tolua_function(tolua_S,"cPlugin__OnUpdatingSign",tolua_AllToLua_Lua__cPlugin_cPlugin__OnUpdatingSign00); tolua_function(tolua_S,"cPlugin__OnUpdatingSign",tolua_AllToLua_Lua__cPlugin_cPlugin__OnUpdatingSign00);
tolua_function(tolua_S,"cPlugin__OnWeatherChanged",tolua_AllToLua_Lua__cPlugin_cPlugin__OnWeatherChanged00); tolua_function(tolua_S,"cPlugin__OnWeatherChanged",tolua_AllToLua_Lua__cPlugin_cPlugin__OnWeatherChanged00);
tolua_function(tolua_S,"cPlugin__SetName",tolua_AllToLua_Lua__cPlugin_cPlugin__SetName00);
tolua_function(tolua_S,"new",tolua_AllToLua_Lua__cPlugin_new00); tolua_function(tolua_S,"new",tolua_AllToLua_Lua__cPlugin_new00);
tolua_function(tolua_S,"new_local",tolua_AllToLua_Lua__cPlugin_new00_local); tolua_function(tolua_S,"new_local",tolua_AllToLua_Lua__cPlugin_new00_local);
tolua_function(tolua_S,".call",tolua_AllToLua_Lua__cPlugin_new00_local); tolua_function(tolua_S,".call",tolua_AllToLua_Lua__cPlugin_new00_local);
@ -21662,6 +21728,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"Initialize",tolua_AllToLua_cPlugin_NewLua_Initialize00); tolua_function(tolua_S,"Initialize",tolua_AllToLua_cPlugin_NewLua_Initialize00);
tolua_function(tolua_S,"Tick",tolua_AllToLua_cPlugin_NewLua_Tick00); tolua_function(tolua_S,"Tick",tolua_AllToLua_cPlugin_NewLua_Tick00);
tolua_function(tolua_S,"CreateWebPlugin",tolua_AllToLua_cPlugin_NewLua_CreateWebPlugin00); tolua_function(tolua_S,"CreateWebPlugin",tolua_AllToLua_cPlugin_NewLua_CreateWebPlugin00);
tolua_variable(tolua_S,"__cWebPlugin__",tolua_get_cPlugin_NewLua___cWebPlugin__,NULL);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_cclass(tolua_S,"Lua__cPlugin_NewLua","Lua__cPlugin_NewLua","cPlugin_NewLua",NULL); tolua_cclass(tolua_S,"Lua__cPlugin_NewLua","Lua__cPlugin_NewLua","cPlugin_NewLua",NULL);
tolua_beginmodule(tolua_S,"Lua__cPlugin_NewLua"); tolua_beginmodule(tolua_S,"Lua__cPlugin_NewLua");
@ -21788,8 +21855,8 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"delete",tolua_AllToLua_cWebPlugin_delete00); tolua_function(tolua_S,"delete",tolua_AllToLua_cWebPlugin_delete00);
tolua_function(tolua_S,"SetName",tolua_AllToLua_cWebPlugin_SetName00); tolua_function(tolua_S,"SetName",tolua_AllToLua_cWebPlugin_SetName00);
tolua_function(tolua_S,"GetName",tolua_AllToLua_cWebPlugin_GetName00); tolua_function(tolua_S,"GetName",tolua_AllToLua_cWebPlugin_GetName00);
tolua_function(tolua_S,"HandleRequest",tolua_AllToLua_cWebPlugin_HandleRequest00); tolua_function(tolua_S,"HandleWebRequest",tolua_AllToLua_cWebPlugin_HandleWebRequest00);
tolua_function(tolua_S,"Initialize",tolua_AllToLua_cWebPlugin_Initialize00); tolua_function(tolua_S,"SafeString",tolua_AllToLua_cWebPlugin_SafeString00);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
#ifdef __cplusplus #ifdef __cplusplus
tolua_cclass(tolua_S,"Lua__cWebPlugin","Lua__cWebPlugin","cWebPlugin",tolua_collect_Lua__cWebPlugin); tolua_cclass(tolua_S,"Lua__cWebPlugin","Lua__cWebPlugin","cWebPlugin",tolua_collect_Lua__cWebPlugin);
@ -21803,9 +21870,6 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,".call",tolua_AllToLua_Lua__cWebPlugin_new00_local); tolua_function(tolua_S,".call",tolua_AllToLua_Lua__cWebPlugin_new00_local);
tolua_function(tolua_S,"delete",tolua_AllToLua_Lua__cWebPlugin_delete00); tolua_function(tolua_S,"delete",tolua_AllToLua_Lua__cWebPlugin_delete00);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_cclass(tolua_S,"cWebPlugin_Lua","cWebPlugin_Lua","cWebPlugin",NULL);
tolua_beginmodule(tolua_S,"cWebPlugin_Lua");
tolua_endmodule(tolua_S);
#ifdef __cplusplus #ifdef __cplusplus
tolua_cclass(tolua_S,"cPickup","cPickup","cEntity",tolua_collect_cPickup); tolua_cclass(tolua_S,"cPickup","cPickup","cEntity",tolua_collect_cPickup);
#else #else

View File

@ -1,6 +1,6 @@
/* /*
** Lua binding: AllToLua ** Lua binding: AllToLua
** Generated automatically by tolua++-1.0.92 on 08/19/12 21:46:45. ** Generated automatically by tolua++-1.0.92 on 08/22/12 16:11:06.
*/ */
/* Exported function */ /* Exported function */

View File

@ -7,8 +7,8 @@
#include "cRoot.h" #include "cRoot.h"
#include "cWorld.h" #include "cWorld.h"
#include "cPlugin.h" #include "cPlugin.h"
#include "cPlugin_NewLua.h"
#include "cPluginManager.h" #include "cPluginManager.h"
#include "cWebPlugin_Lua.h"
#include "cLuaCommandBinder.h" #include "cLuaCommandBinder.h"
#include "cPlayer.h" #include "cPlayer.h"
#include "cWebAdmin.h" #include "cWebAdmin.h"
@ -549,9 +549,9 @@ static int tolua_cPlugin_BindCommand(lua_State* tolua_S)
static int tolua_cWebPlugin_Lua_AddTab(lua_State* tolua_S) static int tolua_cPlugin_NewLua_AddWebTab(lua_State* tolua_S)
{ {
cWebPlugin_Lua* self = (cWebPlugin_Lua*) tolua_tousertype(tolua_S,1,0); cPlugin_NewLua* self = (cPlugin_NewLua*) tolua_tousertype(tolua_S,1,0);
tolua_Error tolua_err; tolua_Error tolua_err;
tolua_err.array = 0; tolua_err.array = 0;
@ -573,20 +573,20 @@ static int tolua_cWebPlugin_Lua_AddTab(lua_State* tolua_S)
{ {
tolua_err.type = "function"; tolua_err.type = "function";
} }
tolua_error(tolua_S,"#ferror in function 'AddTab'.",&tolua_err); tolua_error(tolua_S,"#ferror in function 'AddWebTab'.",&tolua_err);
return 0; return 0;
} }
if( Reference != LUA_REFNIL ) if( Reference != LUA_REFNIL )
{ {
if( !self->AddTab( Title.c_str(), tolua_S, Reference ) ) if( !self->AddWebTab( Title.c_str(), tolua_S, Reference ) )
{ {
luaL_unref( tolua_S, LUA_REGISTRYINDEX, Reference ); luaL_unref( tolua_S, LUA_REGISTRYINDEX, Reference );
} }
} }
else else
{ {
LOGERROR("ERROR: cWebPlugin_Lua:AddTab invalid function reference in 2nd argument (Title: \"%s\")", Title.c_str() ); LOGERROR("ERROR: cPlugin_NewLua:AddWebTab invalid function reference in 2nd argument (Title: \"%s\")", Title.c_str() );
} }
return 0; return 0;
@ -596,6 +596,16 @@ static int tolua_cWebPlugin_Lua_AddTab(lua_State* tolua_S)
static int tolua_cPlugin_NewLua_AddTab(lua_State* tolua_S)
{
LOGWARN("WARNING: Using deprecated function AddTab()! Use AddWebTab() instead.");
return tolua_cPlugin_NewLua_AddWebTab( tolua_S );
}
static int tolua_md5(lua_State* tolua_S) static int tolua_md5(lua_State* tolua_S)
{ {
std::string SourceString = tolua_tostring(tolua_S, 1, 0); std::string SourceString = tolua_tostring(tolua_S, 1, 0);
@ -709,8 +719,9 @@ void ManualBindings::Bind( lua_State* tolua_S )
tolua_function(tolua_S, "GetResolvedPermissions", tolua_cPlayer_GetResolvedPermissions); tolua_function(tolua_S, "GetResolvedPermissions", tolua_cPlayer_GetResolvedPermissions);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_beginmodule(tolua_S, "cWebPlugin_Lua"); tolua_beginmodule(tolua_S, "cPlugin_NewLua");
tolua_function(tolua_S, "AddTab", tolua_cWebPlugin_Lua_AddTab); tolua_function(tolua_S, "AddWebTab", tolua_cPlugin_NewLua_AddWebTab);
tolua_function(tolua_S, "AddTab", tolua_cPlugin_NewLua_AddTab);
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_cclass(tolua_S,"HTTPRequest","HTTPRequest","",NULL); tolua_cclass(tolua_S,"HTTPRequest","HTTPRequest","",NULL);

View File

@ -70,8 +70,8 @@ public:
virtual bool OnWeatherChanged (cWorld * a_World); virtual bool OnWeatherChanged (cWorld * a_World);
// Accessors // Accessors
const char* GetName() const { return m_Name.c_str(); } const AString & GetName() const { return m_Name; }
void SetName( const char* a_Name ) { m_Name = a_Name; } virtual void SetName( const AString & a_Name ) { m_Name = a_Name; }
int GetVersion() const { return m_Version; } int GetVersion() const { return m_Version; }
void SetVersion( int a_Version ) { m_Version = a_Version; } void SetVersion( int a_Version ) { m_Version = a_Version; }

View File

@ -623,11 +623,11 @@ bool cPluginManager::CallHookUpdatedSign(cWorld * a_World, int a_BlockX, int a_B
cPlugin* cPluginManager::GetPlugin( const char* a_Plugin ) const cPlugin* cPluginManager::GetPlugin( const AString & a_Plugin ) const
{ {
for( PluginList::const_iterator itr = m_Plugins.begin(); itr != m_Plugins.end(); ++itr ) for( PluginList::const_iterator itr = m_Plugins.begin(); itr != m_Plugins.end(); ++itr )
{ {
if (strcmp((*itr)->GetName(), a_Plugin) == 0 ) if ((*itr)->GetName().compare(a_Plugin) == 0)
{ {
return *itr; return *itr;
} }
@ -657,8 +657,6 @@ void cPluginManager::UnloadPluginsNow()
cPlugin_Lua* LuaPlugin = *m_LuaPlugins.begin(); cPlugin_Lua* LuaPlugin = *m_LuaPlugins.begin();
if( LuaPlugin ) if( LuaPlugin )
{ {
cWebAdmin* WebAdmin = cRoot::Get()->GetWebAdmin();
if( WebAdmin ) WebAdmin->RemovePlugin( LuaPlugin->GetLuaState() );
delete LuaPlugin; delete LuaPlugin;
} }
m_LuaPlugins.remove( LuaPlugin ); m_LuaPlugins.remove( LuaPlugin );

View File

@ -83,7 +83,7 @@ public: //tolua_export
static cPluginManager * GetPluginManager(); //tolua_export static cPluginManager * GetPluginManager(); //tolua_export
typedef std::list< cPlugin * > PluginList; typedef std::list< cPlugin * > PluginList;
cPlugin* GetPlugin( const char* a_Plugin ) const; //tolua_export cPlugin * GetPlugin( const AString & a_Plugin ) const; //tolua_export
const PluginList & GetAllPlugins() const; // >> EXPORTED IN MANUALBINDINGS << const PluginList & GetAllPlugins() const; // >> EXPORTED IN MANUALBINDINGS <<
void ReloadPlugins(); //tolua_export void ReloadPlugins(); //tolua_export

View File

@ -4,7 +4,6 @@
#define LUA_USE_POSIX #define LUA_USE_POSIX
#include "cPlugin_NewLua.h" #include "cPlugin_NewLua.h"
#include "cMCLogger.h" #include "cMCLogger.h"
#include "cWebPlugin_Lua.h"
#include "LuaItems.h" #include "LuaItems.h"
extern "C" extern "C"
@ -34,6 +33,7 @@ extern bool report_errors(lua_State* lua, int status);
cPlugin_NewLua::cPlugin_NewLua( const char* a_PluginName ) cPlugin_NewLua::cPlugin_NewLua( const char* a_PluginName )
: m_LuaState( 0 ) : m_LuaState( 0 )
, cWebPlugin()
{ {
m_Directory = a_PluginName; m_Directory = a_PluginName;
} }
@ -45,11 +45,6 @@ cPlugin_NewLua::cPlugin_NewLua( const char* a_PluginName )
cPlugin_NewLua::~cPlugin_NewLua() cPlugin_NewLua::~cPlugin_NewLua()
{ {
cCSLock Lock( m_CriticalSection ); cCSLock Lock( m_CriticalSection );
for( WebPluginList::iterator itr = m_WebPlugins.begin(); itr != m_WebPlugins.end(); ++itr )
{
delete *itr;
}
m_WebPlugins.clear();
if( m_LuaState ) if( m_LuaState )
{ {
@ -638,22 +633,97 @@ bool cPlugin_NewLua::OnUpdatedSign(
cWebPlugin_Lua* cPlugin_NewLua::CreateWebPlugin(lua_State* a_LuaState) cPlugin_NewLua* cPlugin_NewLua::CreateWebPlugin(lua_State* a_LuaState)
{
LOGWARN("WARNING: Using deprecated function CreateWebPlugin()! A Lua plugin is a WebPlugin by itself now.");
return this;
}
AString cPlugin_NewLua::HandleWebRequest( HTTPRequest * a_Request )
{
cCSLock Lock( m_CriticalSection );
std::string RetVal = "";
std::pair< std::string, std::string > TabName = GetTabNameForRequest(a_Request);
std::string SafeTabName = TabName.second;
if( SafeTabName.empty() )
return "";
sWebPluginTab* Tab = 0;
for( TabList::iterator itr = GetTabs().begin(); itr != GetTabs().end(); ++itr )
{
if( (*itr)->SafeTitle.compare( SafeTabName ) == 0 ) // This is the one! Rawr
{
Tab = *itr;
break;
}
}
if( Tab )
{
//LOGINFO("1. Stack size: %i", lua_gettop(m_LuaState) );
lua_rawgeti( m_LuaState, LUA_REGISTRYINDEX, Tab->UserData); // same as lua_getref()
//LOGINFO("2. Stack size: %i", lua_gettop(m_LuaState) );
// Push HTTPRequest
tolua_pushusertype( m_LuaState, a_Request, "HTTPRequest" );
//LOGINFO("Calling bound function! :D");
int s = lua_pcall( m_LuaState, 1, 1, 0);
if ( s != 0 )
{
std::string err = lua_tostring(m_LuaState, -1);
LOGERROR("-- %s", err.c_str() );
lua_pop(m_LuaState, 1);
LOGINFO("error. Stack size: %i", lua_gettop(m_LuaState) );
return err; // Show the error message in the web page, looks cool
}
if( !lua_isstring( m_LuaState, -1 ) )
{
LOGWARN("WARNING: WebPlugin tab '%s' did not return a string!", Tab->Title.c_str() );
lua_pop(m_LuaState, 1); // Pop return value
return std::string("WARNING: WebPlugin tab '") + Tab->Title + std::string("' did not return a string!");
}
RetVal += tolua_tostring(m_LuaState, -1, 0);
lua_pop(m_LuaState, 1); // Pop return value
//LOGINFO("ok. Stack size: %i", lua_gettop(m_LuaState) );
}
return RetVal;
}
bool cPlugin_NewLua::AddWebTab( const AString & a_Title, lua_State * a_LuaState, int a_FunctionReference )
{ {
cCSLock Lock( m_CriticalSection ); cCSLock Lock( m_CriticalSection );
if( a_LuaState != m_LuaState ) if( a_LuaState != m_LuaState )
{ {
LOGERROR("Not allowed to create a WebPlugin from another plugin but your own!"); LOGERROR("Only allowed to add a tab to a WebPlugin of your own Plugin!");
return 0; return false;
} }
cWebPlugin_Lua* WebPlugin = new cWebPlugin_Lua( this ); sWebPluginTab* Tab = new sWebPluginTab();
Tab->Title = a_Title;
Tab->SafeTitle = SafeString( a_Title );
m_WebPlugins.push_back( WebPlugin ); Tab->UserData = a_FunctionReference;
return WebPlugin; GetTabs().push_back( Tab );
return true;
} }
// Helper functions // Helper functions
bool cPlugin_NewLua::PushFunction( const char* a_FunctionName, bool a_bLogError /* = true */ ) bool cPlugin_NewLua::PushFunction( const char* a_FunctionName, bool a_bLogError /* = true */ )
{ {

View File

@ -2,6 +2,7 @@
#pragma once #pragma once
#include "cPlugin.h" #include "cPlugin.h"
#include "cWebPlugin.h"
@ -14,7 +15,7 @@ class cWebPlugin_Lua;
class cPlugin_NewLua : public cPlugin //tolua_export class cPlugin_NewLua : public cPlugin, public cWebPlugin //tolua_export
{ //tolua_export { //tolua_export
public: //tolua_export public: //tolua_export
cPlugin_NewLua( const char* a_PluginName ); cPlugin_NewLua( const char* a_PluginName );
@ -46,18 +47,22 @@ public: //tolua_export
virtual bool OnUpdatingSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4) override; virtual bool OnUpdatingSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4) override;
virtual bool OnWeatherChanged (cWorld * a_World) override; virtual bool OnWeatherChanged (cWorld * a_World) override;
virtual void SetName( const AString & a_Name ) override { cPlugin::SetName(a_Name); cWebPlugin::SetName(a_Name); }
// cWebPlugin and WebAdmin stuff
virtual AString HandleWebRequest( HTTPRequest * a_Request ) override;
bool AddWebTab( const AString & a_Title, lua_State * a_LuaState, int a_FunctionReference ); // >> EXPORTED IN MANUALBINDINGS <<
OBSOLETE bool AddTab( const AString & a_Title, lua_State * a_LuaState, int a_FunctionReference ); // >> EXPORTED IN MANUALBINDINGS <<
lua_State* GetLuaState() { return m_LuaState; } lua_State* GetLuaState() { return m_LuaState; }
cWebPlugin_Lua* CreateWebPlugin(lua_State* a_LuaState); //tolua_export OBSOLETE cPlugin_NewLua * CreateWebPlugin(lua_State* a_LuaState); //tolua_export
cCriticalSection & GetCriticalSection() { return m_CriticalSection; } cCriticalSection & GetCriticalSection() { return m_CriticalSection; }
private: private:
bool PushFunction( const char* a_FunctionName, bool a_bLogError = true ); bool PushFunction( const char* a_FunctionName, bool a_bLogError = true );
bool CallFunction( int a_NumArgs, int a_NumResults, const char* a_FunctionName ); // a_FunctionName is only used for error messages, nothing else bool CallFunction( int a_NumArgs, int a_NumResults, const char* a_FunctionName ); // a_FunctionName is only used for error messages, nothing else
typedef std::list< cWebPlugin_Lua* > WebPluginList;
WebPluginList m_WebPlugins;
cCriticalSection m_CriticalSection; cCriticalSection m_CriticalSection;
std::string m_Directory; std::string m_Directory;

View File

@ -80,13 +80,13 @@ cWebAdmin::~cWebAdmin()
delete m_Event; delete m_Event;
} }
void cWebAdmin::AddPlugin( cWebPlugin* a_Plugin ) void cWebAdmin::AddPlugin( cWebPlugin * a_Plugin )
{ {
m_Plugins.remove( a_Plugin ); m_Plugins.remove( a_Plugin );
m_Plugins.push_back( a_Plugin ); m_Plugins.push_back( a_Plugin );
} }
void cWebAdmin::RemovePlugin( cWebPlugin* a_Plugin ) void cWebAdmin::RemovePlugin( cWebPlugin * a_Plugin )
{ {
m_Plugins.remove( a_Plugin ); m_Plugins.remove( a_Plugin );
} }
@ -161,18 +161,10 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
for (PluginList::iterator itr = WebAdmin->m_Plugins.begin(); itr != WebAdmin->m_Plugins.end(); ++itr) for (PluginList::iterator itr = WebAdmin->m_Plugins.begin(); itr != WebAdmin->m_Plugins.end(); ++itr)
{ {
cWebPlugin* WebPlugin = *itr; cWebPlugin* WebPlugin = *itr;
cWebPlugin_Lua* LuaPlugin = dynamic_cast< cWebPlugin_Lua* >( WebPlugin ); std::list< std::pair<std::string, std::string> > NameList = WebPlugin->GetTabNames();
if( LuaPlugin ) for( std::list< std::pair<std::string, std::string> >::iterator Names = NameList.begin(); Names != NameList.end(); ++Names )
{ {
std::list< std::pair<std::string, std::string> > NameList = LuaPlugin->GetTabNames(); Menu += "<li><a href='" + BaseURL + WebPlugin->GetName().c_str() + "/" + (*Names).second + "'>" + (*Names).first + "</a></li>";
for( std::list< std::pair<std::string, std::string> >::iterator Names = NameList.begin(); Names != NameList.end(); ++Names )
{
Menu += "<li><a href='" + BaseURL + WebPlugin->GetName() + "/" + (*Names).second + "'>" + (*Names).first + "</a></li>";
}
}
else
{
Menu += "<li><a href='" + BaseURL + WebPlugin->GetName() + "'>" + WebPlugin->GetName() + "</a></li>";
} }
} }
@ -201,7 +193,7 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
{ {
if( (*itr)->GetName() == Split[1] ) if( (*itr)->GetName() == Split[1] )
{ {
Content = (*itr)->HandleRequest( &Request ); Content = (*itr)->HandleWebRequest( &Request );
cWebPlugin* WebPlugin = *itr; cWebPlugin* WebPlugin = *itr;
FoundPlugin = WebPlugin->GetName(); FoundPlugin = WebPlugin->GetName();
cWebPlugin_Lua* LuaPlugin = dynamic_cast< cWebPlugin_Lua* >( WebPlugin ); cWebPlugin_Lua* LuaPlugin = dynamic_cast< cWebPlugin_Lua* >( WebPlugin );
@ -229,7 +221,7 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
for( cPluginManager::PluginList::const_iterator itr = List.begin(); itr != List.end(); ++itr ) for( cPluginManager::PluginList::const_iterator itr = List.begin(); itr != List.end(); ++itr )
{ {
AString VersionNum; AString VersionNum;
AppendPrintf(Content, "<li>%s V.%i</li>", (*itr)->GetName(), (*itr)->GetVersion()); AppendPrintf(Content, "<li>%s V.%i</li>", (*itr)->GetName().c_str(), (*itr)->GetVersion());
} }
} }
Content += "</ul>"; Content += "</ul>";
@ -371,22 +363,4 @@ std::string cWebAdmin::GetTemplate()
f.ReadRestOfFile(retVal); f.ReadRestOfFile(retVal);
return retVal; return retVal;
} }
void cWebAdmin::RemovePlugin( lua_State* L )
{
for( PluginList::iterator itr = m_Plugins.begin(); itr != m_Plugins.end(); )
{
if( (*itr)->GetLuaState() == L )
{
PluginList::iterator prev = itr++;
delete *prev; // deleting a dereferenced iterator also takes it out of the list, so no need for erase()
}
else
++itr;
}
}

View File

@ -43,8 +43,6 @@ public:
PluginList GetPlugins() { return m_Plugins; } PluginList GetPlugins() { return m_Plugins; }
static void Request_Handler(webserver::http_request* r); static void Request_Handler(webserver::http_request* r);
void RemovePlugin( lua_State* L );
private: private:
#ifdef _WIN32 #ifdef _WIN32

View File

@ -10,17 +10,100 @@
cWebPlugin::cWebPlugin( lua_State* L ) cWebPlugin::cWebPlugin()
{ {
LOG("cWebPlugin::cWebPlugin()"); LOG("cWebPlugin::cWebPlugin()");
m_LuaState = L;
cWebAdmin* WebAdmin = cRoot::Get()->GetWebAdmin(); cWebAdmin* WebAdmin = cRoot::Get()->GetWebAdmin();
if( WebAdmin ) WebAdmin->AddPlugin( this ); if( WebAdmin ) WebAdmin->AddPlugin( this );
} }
cWebPlugin::~cWebPlugin() cWebPlugin::~cWebPlugin()
{ {
LOG("~cWebPlugin::cWebPlugin()"); LOG("~cWebPlugin::cWebPlugin()");
cWebAdmin* WebAdmin = cRoot::Get()->GetWebAdmin(); cWebAdmin* WebAdmin = cRoot::Get()->GetWebAdmin();
if( WebAdmin ) WebAdmin->RemovePlugin( this ); if( WebAdmin ) WebAdmin->RemovePlugin( this );
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
delete *itr;
}
m_Tabs.clear();
}
std::list< std::pair<std::string, std::string> > cWebPlugin::GetTabNames()
{
std::list< std::pair< std::string, std::string > > NameList;
for( TabList::iterator itr = GetTabs().begin(); itr != GetTabs().end(); ++itr )
{
std::pair< std::string, std::string > StringPair;
StringPair.first = (*itr)->Title;
StringPair.second = (*itr)->SafeTitle;
NameList.push_back( StringPair );
}
return NameList;
}
std::pair< std::string, std::string > cWebPlugin::GetTabNameForRequest( HTTPRequest* a_Request )
{
std::pair< std::string, std::string > Names;
AStringVector 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 = GetTabs().begin(); itr != GetTabs().end(); ++itr )
{
if( (*itr)->SafeTitle.compare( Split[2] ) == 0 ) // This is the one! Rawr
{
Tab = *itr;
break;
}
}
}
else // Otherwise show the first tab
{
if( GetTabs().size() > 0 )
Tab = *GetTabs().begin();
}
if( Tab )
{
Names.first = Tab->Title;
Names.second = Tab->SafeTitle;
}
}
return Names;
}
AString cWebPlugin::SafeString( const AString & a_String )
{
std::string RetVal;
for( unsigned int i = 0; i < a_String.size(); ++i )
{
char c = a_String[i];
if( c == ' ' )
{
c = '_';
}
RetVal.push_back( c );
}
return RetVal;
} }

View File

@ -7,18 +7,32 @@ struct HTTPRequest;
class cWebPlugin class cWebPlugin
{ {
public: public:
cWebPlugin( lua_State* L ); cWebPlugin();
virtual ~cWebPlugin(); virtual ~cWebPlugin();
void SetName( std::string a_Name ) { m_Name = a_Name; } void SetName( std::string a_Name ) { m_Name = a_Name; }
std::string GetName() { return m_Name; } std::string GetName() { return m_Name; }
virtual std::string HandleRequest( HTTPRequest* a_Request ) = 0; virtual std::string HandleWebRequest( HTTPRequest* a_Request ) = 0;
virtual void Initialize() = 0;
static AString SafeString( const AString & a_String );
//tolua_end //tolua_end
lua_State* GetLuaState() { return m_LuaState; } struct sWebPluginTab
{
std::string Title;
std::string SafeTitle;
int UserData;
};
typedef std::list< sWebPluginTab* > TabList;
TabList & GetTabs() { return m_Tabs; }
std::list< std::pair<std::string, std::string> > GetTabNames();
std::pair< std::string, std::string > GetTabNameForRequest( HTTPRequest* a_Request );
private: private:
lua_State* m_LuaState; TabList m_Tabs;
std::string m_Name; std::string m_Name;
}; //tolua_export }; //tolua_export

View File

@ -1,186 +0,0 @@
#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);
static std::string SafeString( const std::string& a_String )
{
std::string RetVal;
for( unsigned int i = 0; i < a_String.size(); ++i )
{
char c = a_String[i];
if( c == ' ' )
{
c = '_';
}
RetVal.push_back( c );
}
return RetVal;
}
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 = SafeString( a_Title );
Tab->Reference = a_FunctionReference;
m_Tabs.push_back( Tab );
return true;
}
std::string cWebPlugin_Lua::HandleRequest( HTTPRequest* a_Request )
{
cCSLock( m_Plugin->GetCriticalSection() );
lua_State* LuaState = m_Plugin->GetLuaState();
std::string RetVal = "";
std::pair< std::string, std::string > TabName = GetTabNameForRequest(a_Request);
std::string SafeTabName = TabName.second;
if( SafeTabName.empty() )
return "";
sWebPluginTab* Tab = 0;
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
if( (*itr)->SafeTitle.compare( SafeTabName ) == 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::pair< std::string, std::string > cWebPlugin_Lua::GetTabNameForRequest( HTTPRequest* a_Request )
{
std::pair< std::string, std::string > Names;
AStringVector 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 )
{
Names.first = Tab->Title;
Names.second = Tab->SafeTitle;
}
}
return Names;
}
std::list< std::pair<std::string, std::string> > cWebPlugin_Lua::GetTabNames()
{
std::list< std::pair< std::string, std::string > > NameList;
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
std::pair< std::string, std::string > StringPair;
StringPair.first = (*itr)->Title;
StringPair.second = (*itr)->SafeTitle;
NameList.push_back( StringPair );
}
return NameList;
}

View File

@ -1,29 +0,0 @@
#pragma once
#include "cWebPlugin.h"
class cPlugin_NewLua;
typedef struct lua_State lua_State;
// a WebPlugin class more specialized for Lua
class cWebPlugin_Lua : public cWebPlugin //tolua_export
{ //tolua_export
public: //tolua_export
cWebPlugin_Lua( cPlugin_NewLua* a_Plugin );
virtual ~cWebPlugin_Lua();
bool AddTab( const char* a_Title, lua_State * a_LuaState, int a_FunctionReference ); // >> EXPORTED IN MANUALBINDINGS <<
virtual std::string HandleRequest( HTTPRequest* a_Request );
virtual void Initialize();
std::pair< std::string, std::string > GetTabNameForRequest( HTTPRequest* a_Request );
std::list< std::pair<std::string, std::string> > GetTabNames();
private:
cPlugin_NewLua* m_Plugin;
struct sWebPluginTab;
typedef std::list< sWebPluginTab* > TabList;
TabList m_Tabs;
}; //tolua_export