From c041a6e17f160e923dd76a87b6d756c6ceb41890 Mon Sep 17 00:00:00 2001 From: prozacx Date: Tue, 24 May 2005 01:31:37 +0000 Subject: [PATCH] Added global module hook OnConfigLine() git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@355 726aef4b-f618-498e-8847-2d620e286838 --- Modules.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ Modules.h | 4 +++- znc.cpp | 6 ++++-- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Modules.cpp b/Modules.cpp index c41d1ab0..063b2fee 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -24,6 +24,34 @@ } \ } \ +#define GLOBALMODHALTCHK(func) \ + bool bHaltCore = false; \ + for (unsigned int a = 0; a < size(); a++) { \ + try { \ + CGlobalModule* pMod = (CGlobalModule*) (*this)[a]; \ + CModule::EModRet e = CModule::CONTINUE; \ + if (m_pUser) { \ + pMod->SetUser(m_pUser); \ + e = pMod->func; \ + pMod->SetUser(NULL); \ + } else { \ + e = pMod->func; \ + } \ + if (e == CModule::HALTMODS) { \ + break; \ + } else if (e == CModule::HALTCORE) { \ + bHaltCore = true; \ + } else if (e == CModule::HALT) { \ + bHaltCore = true; \ + break; \ + } \ + } catch (CModule::EModException e) { \ + if (e == CModule::UNLOAD) { \ + UnloadModule((*this)[a]->GetModName()); \ + } \ + } \ + } \ + return bHaltCore; #define MODHALTCHK(func) \ bool bHaltCore = false; \ for (unsigned int a = 0; a < size(); a++) { \ @@ -305,6 +333,12 @@ bool CModule::PutModNotice(const CString& sLine, const CString& sIdent, const CS return (m_pUser) ? m_pUser->PutUser(":" + GetModNick() + "!" + sIdent + "@" + sHost + " NOTICE " + m_pUser->GetCurNick() + " :" + sLine) : false; } + +/////////////////// +// CGlobalModule // +/////////////////// +CModule::EModRet CGlobalModule::OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan) { return CONTINUE; } + CModules::CModules(CZNC* pZNC) { m_pZNC = pZNC; m_pUser = NULL; @@ -472,6 +506,13 @@ void CModules::OnModCTCP(const CString& sMessage) { MODUNLOADCHK(OnModCTCP(sMessage)); } +//////////////////// +// CGlobalModules // +//////////////////// +bool CGlobalModules::OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan) { + GLOBALMODHALTCHK(OnConfigLine(sName, sValue, pUser, pChan)); +} + CModule* CModules::FindModule(const CString& sModule) { for (unsigned int a = 0; a < size(); a++) { if (sModule.CaseCmp((*this)[a]->GetModName()) == 0) { diff --git a/Modules.h b/Modules.h index 723b71e5..f820f2ae 100644 --- a/Modules.h +++ b/Modules.h @@ -287,7 +287,7 @@ public: static void GetAvailableMods(set& ssMods, CZNC* pZNC, bool bGlobal = false); -private: +protected: CZNC* m_pZNC; CUser* m_pUser; }; @@ -297,6 +297,7 @@ public: CGlobalModule(void* pDLL, CZNC* pZNC, const CString& sModName) : CModule(pDLL, pZNC, sModName) {} virtual ~CGlobalModule() {} + virtual EModRet OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan); private: }; @@ -305,6 +306,7 @@ public: CGlobalModules(CZNC* pZNC) : CModules(pZNC) {} virtual ~CGlobalModules() {} + virtual bool OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan); private: }; diff --git a/znc.cpp b/znc.cpp index d57c6759..11e6057f 100644 --- a/znc.cpp +++ b/znc.cpp @@ -823,8 +823,10 @@ bool CZNC::ParseConfig(const CString& sConfig) { } } - CUtils::PrintError("Unhandled line in config: [" + sLine + "]"); - return false; + if (!GetModules().OnConfigLine(sName, sValue, pUser, pChan)) { + CUtils::PrintError("Unhandled line in config: [" + sLine + "]"); + return false; + } } if (pChan) {