bool edit_archivers() { arcrec arc[MAX_ARCS]; File file(syscfg.datadir, ARCHIVER_DAT); if (!file.Open(File::modeReadWrite|File::modeBinary)) { if (!create_arcs(out->window())) { return false; } file.Open(File::modeReadWrite|File::modeBinary); } file.Read(&arc, MAX_ARCS * sizeof(arcrec)); bool done = false; do { out->Cls(ACS_CKBOARD); vector<ListBoxItem> items; for (int i = 0; i < MAX_ARCS; i++) { items.emplace_back(StringPrintf("[%s] %s", arc[i].extension, arc[i].name)); } CursesWindow* window = out->window(); ListBox list(out, window, "Select Archiver", static_cast<int>(floor(window->GetMaxX() * 0.8)), std::min<int>(10, static_cast<int>(floor(window->GetMaxY() * 0.8))), items, out->color_scheme()); list.selection_returns_hotkey(true); list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"} }); ListBoxResult result = list.Run(); if (result.type == ListBoxResultType::HOTKEY) { } else if (result.type == ListBoxResultType::SELECTION) { edit_arc(result.selected + 1, &arc[result.selected]); } else if (result.type == ListBoxResultType::NO_SELECTION) { done = true; } } while (!done); // Copy first four new fomat archivers to oldarcsrec // This was the 4.24 and lower place for them. 4.31 introduced // the new archivers record. for (int j = 0; j < 4; j++) { strncpy(syscfg.arcs[j].extension, arc[j].extension, 4); strncpy(syscfg.arcs[j].arca, arc[j].arca , 32); strncpy(syscfg.arcs[j].arce, arc[j].arce , 32); strncpy(syscfg.arcs[j].arcl, arc[j].arcl , 32); } // seek to beginning of file, write arcrecs, close file file.Seek(0, File::seekBegin); file.Write(arc, MAX_ARCS * sizeof(arcrec)); return true; }
void extrn_editors() { vector<editorrec> editors; DataFile<editorrec> file (syscfg.datadir, EDITORS_DAT); if (file) { file.ReadVector(editors, 10); file.Close(); } bool done = false; do { out->Cls(ACS_CKBOARD); vector<ListBoxItem> items; for (size_t i = 0; i < editors.size(); i++) { items.emplace_back(StringPrintf("%d. %s", i + 1, editors[i].description)); } CursesWindow* window = out->window(); ListBox list(out, window, "Select Editor", static_cast<int>(floor(window->GetMaxX() * 0.8)), static_cast<int>(floor(window->GetMaxY() * 0.8)), items, out->color_scheme()); list.selection_returns_hotkey(true); list.set_additional_hotkeys("DI"); list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"}, {"D", "Delete"}, {"I", "Insert"} }); ListBoxResult result = list.Run(); if (result.type == ListBoxResultType::HOTKEY) { switch (result.hotkey) { case 'D': { if (editors.size()) { string prompt = StringPrintf("Delete '%s'", items[result.selected].text().c_str()); bool yn = dialog_yn(window, prompt); if (!yn) { break; } auto it = editors.begin(); std::advance(it, result.selected); editors.erase(it); } } break; case 'I': { if (editors.size() >= 10) { messagebox(out->window(), "Too many editors."); break; } string prompt = StringPrintf("Insert before which (1-%d) : ", editors.size() + 1); size_t i = dialog_input_number(out->window(), prompt, 1, editors.size() + 1); editorrec e; memset(&e, 0, sizeof(editorrec)); // N.B. i is one based, result.selected is 0 based. if (i <= 0 || i > editors.size() + 1) { break; } else if (i > editors.size()) { editors.push_back(e); edit_editor(editors.back()); } else { auto it = editors.begin(); std::advance(it, i - 1); auto new_editor_it = editors.insert(it, e); edit_editor(*new_editor_it); } } break; } } else if (result.type == ListBoxResultType::SELECTION) { edit_editor(editors[result.selected]); } else if (result.type == ListBoxResultType::NO_SELECTION) { done = true; } } while (!done); DataFile<editorrec> editors_dat(syscfg.datadir, EDITORS_DAT, File::modeReadWrite|File::modeBinary|File::modeCreateFile|File::modeTruncate, File::shareDenyReadWrite); if (editors_dat) { editors_dat.WriteVector(editors); } }
void networks(wwiv::sdk::Config& config) { try { Networks networks(config); bool done = false; do { vector<ListBoxItem> items; for (const auto& n : networks.networks()) { items.emplace_back(StringPrintf("@%u %s", n.sysnum, n.name)); } CursesWindow* window = out->window(); ListBox list(out, window, "Select Network", static_cast<int>(floor(window->GetMaxX() * 0.8)), static_cast<int>(floor(window->GetMaxY() * 0.8)), items, out->color_scheme()); list.selection_returns_hotkey(true); list.set_additional_hotkeys("DI"); list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"}, {"D", "Delete"}, {"I", "Insert"} }); ListBoxResult result = list.Run(); if (result.type == ListBoxResultType::SELECTION) { edit_net(config, networks, result.selected); } else if (result.type == ListBoxResultType::NO_SELECTION) { done = true; } else if (result.type == ListBoxResultType::HOTKEY) { switch (result.hotkey) { case 'D': if (!(syscfg.fnoffset && syscfg.fsoffset && syscfg.fuoffset)) { messagebox(window, { "You must run the BBS once", "to set up some variables before ", "deleting a network." }); break; } if (networks.networks().size() > 1) { const string prompt = StringPrintf("Delete '%s'", networks.at(result.selected).name); bool yn = dialog_yn(window, prompt); if (yn) { yn = dialog_yn(window, "Are you REALLY sure? "); if (yn) { del_net(networks, result.selected); } } } else { messagebox(window, "You must leave at least one network."); } break; case 'I': if (!(syscfg.fnoffset && syscfg.fsoffset && syscfg.fuoffset)) { vector<string> lines{ "You must run the BBS once to set up ", "some variables before inserting a network." }; messagebox(window, lines); break; } if (networks.networks().size() >= MAX_NETWORKS) { messagebox(window, "Too many networks."); break; } const string prompt = StringPrintf("Insert before which (1-%d) ? ", networks.networks().size() + 1); const size_t net_num = dialog_input_number(window, prompt, 1, networks.networks().size() + 1 ); if (net_num > 0 && net_num <= networks.networks().size() + 1) { if (dialog_yn(window, "Are you sure? ")) { insert_net(config, networks, net_num - 1); } } break; } } } while (!done); networks.Save(); } catch (const std::exception& e) { LOG(ERROR) << e.what(); } }
void edit_languages() { vector<languagerec> languages; { DataFile<languagerec> file(syscfg.datadir, LANGUAGE_DAT); if (file) { file.ReadVector(languages, MAX_LANGUAGES); } } bool done = false; do { out->Cls(ACS_CKBOARD); vector<ListBoxItem> items; for (std::size_t i = 0; i < languages.size(); i++) { items.emplace_back(StringPrintf("%d. %s (%s)", i + 1, languages[i].name, languages[i].dir)); } CursesWindow* window = out->window(); ListBox list(out, window, "Select Language", static_cast<int>(floor(window->GetMaxX() * 0.8)), static_cast<int>(floor(window->GetMaxY() * 0.8)), items, out->color_scheme()); list.selection_returns_hotkey(true); list.set_additional_hotkeys("DI"); list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"}, {"D", "Delete"}, {"I", "Insert"} }); ListBoxResult result = list.Run(); if (result.type == ListBoxResultType::HOTKEY) { switch (result.hotkey) { case 'D': { if (languages.size() > 1) { string prompt = StringPrintf("Delete '%s' ?", items[result.selected].text().c_str()); bool yn = dialog_yn(window, prompt); if (!yn) { break; } auto it = languages.begin(); std::advance(it, result.selected); languages.erase(it); if (languages.size() == 1) { languages[0].num = 0; } } else { messagebox(window, "You must leave at least one language."); } } break; case 'I': if (languages.size() >= MAX_LANGUAGES) { messagebox(window, "Too many languages."); break; } string prompt = StringPrintf("Insert before which (1-%d) : ", languages.size() + 1); size_t i = dialog_input_number(out->window(), prompt, 1, languages.size() + 1); // N.B. i is one based, result.selected is 0 based. if (i <= 0 || i > languages.size() + 1) { break; } languagerec l; memset(&l, 0, sizeof(languagerec)); strcpy(l.name, "English"); strcpy(l.dir, syscfg.gfilesdir); strcpy(l.mdir, syscfg.gfilesdir); l.num = get_next_langauge_num(languages); if (i > languages.size()) { languages.push_back(l); edit_lang(languages.back()); } else { auto it = languages.begin(); std::advance(it, i - 1); auto new_lang = languages.insert(it, l); edit_lang(*new_lang); } break; } } else if (result.type == ListBoxResultType::SELECTION) { edit_lang(languages[result.selected]); } else if (result.type == ListBoxResultType::NO_SELECTION) { done = true; } } while (!done); { DataFile<languagerec> file(syscfg.datadir, LANGUAGE_DAT, File::modeWriteOnly | File::modeBinary | File::modeCreateFile | File::modeTruncate, File::shareDenyReadWrite); if (file) { file.WriteVector(languages, MAX_LANGUAGES); } } }