const string GetCommand(const MenuInstanceData* menu_data) { if (pSecondUserRec->cHotKeys == HOTKEYS_ON) { if (menu_data->header.nNumbers == MENU_NUMFLAG_DIRNUMBER) { write_inst(INST_LOC_XFER, udir[session()->GetCurrentFileArea()].subnum, INST_FLAGS_NONE); return string(mmkey(1, WSession::mmkeyFileAreas)); } else if (menu_data->header.nNumbers == MENU_NUMFLAG_SUBNUMBER) { write_inst(INST_LOC_MAIN, usub[session()->GetCurrentMessageArea()].subnum, INST_FLAGS_NONE); return string(mmkey(0, WSession::mmkeyMessageAreas)); } else { odc[0] = '/'; odc[1] = '\0'; return string(mmkey(2)); } } else { string text; input(&text, 50); return string(text); } }
void do_chains() { int *map = static_cast<int*>(BbsAllocA(GetSession()->max_chains * sizeof(int))); WWIV_ASSERT(map != NULL); if (!map) { return; } GetSession()->localIO()->tleft(true); int mapp = 0; memset(odc, 0, sizeof(odc)); for (int i = 0; i < GetSession()->GetNumberOfChains(); i++) { bool ok = true; chainfilerec c = chains[i]; if ((c.ansir & ansir_ansi) && !okansi()) { ok = false; } if ((c.ansir & ansir_local_only) && GetSession()->using_modem) { ok = false; } if (c.sl > GetSession()->GetEffectiveSl()) { ok = false; } if (c.ar && !GetSession()->GetCurrentUser()->HasArFlag(c.ar)) { ok = false; } if (GetApplication()->HasConfigFlag(OP_FLAGS_CHAIN_REG) && chains_reg && (GetSession()->GetEffectiveSl() < 255)) { chainregrec r = chains_reg[ i ]; if (r.maxage) { if (r.minage > GetSession()->GetCurrentUser()->GetAge() || r.maxage < GetSession()->GetCurrentUser()->GetAge()) { ok = false; } } } if (ok) { map[ mapp++ ] = i; if (mapp < 100) { if ((mapp % 10) == 0) { odc[mapp / 10 - 1] = static_cast< char >('0' + (mapp / 10)); } } } } if (mapp == 0) { GetSession()->bout << "\r\n\n|#5Sorry, no external programs available.\r\n"; free(map); GetSession()->SetMMKeyArea(WSession::mmkeyMessageAreas); return; } show_chains(&mapp, map); bool done = false; GetSession()->SetMMKeyArea(WSession::mmkeyMessageAreas); int start = 0; char *ss = NULL; do { GetSession()->SetMMKeyArea(WSession::mmkeyChains); GetSession()->localIO()->tleft(true); GetSession()->bout.NewLine(); GetSession()->bout << "|#7Which chain (1-" << mapp << ", Q=Quit, ?=List): "; int nChainNumber = -1; if (mapp < 100) { ss = mmkey(2); nChainNumber = atoi(ss); } else { char szChainNumber[ 11 ]; input(szChainNumber, 3); nChainNumber = atoi(szChainNumber); } if (nChainNumber > 0 && nChainNumber <= mapp) { done = true; GetSession()->SetMMKeyArea(WSession::mmkeyChains); GetSession()->bout << "\r\n|#6Please wait...\r\n"; run_chain(map[ nChainNumber - 1 ]); } else if (wwiv::strings::IsEquals(ss, "Q")) { GetSession()->SetMMKeyArea(WSession::mmkeyMessageAreas); done = true; } else if (wwiv::strings::IsEquals(ss, "?")) { show_chains(&mapp, map); } else if (wwiv::strings::IsEquals(ss, "P")) { if (start > 0) { start -= 14; } start = std::max<int>(start, 0); } else if (wwiv::strings::IsEquals(ss, "N")) { if (start + 14 < mapp) { start += 14; } } } while (!hangup && !done); free(map); }
/** Displays the available file areas for the current user. */ void dirlist(int mode) { bool next = false; int oc = session()->GetCurrentConferenceFileArea(); int os = udir[session()->GetCurrentFileArea()].subnum; int tally = 0; int nd = 0; int sn = session()->GetCurrentConferenceFileArea(); int en = session()->GetCurrentConferenceFileArea(); bool done = false; do { bool is = false; bool abort = false; int p = 1; int i = sn; char *ss = nullptr; while (i <= en && uconfdir[i].confnum != -1 && !abort) { size_t i1 = 0; while (i1 < session()->directories.size() && udir[i1].subnum != -1 && !abort) { char s[255]; size_t firstp = 0; if (p && mode == 0) { p = 0; firstp = i1; bout.cls(); if (uconfdir[1].confnum != -1 && okconf(session()->user())) { sprintf(s, " [ %s %c ] [ %s ] ", "Conference", dirconfs[uconfdir[i].confnum].designator, stripcolors(reinterpret_cast<char*>(dirconfs[uconfdir[i].confnum].name))); } else { sprintf(s, " [ %s File Areas ] ", syscfg.systemname); } bout.litebar(s); DisplayHorizontalBar(78, 7); bout << "|#2 Dir Qscan? Directory Name Total Files\r\n"; DisplayHorizontalBar(78, 7); } ++nd; int directory_number = udir[i1].subnum; if (directory_number == 0) { is = true; } std::string scanme = "|#6No "; if (qsc_n[ directory_number / 32 ] & (1L << (directory_number % 32))) { scanme = "|#5Yes"; } dliscan1(directory_number); if (udir[session()->GetCurrentFileArea()].subnum == udir[i1].subnum) { sprintf(s, " |#9%3s |#9\xB3 |#6%3s |#9\xB3|B1|15 %-40.40s |#9\xB3 |#9%4d|B0", udir[i1].keys, scanme.c_str(), session()->directories[directory_number].name, session()->numf); } else { sprintf(s, " |#9%3s |#9\xB3 |#6%3s |#9\xB3 %s%-40.40s |#9\xB3 |#9%4d", udir[i1].keys, scanme.c_str(), (((mode == 1) && (session()->directories[udir[i1].subnum].mask & mask_cdrom)) ? "|#9" : "|#1"), session()->directories[ directory_number ].name, session()->numf); } if (okansi()) { osan(s, &abort, &next); } else { osan(stripcolors(s), &abort, &next); } tally += session()->numf; int lastp = i1++; bout.nl(); if (lines_listed >= session()->screenlinest - 2 && mode == 0) { p = 1; lines_listed = 0; DisplayHorizontalBar(78, 7); bout.bprintf("|#1Select |#9[|#2%d-%d, [Enter]=Next Page, Q=Quit|#9]|#0 : ", is ? firstp : firstp + 1, lastp); ss = mmkey(1, WSession::mmkeyFileAreas, true); if (isdigit(ss[0])) { for (size_t i3 = 0; i3 < session()->directories.size(); i3++) { if (wwiv::strings::IsEquals(udir[i3].keys, ss)) { session()->SetCurrentFileArea(i3); os = udir[session()->GetCurrentFileArea()].subnum; done = true; abort = true; } } } else { switch (ss[0]) { case 'Q': if (okconf(session()->user())) { setuconf(ConferenceType::CONF_DIRS, oc, os); } done = true; abort = true; break; default: bout.backline(); break; } } } } if (nd) { i++; } if (!okconf(session()->user())) { break; } } if (i == 0) { pla("None.", &abort); bout.nl(); } if (!abort && mode == 0) { p = 1; DisplayHorizontalBar(78, 7); if (okconf(session()->user())) { if (uconfdir[1].confnum != -1) { bout.bprintf("|#1Select |#9[|#2%d-%d, J=Join Conference, ?=List Again, Q=Quit|#9]|#0 : ", is ? 0 : 1, is ? nd - 1 : nd); } else { bout.bprintf("|#1Select |#9[|#2%d-%d, ?=List Again, Q=Quit|#9]|#0 : ", is ? 0 : 1, is ? nd - 1 : nd); } } else { bout.bprintf("|#1Select |#9[|#2%d-%d, ?=List Again, Q=Quit|#9]|#0 : ", is ? 0 : 1, is ? nd - 1 : nd); } ss = mmkey(0, true); if (wwiv::strings::IsEquals(ss, "") || wwiv::strings::IsEquals(ss, "Q") || wwiv::strings::IsEquals(ss, "\r")) { if (okconf(session()->user())) { setuconf(ConferenceType::CONF_DIRS, oc, os); } done = true; } if (wwiv::strings::IsEquals(ss, "J")) { if (okconf(session()->user())) { jump_conf(ConferenceType::CONF_DIRS); } sn = en = oc = session()->GetCurrentConferenceFileArea(); nd = i = 0; is = false; } if (isdigit(ss[0])) { for (size_t i3 = 0; i3 < session()->directories.size(); i3++) { if (wwiv::strings::IsEquals(udir[i3].keys, ss)) { session()->SetCurrentFileArea(i3); os = udir[session()->GetCurrentFileArea()].subnum; done = true; } } } nd = 0; } else { if (okconf(session()->user())) { setuconf(ConferenceType::CONF_DIRS, oc, os); } done = true; } } while (!hangup && !done); }
/** * Finds GetSession()->usernum and system number from emailAddress, sets network number as * appropriate. * @param emailAddress The text of the email address. * @param pUserNumber OUT The User Number * @param pSystemmNumber OUT The System Number */ void parse_email_info(const std::string emailAddress, int *pUserNumber, int *pSystemNumber) { char *ss1, onx[20], ch, *mmk; unsigned nUserNumber, nSystemNumber; int i, nv, on, xx, onxi, odci; net_system_list_rec *csne; char szEmailAddress[ 255 ]; strcpy(szEmailAddress, emailAddress.c_str()); *pUserNumber = 0; *pSystemNumber = 0; net_email_name[0] = '\0'; char *ss = strrchr(szEmailAddress, '@'); if (ss == NULL) { nUserNumber = finduser1(szEmailAddress); if (nUserNumber > 0) { *pUserNumber = static_cast< unsigned short >(nUserNumber); } else if (wwiv::strings::IsEquals(szEmailAddress, "SYSOP")) { // Add 4.31 Build3 *pUserNumber = 1; } else { GetSession()->bout << "Unknown user.\r\n"; } } else if (atoi(ss + 1) == 0) { for (i = 0; i < GetSession()->GetMaxNetworkNumber(); i++) { set_net_num(i); if ((WWIV_STRNICMP("internet", GetSession()->GetNetworkName(), 8) == 0) || ((WWIV_STRNICMP("filenet", GetSession()->GetNetworkName(), 7) == 0) && (*pSystemNumber == 32767))) { strcpy(net_email_name, szEmailAddress); for (ss1 = net_email_name; *ss1; ss1++) { if ((*ss1 >= 'A') && (*ss1 <= 'Z')) { *ss1 += 'a' - 'A'; } } *pSystemNumber = 1; break; } } if (i >= GetSession()->GetMaxNetworkNumber()) { GetSession()->bout << "Unknown user.\r\n"; } } else { ss[0] = '\0'; ss = &(ss[1]); i = strlen(szEmailAddress); while (i > 0 && szEmailAddress[i - 1] == ' ') { --i; } szEmailAddress[i] = 0; nUserNumber = atoi(szEmailAddress); if (nUserNumber == 0 && szEmailAddress[0] == '#') { nUserNumber = atoi(szEmailAddress + 1); } if (strchr(szEmailAddress, '@')) { nUserNumber = 0; } nSystemNumber = atoi(ss); ss1 = strchr(ss, '.'); if (ss1) { ss1++; } if (nUserNumber == 0) { strcpy(net_email_name, szEmailAddress); i = strlen(net_email_name); while (i > 0 && net_email_name[i - 1] == ' ') { --i; } net_email_name[i] = '\0'; if (net_email_name[0]) { *pSystemNumber = static_cast< unsigned short >(nSystemNumber); } else { GetSession()->bout << "Unknown user.\r\n"; } } else { *pUserNumber = static_cast< unsigned short >(nUserNumber); *pSystemNumber = static_cast< unsigned short >(nSystemNumber); } if (*pSystemNumber && ss1) { for (i = 0; i < GetSession()->GetMaxNetworkNumber(); i++) { set_net_num(i); if (wwiv::strings::IsEqualsIgnoreCase(ss1, GetSession()->GetNetworkName())) { if (!valid_system(*pSystemNumber)) { GetSession()->bout.NewLine(); GetSession()->bout << "There is no " << ss1 << " @" << *pSystemNumber << ".\r\n\n"; *pSystemNumber = *pUserNumber = 0; } else { if (*pSystemNumber == net_sysnum) { *pSystemNumber = 0; if (*pUserNumber == 0) { *pUserNumber = static_cast< unsigned short >(finduser(net_email_name)); } if (*pUserNumber == 0 || *pUserNumber > 32767) { *pUserNumber = 0; GetSession()->bout << "Unknown user.\r\n"; } } } break; } } if (i >= GetSession()->GetMaxNetworkNumber()) { GetSession()->bout.NewLine(); GetSession()->bout << "This system isn't connected to " << ss1 << "\r\n"; *pSystemNumber = *pUserNumber = 0; } } else if (*pSystemNumber && GetSession()->GetMaxNetworkNumber() > 1) { odc[0] = '\0'; odci = 0; onx[0] = 'Q'; onx[1] = '\0'; onxi = 1; nv = 0; on = GetSession()->GetNetworkNumber(); ss = static_cast<char *>(BbsAllocA(GetSession()->GetMaxNetworkNumber())); WWIV_ASSERT(ss != NULL); xx = -1; for (i = 0; i < GetSession()->GetMaxNetworkNumber(); i++) { set_net_num(i); if (net_sysnum == *pSystemNumber) { xx = i; } else if (valid_system(*pSystemNumber)) { ss[nv++] = static_cast< char >(i); } } set_net_num(on); if (nv == 0) { if (xx != -1) { set_net_num(xx); *pSystemNumber = 0; if (*pUserNumber == 0) { *pUserNumber = static_cast< unsigned short >(finduser(net_email_name)); if (*pUserNumber == 0 || *pUserNumber > 32767) { *pUserNumber = 0; GetSession()->bout << "Unknown user.\r\n"; } } } else { GetSession()->bout.NewLine(); GetSession()->bout << "Unknown system\r\n"; *pSystemNumber = *pUserNumber = 0; } } else if (nv == 1) { set_net_num(ss[0]); } else { GetSession()->bout.NewLine(); for (i = 0; i < nv; i++) { set_net_num(ss[i]); csne = next_system(*pSystemNumber); if (csne) { if (i < 9) { onx[onxi++] = static_cast< char >(i + '1'); onx[onxi] = 0; } else { odci = static_cast< char >((i + 1) / 10); odc[odci - 1] = static_cast< char >(odci + '0'); odc[odci] = 0; } GetSession()->bout << i + 1 << ". " << GetSession()->GetNetworkName() << " (" << csne->name << ")\r\n"; } } GetSession()->bout << "Q. Quit\r\n\n"; GetSession()->bout << "|#2Which network (number): "; if (nv < 9) { ch = onek(onx); if (ch == 'Q') { i = -1; } else { i = ch - '1'; } } else { mmk = mmkey(2); if (*mmk == 'Q') { i = -1; } else { i = atoi(mmk) - 1; } } if (i >= 0 && i < nv) { set_net_num(ss[i]); } else { GetSession()->bout << "\r\n|#6Aborted.\r\n\n"; *pUserNumber = *pSystemNumber = 0; } } free(ss); } else { if (*pSystemNumber == net_sysnum) { *pSystemNumber = 0; if (*pUserNumber == 0) { *pUserNumber = static_cast< unsigned short >(finduser(net_email_name)); } if (*pUserNumber == 0 || *pUserNumber > 32767) { *pUserNumber = 0; GetSession()->bout << "Unknown user.\r\n"; } } else if (!valid_system(*pSystemNumber)) { GetSession()->bout << "\r\nUnknown user.\r\n"; *pSystemNumber = *pUserNumber = 0; } } } }