Skip to content

Commit

Permalink
Fixes seg fault with new user page.
Browse files Browse the repository at this point in the history
Refactor loops and templates so less code is needed.
  • Loading branch information
VasilyFomin committed May 29, 2014
1 parent 3ad2852 commit 16697d9
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 67 deletions.
14 changes: 7 additions & 7 deletions modules/data/webadmin/tmpl/add_edit_user.tmpl
Expand Up @@ -199,14 +199,14 @@
<? ENDIF ?>
</td>
<td align="center">
<? IF LoadedByAllNetworks ?>
<? IF LoadedBySomeNetworks ?>
<input type="checkbox" name="loaded_by_network" id="loaded_by_net_<? VAR Name ?>" checked="checked" disabled="disabled"/>
<? ELSE IF LoadedBySomeNetworks ?>
<input type="checkbox" name="loaded_by_network" id="loaded_by_net_<? VAR Name ?>" checked="checked" disabled="disabled"/>
<script type="text/javascript">
var checkbox = document.getElementById("loaded_by_net_<? VAR Name ?>");
checkbox.indeterminate = true;
</script>
<? IF !LoadedByAllNetworks ?>
<script type="text/javascript">
var checkbox = document.getElementById("loaded_by_net_<? VAR Name ?>");
checkbox.indeterminate = true;
</script>
<? ENDIF ?>
<? ENDIF ?>
</td>
</tr>
Expand Down
28 changes: 14 additions & 14 deletions modules/data/webadmin/tmpl/settings.tmpl
Expand Up @@ -189,25 +189,25 @@
</td>
<td class="mod_descr"><? VAR Description ?></td>
<td align="center">
<? IF LoadedByAllNetworks ?>
<? IF LoadedBySomeNetworks ?>
<input type="checkbox" name="loaded_by_network" id="loaded_by_net_<? VAR Name ?>" checked="checked" disabled="disabled"/>
<? ELSE IF LoadedBySomeNetworks ?>
<input type="checkbox" name="loaded_by_network" id="loaded_by_net_<? VAR Name ?>" checked="checked" disabled="disabled"/>
<script type="text/javascript">
var checkbox = document.getElementById("loaded_by_net_<? VAR Name ?>");
checkbox.indeterminate = true;
</script>
<? IF !LoadedByAllNetworks ?>
<script type="text/javascript">
var checkbox = document.getElementById("loaded_by_net_<? VAR Name ?>");
checkbox.indeterminate = true;
</script>
<? ENDIF ?>
<? ENDIF ?>
</td>
<td align="center">
<? IF LoadedByAllUsers ?>
<input type="checkbox" name="loaded_by_user" id="loaded_by_user_<? VAR Name ?>" checked="checked" disabled="disabled"/>
<? ELSE IF LoadedBySomeUsers ?>
<? IF LoadedBySomeUsers ?>
<input type="checkbox" name="loaded_by_user" id="loaded_by_user_<? VAR Name ?>" checked="checked" disabled="disabled"/>
<script type="text/javascript">
var checkbox = document.getElementById("loaded_by_user_<? VAR Name ?>");
checkbox.indeterminate = true;
</script>
<? IF !LoadedByAllUsers ?>
<script type="text/javascript">
var checkbox = document.getElementById("loaded_by_user_<? VAR Name ?>");
checkbox.indeterminate = true;
</script>
<? ENDIF ?>
<? ENDIF ?>
</td>
</tr>
Expand Down
80 changes: 34 additions & 46 deletions modules/webadmin.cpp
Expand Up @@ -749,7 +749,7 @@ class CWebAdminMod : public CModule {
if (pModule) {
l["Checked"] = "true";
l["Args"] = pModule->GetArgs();
}
}
}

// Check if module is loaded globally
Expand Down Expand Up @@ -1215,8 +1215,21 @@ class CWebAdminMod : public CModule {
l["ArgsHelpText"] = Info.GetArgsHelpText();

CModule *pModule = NULL;
if (pUser)
if (pUser) {
pModule = pUser->GetModules().FindModule(Info.GetName());
// Check if module is loaded by all or some networks
const vector<CIRCNetwork*>& userNetworks = pUser->GetNetworks();
unsigned int networksWithRenderedModuleCount = 0;
for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex) {
const CIRCNetwork* pCurrentNetwork = userNetworks[networkIndex];
const CModules& networkModules = pCurrentNetwork->GetModules();
if (networkModules.FindModule(Info.GetName())) {
networksWithRenderedModuleCount++;
}
}
l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size());
l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0);
}
if (pModule) {
l["Checked"] = "true";
l["Args"] = pModule->GetArgs();
Expand All @@ -1228,23 +1241,6 @@ class CWebAdminMod : public CModule {
// Check if module is loaded globally
l["LoadedGlobally"] = CString(CZNC::Get().GetModules().FindModule(Info.GetName()) != NULL);

// Check if module is loaded by all or some networks
const vector<CIRCNetwork*>& userNetworks = pUser->GetNetworks();
unsigned int networksWithRenderedModuleCount = 0;
for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex) {
const CIRCNetwork* pCurrentNetwork = userNetworks[networkIndex];
const CModules& networkModules = pCurrentNetwork->GetModules();
for (unsigned int networkModuleIndex = 0; networkModuleIndex < networkModules.size(); ++networkModuleIndex) {
const CModule* pCurModule = networkModules[networkModuleIndex];
if (Info.GetName() == pCurModule->GetModName()) {
networksWithRenderedModuleCount++;
}
}
}
l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size());
const bool isLoadedBySomeNetworks = (networksWithRenderedModuleCount != 0) && (networksWithRenderedModuleCount < userNetworks.size());
l["LoadedBySomeNetworks"] = CString(isLoadedBySomeNetworks);

if (!spSession->IsAdmin() && pUser && pUser->DenyLoadMod()) {
l["Disabled"] = "true";
}
Expand Down Expand Up @@ -1653,42 +1649,34 @@ class CWebAdminMod : public CModule {
l["HasArgs"] = CString(Info.GetHasArgs());
l["ArgsHelpText"] = Info.GetArgsHelpText();

// Check if the module is loaded by all or some users and collect all available networks for future processing
vector<CIRCNetwork*> allNetworks;
// Check if the module is loaded by all or some users, and/or by all or some networks
unsigned int usersWithRenderedModuleCount = 0;
unsigned int networksWithRenderedModuleCount = 0;
unsigned int networksCount = 0;
const map<CString,CUser*>& allUsers = CZNC::Get().GetUserMap();
allNetworks.reserve(allUsers.size()); // Reserve for at least one network per scene
for (map<CString,CUser*>::const_iterator usersIt = allUsers.begin(); usersIt != allUsers.end(); ++usersIt) {
for (map<CString,CUser*>::const_iterator usersIt = allUsers.begin(); usersIt != allUsers.end(); ++usersIt) {
const CUser& User = *usersIt->second;
const vector<CIRCNetwork*>& userNetworks = User.GetNetworks();
allNetworks.insert(allNetworks.end(), userNetworks.begin(), userNetworks.end());

// Count users which has loaded a render module
const CModules& userModules = User.GetModules();
for (unsigned int userModuleIndex = 0; userModuleIndex < userModules.size(); ++userModuleIndex) {
const CModule* pCurModule = userModules[userModuleIndex];
if (Info.GetName() == pCurModule->GetModName()) {
usersWithRenderedModuleCount++;
}
if (userModules.FindModule(Info.GetName())) {
usersWithRenderedModuleCount++;
}
}
l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size());
const bool isLoadedBySomeUsers = (usersWithRenderedModuleCount != 0) && (usersWithRenderedModuleCount < allUsers.size());
l["LoadedBySomeUsers"] = CString(isLoadedBySomeUsers);

// Check if module is loaded by all or some networks
unsigned int networksWithRenderedModuleCount = 0;
for (unsigned int networkIndex = 0; networkIndex < allNetworks.size(); ++networkIndex) {
const CIRCNetwork* pCurrentNetwork = allNetworks[networkIndex];
const CModules& networkModules = pCurrentNetwork->GetModules();
for (unsigned int networkModuleIndex = 0; networkModuleIndex < networkModules.size(); ++networkModuleIndex) {
const CModule* pCurModule = networkModules[networkModuleIndex];
if (Info.GetName() == pCurModule->GetModName()) {
// Count networks which has loaded a render module
const vector<CIRCNetwork*>& userNetworks = User.GetNetworks();
networksCount += userNetworks.size();
for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex)
{
const CIRCNetwork *pCurrentNetwork = userNetworks[networkIndex];
if (pCurrentNetwork->GetModules().FindModule(Info.GetName())) {
networksWithRenderedModuleCount++;
}
}
}
l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == allNetworks.size());
const bool isLoadedBySomeNetworks = (networksWithRenderedModuleCount != 0) && (networksWithRenderedModuleCount < allNetworks.size());
l["LoadedBySomeNetworks"] = CString(isLoadedBySomeNetworks);
l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size());
l["LoadedBySomeUsers"] = CString(usersWithRenderedModuleCount != 0);
l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == networksCount);
l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0);
}

return true;
Expand Down

0 comments on commit 16697d9

Please sign in to comment.