mirror of
https://github.com/znc/znc.git
synced 2026-07-04 00:41:38 +02:00
Merge pull request #906 from jpnurmi/weffc++
Use member initialization lists [-Weffc++] (#270)
This commit is contained in:
@@ -28,7 +28,7 @@ class CClient;
|
||||
|
||||
class CBufLine {
|
||||
public:
|
||||
CBufLine() { throw 0; } // shouldn't be called, but is needed for compilation
|
||||
CBufLine() : CBufLine("") { throw 0; } // shouldn't be called, but is needed for compilation
|
||||
CBufLine(const CString& sFormat, const CString& sText = "", const timeval* ts = nullptr);
|
||||
~CBufLine();
|
||||
CString GetLine(const CClient& Client, const MCString& msParams) const;
|
||||
|
||||
@@ -33,8 +33,7 @@ class CClient;
|
||||
|
||||
class CAuthBase {
|
||||
public:
|
||||
CAuthBase(const CString& sUsername, const CString& sPassword, CZNCSock* pSock) {
|
||||
SetLoginInfo(sUsername, sPassword, pSock);
|
||||
CAuthBase(const CString& sUsername, const CString& sPassword, CZNCSock* pSock) : m_sUsername(sUsername), m_sPassword(sPassword), m_pSock(pSock) {
|
||||
}
|
||||
|
||||
virtual ~CAuthBase() {}
|
||||
|
||||
@@ -35,6 +35,8 @@ struct CConfigEntry {
|
||||
|
||||
class CConfig {
|
||||
public:
|
||||
CConfig() : m_ConfigEntries(), m_SubConfigs() {}
|
||||
|
||||
typedef std::map<CString, VCString> EntryMap;
|
||||
typedef std::map<CString, CConfigEntry> SubConfig;
|
||||
typedef std::map<CString, SubConfig> SubConfigMap;
|
||||
|
||||
@@ -24,9 +24,7 @@
|
||||
//! @author imaginos@imaginos.net
|
||||
class CExecSock : public CZNCSock {
|
||||
public:
|
||||
CExecSock() : CZNCSock(0) {
|
||||
m_iPid = -1;
|
||||
}
|
||||
CExecSock() : CZNCSock(0), m_iPid(-1) {}
|
||||
|
||||
int Execute(const CString & sExec) {
|
||||
int iReadFD, iWriteFD;
|
||||
|
||||
@@ -151,15 +151,11 @@ protected:
|
||||
class CDir : public std::vector<CFile*> {
|
||||
public:
|
||||
|
||||
CDir(const CString& sDir) {
|
||||
m_bDesc = false;
|
||||
m_eSortAttr = CFile::FA_Name;
|
||||
CDir(const CString& sDir) : m_eSortAttr(CFile::FA_Name), m_bDesc(false) {
|
||||
Fill(sDir);
|
||||
}
|
||||
|
||||
CDir() {
|
||||
m_bDesc = false;
|
||||
m_eSortAttr = CFile::FA_Name;
|
||||
CDir() : m_eSortAttr(CFile::FA_Name), m_bDesc(false) {
|
||||
}
|
||||
|
||||
~CDir() {
|
||||
|
||||
@@ -32,14 +32,14 @@ public:
|
||||
ACCEPT_ALL
|
||||
} EAcceptType;
|
||||
|
||||
CListener(unsigned short uPort, const CString& sBindHost, const CString& sURIPrefix, bool bSSL, EAddrType eAddr, EAcceptType eAccept) {
|
||||
m_uPort = uPort;
|
||||
m_sBindHost = sBindHost;
|
||||
m_bSSL = bSSL;
|
||||
m_eAddr = eAddr;
|
||||
m_sURIPrefix = sURIPrefix;
|
||||
m_pListener = nullptr;
|
||||
m_eAcceptType = eAccept;
|
||||
CListener(unsigned short uPort, const CString& sBindHost, const CString& sURIPrefix, bool bSSL, EAddrType eAddr, EAcceptType eAccept)
|
||||
: m_bSSL(bSSL),
|
||||
m_eAddr(eAddr),
|
||||
m_uPort(uPort),
|
||||
m_sBindHost(sBindHost),
|
||||
m_sURIPrefix(sURIPrefix),
|
||||
m_pListener(nullptr),
|
||||
m_eAcceptType(eAccept) {
|
||||
}
|
||||
|
||||
~CListener();
|
||||
|
||||
@@ -165,8 +165,7 @@ typedef void (*FPTimer_t)(CModule *, CFPTimer *);
|
||||
class CFPTimer : public CTimer {
|
||||
public:
|
||||
CFPTimer(CModule* pModule, unsigned int uInterval, unsigned int uCycles, const CString& sLabel, const CString& sDescription)
|
||||
: CTimer(pModule, uInterval, uCycles, sLabel, sDescription) {
|
||||
m_pFBCallback = nullptr;
|
||||
: CTimer(pModule, uInterval, uCycles, sLabel, sDescription), m_pFBCallback(nullptr) {
|
||||
}
|
||||
|
||||
virtual ~CFPTimer() {}
|
||||
|
||||
+6
-17
@@ -51,9 +51,7 @@ class CTemplate;
|
||||
|
||||
class CTemplateOptions {
|
||||
public:
|
||||
CTemplateOptions() {
|
||||
m_eEscapeFrom = CString::EASCII;
|
||||
m_eEscapeTo = CString::EASCII;
|
||||
CTemplateOptions() : m_eEscapeFrom(CString::EASCII), m_eEscapeTo(CString::EASCII) {
|
||||
}
|
||||
|
||||
virtual ~CTemplateOptions() {}
|
||||
@@ -72,13 +70,8 @@ private:
|
||||
|
||||
class CTemplateLoopContext {
|
||||
public:
|
||||
CTemplateLoopContext(unsigned long uFilePos, const CString& sLoopName, bool bReverse, std::vector<CTemplate*>* pRows) {
|
||||
m_uFilePosition = uFilePos;
|
||||
m_sName = sLoopName;
|
||||
m_uRowIndex = 0;
|
||||
m_bReverse = bReverse;
|
||||
m_pvRows = pRows;
|
||||
m_bHasData = false;
|
||||
CTemplateLoopContext(unsigned long uFilePos, const CString& sLoopName, bool bReverse, std::vector<CTemplate*>* pRows)
|
||||
: m_bReverse(bReverse), m_bHasData(false), m_sName(sLoopName), m_uRowIndex(0), m_uFilePosition(uFilePos), m_pvRows(pRows) {
|
||||
}
|
||||
|
||||
virtual ~CTemplateLoopContext() {}
|
||||
@@ -120,17 +113,13 @@ private:
|
||||
|
||||
class CTemplate : public MCString {
|
||||
public:
|
||||
CTemplate() : MCString(), m_spOptions(new CTemplateOptions) {
|
||||
Init();
|
||||
CTemplate() : CTemplate("") {
|
||||
}
|
||||
|
||||
CTemplate(const CString& sFileName) : MCString(), m_sFileName(sFileName), m_spOptions(new CTemplateOptions) {
|
||||
Init();
|
||||
CTemplate(const CString& sFileName) : MCString(), m_pParent(nullptr), m_sFileName(sFileName), m_lsbPaths(), m_mvLoops(), m_vLoopContexts(), m_spOptions(new CTemplateOptions), m_vspTagHandlers() {
|
||||
}
|
||||
|
||||
CTemplate(const std::shared_ptr<CTemplateOptions>& Options, CTemplate* pParent = nullptr) : MCString(), m_spOptions(Options) {
|
||||
Init();
|
||||
m_pParent = pParent;
|
||||
CTemplate(const std::shared_ptr<CTemplateOptions>& Options, CTemplate* pParent = nullptr) : MCString(), m_pParent(pParent), m_sFileName(""), m_lsbPaths(), m_mvLoops(), m_vLoopContexts(), m_spOptions(Options), m_vspTagHandlers() {
|
||||
}
|
||||
|
||||
virtual ~CTemplate();
|
||||
|
||||
@@ -38,7 +38,7 @@ class CMutex {
|
||||
public:
|
||||
friend class CConditionVariable;
|
||||
|
||||
CMutex() {
|
||||
CMutex() : m_mutex() {
|
||||
int i = pthread_mutex_init(&m_mutex, nullptr);
|
||||
if (i) {
|
||||
CUtils::PrintError("Can't initialize mutex: " + CString(strerror(errno)));
|
||||
@@ -123,7 +123,7 @@ private:
|
||||
*/
|
||||
class CConditionVariable {
|
||||
public:
|
||||
CConditionVariable() {
|
||||
CConditionVariable() : m_cond() {
|
||||
int i = pthread_cond_init(&m_cond, nullptr);
|
||||
if (i) {
|
||||
CUtils::PrintError("Can't initialize condition variable: "
|
||||
|
||||
+3
-6
@@ -100,8 +100,7 @@ public:
|
||||
EX_Restart
|
||||
} EType;
|
||||
|
||||
CException(EType e) {
|
||||
m_eType = e;
|
||||
CException(EType e) : m_eType(e) {
|
||||
}
|
||||
virtual ~CException() {}
|
||||
|
||||
@@ -143,7 +142,7 @@ public:
|
||||
*
|
||||
* @param uPreferredWidth If width of table is bigger than this, text in cells will be wrapped to several lines, if possible
|
||||
*/
|
||||
explicit CTable(size_type uPreferredWidth = 110) : m_uPreferredWidth(uPreferredWidth) {}
|
||||
explicit CTable(size_type uPreferredWidth = 110) : m_vsHeaders(), m_vuMaxWidths(), m_vuMinWidths(), m_vbWrappable(), m_uPreferredWidth(uPreferredWidth), m_vsOutput() {}
|
||||
virtual ~CTable() {}
|
||||
|
||||
/** Adds a new column to the table.
|
||||
@@ -252,9 +251,7 @@ private:
|
||||
template<typename K, typename V = bool>
|
||||
class TCacheMap {
|
||||
public:
|
||||
TCacheMap(unsigned int uTTL = 5000) {
|
||||
m_uTTL = uTTL;
|
||||
}
|
||||
TCacheMap(unsigned int uTTL = 5000) : m_mItems(), m_uTTL(uTTL) {}
|
||||
|
||||
virtual ~TCacheMap() {}
|
||||
|
||||
|
||||
@@ -76,12 +76,10 @@ private:
|
||||
|
||||
class CWebSubPage {
|
||||
public:
|
||||
CWebSubPage(const CString& sName, const CString& sTitle = "", unsigned int uFlags = 0) : m_sName(sName), m_sTitle(sTitle) {
|
||||
m_uFlags = uFlags;
|
||||
CWebSubPage(const CString& sName, const CString& sTitle = "", unsigned int uFlags = 0) : m_uFlags(uFlags), m_sName(sName), m_sTitle(sTitle), m_vParams() {
|
||||
}
|
||||
|
||||
CWebSubPage(const CString& sName, const CString& sTitle, const VPair& vParams, unsigned int uFlags = 0) : m_sName(sName), m_sTitle(sTitle), m_vParams(vParams) {
|
||||
m_uFlags = uFlags;
|
||||
CWebSubPage(const CString& sName, const CString& sTitle, const VPair& vParams, unsigned int uFlags = 0) : m_uFlags(uFlags), m_sName(sName), m_sTitle(sTitle), m_vParams(vParams) {
|
||||
}
|
||||
|
||||
virtual ~CWebSubPage() {}
|
||||
|
||||
+2
-5
@@ -17,9 +17,7 @@
|
||||
#include <znc/znc.h>
|
||||
#include <znc/User.h>
|
||||
|
||||
CBufLine::CBufLine(const CString& sFormat, const CString& sText, const timeval* ts) {
|
||||
m_sFormat = sFormat;
|
||||
m_sText = sText;
|
||||
CBufLine::CBufLine(const CString& sFormat, const CString& sText, const timeval* ts) : m_sFormat(sFormat), m_sText(sText), m_time() {
|
||||
if (ts == nullptr)
|
||||
UpdateTime();
|
||||
else
|
||||
@@ -49,8 +47,7 @@ CString CBufLine::GetLine(const CClient& Client, const MCString& msParams) const
|
||||
}
|
||||
}
|
||||
|
||||
CBuffer::CBuffer(unsigned int uLineCount) {
|
||||
m_uLineCount = uLineCount;
|
||||
CBuffer::CBuffer(unsigned int uLineCount) : m_uLineCount(uLineCount) {
|
||||
}
|
||||
|
||||
CBuffer::~CBuffer() {}
|
||||
|
||||
+1
-2
@@ -625,8 +625,7 @@ void CClient::AuthUser() {
|
||||
}
|
||||
|
||||
CClientAuth::CClientAuth(CClient* pClient, const CString& sUsername, const CString& sPassword)
|
||||
: CAuthBase(sUsername, sPassword, pClient) {
|
||||
m_pClient = pClient;
|
||||
: CAuthBase(sUsername, sPassword, pClient), m_pClient(pClient) {
|
||||
}
|
||||
|
||||
void CClientAuth::RefusedLogin(const CString& sReason) {
|
||||
|
||||
+1
-3
@@ -24,9 +24,7 @@ struct ConfigStackEntry {
|
||||
CString sName;
|
||||
CConfig Config;
|
||||
|
||||
ConfigStackEntry(const CString& Tag, const CString Name) {
|
||||
sTag = Tag;
|
||||
sName = Name;
|
||||
ConfigStackEntry(const CString& Tag, const CString Name) : sTag(Tag), sName(Name), Config() {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+2
-7
@@ -33,15 +33,10 @@
|
||||
|
||||
CString CFile::m_sHomePath;
|
||||
|
||||
CFile::CFile() {
|
||||
m_iFD = -1;
|
||||
ResetError();
|
||||
CFile::CFile() : CFile("") {
|
||||
}
|
||||
|
||||
CFile::CFile(const CString& sLongName) {
|
||||
m_iFD = -1;
|
||||
|
||||
ResetError();
|
||||
CFile::CFile(const CString& sLongName) : m_sBuffer(""), m_iFD(-1), m_bHadError(false), m_sLongName(""), m_sShortName("") {
|
||||
SetFileName(sLongName);
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -30,8 +30,7 @@ using std::set;
|
||||
|
||||
class CIRCNetworkPingTimer : public CCron {
|
||||
public:
|
||||
CIRCNetworkPingTimer(CIRCNetwork *pNetwork) : CCron() {
|
||||
m_pNetwork = pNetwork;
|
||||
CIRCNetworkPingTimer(CIRCNetwork *pNetwork) : CCron(), m_pNetwork(pNetwork) {
|
||||
SetName("CIRCNetworkPingTimer::" + m_pNetwork->GetUser()->GetUserName() + "::" + m_pNetwork->GetName());
|
||||
Start(CIRCNetwork::PING_SLACK);
|
||||
}
|
||||
|
||||
+1
-2
@@ -38,8 +38,7 @@ static const double FLOOD_MINIMAL_RATE = 0.3;
|
||||
class CIRCFloodTimer : public CCron {
|
||||
CIRCSock* m_pSock;
|
||||
public:
|
||||
CIRCFloodTimer(CIRCSock* pSock) {
|
||||
m_pSock = pSock;
|
||||
CIRCFloodTimer(CIRCSock* pSock) : m_pSock(pSock) {
|
||||
StartMaxCycles(m_pSock->m_fFloodRate, 0);
|
||||
}
|
||||
void RunJob() override {
|
||||
|
||||
+1
-2
@@ -85,8 +85,7 @@ void CRealListener::SockError(int iErrno, const CString& sDescription) {
|
||||
}
|
||||
}
|
||||
|
||||
CIncomingConnection::CIncomingConnection(const CString& sHostname, unsigned short uPort, CListener::EAcceptType eAcceptType, const CString& sURIPrefix) : CZNCSock(sHostname, uPort), m_sURIPrefix(sURIPrefix) {
|
||||
m_eAcceptType = eAcceptType;
|
||||
CIncomingConnection::CIncomingConnection(const CString& sHostname, unsigned short uPort, CListener::EAcceptType eAcceptType, const CString& sURIPrefix) : CZNCSock(sHostname, uPort), m_eAcceptType(eAcceptType), m_sURIPrefix(sURIPrefix) {
|
||||
// The socket will time out in 120 secs, no matter what.
|
||||
// This has to be fixed up later, if desired.
|
||||
SetTimeout(120, 0);
|
||||
|
||||
+2
-7
@@ -103,10 +103,8 @@ bool ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER;
|
||||
return bHaltCore;
|
||||
|
||||
/////////////////// Timer ///////////////////
|
||||
CTimer::CTimer(CModule* pModule, unsigned int uInterval, unsigned int uCycles, const CString& sLabel, const CString& sDescription) : CCron() {
|
||||
CTimer::CTimer(CModule* pModule, unsigned int uInterval, unsigned int uCycles, const CString& sLabel, const CString& sDescription) : CCron(), m_pModule(pModule), m_sDescription(sDescription) {
|
||||
SetName(sLabel);
|
||||
m_sDescription = sDescription;
|
||||
m_pModule = pModule;
|
||||
|
||||
if (uCycles) {
|
||||
StartMaxCycles(uInterval, uCycles);
|
||||
@@ -747,10 +745,7 @@ CModule::EModRet CModule::OnGetModInfo(CModInfo& ModInfo, const CString& sModule
|
||||
void CModule::OnGetAvailableMods(set<CModInfo>& ssMods, CModInfo::EModuleType eType) {}
|
||||
|
||||
|
||||
CModules::CModules() {
|
||||
m_pUser = nullptr;
|
||||
m_pNetwork = nullptr;
|
||||
m_pClient = nullptr;
|
||||
CModules::CModules() : m_pUser(nullptr), m_pNetwork(nullptr), m_pClient(nullptr) {
|
||||
}
|
||||
|
||||
CModules::~CModules() {
|
||||
|
||||
+2
-4
@@ -21,12 +21,10 @@
|
||||
using std::vector;
|
||||
using std::map;
|
||||
|
||||
CNick::CNick() {
|
||||
Reset();
|
||||
CNick::CNick() : m_sChanPerms(""), m_pNetwork(nullptr), m_sNick(""), m_sIdent(""), m_sHost("") {
|
||||
}
|
||||
|
||||
CNick::CNick(const CString& sNick) {
|
||||
Reset();
|
||||
CNick::CNick(const CString& sNick) : CNick() {
|
||||
Parse(sNick);
|
||||
}
|
||||
|
||||
|
||||
+1
-4
@@ -20,10 +20,7 @@
|
||||
|
||||
using std::vector;
|
||||
|
||||
CQuery::CQuery(const CString& sName, CIRCNetwork* pNetwork) {
|
||||
m_sName = sName;
|
||||
m_pNetwork = pNetwork;
|
||||
|
||||
CQuery::CQuery(const CString& sName, CIRCNetwork* pNetwork) : m_sName(sName), m_pNetwork(pNetwork), m_Buffer() {
|
||||
SetBufferCount(m_pNetwork->GetUser()->GetBufferCount(), true);
|
||||
}
|
||||
|
||||
|
||||
+6
-5
@@ -16,11 +16,12 @@
|
||||
|
||||
#include <znc/Server.h>
|
||||
|
||||
CServer::CServer(const CString& sName, unsigned short uPort, const CString& sPass, bool bSSL) {
|
||||
m_sName = sName;
|
||||
m_uPort = (uPort) ? uPort : (unsigned short)6667;
|
||||
m_sPass = sPass;
|
||||
m_bSSL = bSSL;
|
||||
CServer::CServer(const CString& sName, unsigned short uPort, const CString& sPass, bool bSSL)
|
||||
: m_sName(sName),
|
||||
m_uPort((uPort) ? uPort : (unsigned short)6667),
|
||||
m_sPass(sPass),
|
||||
m_bSSL(bSSL)
|
||||
{
|
||||
}
|
||||
|
||||
CServer::~CServer() {}
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ CThreadPool& CThreadPool::Get() {
|
||||
return pool;
|
||||
}
|
||||
|
||||
CThreadPool::CThreadPool() : m_done(false), m_num_threads(0), m_num_idle(0) {
|
||||
CThreadPool::CThreadPool() : m_mutex(), m_cond(), m_cancellationCond(), m_exit_cond(), m_done(false), m_num_threads(0), m_num_idle(0), m_iJobPipe{0,0}, m_jobs() {
|
||||
if (pipe(m_iJobPipe)) {
|
||||
DEBUG("Ouch, can't open pipe for thread pool: " << strerror(errno));
|
||||
exit(1);
|
||||
|
||||
+1
-2
@@ -28,8 +28,7 @@ using std::set;
|
||||
|
||||
class CUserTimer : public CCron {
|
||||
public:
|
||||
CUserTimer(CUser* pUser) : CCron() {
|
||||
m_pUser = pUser;
|
||||
CUserTimer(CUser* pUser) : CCron(), m_pUser(pUser) {
|
||||
SetName("CUserTimer::" + m_pUser->GetUserName());
|
||||
Start(CIRCNetwork::PING_SLACK);
|
||||
}
|
||||
|
||||
+6
-4
@@ -774,10 +774,12 @@ void CTable::Clear() {
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBSSL
|
||||
CBlowfish::CBlowfish(const CString & sPassword, int iEncrypt, const CString & sIvec) {
|
||||
m_iEncrypt = iEncrypt;
|
||||
m_ivec = (unsigned char *)calloc(sizeof(unsigned char), 8);
|
||||
m_num = 0;
|
||||
CBlowfish::CBlowfish(const CString & sPassword, int iEncrypt, const CString & sIvec)
|
||||
: m_ivec((unsigned char *)calloc(sizeof(unsigned char), 8)),
|
||||
m_bkey(),
|
||||
m_iEncrypt(iEncrypt),
|
||||
m_num(0)
|
||||
{
|
||||
|
||||
if (sIvec.length() >= 8) {
|
||||
memcpy(m_ivec, sIvec.data(), 8);
|
||||
|
||||
+6
-9
@@ -34,7 +34,7 @@ const unsigned int CWebSock::m_uiMaxSessions = 5;
|
||||
// destroyed in the order that we want.
|
||||
struct CSessionManager {
|
||||
// Sessions are valid for a day, (24h, ...)
|
||||
CSessionManager() : m_mspSessions(24 * 60 * 60 * 1000) {}
|
||||
CSessionManager() : m_mspSessions(24 * 60 * 60 * 1000), m_mIPSessions() {}
|
||||
~CSessionManager() {
|
||||
// Make sure all sessions are destroyed before any of our maps
|
||||
// are destroyed
|
||||
@@ -96,8 +96,7 @@ bool CZNCTagHandler::HandleTag(CTemplate& Tmpl, const CString& sName, const CStr
|
||||
return false;
|
||||
}
|
||||
|
||||
CWebSession::CWebSession(const CString& sId, const CString& sIP) : m_sId(sId), m_sIP(sIP) {
|
||||
m_pUser = nullptr;
|
||||
CWebSession::CWebSession(const CString& sId, const CString& sIP) : m_sId(sId), m_sIP(sIP), m_pUser(nullptr), m_vsErrorMsgs(), m_vsSuccessMsgs(), m_tmLastActive() {
|
||||
Sessions.m_mIPSessions.insert(make_pair(sIP, this));
|
||||
UpdateLastActive();
|
||||
}
|
||||
@@ -109,9 +108,7 @@ void CWebSession::UpdateLastActive() {
|
||||
bool CWebSession::IsAdmin() const { return IsLoggedIn() && m_pUser->IsAdmin(); }
|
||||
|
||||
CWebAuth::CWebAuth(CWebSock* pWebSock, const CString& sUsername, const CString& sPassword, bool bBasic)
|
||||
: CAuthBase(sUsername, sPassword, pWebSock) {
|
||||
m_pWebSock = pWebSock;
|
||||
m_bBasic = bBasic;
|
||||
: CAuthBase(sUsername, sPassword, pWebSock), m_pWebSock(pWebSock), m_bBasic(bBasic) {
|
||||
}
|
||||
|
||||
void CWebSession::ClearMessageLoops() {
|
||||
@@ -189,9 +186,9 @@ void CWebAuth::Invalidate() {
|
||||
m_pWebSock = nullptr;
|
||||
}
|
||||
|
||||
CWebSock::CWebSock(const CString& sURIPrefix) : CHTTPSock(nullptr, sURIPrefix) {
|
||||
m_bPathsSet = false;
|
||||
|
||||
CWebSock::CWebSock(const CString& sURIPrefix) : CHTTPSock(nullptr, sURIPrefix),
|
||||
m_bPathsSet(false), m_Template(), m_spAuth(), m_sModName(""), m_sPath(""), m_sPage(""), m_spSession()
|
||||
{
|
||||
m_Template.AddTagHandler(std::make_shared<CZNCTagHandler>(*this));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user