static void edit_net(const Config& config, Networks& networks, int nn) { static const vector<pair<network_type_t, string>> nettypes = { {network_type_t::wwivnet, "WWIVnet "}, {network_type_t::ftn, "Fido "}, {network_type_t::internet, "Internet"} }; Subs subs(syscfg.datadir, networks.networks()); bool subs_loaded = subs.Load(); net_networks_rec& n = networks.at(nn); const string orig_network_name(n.name); const int COL1_POSITION = 14; int y = 1; EditItems items{ new ToggleEditItem<network_type_t>(out, COL1_POSITION, y++, nettypes, &n.type), new StringEditItem<char*>(COL1_POSITION, y++, 15, n.name, false), new NumberEditItem<uint16_t>(COL1_POSITION, y++, &n.sysnum), new StringFilePathItem(COL1_POSITION, y++, 60, config.root_directory(), n.dir) }; if (n.type == network_type_t::ftn) { auto net_dir = File::MakeAbsolutePath(config.root_directory(), n.dir); items.add(new FidoNetworkConfigSubDialog(net_dir, COL1_POSITION, y++, "Network Settings", 76, n)); items.add(new FidoPacketConfigSubDialog(net_dir, COL1_POSITION, y++, "Node Settings", 76, config, n)); } const string title = StrCat("Network Configuration; Net #", nn); unique_ptr<CursesWindow> window(out->CreateBoxedWindow(title, items.size() + 2, 76)); items.set_curses_io(out, window.get()); y = 1; window->PutsXY(2, y++, "Net Type :"); window->PutsXY(2, y++, "Net Name :"); window->PutsXY(2, y++, "Node # :"); window->PutsXY(2, y++, "Directory :"); if (n.type == network_type_t::ftn) { window->PutsXY(2, y++, "Settings :"); window->PutsXY(2, y++, "Addresses :"); } items.Run(); if (subs_loaded && orig_network_name != n.name) { subs.Save(); } networks.Save(); }
static bool del_net( Networks& networks, int nn) { wwiv::sdk::Subs subs(syscfg.datadir, networks.networks()); if (!subs.Load()) { return false; } if (subs.subs().empty()) { return false; } // TODO(rushfan): Ensure that no subs are using it. for (size_t i = 0; i < subs.subs().size(); i++) { size_t i2; for (i2 = 0; i2 < i; i2++) { if (subs.sub(i).filename == subs.sub(i2).filename) { break; } } if (i2 >= i) { iscan1(i, subs); open_sub(true); for (int i1 = 1; i1 <= GetNumMessagesInCurrentMessageArea(); i1++) { postrec* p = get_post(i1); if (p->status & status_post_new_net) { if (p->network.network_msg.net_number == nn) { p->network.network_msg.net_number = static_cast<uint8_t>('\xff'); write_post(i1, p); } else if (p->network.network_msg.net_number > nn) { p->network.network_msg.net_number--; write_post(i1, p); } } } close_sub(); } } // Now we update the email. File emailfile(syscfg.datadir, EMAIL_DAT); if (emailfile.Open(File::modeBinary|File::modeReadWrite)) { auto t = emailfile.GetLength() / sizeof(mailrec); for (size_t r = 0; r < t; r++) { mailrec m = {}; emailfile.Seek(r * sizeof(mailrec), File::Whence::begin); emailfile.Read(&m, sizeof(mailrec)); if (((m.tosys != 0) || (m.touser != 0)) && m.fromsys) { if (strlen(m.title) >= WWIV_MESSAGE_TITLE_LENGTH) { // always trim to WWIV_MESSAGE_TITLE_LENGTH now. m.title[WWIV_MESSAGE_TITLE_LENGTH] = 0; } m.status |= status_new_net; if (m.status & status_source_verified) { if (m.network.src_verified_msg.net_number == nn) { m.network.src_verified_msg.net_number = static_cast<uint8_t>('\xff'); } else if (m.network.src_verified_msg.net_number > nn) { m.network.src_verified_msg.net_number--; } } else { if (m.network.network_msg.net_number == nn) { m.network.network_msg.net_number = static_cast<uint8_t>('\xff'); } else if (m.network.network_msg.net_number > nn) { m.network.network_msg.net_number--; } } emailfile.Seek(r * sizeof(mailrec), File::Whence::begin); emailfile.Write(&m, sizeof(mailrec)); } } } // Update the user unique_ptr<char[]> u(new char[syscfg.userreclen]); read_user(1, reinterpret_cast<userrec*>(u.get())); int nu = number_userrecs(); for (int i = 1; i <= nu; i++) { read_user(i, reinterpret_cast<userrec*>(u.get())); if (UINT(u.get(), syscfg.fsoffset)) { if (UCHAR(u.get(), syscfg.fnoffset) == nn) { UINT(u.get(), syscfg.fsoffset) = UINT(u.get(), syscfg.fuoffset) = UCHAR(u.get(), syscfg.fnoffset) = 0; write_user(i, reinterpret_cast<userrec*>(u.get())); } else if (UCHAR(u.get(), syscfg.fnoffset) > nn) { UCHAR(u.get(), syscfg.fnoffset)--; write_user(i, reinterpret_cast<userrec*>(u.get())); } } } // Finally delete it from networks.dat networks.erase(nn); return networks.Save(); }
static bool insert_net(const Config& config, Networks& networks, int nn) { wwiv::sdk::Subs subs(syscfg.datadir, networks.networks()); if (!subs.Load()) { return false; } if (subs.subs().empty()) { return false; } for (size_t i = 0; i < subs.subs().size(); i++) { size_t i2 = 0; for (i2 = 0; i2 < i; i2++) { if (subs.sub(i).filename == subs.sub(i2).filename) { break; } } if (i2 >= i) { iscan1(i, subs); open_sub(true); for (int i1 = 1; i1 <= GetNumMessagesInCurrentMessageArea(); i1++) { postrec* p = get_post(i1); if (p->status & status_post_new_net) { if (p->network.network_msg.net_number >= nn) { p->network.network_msg.net_number++; write_post(i1, p); } } } close_sub(); } } // same as del_net, don't think we need to do this here. // wwiv::sdk::write_subs(syscfg.datadir, subboards); File emailfile(syscfg.datadir, EMAIL_DAT); if (emailfile.Open(File::modeBinary|File::modeReadWrite)) { auto t = emailfile.GetLength() / sizeof(mailrec); for (size_t r = 0; r < t; r++) { mailrec m; emailfile.Seek(sizeof(mailrec) * r, File::Whence::begin); emailfile.Read(&m, sizeof(mailrec)); if (((m.tosys != 0) || (m.touser != 0)) && m.fromsys) { if (strlen(m.title) >= WWIV_MESSAGE_TITLE_LENGTH) { // always trim to WWIV_MESSAGE_TITLE_LENGTH now. m.title[71] = 0; } m.status |= status_new_net; if (m.status & status_source_verified) { if (m.network.src_verified_msg.net_number >= nn) { m.network.src_verified_msg.net_number++; } } else { if (m.network.network_msg.net_number >= nn) { m.network.network_msg.net_number++; } } emailfile.Seek(sizeof(mailrec) * r, File::Whence::begin); emailfile.Write(&m, sizeof(mailrec)); } } } unique_ptr<char[]> u(new char[syscfg.userreclen]); read_user(1, reinterpret_cast<userrec*>(u.get())); int nu = number_userrecs(); for (int i = 1; i <= nu; i++) { read_user(i, reinterpret_cast<userrec*>(u.get())); if (UINT(u.get(), syscfg.fsoffset)) { if (UCHAR(u.get(), syscfg.fnoffset) >= nn) { UCHAR(u.get(), syscfg.fnoffset)++; write_user(i, reinterpret_cast<userrec*>(u.get())); } } } { net_networks_rec n{}; strcpy(n.name, "NetNet"); n.dir = StrCat("newnet.dir", File::pathSeparatorChar); networks.insert(nn, n); } edit_net(config, networks, nn); return true; }