From 2b2822ba2a94a5500267914bce9cf311377c4e85 Mon Sep 17 00:00:00 2001 From: imaginos Date: Tue, 17 May 2005 07:53:55 +0000 Subject: [PATCH] created CORE syntax and subsequent xs versions of modlod, etc git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@329 726aef4b-f618-498e-8847-2d620e286838 --- modules/modperl.cpp | 51 +++++++++++++++++++++++++++++++++++++++------ modules/modperl.pm | 10 ++++----- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/modules/modperl.cpp b/modules/modperl.cpp index 285a494f..ecfff797 100644 --- a/modules/modperl.cpp +++ b/modules/modperl.cpp @@ -13,7 +13,9 @@ #define NICK( a ) a.GetNickMask() #define CHAN( a ) a.GetName() -#define ZNCEvalCB "ZNC::Eval" +#define ZNCEvalCB "ZNC::COREEval" +#define ZNCCallFuncCB "ZNC::CORECallFunc" +#define ZNCCallTimerCB "ZNC::CORECallTimer" class PString : public CString { @@ -371,10 +373,10 @@ public: return( CONTINUE ); } -private: void LoadPerlMod( const CString & sModule ); void UnLoadPerlMod( const CString & sModule ); +private: PerlInterpreter *m_pPerl; }; @@ -431,7 +433,42 @@ XS(XS_ZNC_PutIRC) } } +XS(XS_ZNC_LoadMod) +{ + dXSARGS; + if ( items != 1 ) + Perl_croak( aTHX_ "Usage: LoadMod( module )" ); + + SP -= items; + ax = (SP - PL_stack_base) + 1 ; + { + if ( g_ModPerl ) + { + CString sModule = (char *)SvPV(ST(0),PL_na); + g_ModPerl->LoadPerlMod( sModule ); + } + PUTBACK; + } +} +XS(XS_ZNC_UnLoadMod) +{ + dXSARGS; + if ( items != 1 ) + Perl_croak( aTHX_ "Usage: UnLoadMod( module )" ); + + SP -= items; + ax = (SP - PL_stack_base) + 1 ; + { + if ( g_ModPerl ) + { + CString sModule = (char *)SvPV(ST(0),PL_na); + g_ModPerl->UnLoadPerlMod( sModule ); + } + PUTBACK; + } +} + XS(XS_ZNC_PutUser) { dXSARGS; @@ -640,9 +677,9 @@ CModPerl::EModRet CModPerl::CallBack( const PString & sHookName, const VPString XPUSHs( sUsername.GetSV() ); XPUSHs( sHookName.GetSV() ); if ( eCBType == CB_ONHOOK ) - sFuncToCall = "ZNC::CallFunc"; + sFuncToCall = ZNCCallFuncCB; else - sFuncToCall = "ZNC::CallTimer"; + sFuncToCall = ZNCCallTimerCB; } for( VPString::size_type a = 0; a < vsArgs.size(); a++ ) @@ -708,6 +745,8 @@ bool CModPerl::OnLoad( const CString & sArgs ) newXS( "ZNC::GetNicks", XS_ZNC_GetNicks, (char *)file ); newXS( "ZNC::GetString", XS_ZNC_GetString, (char *)file ); newXS( "ZNC::COREAddTimer", XS_ZNC_COREAddTimer, (char *)file ); + newXS( "ZNC::LoadMod", XS_ZNC_LoadMod, (char *)file ); + newXS( "ZNC::UnLoadMod", XS_ZNC_UnLoadMod, (char *)file ); // this sets up the eval CB that we call from here on out. this way we can grab the error produced SetupZNCScript(); @@ -742,13 +781,13 @@ void CModPerl::LoadPerlMod( const CString & sModule ) else { PutModule( "Using " + sModPath ); - Eval( "ZNC::LoadMod( '" + m_pUser->GetUserName() + "', '" + sModPath + "');" ); + Eval( "ZNC::CORELoadMod( '" + m_pUser->GetUserName() + "', '" + sModPath + "');" ); } } void CModPerl::UnLoadPerlMod( const CString & sModule ) { - Eval( "ZNC::UnLoadMod( '" + m_pUser->GetUserName() + "', '" + sModule + "');" ); + Eval( "ZNC::COREUnLoadMod( '" + m_pUser->GetUserName() + "', '" + sModule + "');" ); } diff --git a/modules/modperl.pm b/modules/modperl.pm index 1a6e369f..372256f0 100644 --- a/modules/modperl.pm +++ b/modules/modperl.pm @@ -7,13 +7,13 @@ use strict; my @MODS = (); -sub Eval +sub COREEval { my $arg = shift; eval $arg; } -sub CallFunc +sub CORECallFunc { my ( $Username, $Func, @args ) = @_; my $FinalRet = CONTINUE(); @@ -46,7 +46,7 @@ sub CallFunc return( $FinalRet ); } -sub LoadMod +sub CORELoadMod { my ( $Username, $ModPath ) = @_; @@ -128,7 +128,7 @@ sub LoadMod ZNC::PutModule( "Loaded $Module" ); } -sub UnLoadMod +sub COREUnLoadMod { my ( $Username, $Module ) = @_; @@ -155,7 +155,7 @@ sub UnLoadMod } # the timer is inserted, it just calls this guy and expects it to be here -sub CallTimer +sub CORECallTimer { my ( $Username, $Func, $ModName ) = @_;