diff --git a/IRCNetwork.cpp b/IRCNetwork.cpp index d7672c27..7610d0ff 100644 --- a/IRCNetwork.cpp +++ b/IRCNetwork.cpp @@ -134,15 +134,33 @@ CIRCNetwork::CIRCNetwork(CUser *pUser, const CIRCNetwork *pNetwork, bool bCloneC } CIRCNetwork::~CIRCNetwork() { - DelClients(); + // Delete modules (this unloads all modules) + delete m_pModules; + m_pModules = NULL; + + // Delete clients + for (vector::const_iterator it = m_vClients.begin(); it != m_vClients.end(); ++it) { + CZNC::Get().GetManager().DelSockByAddr(*it); + } + m_vClients.clear(); + + // Delete servers DelServers(); - DelModules(); + + // Delete Channels + for (vector::const_iterator it = m_vChans.begin(); it != m_vChans.end(); ++it) { + delete *it; + } + m_vChans.clear(); SetUser(NULL); +} - for (unsigned int b = 0; b < m_vChans.size(); b++) { - delete m_vChans[b]; +void CIRCNetwork::DelServers() { + for (vector::const_iterator it = m_vServers.begin(); it != m_vServers.end(); ++it) { + delete *it; } + m_vServers.clear(); } CString CIRCNetwork::GetNetworkPath() { @@ -155,28 +173,6 @@ CString CIRCNetwork::GetNetworkPath() { return sNetworkPath; } -void CIRCNetwork::DelClients() { - for (unsigned int c = 0; c < m_vClients.size(); c++) { - CClient* pClient = m_vClients[c]; - CZNC::Get().GetManager().DelSockByAddr(pClient); - } - - m_vClients.clear(); -} - -void CIRCNetwork::DelServers() { - for (unsigned int a = 0; a < m_vServers.size(); a++) { - delete m_vServers[a]; - } - - m_vServers.clear(); -} - -void CIRCNetwork::DelModules() { - delete m_pModules; - m_pModules = NULL; -} - bool CIRCNetwork::ParseConfig(CConfig *pConfig, CString& sError, bool bUpgrade) { VCString vsList; VCString::const_iterator vit; diff --git a/IRCNetwork.h b/IRCNetwork.h index fa569bb7..fab1f012 100644 --- a/IRCNetwork.h +++ b/IRCNetwork.h @@ -35,7 +35,6 @@ public: CString GetNetworkPath(); - void DelClients(); void DelServers(); bool ParseConfig(CConfig *pConfig, CString& sError, bool bUpgrade = false); @@ -56,7 +55,6 @@ public: bool SetName(const CString& sName); // Modules - void DelModules(); CModules& GetModules() { return *m_pModules; } const CModules& GetModules() const { return *m_pModules; } // !Modules diff --git a/User.cpp b/User.cpp index cf5ce2e4..80767798 100644 --- a/User.cpp +++ b/User.cpp @@ -88,13 +88,28 @@ CUser::CUser(const CString& sUserName) } CUser::~CUser() { - DelNetworks(); + // Delete modules (unloads all modules!) + delete m_pModules; + m_pModules = NULL; - DelClients(); + // Delete networks + for (unsigned int c = 0; c < m_vIRCNetworks.size(); c++) { + CIRCNetwork* pNetwork = m_vIRCNetworks[c]; + delete pNetwork; + } + m_vIRCNetworks.clear(); - DelModules(); + // Delete clients + for (unsigned int c = 0; c < m_vClients.size(); c++) { + CClient* pClient = m_vClients[c]; + CZNC::Get().GetManager().DelSockByAddr(pClient); + } + m_vClients.clear(); CZNC::Get().GetManager().DelCronByAddr(m_pUserTimer); + + CZNC::Get().AddBytesRead(BytesRead()); + CZNC::Get().AddBytesWritten(BytesWritten()); } template @@ -395,11 +410,6 @@ bool CUser::ParseConfig(CConfig* pConfig, CString& sError) { return true; } -void CUser::DelModules() { - delete m_pModules; - m_pModules = NULL; -} - bool CUser::UpdateModule(const CString &sModule) { const map& Users = CZNC::Get().GetUserMap(); map::const_iterator it; @@ -427,24 +437,6 @@ bool CUser::UpdateModule(const CString &sModule) { return !error; } -void CUser::DelNetworks() { - for (unsigned int c = 0; c < m_vIRCNetworks.size(); c++) { - CIRCNetwork* pNetwork = m_vIRCNetworks[c]; - delete pNetwork; - } - - m_vIRCNetworks.clear(); -} - -void CUser::DelClients() { - for (unsigned int c = 0; c < m_vClients.size(); c++) { - CClient* pClient = m_vClients[c]; - CZNC::Get().GetManager().DelSockByAddr(pClient); - } - - m_vClients.clear(); -} - CIRCNetwork* CUser::AddNetwork(const CString &sNetwork) { if (!CIRCNetwork::IsValidNetwork(sNetwork) || FindNetwork(sNetwork)) { return NULL; diff --git a/User.h b/User.h index e80e0b6f..f20dfb91 100644 --- a/User.h +++ b/User.h @@ -57,10 +57,6 @@ public: static bool IsValidUserName(const CString& sUserName); static CString MakeCleanUserName(const CString& sUserName); - void DelNetworks(); - void DelClients(); - void DelModules(); - // Unloads a module on all users who have it loaded and loads it again. static bool UpdateModule(const CString &sModule); diff --git a/znc.cpp b/znc.cpp index 5eee18ed..6ed45efe 100644 --- a/znc.cpp +++ b/znc.cpp @@ -180,12 +180,7 @@ bool CZNC::HandleUserDeletion() } } - pUser->DelNetworks(); - pUser->DelClients(); - pUser->DelModules(); CWebSock::FinishUserSessions(*pUser); - AddBytesRead(pUser->BytesRead()); - AddBytesWritten(pUser->BytesWritten()); delete pUser; }