home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / lora299s.zip / LCFGTXT2.CPP < prev    next >
C/C++ Source or Header  |  1997-04-03  |  99KB  |  2,790 lines

  1.  
  2. // ----------------------------------------------------------------------
  3. // LoraBBS Professional Edition - Version 2.99.20
  4. // Copyright (c) 1996 by Marco Maccaferri. All rights reserved.
  5. //
  6. // History:
  7. //    03/10/95 - Initial coding.
  8. // ----------------------------------------------------------------------
  9.  
  10. #include "_ldefs.h"
  11. #include "msgbase.h"
  12. #include "lorawin.h"
  13.  
  14. short cmd_sel = 0;
  15.  
  16. VOID AddShadow (VOID);
  17. VOID DisplayButton (USHORT y, USHORT x, CHAR *Text, USHORT Shadow);
  18. VOID DisplayTextField (USHORT y, USHORT x, CHAR *Text, USHORT FieldSize, USHORT Size);
  19. VOID GetTextField (USHORT y, USHORT x, CHAR *Text, USHORT FieldSize, USHORT Size);
  20. USHORT MessageBox (PSZ Caption, PSZ Text);
  21. USHORT CFlagsDlg (PSZ title, ULONG *flags);
  22. VOID DisplayFlags (USHORT y, USHORT x, ULONG Flags);
  23. USHORT CSecurityDlg (PSZ title, USHORT *level, ULONG *flags, ULONG *deny_flags);
  24.  
  25. // ----------------------------------------------------------------------
  26.  
  27. typedef struct {
  28.    USHORT Id;
  29.    PSZ    Text;
  30. } MENUCMD;
  31.  
  32. // Moving between menu
  33. MENUCMD MenuCmd1[] = {
  34.    MNU_GOTO,       "Goto menu          ",
  35.    MNU_GOSUB,      "Gosub menu         ",
  36.    MNU_RETURN,     "Return to previous ",
  37.    MNU_CLEARSTACK, "Clear menu stack   ",
  38.    MNU_CLEARGOSUB, "Clear gosub menu   ",
  39.    MNU_CLEARGOTO,  "Clear goto menu    ",
  40.    MNU_RETURNMAIN, "Return to MAIN menu",
  41.    0, NULL
  42. };
  43.  
  44. // Message areas
  45. MENUCMD MenuCmd2[] = {
  46.    MNU_MSGSELECT,       "Change message area      ",
  47.    MNU_MSGDELETE,       "Kill message             ",
  48.    MNU_MSGWRITE,        "Edit new message         ",
  49.    MNU_MSGREPLY,        "Reply to message         ",
  50.    MNU_MSGBRIEFLIST,    "Short message list       ",
  51.    MNU_MSGFORWARD,      "Read next message        ",
  52.    MNU_MSGBACKWARD,     "Read previous message    ",
  53.    MNU_MSGREADNONSTOP,  "Read message non-stop    ",
  54.    MNU_INQUIRETEXT,     "Inquire messages         ",
  55.    MNU_MSGINDIVIDUAL,   "Read individual message  ",
  56.    MNU_MSGTITLELIST,    "Verbose message list     ",
  57.    MNU_MSGLISTNEWAREAS, "List areas w/new messages",
  58.    MNU_MSGREAD,         "Read messages            ",
  59.    MNU_INQUIREPERSONAL, "Inquire personal messages",
  60.    MNU_MSGMODIFY,       "Change message           ",
  61.    MNU_MSGUNRECEIVE,    "Unreceive message        ",
  62.    MNU_MSGREADORIGINAL, "Read original message    ",
  63.    MNU_MSGREADREPLY,    "Read reply message       ",
  64.    MNU_MSGREADCURRENT,  "Read current message     ",
  65.    MNU_TOGGLEKLUDGES,   "Toggle kludges lines     ",
  66.    0, NULL
  67. };
  68.  
  69. // File areas
  70. MENUCMD MenuCmd3[] = {
  71.    MNU_FILENAMELIST, "File list",
  72.    MNU_FILEDOWNLOAD, "Download file",
  73.    MNU_FILETEXTLIST, "Locate files",
  74.    MNU_FILEUPLOAD, "Upload file",
  75.    MNU_FILENEWLIST, "New files list",
  76.    MNU_FILEDOWNLOADANY, "Download from any area",
  77.    MNU_FILEDELETE, "Kill files",
  78.    MNU_FILESELECT, "Change file area",
  79.    MNU_SEARCHFILENAME, "Locate files by name",
  80.    MNU_FILEKEYWORDLIST, "Locate files by keyword",
  81.    MNU_FILEDATELIST, "File list by date",
  82.    MNU_FILEDOWNLOADLIST, "Download list of files",
  83.    MNU_FILEUPLOADUSER, "Upload file to user",
  84.    MNU_FILEDISPLAY, "File Display",
  85.    MNU_ADDTAGGED, "Tag files",
  86.    MNU_DELETETAGGED, "Delete tagged files",
  87.    MNU_LISTTAGGED, "List tagged files",
  88.    MNU_DELETEALLTAGGED, "Delete all tagged files",
  89.    0, NULL
  90. };
  91.  
  92. // User configuration
  93. MENUCMD MenuCmd4[] = {
  94.    MNU_SETLANGUAGE, "Change language",
  95.    MNU_SETPASSWORD, "Set password",
  96.    MNU_TOGGLEANSI, "Toggle ANSI graphics",
  97.    MNU_TOGGLEAVATAR, "Toggle AVATAR graphics",
  98.    MNU_TOGGLECOLOR, "Toggle COLOR codes",
  99.    MNU_TOGGLEHOTKEY, "Toggle hot-keyed menu",
  100.    MNU_SETCOMPANY, "Set company name",
  101.    MNU_SETADDRESS, "Set address",
  102.    MNU_SETCITY, "Set city",
  103.    MNU_SETPHONE, "Set phone number",
  104.    MNU_SETGENDER, "Set gender",
  105.    MNU_TOGGLEFULLSCREEN, "Toggle fullscreen lists",
  106.    MNU_TOGGLEIBMCHARS, "Toggle IBM characters",
  107.    MNU_TOGGLEMOREPROMPT, "Toggle More? prompt",
  108.    MNU_TOGGLESCREENCLEAR, "Toggle screen clear",
  109.    MNU_TOGGLEINUSERLIST, "Toggle in user list",
  110.    MNU_SETARCHIVER, "Set default archiver",
  111.    MNU_SETPROTOCOL, "Set default protocol",
  112.    MNU_SETSIGNATURE, "Set personal signature",
  113.    MNU_SETVIDEOMODE, "Set video mode",
  114.    MNU_TOGGLEFULLED, "Toggle fullscreen editor",
  115.    MNU_TOGGLEFULLREAD, "Toggle fullscreen reader",
  116.    MNU_TOGGLENODISTURB, "Toggle do not disturb flag",
  117.    MNU_TOGGLEMAILCHECK, "Toggle logon mail check",
  118.    MNU_TOGGLEFILECHECK, "Toggle new files check",
  119.    MNU_SETBIRTHDATE, "Set birthdate",
  120.    MNU_SETSCREENLENGTH, "Set screen length",
  121.    MNU_TOGGLERIP, "Toggle RIP graphics",
  122.    0, NULL
  123. };
  124.  
  125. // Personal mail
  126. MENUCMD MenuCmd5[] = {
  127.    MNU_MAILWRITELOCAL,    "Write local mail    ",
  128.    MNU_MAILWRITEINTERNET, "Write Internet mail ",
  129.    MNU_MAILREAD,          "Read mail           ",
  130.    MNU_MAILDELETE,        "Kill mail           ",
  131.    MNU_MAILLIST,          "List mail           ",
  132.    MNU_MAILWRITEFIDONET,  "Write FidoNet mail  ",
  133.    MNU_MAILCHECK,         "Check unread mail   ",
  134.    MNU_MAILNEXT,          "Read next mail      ",
  135.    MNU_MAILPREVIOUS,      "Read previous mail  ",
  136.    MNU_MAILINDIVIDUAL,    "Read individual mail",
  137.    MNU_MAILNONSTOP,       "Read mail non-stop  ",
  138.    0, NULL
  139. };
  140.  
  141. // Offline reader
  142. MENUCMD MenuCmd6[] = {
  143.    MNU_OLRDOWNLOADASCII, "ASCII download    ",
  144.    MNU_OLRDOWNLOADBW,    "BlueWave download ",
  145.    MNU_OLRDOWNLOADQWK,   "QWK download      ",
  146.    MNU_OLRTAGAREA,       "Tag areas         ",
  147.    MNU_OLRREMOVEAREA,    "Untag areas       ",
  148.    MNU_OLRVIEWTAGGED,    "View tagged areas ",
  149.    MNU_OLRUPLOAD,        "Upload replies    ",
  150.    MNU_OLRDOWNLOADPNT,   "PointMail download",
  151.    MNU_OLRRESTRICTDATE,  "Restrict date     ",
  152.    0, NULL
  153. };
  154.  
  155.    // Miscellaneous
  156. MENUCMD MenuCmd7[] = {
  157.    MNU_NULL,        "Display only           ",
  158.    MNU_LOGOFF,      "Logoff                 ",
  159.    MNU_ONLINEUSERS, "Online users           ",
  160.    MNU_DISPLAY,     "Display file (anywhere)",
  161.    MNU_RUNEXTERNAL, "Run external program   ",
  162.    MNU_PRESSENTER,  "Press Enter to Continue",
  163.    MNU_VERSION,     "Version information    ",
  164.    MNU_TELNET,      "Telnet client          ",
  165.    MNU_FINGER,      "Finger                 ",
  166.    MNU_FTP,         "FTP client             ",
  167.    MNU_IRC,         "IRC client             ",
  168.    MNU_APPENDMENU,  "Append menu            ",
  169. //   MNU_GOPHER, "Gopher Client",
  170.    0, NULL
  171. };
  172.  
  173. VOID AddCmdShadow (VOID)
  174. {
  175.    wtitle (" Menu Commands ", TCENTER, WHITE|_CYAN);
  176.    wshadow (DGREY|_BLACK);
  177. }
  178.  
  179. USHORT CSelectColorDlg (USHORT color)
  180. {
  181.    short x, y, i;
  182.  
  183.    wopen (7, 30, 16, 47, 1, WHITE|_LGREY, WHITE|_LGREY);
  184.    wshadow (DGREY|_BLACK);
  185.    wtitle (" Colors ", TCENTER, WHITE|_LGREY);
  186.  
  187.    for (y = 0; y < 8; y++) {
  188.       for (x = 0; x < 16; x++)
  189.          wprints (y, x, (short)(x | (y << 4)), "");
  190.    }
  191.  
  192.    x = (short)(color & 0x0F);
  193.    y = (short)((color & 0xF0) >> 4);
  194.  
  195.    wprints (y, x, LGREY|_BLACK, "");
  196.  
  197.    for (;;) {
  198.       i = (short)getxch ();
  199.       if ( (i & 0xFF) != 0 )
  200.          i &= 0xFF;
  201.  
  202.       switch (i) {
  203.          case 0x4800:
  204.             if (y > 1) {
  205.                wprints (y, x, (short)(x | (y << 4)), "");
  206.                y--;
  207.                wprints (y, x, LGREY|_BLACK, "");
  208.             }
  209.             break;
  210.  
  211.          case 0x5000:
  212.             if (y < 8) {
  213.                wprints (y, x, (short)(x | (y << 4)), "");
  214.                y++;
  215.                wprints (y, x, LGREY|_BLACK, "");
  216.             }
  217.             break;
  218.  
  219.          case 0x4B00:
  220.             if (x > 1) {
  221.                wprints (y, x, (short)(x | (y << 4)), "");
  222.                x--;
  223.                wprints (y, x, LGREY|_BLACK, "");
  224.             }
  225.             break;
  226.  
  227.          case 0x4D00:
  228.             if (x < 16) {
  229.                wprints (y, x, (short)(x | (y << 4)), "");
  230.                x++;
  231.                wprints (y, x, LGREY|_BLACK, "");
  232.             }
  233.             break;
  234.       }
  235.  
  236.       if (i == 0x1B) {
  237.          color = (short)0xFFFFU;
  238.          break;
  239.       }
  240.       else if (i == 0x0D) {
  241.          color = (short)(x | (y << 4));
  242.          break;
  243.       }
  244.    }
  245.  
  246.    wclose ();
  247.    return (color);
  248. }
  249.  
  250. USHORT CMenuPromptDlg (class TMenu *Menu)
  251. {
  252.    short menu_sel = 1;
  253.    USHORT r, RetVal = FALSE;
  254.    class TMenu *Data;
  255.  
  256.    Data = new TMenu;
  257.    strcpy (Data->Prompt, Menu->Prompt);
  258.    Data->PromptColor = Menu->PromptColor;
  259.    Data->PromptHilight = Menu->PromptHilight;
  260.  
  261.    wopen (8, 4, 15, 74, 1, WHITE|_LGREY, WHITE|_LGREY);
  262.    wshadow (DGREY|_BLACK);
  263.    wtitle (" Menu Prompt ", TCENTER, WHITE|_LGREY);
  264.  
  265.    DisplayButton (4,  2, "   Ok   ");
  266.    DisplayButton (4, 12, " Cancel ");
  267.  
  268.    do {
  269.       wmenubegc ();
  270.       wmenuitem (0, 1, " Display    ", 0, 1, 0, NULL, 0, 0);
  271.       wmenuitem (1, 1, " Color      ", 0, 2, 0, NULL, 0, 0);
  272.       wmenuitem (2, 1, " Hilight    ", 0, 3, 0, NULL, 0, 0);
  273.  
  274.       wmenuitem (4,  2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  275.       wmenuitem (4, 12, " Cancel ", 'C', 995, 0, NULL, 0, 0);
  276.  
  277.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  278.  
  279.       DisplayTextField (0, 14, Data->Prompt, sizeof (Data->Prompt), 54);
  280.       wprints (1, 14, Data->PromptColor, "Sample color text");
  281.       wprints (2, 14, Data->PromptHilight, "Sample color text");
  282.  
  283.       switch (menu_sel = wmenuget ()) {
  284.          case 1:
  285.             GetTextField (0, 14, Data->Prompt, sizeof (Data->Prompt), 54);
  286.             break;
  287.          case 2:
  288.             if ((r = CSelectColorDlg (Data->PromptColor)) != 0xFFFFU)
  289.                Data->Color = (UCHAR)r;
  290.             break;
  291.          case 3:
  292.             if ((r = CSelectColorDlg (Data->PromptHilight)) != 0xFFFFU)
  293.                Data->Hilight = (UCHAR)r;
  294.             break;
  295.          case 996:
  296.             strcpy (Menu->Prompt, Data->Prompt);
  297.             Menu->PromptColor = Data->PromptColor;
  298.             Menu->PromptHilight = Data->PromptHilight;
  299.             break;
  300.       }
  301.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  302.  
  303.    wclose ();
  304.  
  305.    if (Data != NULL)
  306.       delete Data;
  307.  
  308.    return (RetVal);
  309. }
  310.  
  311. VOID CommandSelection (VOID)
  312. {
  313.    struct _item_t *item;
  314.  
  315.    item = wmenuicurr ();
  316.    cmd_sel = item->tagid;
  317. }
  318.  
  319. USHORT CMenuEditorDlg (PSZ pszFile)
  320. {
  321.    short i, menu_sel = 1, maxlen, start;
  322.    CHAR Temp[48], *p;
  323.    USHORT r, RetVal = FALSE;
  324.    MENUCMD *MenuCmd;
  325.    class TCollection List;
  326.    class TMenu *Data;
  327.  
  328.    Data = new TMenu;
  329.    Data->Load (pszFile);
  330.    if (Data->First () == FALSE)
  331.       Data->New ();
  332.  
  333.    wopen (5, 2, 19, 76, 1, WHITE|_LGREY, WHITE|_LGREY);
  334.    wshadow (DGREY|_BLACK);
  335.    wtitle (" Menu Editor ", TCENTER, WHITE|_LGREY);
  336.  
  337.    DisplayButton (9, 22, " Delete ");
  338.    DisplayButton (9, 32, " Prompt ");
  339.    DisplayButton (9, 52, "    Security     ");
  340.  
  341.    DisplayButton (11,  2, "  Save  ");
  342.    DisplayButton (11, 12, "  Add   ");
  343.    DisplayButton (11, 22, " Delete ");
  344.    DisplayButton (11, 32, "  List  ");
  345.    DisplayButton (11, 52, "  Prev. ");
  346.    DisplayButton (11, 62, "  Next  ");
  347.  
  348.    do {
  349.       wmenubegc ();
  350.       wmenuitem (0, 1, " Key        ", 0, 1, 0, NULL, 0, 0);
  351.       wmenuitem (1, 1, " Display    ", 0, 2, 0, NULL, 0, 0);
  352.       wmenuitem (2, 1, " Color      ", 0, 3, 0, NULL, 0, 0);
  353.       wmenuitem (3, 1, " Hilight    ", 0, 4, 0, NULL, 0, 0);
  354.       wmenuitem (4, 1, " Command    ", 0, 5, 0, NULL, 0, 0);
  355.       wmenuitem (5, 1, " Argument   ", 0, 6, 0, NULL, 0, 0);
  356.       wmenuitem (6, 1, " Automatic  ", 0, 7, 0, NULL, 0, 0);
  357.       wmenuitem (7, 1, " First Time ", 0, 8, 0, NULL, 0, 0);
  358.  
  359.       wmenuitem (9, 22, " Delete ", 'D', 121, 0, NULL, 0, 0);
  360.       wmenuitem (9, 32, " Prompt ", 'r', 122, 0, NULL, 0, 0);
  361.       wmenuitem (9, 52, "    Security      ", 'S', 123, 0, NULL, 0, 0);
  362.  
  363.       wmenuitem (11,  2, "  Save  ", 'v', 996, 0, NULL, 0, 0);
  364.       wmenuitem (11, 12, "  Add   ", 'A', 115, 0, NULL, 0, 0);
  365.       wmenuitem (11, 22, " Insert ", 'I', 116, 0, NULL, 0, 0);
  366.       wmenuitem (11, 32, "  List  ", 'L', 117, 0, NULL, 0, 0);
  367.       wmenuitem (11, 52, "  Prev. ", 'P', 118, 0, NULL, 0, 0);
  368.       wmenuitem (11, 62, "  Next  ", 'N', 119, 0, NULL, 0, 0);
  369.  
  370.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  371.  
  372.       DisplayTextField (0, 14, Data->Key, sizeof (Data->Key), 15);
  373.       DisplayTextField (1, 14, Data->Display, sizeof (Data->Display), 58);
  374.       wprints (2, 14, Data->Color, "Sample color text");
  375.       wprints (3, 14, Data->Hilight, "Sample color text");
  376.       p = "???";
  377.       for (i = 0; MenuCmd1[i].Text != NULL; i++) {
  378.          if (MenuCmd1[i].Id == Data->Command) {
  379.             sprintf (Temp, "%d - %s", MenuCmd1[i].Id, MenuCmd1[i].Text);
  380.             p = Temp;
  381.             break;
  382.          }
  383.       }
  384.       for (i = 0; MenuCmd2[i].Text != NULL; i++) {
  385.          if (MenuCmd2[i].Id == Data->Command) {
  386.             sprintf (Temp, "%d - %s", MenuCmd2[i].Id, MenuCmd2[i].Text);
  387.             p = Temp;
  388.             break;
  389.          }
  390.       }
  391.       for (i = 0; MenuCmd3[i].Text != NULL; i++) {
  392.          if (MenuCmd3[i].Id == Data->Command) {
  393.             sprintf (Temp, "%d - %s", MenuCmd3[i].Id, MenuCmd3[i].Text);
  394.             p = Temp;
  395.             break;
  396.          }
  397.       }
  398.       for (i = 0; MenuCmd4[i].Text != NULL; i++) {
  399.          if (MenuCmd4[i].Id == Data->Command) {
  400.             sprintf (Temp, "%d - %s", MenuCmd4[i].Id, MenuCmd4[i].Text);
  401.             p = Temp;
  402.             break;
  403.          }
  404.       }
  405.       for (i = 0; MenuCmd5[i].Text != NULL; i++) {
  406.          if (MenuCmd5[i].Id == Data->Command) {
  407.             sprintf (Temp, "%d - %s", MenuCmd5[i].Id, MenuCmd5[i].Text);
  408.             p = Temp;
  409.             break;
  410.          }
  411.       }
  412.       for (i = 0; MenuCmd6[i].Text != NULL; i++) {
  413.          if (MenuCmd6[i].Id == Data->Command) {
  414.             sprintf (Temp, "%d - %s", MenuCmd6[i].Id, MenuCmd6[i].Text);
  415.             p = Temp;
  416.             break;
  417.          }
  418.       }
  419.       for (i = 0; MenuCmd7[i].Text != NULL; i++) {
  420.          if (MenuCmd7[i].Id == Data->Command) {
  421.             sprintf (Temp, "%d - %s", MenuCmd7[i].Id, MenuCmd7[i].Text);
  422.             p = Temp;
  423.             break;
  424.          }
  425.       }
  426.       DisplayTextField (4, 14, p, 35, 35);
  427.       DisplayTextField (5, 14, Data->Argument, sizeof (Data->Argument), 58);
  428.       wprints (6, 14, WHITE|_BLUE, (Data->Automatic == TRUE) ? "Yes" : "No ");
  429.       wprints (7, 14, WHITE|_BLUE, (Data->FirstTime == TRUE) ? "Yes" : "No ");
  430.  
  431.       switch (menu_sel = wmenuget ()) {
  432.          case 1:
  433.             GetTextField (0, 14, Data->Key, sizeof (Data->Key), 15);
  434.             break;
  435.          case 2:
  436.             GetTextField (1, 14, Data->Display, sizeof (Data->Display), 58);
  437.             break;
  438.          case 3:
  439.             if ((r = CSelectColorDlg (Data->Color)) != 0xFFFFU)
  440.                Data->Color = (UCHAR)r;
  441.             break;
  442.          case 4:
  443.             if ((r = CSelectColorDlg (Data->Hilight)) != 0xFFFFU)
  444.                Data->Hilight = (UCHAR)r;
  445.             break;
  446.          case 5:
  447.             List.Clear ();
  448.             start = maxlen = 0;
  449.  
  450.             wmenubeg (7, 25, 15, 48, 3, BLACK|_LGREY, BLACK|_LGREY, AddShadow);
  451.             wmenuitem (0, 0, " Moving between menus ", 0, 901, 0, NULL, 0, 0);
  452.                maxlen = 0;
  453.                MenuCmd = MenuCmd1;
  454.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  455.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  456.                   if (maxlen < strlen (Temp))
  457.                      maxlen = (short)strlen (Temp);
  458.                }
  459.                wmenubeg (5, 40, (short)(5 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  460.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  461.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  462.                   List.Add (Temp);
  463.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  464.                }
  465.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  466.             wmenuitem (1, 0, " Message areas        ", 0, 902, 0, NULL, 0, 0);
  467.                maxlen = 0;
  468.                MenuCmd = MenuCmd2;
  469.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  470.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  471.                   if (maxlen < strlen (Temp))
  472.                      maxlen = (short)strlen (Temp);
  473.                }
  474.                wmenubeg (2, 40, (short)(2 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  475.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  476.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  477.                   List.Add (Temp);
  478.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  479.                }
  480.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  481.             wmenuitem (2, 0, " File areas           ", 0, 903, 0, NULL, 0, 0);
  482.                maxlen = 0;
  483.                MenuCmd = MenuCmd3;
  484.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  485.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  486.                   if (maxlen < strlen (Temp))
  487.                      maxlen = (short)strlen (Temp);
  488.                }
  489.                wmenubeg (3, 40, (short)(3 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  490.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  491.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  492.                   List.Add (Temp);
  493.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  494.                }
  495.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  496.             wmenuitem (3, 0, " User configuration   ", 0, 904, 0, NULL, 0, 0);
  497.                maxlen = 0;
  498.                MenuCmd = MenuCmd4;
  499.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  500.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  501.                   if (maxlen < strlen (Temp))
  502.                      maxlen = (short)strlen (Temp);
  503.                }
  504.                wmenubeg (2, 40, (short)(2 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  505.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  506.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  507.                   List.Add (Temp);
  508.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  509.                }
  510.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  511.             wmenuitem (4, 0, " Personal mail        ", 0, 905, 0, NULL, 0, 0);
  512.                maxlen = 0;
  513.                MenuCmd = MenuCmd5;
  514.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  515.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  516.                   if (maxlen < strlen (Temp))
  517.                      maxlen = (short)strlen (Temp);
  518.                }
  519.                wmenubeg (5, 40, (short)(5 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  520.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  521.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  522.                   List.Add (Temp);
  523.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  524.                }
  525.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  526.             wmenuitem (5, 0, " Offline reader       ", 0, 906, 0, NULL, 0, 0);
  527.                maxlen = 0;
  528.                MenuCmd = MenuCmd6;
  529.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  530.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  531.                   if (maxlen < strlen (Temp))
  532.                      maxlen = (short)strlen (Temp);
  533.                }
  534.                wmenubeg (6, 40, (short)(6 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  535.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  536.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  537.                   List.Add (Temp);
  538.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  539.                }
  540.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  541.             wmenuitem (6, 0, " Miscellaneous        ", 0, 907, 0, NULL, 0, 0);
  542.                maxlen = 0;
  543.                MenuCmd = MenuCmd7;
  544.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  545.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  546.                   if (maxlen < strlen (Temp))
  547.                      maxlen = (short)strlen (Temp);
  548.                }
  549.                wmenubeg (5, 40, (short)(5 + i + 1), (short)(40 + maxlen + 1), 3, RED|_LGREY, BLUE|_LGREY, AddShadow);
  550.                for (i = 0; MenuCmd[i].Text != NULL; i++) {
  551.                   sprintf (Temp, " %3d - %s ", MenuCmd[i].Id, MenuCmd[i].Text);
  552.                   List.Add (Temp);
  553.                   wmenuitem ( i, 0, (PSZ)List.Value (), 0, MenuCmd[i].Id, M_CLALL, CommandSelection, 0, 0);
  554.                }
  555.                wmenuend (MenuCmd[0].Id, M_PD|M_SAVE, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  556.             wmenuend (901, M_VERT, 0, 0, BLUE|_LGREY, WHITE|_LGREY, DGREY|_LGREY, YELLOW|_BLACK);
  557.  
  558.             if (wmenuget () != -1) {
  559.                for (i = 0; MenuCmd1[i].Text != NULL; i++) {
  560.                   if (MenuCmd1[i].Id == cmd_sel) {
  561.                      Data->Command = MenuCmd1[i].Id;
  562.                      break;
  563.                   }
  564.                }
  565.                for (i = 0; MenuCmd2[i].Text != NULL; i++) {
  566.                   if (MenuCmd2[i].Id == cmd_sel) {
  567.                      Data->Command = MenuCmd2[i].Id;
  568.                      break;
  569.                   }
  570.                }
  571.                for (i = 0; MenuCmd3[i].Text != NULL; i++) {
  572.                   if (MenuCmd3[i].Id == cmd_sel) {
  573.                      Data->Command = MenuCmd3[i].Id;
  574.                      break;
  575.                   }
  576.                }
  577.                for (i = 0; MenuCmd4[i].Text != NULL; i++) {
  578.                   if (MenuCmd4[i].Id == cmd_sel) {
  579.                      Data->Command = MenuCmd4[i].Id;
  580.                      break;
  581.                   }
  582.                }
  583.                for (i = 0; MenuCmd5[i].Text != NULL; i++) {
  584.                   if (MenuCmd5[i].Id == cmd_sel) {
  585.                      Data->Command = MenuCmd5[i].Id;
  586.                      break;
  587.                   }
  588.                }
  589.                for (i = 0; MenuCmd6[i].Text != NULL; i++) {
  590.                   if (MenuCmd6[i].Id == cmd_sel) {
  591.                      Data->Command = MenuCmd6[i].Id;
  592.                      break;
  593.                   }
  594.                }
  595.                for (i = 0; MenuCmd7[i].Text != NULL; i++) {
  596.                   if (MenuCmd7[i].Id == cmd_sel) {
  597.                      Data->Command = MenuCmd7[i].Id;
  598.                      break;
  599.                   }
  600.                }
  601.             }
  602.             break;
  603.          case 6:
  604.             GetTextField (5, 14, Data->Argument, sizeof (Data->Argument), 58);
  605.             break;
  606.          case 7:
  607.             Data->Automatic = (Data->Automatic == TRUE) ? FALSE : TRUE;
  608.             break;
  609.          case 8:
  610.             Data->FirstTime = (Data->FirstTime == TRUE) ? FALSE : TRUE;
  611.             break;
  612.          case 115:
  613.             Data->New ();
  614.             Data->Add ();
  615.             break;
  616.          case 116:
  617.             Data->New ();
  618.             Data->Insert ();
  619.             break;
  620.          case 118:
  621.             Data->Update ();
  622.             Data->Previous ();
  623.             break;
  624.          case 119:
  625.             Data->Update ();
  626.             Data->Next ();
  627.             break;
  628.          case 121:
  629.             if (MessageBox ("Delete Item", "Are you really sure ?") == TRUE)
  630.                Data->Delete ();
  631.             break;
  632.          case 122:
  633.             CMenuPromptDlg (Data);
  634.             break;
  635.          case 123:
  636.             CSecurityDlg (" Item Security ", &Data->Level, &Data->AccessFlags, &Data->DenyFlags);
  637.             break;
  638.          case 996:
  639.             Data->Update ();
  640.             Data->Save (pszFile);
  641.             break;
  642.       }
  643.    } while (menu_sel != -1);
  644.  
  645.    wclose ();
  646.  
  647.    if (Data != NULL)
  648.       delete Data;
  649.  
  650.    return (RetVal);
  651. }
  652.  
  653. USHORT CBBSGeneralDlg (VOID)
  654. {
  655.    short menu_sel = 996;
  656.    USHORT RetVal = FALSE;
  657.    CHAR Temp[16];
  658.  
  659.    wopen (5, 3, 20, 75, 1, WHITE|_LGREY, WHITE|_LGREY);
  660.    wshadow (DGREY|_BLACK);
  661.    wtitle (" General BBS Options ", TCENTER, WHITE|_LGREY);
  662.  
  663.    DisplayButton (12, 2, "   Ok   ");
  664.    DisplayButton (12, 12, " Cancel ");
  665.    DisplayButton (12, 22, "  Help  ");
  666.  
  667.    do {
  668.       wmenubegc ();
  669.       wmenuitem (0, 1, " Users File        ", 0, 1, 0, NULL, 0, 0);
  670.       wmenuitem (1, 1, " Menu Directory    ", 0, 2, 0, NULL, 0, 0);
  671.       wmenuitem (2, 1, " General Text Dir. ", 0, 3, 0, NULL, 0, 0);
  672.       wmenuitem (3, 1, " Home Directory    ", 0, 4, 0, NULL, 0, 0);
  673.       wmenuitem (4, 1, " E-Mail Storage    ", 0, 5, 0, NULL, 0, 0);
  674.       wmenuitem (4, 38, " Board ", 0, 10, 0, NULL, 0, 0);
  675.       wmenuitem (5, 1, " E-Mail Path       ", 0, 6, 0, NULL, 0, 0);
  676.       wmenuitem (6, 1, " Main Menu         ", 0, 7, 0, NULL, 0, 0);
  677.       wmenuitem (7, 1, " External editor   ", 0, 11, 0, NULL, 0, 0);
  678.       wmenuitem (8, 1, " Editor command    ", 0, 12, 0, NULL, 0, 0);
  679.       wmenuitem (9, 1, " ANSI at Logon     ", 0, 8, 0, NULL, 0, 0);
  680.       wmenuitem (10, 1, " IEMSI Logins      ", 0, 9, 0, NULL, 0, 0);
  681.       wmenuitem (12, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  682.       wmenuitem (12, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  683.       wmenuitem (12, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  684.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  685.  
  686.       DisplayTextField (0, 21, Cfg->UserFile, sizeof (Cfg->UserFile), 49);
  687.       DisplayTextField (1, 21, Cfg->MenuPath, sizeof (Cfg->MenuPath), 49);
  688.       DisplayTextField (2, 21, Cfg->TextFiles, sizeof (Cfg->TextFiles), 49);
  689.       DisplayTextField (3, 21, Cfg->UsersHomePath, sizeof (Cfg->UsersHomePath), 49);
  690.       switch (Cfg->MailStorage) {
  691.          case ST_JAM:
  692.             wprints (4, 21, WHITE|_BLUE, "JAM             ");
  693.             break;
  694.          case ST_SQUISH:
  695.             wprints (4, 21, WHITE|_BLUE, "Squish          ");
  696.             break;
  697.          case ST_FIDO:
  698.             wprints (4, 21, WHITE|_BLUE, "Fido *.MSG      ");
  699.             break;
  700.          case ST_ADEPT:
  701.             wprints (4, 21, WHITE|_BLUE, "AdeptXBBS       ");
  702.             break;
  703.          case ST_HUDSON:
  704.             wprints (4, 21, WHITE|_BLUE, "Hudson (QBBS)   ");
  705.             break;
  706.       }
  707.       sprintf (Temp, "%u", Cfg->MailBoard);
  708.       DisplayTextField (4, 46, Temp, 5, 5);
  709.       DisplayTextField (5, 21, Cfg->MailPath, sizeof (Cfg->MailPath), 49);
  710.       DisplayTextField (6, 21, Cfg->MainMenu, sizeof (Cfg->MainMenu), 49);
  711.       wprints (7, 21, WHITE|_BLUE, (Cfg->ExternalEditor == TRUE) ? "Yes" : "No ");
  712.       DisplayTextField (8, 21, Cfg->EditorCmd, sizeof (Cfg->EditorCmd), 49);
  713.       if (Cfg->Ansi == NO)
  714.          wprints (9, 21, WHITE|_BLUE, "No  ");
  715.       else if (Cfg->Ansi == YES)
  716.          wprints (9, 21, WHITE|_BLUE, "Yes ");
  717.       else if (Cfg->Ansi == AUTO)
  718.          wprints (9, 21, WHITE|_BLUE, "Auto");
  719.       wprints (10, 21, WHITE|_BLUE, (Cfg->IEMSI == TRUE) ? "Yes" : "No ");
  720.  
  721.       switch (menu_sel = wmenuget ()) {
  722.          case 1:
  723.             GetTextField (0, 21, Cfg->UserFile, sizeof (Cfg->UserFile), 49);
  724.             break;
  725.          case 2:
  726.             GetTextField (1, 21, Cfg->MenuPath, sizeof (Cfg->MenuPath), 49);
  727.             break;
  728.          case 3:
  729.             GetTextField (2, 21, Cfg->TextFiles, sizeof (Cfg->TextFiles), 49);
  730.             break;
  731.          case 4:
  732.             GetTextField (3, 21, Cfg->UsersHomePath, sizeof (Cfg->UsersHomePath), 49);
  733.             break;
  734.          case 5:
  735.             switch (Cfg->MailStorage) {
  736.                case ST_JAM:
  737.                   Cfg->MailStorage = ST_SQUISH;
  738.                   break;
  739.                case ST_SQUISH:
  740.                   Cfg->MailStorage = ST_FIDO;
  741.                   break;
  742.                case ST_FIDO:
  743.                   Cfg->MailStorage = ST_ADEPT;
  744.                   break;
  745.                case ST_ADEPT:
  746.                   Cfg->MailStorage = ST_JAM;
  747.                   break;
  748.                case ST_HUDSON:
  749.                   Cfg->MailStorage = ST_HUDSON;
  750.                   break;
  751.             }
  752.             break;
  753.          case 6:
  754.             GetTextField (5, 21, Cfg->MailPath, sizeof (Cfg->MailPath), 49);
  755.             break;
  756.          case 7:
  757.             GetTextField (6, 21, Cfg->MainMenu, sizeof (Cfg->MainMenu), 49);
  758.             break;
  759.          case 8:
  760.             if (Cfg->Ansi == NO)
  761.                Cfg->Ansi = YES;
  762.             else if (Cfg->Ansi == YES)
  763.                Cfg->Ansi = AUTO;
  764.             else if (Cfg->Ansi == AUTO)
  765.                Cfg->Ansi = NO;
  766.             break;
  767.          case 9:
  768.             Cfg->IEMSI = (Cfg->IEMSI == TRUE) ? FALSE : TRUE;
  769.             break;
  770.          case 10:
  771.             sprintf (Temp, "%u", Cfg->MailBoard);
  772.             GetTextField (4, 46, Temp, 5, 5);
  773.             Cfg->MailBoard = (USHORT)atoi (Temp);
  774.             break;
  775.          case 11:
  776.             Cfg->ExternalEditor = (Cfg->ExternalEditor == TRUE) ? FALSE : TRUE;
  777.             break;
  778.          case 12:
  779.             GetTextField (8, 21, Cfg->EditorCmd, sizeof (Cfg->EditorCmd), 49);
  780.             break;
  781.          case 996:
  782.             RetVal = TRUE;
  783.             break;
  784.          case 997:
  785.             RetVal = FALSE;
  786.             break;
  787.       }
  788.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  789.  
  790.    wclose ();
  791.  
  792.    return (RetVal);
  793. }
  794.  
  795. // ----------------------------------------------------------------------
  796.  
  797. USHORT CAddFileDlg (PSZ Key, PSZ Description)
  798. {
  799.    short menu_sel = 996;
  800.    USHORT RetVal = FALSE;
  801.  
  802.    wopen (9, 4, 15, 75, 1, WHITE|_LGREY, WHITE|_LGREY);
  803.    wshadow (DGREY|_BLACK);
  804.    wtitle (" Add File Area ", TCENTER, WHITE|_LGREY);
  805.  
  806.    DisplayButton (3, 2, "   Ok   ");
  807.    DisplayButton (3, 12, " Cancel ");
  808.    DisplayButton (3, 22, "  Help  ");
  809.  
  810.    do {
  811.       wmenubegc ();
  812.       wmenuitem (0, 1, " Key         ", 0, 1, 0, NULL, 0, 0);
  813.       wmenuitem (1, 1, " Description ", 0, 2, 0, NULL, 0, 0);
  814.       wmenuitem (3, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  815.       wmenuitem (3, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  816.       wmenuitem (3, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  817.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  818.  
  819.       DisplayTextField (0, 15, Key, 15, 15);
  820.       DisplayTextField (1, 15, Description, 54, 54);
  821.  
  822.       switch (menu_sel = wmenuget ()) {
  823.          case 1:
  824.             GetTextField (0, 15, Key, 15, 15);
  825.             break;
  826.          case 2:
  827.             GetTextField (1, 15, Description, 54, 54);
  828.             break;
  829.          case 996:
  830.             RetVal = TRUE;
  831.             break;
  832.          case 997:
  833.             RetVal = FALSE;
  834.             break;
  835.       }
  836.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  837.  
  838.    wclose ();
  839.  
  840.    return (RetVal);
  841. }
  842.  
  843. USHORT CFileListDlg (PSZ key, PSZ search)
  844. {
  845.    short i, start = 0;
  846.    CHAR Temp[128], *p, **Array;
  847.    USHORT RetVal = FALSE, Found = TRUE;
  848.    class TFileData *Data;
  849.    class TCollection List;
  850.  
  851.    wopen (7, 2, 23, 77, 1, WHITE|_LGREY, WHITE|_LGREY);
  852.    wshadow (DGREY|_BLACK);
  853.    wtitle (" File Areas List ", TCENTER, WHITE|_LGREY);
  854.  
  855.    sprintf (Temp, " %-15.15s %5s %5s %5s %-38.38s ", "Key", "Level", "Dnl.L", "Upl.L", "Description");
  856.    wprints (0, 0, YELLOW|_LGREY, Temp);
  857.  
  858.    if (search != NULL)
  859.       strupr (search);
  860.  
  861.    Data = new TFileData (Cfg->SystemPath);
  862.    if (Data->First () == TRUE) {
  863.       i = 0;
  864.       List.Clear ();
  865.       do {
  866.          if (search != NULL) {
  867.             Found = FALSE;
  868.             strcpy (Temp, Data->Key);
  869.             if (strstr (strupr (Temp), search) != NULL)
  870.                Found = TRUE;
  871.             else {
  872.                strcpy (Temp, Data->Display);
  873.                if (strstr (strupr (Temp), search) != NULL)
  874.                   Found = TRUE;
  875.                else {
  876.                   strcpy (Temp, Data->EchoTag);
  877.                   if (strstr (strupr (Temp), search) != NULL)
  878.                      Found = TRUE;
  879.                }
  880.             }
  881.          }
  882.          if (Found == TRUE) {
  883.             sprintf (Temp, " %-15.15s %5u %5u %5u %-38.38s ", Data->Key, Data->Level, Data->DownloadLevel, Data->UploadLevel, Data->Display);
  884.             List.Add (Temp);
  885.             if (!strcmp (Data->Key, key))
  886.                start = i;
  887.             i++;
  888.          }
  889.       } while (Data->Next () == TRUE);
  890.  
  891.       if (List.Elements > 0) {
  892.          i = 0;
  893.          Array = (CHAR **)malloc ((List.Elements + 1) * sizeof (CHAR *));
  894.          if ((p = (CHAR *)List.First ()) != NULL)
  895.             do {
  896.                Array[i++] = p;
  897.             } while ((p = (CHAR *)List.Next ()) != NULL);
  898.          Array[i] = NULL;
  899.          if ((i = wpickstr (9, 3, 22, 76, 5, WHITE|_LGREY, WHITE|_LGREY, WHITE|_BLUE, Array, start, NULL)) != -1) {
  900.             p = Array[i] + 1;
  901.             p[15] = '\0';
  902.             strcpy (key, strtrim (p));
  903.             RetVal = TRUE;
  904.          }
  905.          if (Array != NULL)
  906.             free (Array);
  907.       }
  908.       else
  909.          getxch ();
  910.    }
  911.    else
  912.       getxch ();
  913.  
  914.    wclose ();
  915.  
  916.    if (Data != NULL)
  917.       delete Data;
  918.  
  919.    return (RetVal);
  920. }
  921.  
  922. USHORT CFileSecurityDlg (class TFileData *Data)
  923. {
  924.    short menu_sel = 1;
  925.    CHAR Temp[48];
  926.    USHORT RetVal = FALSE, Level, DownloadLevel, UploadLevel;
  927.    ULONG AccessFlags, DenyFlags, DownloadFlags, DenyDownloadFlags;
  928.    ULONG UploadFlags, DenyUploadFlags;
  929.  
  930.    Level = Data->Level;
  931.    AccessFlags = Data->AccessFlags;
  932.    DenyFlags = Data->DenyFlags;
  933.    DownloadLevel = Data->DownloadLevel;
  934.    DownloadFlags = Data->DownloadFlags;
  935.    DenyDownloadFlags = Data->DownloadDenyFlags;
  936.    UploadLevel = Data->UploadLevel;
  937.    UploadFlags = Data->UploadFlags;
  938.    DenyUploadFlags = Data->UploadDenyFlags;
  939.  
  940.    wopen (6, 14, 21, 65, 1, WHITE|_LGREY, WHITE|_LGREY);
  941.    wshadow (DGREY|_BLACK);
  942.    wtitle (" File Security ", TCENTER, WHITE|_LGREY);
  943.  
  944.    DisplayButton (12,  2, "   Ok   ");
  945.    DisplayButton (12, 12, " Cancel ");
  946.  
  947.    do {
  948.       wmenubegc ();
  949.       wprints (0, 1, WHITE|_LGREY, "Access Security");
  950.       wmenuitem (0, 22, " Level      ", 0, 1, 0, NULL, 0, 0);
  951.       wmenuitem (1, 1, " Flags      ", 0, 2, 0, NULL, 0, 0);
  952.       wmenuitem (2, 1, " Deny Flags ", 0, 3, 0, NULL, 0, 0);
  953.  
  954.       wprints (4, 1, WHITE|_LGREY, "Download Security");
  955.       wmenuitem (4, 22, " Level      ", 0, 4, 0, NULL, 0, 0);
  956.       wmenuitem (5, 1, " Flags      ", 0, 5, 0, NULL, 0, 0);
  957.       wmenuitem (6, 1, " Deny Flags ", 0, 6, 0, NULL, 0, 0);
  958.  
  959.       wprints (8, 1, WHITE|_LGREY, "Upload Security");
  960.       wmenuitem (8, 22, " Level      ", 0, 7, 0, NULL, 0, 0);
  961.       wmenuitem (9, 1, " Flags      ", 0, 8, 0, NULL, 0, 0);
  962.       wmenuitem (10, 1, " Deny Flags ", 0, 9, 0, NULL, 0, 0);
  963.  
  964.       wmenuitem (12,  2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  965.       wmenuitem (12, 12, " Cancel ", 'C', 995, 0, NULL, 0, 0);
  966.  
  967.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  968.  
  969.       sprintf (Temp, "%u", Level);
  970.       DisplayTextField (0, 35, Temp, 5, 5);
  971.       DisplayFlags (1, 14, AccessFlags);
  972.       DisplayFlags (2, 14, DenyFlags);
  973.  
  974.       sprintf (Temp, "%u", DownloadLevel);
  975.       DisplayTextField (4, 35, Temp, 5, 5);
  976.       DisplayFlags (5, 14, DownloadFlags);
  977.       DisplayFlags (6, 14, DenyDownloadFlags);
  978.  
  979.       sprintf (Temp, "%u", UploadLevel);
  980.       DisplayTextField (8, 35, Temp, 5, 5);
  981.       DisplayFlags (9, 14, UploadFlags);
  982.       DisplayFlags (10, 14, DenyUploadFlags);
  983.  
  984.       switch (menu_sel = wmenuget ()) {
  985.          case 1:
  986.             sprintf (Temp, "%u", Level);
  987.             GetTextField (0, 35, Temp, 5, 5);
  988.             Level = (USHORT)atoi (Temp);
  989.             break;
  990.          case 2:
  991.             CFlagsDlg (" Access Flags ", &AccessFlags);
  992.             break;
  993.          case 3:
  994.             CFlagsDlg (" Deny Flags ", &DenyFlags);
  995.             break;
  996.          case 4:
  997.             sprintf (Temp, "%u", DownloadLevel);
  998.             GetTextField (4, 35, Temp, 5, 5);
  999.             DownloadLevel = (USHORT)atoi (Temp);
  1000.             break;
  1001.          case 5:
  1002.             CFlagsDlg (" Access Flags ", &DownloadFlags);
  1003.             break;
  1004.          case 6:
  1005.             CFlagsDlg (" Deny Flags ", &DenyDownloadFlags);
  1006.             break;
  1007.          case 7:
  1008.             sprintf (Temp, "%u", UploadLevel);
  1009.             GetTextField (8, 35, Temp, 5, 5);
  1010.             UploadLevel = (USHORT)atoi (Temp);
  1011.             break;
  1012.          case 8:
  1013.             CFlagsDlg (" Access Flags ", &UploadFlags);
  1014.             break;
  1015.          case 9:
  1016.             CFlagsDlg (" Deny Flags ", &DenyUploadFlags);
  1017.             break;
  1018.          case 996:
  1019.             Data->Level = Level;
  1020.             Data->AccessFlags = AccessFlags;
  1021.             Data->DenyFlags = DenyFlags;
  1022.             Data->DownloadLevel = DownloadLevel;
  1023.             Data->DownloadFlags = DownloadFlags;
  1024.             Data->DownloadDenyFlags = DenyDownloadFlags;
  1025.             Data->UploadLevel = UploadLevel;
  1026.             Data->UploadFlags = UploadFlags;
  1027.             Data->UploadDenyFlags = DenyUploadFlags;
  1028.             break;
  1029.       }
  1030.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  1031.  
  1032.    wclose ();
  1033.  
  1034.    return (RetVal);
  1035. }
  1036.  
  1037. USHORT CFileDlg (VOID)
  1038. {
  1039.    short menu_sel = 1;
  1040.    USHORT RetVal = FALSE;
  1041.    class TFileData *Data;
  1042.  
  1043.    Data = new TFileData (Cfg->SystemPath);
  1044.    if (Data->First () == FALSE)
  1045.       Data->New ();
  1046.  
  1047.    wopen (5, 5, 19, 74, 1, WHITE|_LGREY, WHITE|_LGREY);
  1048.    wshadow (DGREY|_BLACK);
  1049.    wtitle (" File Areas ", TCENTER, WHITE|_LGREY);
  1050.  
  1051.    DisplayButton (9, 2, "  Move  ");
  1052.    DisplayButton (9, 12, " Delete ");
  1053.    DisplayButton (9, 22, " Links  ");
  1054.    DisplayButton (9, 32, " Search ");
  1055.    DisplayButton (9, 47, "    Security     ");
  1056.  
  1057.    DisplayButton (11,  2, " Change ");
  1058.    DisplayButton (11, 12, "  Add   ");
  1059.    DisplayButton (11, 22, " Insert ");
  1060.    DisplayButton (11, 32, "  List  ");
  1061.    DisplayButton (11, 47, "  Prev. ");
  1062.    DisplayButton (11, 57, "  Next  ");
  1063.  
  1064.    do {
  1065.       wmenubegc ();
  1066.       wmenuitem (0, 1, " Key           ", 0, 1, 0, NULL, 0, 0);
  1067.       wmenuitem (1, 1, " Display       ", 0, 2, 0, NULL, 0, 0);
  1068.       wmenuitem (2, 1, " Download Path ", 0, 3, 0, NULL, 0, 0);
  1069.       wmenuitem (3, 1, " Upload Path   ", 0, 4, 0, NULL, 0, 0);
  1070.       wmenuitem (4, 1, " Show Global   ", 0, 5, 0, NULL, 0, 0);
  1071.       wmenuitem (5, 1, " CD-ROM        ", 0, 6, 0, NULL, 0, 0);
  1072.       wmenuitem (6, 1, " Free Download ", 0, 7, 0, NULL, 0, 0);
  1073.       wmenuitem (7, 1, " FileEcho Tag  ", 0, 8, 0, NULL, 0, 0);
  1074.  
  1075.       wmenuitem (9, 2, "  Move  ", 'M', 124, 0, NULL, 0, 0);
  1076.       wmenuitem (9, 12, " Delete ", 'D', 120, 0, NULL, 0, 0);
  1077.       wmenuitem (9, 22, " Links  ", 'k', 121, 0, NULL, 0, 0);
  1078.       wmenuitem (9, 32, " Search ", 'r', 122, 0, NULL, 0, 0);
  1079.       wmenuitem (9, 47, "    Security      ", 'S', 123, 0, NULL, 0, 0);
  1080.  
  1081.       wmenuitem (11,  2, " Change ", 'C', 996, 0, NULL, 0, 0);
  1082.       wmenuitem (11, 12, "  Add   ", 'A', 115, 0, NULL, 0, 0);
  1083.       wmenuitem (11, 22, " Insert ", 'I', 116, 0, NULL, 0, 0);
  1084.       wmenuitem (11, 32, "  List  ", 'L', 117, 0, NULL, 0, 0);
  1085.       wmenuitem (11, 47, "  Prev. ", 'P', 118, 0, NULL, 0, 0);
  1086.       wmenuitem (11, 57, "  Next  ", 'N', 119, 0, NULL, 0, 0);
  1087.  
  1088.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1089.  
  1090.       DisplayTextField (0, 17, Data->Key, sizeof (Data->Key), 16);
  1091.       DisplayTextField (1, 17, Data->Display, sizeof (Data->Display), 50);
  1092.       DisplayTextField (2, 17, Data->Download, sizeof (Data->Download), 50);
  1093.       DisplayTextField (3, 17, Data->Upload, sizeof (Data->Upload), 50);
  1094.       wprints (4, 17, WHITE|_BLUE, (Data->ShowGlobal == TRUE) ? "Yes" : "No ");
  1095.       wprints (5, 17, WHITE|_BLUE, (Data->CdRom == TRUE) ? "Yes" : "No ");
  1096.       wprints (6, 17, WHITE|_BLUE, (Data->FreeDownload == TRUE) ? "Yes" : "No ");
  1097.       DisplayTextField (7, 17, Data->EchoTag, sizeof (Data->EchoTag), 50);
  1098.  
  1099.       switch (menu_sel = wmenuget ()) {
  1100.          case 1:
  1101.             GetTextField (0, 17, Data->Key, sizeof (Data->Key), 16);
  1102.             break;
  1103.          case 2:
  1104.             GetTextField (1, 17, Data->Display, sizeof (Data->Display), 50);
  1105.             break;
  1106.          case 3:
  1107.             GetTextField (2, 17, Data->Download, sizeof (Data->Download), 50);
  1108.             break;
  1109.          case 4:
  1110.             GetTextField (3, 17, Data->Upload, sizeof (Data->Upload), 50);
  1111.             break;
  1112.          case 5:
  1113.             Data->ShowGlobal = (Data->ShowGlobal == TRUE) ? FALSE : TRUE;
  1114.             break;
  1115.          case 6:
  1116.             Data->CdRom = (Data->CdRom == TRUE) ? FALSE : TRUE;
  1117.             break;
  1118.          case 7:
  1119.             Data->FreeDownload = (Data->FreeDownload == TRUE) ? FALSE : TRUE;
  1120.             break;
  1121.          case 8:
  1122.             GetTextField (7, 17, Data->EchoTag, sizeof (Data->EchoTag), 50);
  1123.             break;
  1124.          case 115:
  1125.          case 116: {
  1126.             CHAR Key[16], Description[64];
  1127.  
  1128.             Key[0] = Description[0] = '\0';
  1129.             if (CAddFileDlg (Key, Description) == TRUE) {
  1130.                Data->New ();
  1131.                strcpy (Data->Key, Key);
  1132.                strcpy (Data->Display, Description);
  1133.                if (menu_sel == 115)
  1134.                   Data->Add ();
  1135.                else if (menu_sel == 116)
  1136.                   Data->Insert ();
  1137.             }
  1138.             break;
  1139.          }
  1140.          case 117: {
  1141.             CHAR Key[16];
  1142.  
  1143.             strcpy (Key, Data->Key);
  1144.             if (CFileListDlg (Key, NULL) == TRUE)
  1145.                Data->Read (Key, FALSE);
  1146.             break;
  1147.          }
  1148.          case 118:
  1149.             Data->Previous ();
  1150.             break;
  1151.          case 119:
  1152.             Data->Next ();
  1153.             break;
  1154.          case 120:
  1155.             if (MessageBox ("Delete Area", "Are you really sure ?") == TRUE)
  1156.                Data->Delete ();
  1157.             break;
  1158.          case 122: {
  1159.             CHAR Key[16], Search[48];
  1160.  
  1161.             if (wopen (10, 19, 12, 60, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  1162.                wshadow (DGREY|_BLACK);
  1163.                wtitle (" Search Area ", TCENTER, WHITE|_LGREY);
  1164.  
  1165.                wprints (0, 1, WHITE|_GREEN, " String ");
  1166.                Search[0] = '\0';
  1167.                winpbeg (WHITE|_BLUE, WHITE|_BLUE);
  1168.                winpdef (0, 10, Search, "???????????????????????????", 0, 2, NULL, 0);
  1169.                if (winpread () != W_ESCPRESS && Search[0] != '\0') {
  1170.                   hidecur ();
  1171.                   wclose ();
  1172.  
  1173.                   strtrim (Search);
  1174.                   strcpy (Key, Data->Key);
  1175.                   if (CFileListDlg (Key, Search) == TRUE)
  1176.                      Data->Read (Key, FALSE);
  1177.                }
  1178.                else {
  1179.                   hidecur ();
  1180.                   wclose ();
  1181.                }
  1182.             }
  1183.             break;
  1184.          }
  1185.          case 123:
  1186.             CFileSecurityDlg (Data);
  1187.             break;
  1188.          case 124: {
  1189.             CHAR Key[16];
  1190.             class TFileData *NewData;
  1191.  
  1192.             strcpy (Key, Data->Key);
  1193.             if (CFileListDlg (Key, NULL) == TRUE) {
  1194.                if ((NewData = new TFileData (Cfg->SystemPath)) != NULL) {
  1195.                   NewData->Read (Data->Key);
  1196.                   NewData->Delete ();
  1197.                   NewData->Read (Key);
  1198.                   NewData->Insert (Data);
  1199.                   delete NewData;
  1200.                }
  1201.             }
  1202.             if (Data->Read (Data->Key, FALSE) == FALSE)
  1203.                Data->Read (Key, FALSE);
  1204.             break;
  1205.          }
  1206.          case 996:
  1207.             Data->Update ();
  1208.             break;
  1209.       }
  1210.    } while (menu_sel != -1);
  1211.  
  1212.    wclose ();
  1213.  
  1214.    if (Data != NULL)
  1215.       delete Data;
  1216.  
  1217.    return (RetVal);
  1218. }
  1219.  
  1220. // ----------------------------------------------------------------------
  1221.  
  1222. USHORT CAddMessageDlg (PSZ Key, PSZ Description)
  1223. {
  1224.    short menu_sel = 996;
  1225.    USHORT RetVal = FALSE;
  1226.  
  1227.    wopen (9, 4, 15, 75, 1, WHITE|_LGREY, WHITE|_LGREY);
  1228.    wshadow (DGREY|_BLACK);
  1229.    wtitle (" Add Message Area ", TCENTER, WHITE|_LGREY);
  1230.  
  1231.    DisplayButton (3, 2, "   Ok   ");
  1232.    DisplayButton (3, 12, " Cancel ");
  1233.    DisplayButton (3, 22, "  Help  ");
  1234.  
  1235.    do {
  1236.       wmenubegc ();
  1237.       wmenuitem (0, 1, " Key         ", 0, 1, 0, NULL, 0, 0);
  1238.       wmenuitem (1, 1, " Description ", 0, 2, 0, NULL, 0, 0);
  1239.       wmenuitem (3, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  1240.       wmenuitem (3, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  1241.       wmenuitem (3, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  1242.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1243.  
  1244.       DisplayTextField (0, 15, Key, 15, 15);
  1245.       DisplayTextField (1, 15, Description, 54, 54);
  1246.  
  1247.       switch (menu_sel = wmenuget ()) {
  1248.          case 1:
  1249.             GetTextField (0, 15, Key, 15, 15);
  1250.             break;
  1251.          case 2:
  1252.             GetTextField (1, 15, Description, 54, 54);
  1253.             break;
  1254.          case 996:
  1255.             RetVal = TRUE;
  1256.             break;
  1257.          case 997:
  1258.             RetVal = FALSE;
  1259.             break;
  1260.       }
  1261.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  1262.  
  1263.    wclose ();
  1264.  
  1265.    return (RetVal);
  1266. }
  1267.  
  1268. USHORT CMessageListDlg (PSZ key, PSZ search)
  1269. {
  1270.    short i, start = 0;
  1271.    CHAR Temp[128], *p, **Array;
  1272.    USHORT RetVal = FALSE, Found = TRUE;
  1273.    class TMsgData *Data;
  1274.    class TCollection List;
  1275.  
  1276.    wopen (7, 2, 23, 77, 1, WHITE|_LGREY, WHITE|_LGREY);
  1277.    wshadow (DGREY|_BLACK);
  1278.    wtitle (" Message Areas List ", TCENTER, WHITE|_LGREY);
  1279.  
  1280.    sprintf (Temp, " %-15.15s %5s %5s %-44.44s ", "Key", "Level", "Wrt.L", "Description");
  1281.    wprints (0, 0, YELLOW|_LGREY, Temp);
  1282.  
  1283.    if (search != NULL)
  1284.       strupr (search);
  1285.  
  1286.    Data = new TMsgData (Cfg->SystemPath);
  1287.    if (Data->First () == TRUE) {
  1288.       i = 0;
  1289.       List.Clear ();
  1290.       do {
  1291.          if (search != NULL) {
  1292.             Found = FALSE;
  1293.             strcpy (Temp, Data->Key);
  1294.             if (strstr (strupr (Temp), search) != NULL)
  1295.                Found = TRUE;
  1296.             else {
  1297.                strcpy (Temp, Data->Display);
  1298.                if (strstr (strupr (Temp), search) != NULL)
  1299.                   Found = TRUE;
  1300.                else {
  1301.                   strcpy (Temp, Data->EchoTag);
  1302.                   if (strstr (strupr (Temp), search) != NULL)
  1303.                      Found = TRUE;
  1304.                   else {
  1305.                      strcpy (Temp, Data->NewsGroup);
  1306.                      if (strstr (strupr (Temp), search) != NULL)
  1307.                         Found = TRUE;
  1308.                   }
  1309.                }
  1310.             }
  1311.          }
  1312.          if (Found == TRUE) {
  1313.             sprintf (Temp, " %-15.15s %5u %5u %-44.44s ", Data->Key, Data->Level, Data->WriteLevel, Data->Display);
  1314.             List.Add (Temp);
  1315.             if (!strcmp (Data->Key, key))
  1316.                start = i;
  1317.             i++;
  1318.          }
  1319.       } while (Data->Next () == TRUE);
  1320.  
  1321.       if (List.Elements > 0) {
  1322.          i = 0;
  1323.          Array = (CHAR **)malloc ((List.Elements + 1) * sizeof (CHAR *));
  1324.          if ((p = (CHAR *)List.First ()) != NULL)
  1325.             do {
  1326.                Array[i++] = p;
  1327.             } while ((p = (CHAR *)List.Next ()) != NULL);
  1328.          Array[i] = NULL;
  1329.          if ((i = wpickstr (9, 3, 22, 76, 5, WHITE|_LGREY, WHITE|_LGREY, WHITE|_BLUE, Array, start, NULL)) != -1) {
  1330.             p = Array[i] + 1;
  1331.             p[15] = '\0';
  1332.             strcpy (key, strtrim (p));
  1333.             RetVal = TRUE;
  1334.          }
  1335.          if (Array != NULL)
  1336.             free (Array);
  1337.       }
  1338.       else
  1339.          getxch ();
  1340.    }
  1341.    else
  1342.       getxch ();
  1343.  
  1344.    wclose ();
  1345.  
  1346.    if (Data != NULL)
  1347.       delete Data;
  1348.  
  1349.    return (RetVal);
  1350. }
  1351.  
  1352. USHORT CMessageLinksDlg (class TEchoLink *Link)
  1353. {
  1354.    short i, menu_sel = 996, start = 0;
  1355.    CHAR Temp[128], *p, **Array;
  1356.    USHORT RetVal = FALSE;
  1357.    class TCollection List;
  1358.  
  1359.    wopen (5, 22, 20, 56, 1, WHITE|_LGREY, WHITE|_LGREY);
  1360.    wshadow (DGREY|_BLACK);
  1361.    wtitle (" Links ", TCENTER, WHITE|_LGREY);
  1362.  
  1363.    DisplayButton (1, 22, "  Add   ");
  1364.    DisplayButton (3, 22, " Remove ");
  1365.  
  1366.    DisplayButton (12, 2, "   Ok   ");
  1367.    DisplayButton (12, 12, " Cancel ");
  1368.    DisplayButton (12, 22, "  Help  ");
  1369.  
  1370.    do {
  1371.       wmenubegc ();
  1372.       wmenuitem (1, 22, "  Add   ", 'A', 102, 0, NULL, 0, 0);
  1373.       wmenuitem (3, 22, " Remove ", 'R', 103, 0, NULL, 0, 0);
  1374.  
  1375.       wmenuitem (12, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  1376.       wmenuitem (12, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  1377.       wmenuitem (12, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  1378.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1379.  
  1380.       for (i = 0; i <= 10; i++)
  1381.          wprints (i, 1, BLACK|_CYAN, "                   ");
  1382.  
  1383.       i = 0;
  1384.       if (Link->First () == TRUE)
  1385.          do {
  1386.             if (i <= 10) {
  1387.                sprintf (Temp, "%.17s", Link->Address);
  1388.                wprints (i++, 2, BLACK|_CYAN, Temp);
  1389.             }
  1390.          } while (Link->Next () == TRUE);
  1391.  
  1392.       switch (menu_sel = wmenuget ()) {
  1393.          case 102:
  1394.             if (wopen (10, 20, 12, 59, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  1395.                wshadow (DGREY|_BLACK);
  1396.                wtitle (" Add Link ", TCENTER, WHITE|_LGREY);
  1397.  
  1398.                wprints (0, 1, WHITE|_GREEN, " Address ");
  1399.                Temp[0] = '\0';
  1400.                winpbeg (WHITE|_BLUE, WHITE|_BLUE);
  1401.                winpdef (0, 11, Temp, "??????????????????????????", 0, 2, NULL, 0);
  1402.                if (winpread () != W_ESCPRESS && Temp[0] != '\0')
  1403.                   Link->AddString (Temp);
  1404.                hidecur ();
  1405.                wclose ();
  1406.             }
  1407.             break;
  1408.          case 103:
  1409.             if (Link->First () == TRUE) {
  1410.                i = 0;
  1411.                List.Clear ();
  1412.                do {
  1413.                   sprintf (Temp, " %-17.17s ", Link->Address);
  1414.                   List.Add (Temp);
  1415.                   i++;
  1416.                } while (Link->Next () == TRUE);
  1417.  
  1418.                if (List.Elements > 0) {
  1419.                   i = 0;
  1420.                   Array = (CHAR **)malloc ((List.Elements + 1) * sizeof (CHAR *));
  1421.                   if ((p = (CHAR *)List.First ()) != NULL)
  1422.                      do {
  1423.                         Array[i++] = p;
  1424.                      } while ((p = (CHAR *)List.Next ()) != NULL);
  1425.                   Array[i] = NULL;
  1426.                   if ((i = wpickstr (0 + 5 + 1, 1 + 22 + 1, 9 + 5 + 1, 19 + 22 + 1, 5, BLACK|_CYAN, BLACK|_CYAN, YELLOW|_CYAN, Array, start, NULL)) != -1) {
  1427.                      if (Link->First () == TRUE)
  1428.                         do {
  1429.                            sprintf (Temp, " %-17.17s ", Link->Address);
  1430.                            if (!strcmp (Temp, Array[i])) {
  1431.                               Link->Delete ();
  1432.                               break;
  1433.                            }
  1434.                         } while (Link->Next () == TRUE);
  1435.                   }
  1436.                   if (Array != NULL)
  1437.                      free (Array);
  1438.                }
  1439.                else
  1440.                   getxch ();
  1441.             }
  1442.             else
  1443.                getxch ();
  1444.             break;
  1445.          case 996:
  1446.             RetVal = TRUE;
  1447.             break;
  1448.          case 997:
  1449.             RetVal = FALSE;
  1450.             break;
  1451.       }
  1452.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  1453.  
  1454.    wclose ();
  1455.  
  1456.    return (RetVal);
  1457. }
  1458.  
  1459. USHORT CMessageSecurityDlg (class TMsgData *Data)
  1460. {
  1461.    short menu_sel = 1;
  1462.    CHAR Temp[48];
  1463.    USHORT RetVal = FALSE, Level, WriteLevel;
  1464.    ULONG AccessFlags, DenyFlags, WriteAccessFlags, DenyWriteFlags;
  1465.  
  1466.    Level = Data->Level;
  1467.    AccessFlags = Data->AccessFlags;
  1468.    DenyFlags = Data->DenyFlags;
  1469.    WriteLevel = Data->WriteLevel;
  1470.    WriteAccessFlags = Data->WriteFlags;
  1471.    DenyWriteFlags = Data->DenyWriteFlags;
  1472.  
  1473.    wopen (7, 14, 18, 65, 1, WHITE|_LGREY, WHITE|_LGREY);
  1474.    wshadow (DGREY|_BLACK);
  1475.    wtitle (" Message Security ", TCENTER, WHITE|_LGREY);
  1476.  
  1477.    DisplayButton (8,  2, "   Ok   ");
  1478.    DisplayButton (8, 12, " Cancel ");
  1479.  
  1480.    do {
  1481.       wmenubegc ();
  1482.       wprints (0, 1, WHITE|_LGREY, "Access Security");
  1483.       wmenuitem (0, 22, " Level      ", 0, 1, 0, NULL, 0, 0);
  1484.       wmenuitem (1, 1, " Flags      ", 0, 2, 0, NULL, 0, 0);
  1485.       wmenuitem (2, 1, " Deny Flags ", 0, 3, 0, NULL, 0, 0);
  1486.  
  1487.       wprints (4, 1, WHITE|_LGREY, "Write Security");
  1488.       wmenuitem (4, 22, " Level      ", 0, 4, 0, NULL, 0, 0);
  1489.       wmenuitem (5, 1, " Flags      ", 0, 5, 0, NULL, 0, 0);
  1490.       wmenuitem (6, 1, " Deny Flags ", 0, 6, 0, NULL, 0, 0);
  1491.  
  1492.       wmenuitem (8,  2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  1493.       wmenuitem (8, 12, " Cancel ", 'C', 995, 0, NULL, 0, 0);
  1494.  
  1495.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1496.  
  1497.       sprintf (Temp, "%u", Level);
  1498.       DisplayTextField (0, 36, Temp, 5, 5);
  1499.       DisplayFlags (1, 14, AccessFlags);
  1500.       DisplayFlags (2, 14, DenyFlags);
  1501.  
  1502.       sprintf (Temp, "%u", WriteLevel);
  1503.       DisplayTextField (4, 36, Temp, 5, 5);
  1504.       DisplayFlags (5, 14, WriteAccessFlags);
  1505.       DisplayFlags (6, 14, DenyWriteFlags);
  1506.  
  1507.       switch (menu_sel = wmenuget ()) {
  1508.          case 1:
  1509.             sprintf (Temp, "%u", Level);
  1510.             GetTextField (0, 36, Temp, 5, 5);
  1511.             Level = (USHORT)atoi (Temp);
  1512.             break;
  1513.          case 2:
  1514.             CFlagsDlg (" Access Flags ", &AccessFlags);
  1515.             break;
  1516.          case 3:
  1517.             CFlagsDlg (" Deny Flags ", &DenyFlags);
  1518.             break;
  1519.          case 4:
  1520.             sprintf (Temp, "%u", WriteLevel);
  1521.             GetTextField (4, 36, Temp, 5, 5);
  1522.             WriteLevel = (USHORT)atoi (Temp);
  1523.             break;
  1524.          case 5:
  1525.             CFlagsDlg (" Access Flags ", &WriteAccessFlags);
  1526.             break;
  1527.          case 6:
  1528.             CFlagsDlg (" Deny Flags ", &DenyWriteFlags);
  1529.             break;
  1530.          case 996:
  1531.             Data->Level = Level;
  1532.             Data->AccessFlags = AccessFlags;
  1533.             Data->DenyFlags = DenyFlags;
  1534.             Data->WriteLevel = WriteLevel;
  1535.             Data->WriteFlags = WriteAccessFlags;
  1536.             Data->DenyWriteFlags = DenyWriteFlags;
  1537.             break;
  1538.       }
  1539.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  1540.  
  1541.    wclose ();
  1542.  
  1543.    return (RetVal);
  1544. }
  1545.  
  1546. USHORT CMessageDlg (VOID)
  1547. {
  1548.    short menu_sel = 1;
  1549.    USHORT RetVal = FALSE;
  1550.    CHAR Temp[32];
  1551.    class TMsgData *Data;
  1552.  
  1553.    Data = new TMsgData (Cfg->SystemPath);
  1554.    if (Data->First () == FALSE)
  1555.       Data->New ();
  1556.  
  1557.    wopen (3, 5, 21, 74, 1, WHITE|_LGREY, WHITE|_LGREY);
  1558.    wshadow (DGREY|_BLACK);
  1559.    wtitle (" Message Areas ", TCENTER, WHITE|_LGREY);
  1560.  
  1561.    DisplayButton (13, 2, "  Move  ");
  1562.    DisplayButton (13, 12, " Delete ");
  1563.    DisplayButton (13, 22, " Links  ");
  1564.    DisplayButton (13, 32, " Search ");
  1565.    DisplayButton (13, 47, "    Security     ");
  1566.  
  1567.    DisplayButton (15,  2, " Change ");
  1568.    DisplayButton (15, 12, "  Add   ");
  1569.    DisplayButton (15, 22, " Insert ");
  1570.    DisplayButton (15, 32, "  List  ");
  1571.    DisplayButton (15, 47, "  Prev. ");
  1572.    DisplayButton (15, 57, "  Next  ");
  1573.  
  1574.    do {
  1575.       wmenubegc ();
  1576.       wmenuitem (0, 1, " Key       ", 0, 1, 0, NULL, 0, 0);
  1577.       wmenuitem (1, 1, " Display   ", 0, 2, 0, NULL, 0, 0);
  1578.       wmenuitem (2, 1, " Storage   ", 0, 3, 0, NULL, 0, 0);
  1579.       wmenuitem (2, 30, " Hudson Board ", 0, 14, 0, NULL, 0, 0);
  1580.       wmenuitem (3, 1, " Path      ", 0, 4, 0, NULL, 0, 0);
  1581.  
  1582.       wmenuitem (4, 13, " Show in Global Lists    ", 0, 5, 0, NULL, 0, 0);
  1583.       wmenuitem (4, 45, " EchoMail Kludges ", 0, 6, 0, NULL, 0, 0);
  1584.       wmenuitem (5, 13, " Use with Offline Reader ", 0, 7, 0, NULL, 0, 0);
  1585.       wmenuitem (5, 45, " Update Newsgroup ", 0, 8, 0, NULL, 0, 0);
  1586.  
  1587.       wmenuitem (6, 1, " EchoTag   ", 0, 9, 0, NULL, 0, 0);
  1588.       wmenuitem (7, 1, " Newsgroup ", 0, 10, 0, NULL, 0, 0);
  1589.       wmenuitem (8, 1, " Last retr ", 0, 15, 0, NULL, 0, 0);
  1590.       wmenuitem (9, 1, " Address   ", 0, 11, 0, NULL, 0, 0);
  1591.       wmenuitem (10, 1, " Max.Msgs. ", 0, 12, 0, NULL, 0, 0);
  1592.       wmenuitem (11, 1, " Max Days  ", 0, 13, 0, NULL, 0, 0);
  1593.  
  1594.       wmenuitem (13, 2, "  Move  ", 'M', 124, 0, NULL, 0, 0);
  1595.       wmenuitem (13, 12, " Delete ", 'D', 120, 0, NULL, 0, 0);
  1596.       wmenuitem (13, 22, " Links  ", 'k', 121, 0, NULL, 0, 0);
  1597.       wmenuitem (13, 32, " Search ", 'r', 122, 0, NULL, 0, 0);
  1598.       wmenuitem (13, 47, "    Security      ", 'S', 123, 0, NULL, 0, 0);
  1599.  
  1600.       wmenuitem (15,  2, " Change ", 'C', 996, 0, NULL, 0, 0);
  1601.       wmenuitem (15, 12, "  Add   ", 'A', 115, 0, NULL, 0, 0);
  1602.       wmenuitem (15, 22, " Insert ", 'I', 116, 0, NULL, 0, 0);
  1603.       wmenuitem (15, 32, "  List  ", 'L', 117, 0, NULL, 0, 0);
  1604.       wmenuitem (15, 47, "  Prev. ", 'P', 118, 0, NULL, 0, 0);
  1605.       wmenuitem (15, 57, "  Next  ", 'N', 119, 0, NULL, 0, 0);
  1606.  
  1607.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1608.  
  1609.       DisplayTextField (0, 13, Data->Key, sizeof (Data->Key), 16);
  1610.       DisplayTextField (1, 13, Data->Display, sizeof (Data->Display), 54);
  1611.       switch (Data->Storage) {
  1612.          case ST_JAM:
  1613.             wprints (2, 13, WHITE|_BLUE, "JAM             ");
  1614.             break;
  1615.          case ST_SQUISH:
  1616.             wprints (2, 13, WHITE|_BLUE, "Squish          ");
  1617.             break;
  1618.          case ST_FIDO:
  1619.             wprints (2, 13, WHITE|_BLUE, "Fido *.MSG      ");
  1620.             break;
  1621.          case ST_ADEPT:
  1622.             wprints (2, 13, WHITE|_BLUE, "AdeptXBBS       ");
  1623.             break;
  1624.          case ST_HUDSON:
  1625.             wprints (2, 13, WHITE|_BLUE, "Hudson (QBBS)   ");
  1626.             break;
  1627.          case ST_USENET:
  1628.             wprints (2, 13, WHITE|_BLUE, "Usenet Newsgroup");
  1629.             break;
  1630.          case ST_PASSTHROUGH:
  1631.             wprints (2, 13, WHITE|_BLUE, "Passthrough     ");
  1632.             break;
  1633.       }
  1634.       DisplayTextField (3, 13, Data->Path, sizeof (Data->Path), 54);
  1635.       wprints (4, 39, WHITE|_BLUE, (Data->ShowGlobal == TRUE) ? "Yes" : "No ");
  1636.       wprints (4, 64, WHITE|_BLUE, (Data->EchoMail == TRUE) ? "Yes" : "No ");
  1637.       wprints (5, 39, WHITE|_BLUE, (Data->Offline == TRUE) ? "Yes" : "No ");
  1638.       wprints (5, 64, WHITE|_BLUE, (Data->UpdateNews == TRUE) ? "Yes" : "No ");
  1639.       DisplayTextField (6, 13, Data->EchoTag, sizeof (Data->EchoTag), 54);
  1640.       DisplayTextField (7, 13, Data->NewsGroup, sizeof (Data->NewsGroup), 54);
  1641.       sprintf (Temp, "%lu", Data->Highest);
  1642.       DisplayTextField (8, 13, Temp, 7, 7);
  1643.       DisplayTextField (9, 13, Data->Address, sizeof (Data->Address), 32);
  1644.       sprintf (Temp, "%u", Data->MaxMessages);
  1645.       DisplayTextField (10, 13, Temp, 5, 5);
  1646.       sprintf (Temp, "%u", Data->DaysOld);
  1647.       DisplayTextField (11, 13, Temp, 5, 5);
  1648.  
  1649.       sprintf (Temp, "%u", Data->Board);
  1650.       DisplayTextField (2, 45, Temp, 5, 5);
  1651.  
  1652.       switch (menu_sel = wmenuget ()) {
  1653.          case 1:
  1654.             GetTextField (0, 13, Data->Key, sizeof (Data->Key), 16);
  1655.             break;
  1656.          case 2:
  1657.             GetTextField (1, 13, Data->Display, sizeof (Data->Display), 54);
  1658.             break;
  1659.          case 3:
  1660.             switch (Data->Storage) {
  1661.                case ST_JAM:
  1662.                   Data->Storage = ST_SQUISH;
  1663.                   break;
  1664.                case ST_SQUISH:
  1665.                   Data->Storage = ST_FIDO;
  1666.                   break;
  1667.                case ST_FIDO:
  1668.                   Data->Storage = ST_ADEPT;
  1669.                   break;
  1670.                case ST_ADEPT:
  1671.                   Data->Storage = ST_HUDSON;
  1672.                   break;
  1673.                case ST_HUDSON:
  1674.                   Data->Storage = ST_USENET;
  1675.                   break;
  1676.                case ST_USENET:
  1677.                   Data->Storage = ST_PASSTHROUGH;
  1678.                   break;
  1679.                case ST_PASSTHROUGH:
  1680.                   Data->Storage = ST_JAM;
  1681.                   break;
  1682.             }
  1683.             break;
  1684.          case 4:
  1685.             GetTextField (3, 13, Data->Path, sizeof (Data->Path), 54);
  1686.             break;
  1687.          case 5:
  1688.             Data->ShowGlobal = (Data->ShowGlobal == TRUE) ? FALSE : TRUE;
  1689.             break;
  1690.          case 6:
  1691.             Data->EchoMail = (Data->EchoMail == TRUE) ? FALSE : TRUE;
  1692.             break;
  1693.          case 7:
  1694.             Data->Offline = (Data->Offline == TRUE) ? FALSE : TRUE;
  1695.             break;
  1696.          case 8:
  1697.             Data->UpdateNews = (Data->UpdateNews == TRUE) ? FALSE : TRUE;
  1698.             break;
  1699.          case 9:
  1700.             GetTextField (6, 13, Data->EchoTag, sizeof (Data->EchoTag), 54);
  1701.             break;
  1702.          case 10:
  1703.             GetTextField (7, 13, Data->NewsGroup, sizeof (Data->NewsGroup), 54);
  1704.             break;
  1705.          case 11:
  1706.             GetTextField (9, 13, Data->Address, sizeof (Data->Address), 32);
  1707.             break;
  1708.          case 12:
  1709.             sprintf (Temp, "%u", Data->MaxMessages);
  1710.             GetTextField (10, 13, Temp, 5, 5);
  1711.             Data->MaxMessages = (USHORT)atoi (Temp);
  1712.             break;
  1713.          case 13:
  1714.             sprintf (Temp, "%u", Data->DaysOld);
  1715.             GetTextField (11, 13, Temp, 5, 5);
  1716.             Data->DaysOld = (USHORT)atoi (Temp);
  1717.             break;
  1718.          case 14:
  1719.             sprintf (Temp, "%u", Data->Board);
  1720.             GetTextField (2, 45, Temp, 5, 5);
  1721.             Data->Board = (USHORT)atoi (Temp);
  1722.             break;
  1723.          case 15:
  1724.             sprintf (Temp, "%lu", Data->Highest);
  1725.             GetTextField (8, 13, Temp, 7, 7);
  1726.             Data->Highest = atol (Temp);
  1727.             break;
  1728.          case 115:
  1729.          case 116: {
  1730.             CHAR Key[16], Description[64];
  1731.  
  1732.             Key[0] = Description[0] = '\0';
  1733.             if (CAddMessageDlg (Key, Description) == TRUE) {
  1734.                Data->New ();
  1735.                strcpy (Data->Key, Key);
  1736.                strcpy (Data->Display, Description);
  1737.                Data->Storage = Cfg->NewAreasStorage;
  1738.                strcpy (Data->Path, Cfg->NewAreasPath);
  1739.                strcat (Data->Path, Data->Key);
  1740.                Data->Level = Cfg->NewAreasLevel;
  1741.                Data->AccessFlags = Cfg->NewAreasFlags;
  1742.                Data->DenyFlags = Cfg->NewAreasDenyFlags;
  1743.                Data->WriteLevel = Cfg->NewAreasWriteLevel;
  1744.                Data->WriteFlags = Cfg->NewAreasWriteFlags;
  1745.                Data->DenyWriteFlags = Cfg->NewAreasDenyWriteFlags;
  1746.                Data->MaxMessages = 200;
  1747.                Data->DaysOld = 14;
  1748.                if (menu_sel == 115)
  1749.                   Data->Add ();
  1750.                else if (menu_sel == 116)
  1751.                   Data->Insert ();
  1752.             }
  1753.             break;
  1754.          }
  1755.          case 117: {
  1756.             CHAR Key[16];
  1757.  
  1758.             strcpy (Key, Data->Key);
  1759.             if (CMessageListDlg (Key, NULL) == TRUE)
  1760.                Data->Read (Key, FALSE);
  1761.             break;
  1762.          }
  1763.          case 118:
  1764.             Data->Previous ();
  1765.             break;
  1766.          case 119:
  1767.             Data->Next ();
  1768.             break;
  1769.          case 120:
  1770.             if (MessageBox ("Delete Area", "Are you really sure ?") == TRUE)
  1771.                Data->Delete ();
  1772.             break;
  1773.          case 121: {
  1774.             class TEchoLink *Link;
  1775.  
  1776.             if ((Link = new TEchoLink (Cfg->SystemPath)) != NULL) {
  1777.                Link->Load (Data->EchoTag);
  1778.                if (CMessageLinksDlg (Link) == TRUE)
  1779.                   Link->Save ();
  1780.                delete Link;
  1781.             }
  1782.             break;
  1783.          }
  1784.          case 122: {
  1785.             CHAR Key[16], Search[48];
  1786.  
  1787.             if (wopen (10, 19, 12, 60, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  1788.                wshadow (DGREY|_BLACK);
  1789.                wtitle (" Search Area ", TCENTER, WHITE|_LGREY);
  1790.  
  1791.                wprints (0, 1, WHITE|_GREEN, " String ");
  1792.                Search[0] = '\0';
  1793.                winpbeg (WHITE|_BLUE, WHITE|_BLUE);
  1794.                winpdef (0, 10, Search, "???????????????????????????", 0, 2, NULL, 0);
  1795.                if (winpread () != W_ESCPRESS && Search[0] != '\0') {
  1796.                   hidecur ();
  1797.                   wclose ();
  1798.  
  1799.                   strtrim (Search);
  1800.                   strcpy (Key, Data->Key);
  1801.                   if (CMessageListDlg (Key, Search) == TRUE)
  1802.                      Data->Read (Key, FALSE);
  1803.                }
  1804.                else {
  1805.                   hidecur ();
  1806.                   wclose ();
  1807.                }
  1808.             }
  1809.             break;
  1810.          }
  1811.          case 123:
  1812.             CMessageSecurityDlg (Data);
  1813.             break;
  1814.          case 124: {
  1815.             CHAR Key[16];
  1816.             class TMsgData *NewData;
  1817.  
  1818.             strcpy (Key, Data->Key);
  1819.             if (CMessageListDlg (Key, NULL) == TRUE) {
  1820.                if ((NewData = new TMsgData (Cfg->SystemPath)) != NULL) {
  1821.                   NewData->Read (Data->Key);
  1822.                   NewData->Delete ();
  1823.                   NewData->Read (Key);
  1824.                   NewData->Insert (Data);
  1825.                   delete NewData;
  1826.                }
  1827.             }
  1828.             if (Data->Read (Data->Key, FALSE) == FALSE)
  1829.                Data->Read (Key, FALSE);
  1830.             break;
  1831.          }
  1832.          case 996:
  1833.             Data->Update ();
  1834.             break;
  1835.       }
  1836.    } while (menu_sel != -1);
  1837.  
  1838.    wclose ();
  1839.  
  1840.    if (Data != NULL)
  1841.       delete Data;
  1842.  
  1843.    return (RetVal);
  1844. }
  1845.  
  1846. USHORT COfflineDlg (VOID)
  1847. {
  1848.    short menu_sel = 996;
  1849.    CHAR Temp[16];
  1850.    USHORT RetVal = FALSE;
  1851.  
  1852.    wopen (9, 5, 16, 74, 1, WHITE|_LGREY, WHITE|_LGREY);
  1853.    wshadow (DGREY|_BLACK);
  1854.    wtitle (" Offline Reader ", TCENTER, WHITE|_LGREY);
  1855.  
  1856.    DisplayButton (4, 2, "   Ok   ");
  1857.    DisplayButton (4, 12, " Cancel ");
  1858.    DisplayButton (4, 22, "  Help  ");
  1859.  
  1860.    do {
  1861.       wmenubegc ();
  1862.       wmenuitem (0, 1, " Work Directory ", 0, 1, 0, NULL, 0, 0);
  1863.       wmenuitem (1, 1, " Packet Name    ", 0, 2, 0, NULL, 0, 0);
  1864.       wmenuitem (2, 1, " Max Messages   ", 0, 3, 0, NULL, 0, 0);
  1865.       wmenuitem (4, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  1866.       wmenuitem (4, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  1867.       wmenuitem (4, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  1868.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1869.  
  1870.       DisplayTextField (0, 18, Cfg->TempPath, sizeof (Cfg->TempPath), 49);
  1871.       DisplayTextField (1, 18, Cfg->OLRPacketName, sizeof (Cfg->OLRPacketName), 49);
  1872.       sprintf (Temp, "%u", Cfg->OLRMaxMessages);
  1873.       DisplayTextField (2, 18, Temp, 5, 5);
  1874.  
  1875.       switch (menu_sel = wmenuget ()) {
  1876.          case 1:
  1877.             GetTextField (0, 18, Cfg->TempPath, sizeof (Cfg->TempPath), 49);
  1878.             break;
  1879.          case 2:
  1880.             GetTextField (1, 18, Cfg->OLRPacketName, sizeof (Cfg->OLRPacketName), 49);
  1881.             break;
  1882.          case 3:
  1883.             sprintf (Temp, "%u", Cfg->OLRMaxMessages);
  1884.             GetTextField (2, 18, Temp, 5, 5);
  1885.             Cfg->OLRMaxMessages = (USHORT)atoi (Temp);
  1886.             break;
  1887.          case 996:
  1888.             RetVal = TRUE;
  1889.             break;
  1890.          case 997:
  1891.             RetVal = FALSE;
  1892.             break;
  1893.       }
  1894.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  1895.  
  1896.    wclose ();
  1897.  
  1898.    return (RetVal);
  1899. }
  1900.  
  1901. // ----------------------------------------------------------------------
  1902.  
  1903. USHORT CAddUserDlg (PSZ Name, PSZ Pwd)
  1904. {
  1905.    short menu_sel = 996;
  1906.    USHORT RetVal = FALSE;
  1907.  
  1908.    wopen (9, 15, 15, 64, 1, WHITE|_LGREY, WHITE|_LGREY);
  1909.    wshadow (DGREY|_BLACK);
  1910.    wtitle (" Add User ", TCENTER, WHITE|_LGREY);
  1911.  
  1912.    DisplayButton (3, 2, "   Ok   ");
  1913.    DisplayButton (3, 12, " Cancel ");
  1914.    DisplayButton (3, 22, "  Help  ");
  1915.  
  1916.    do {
  1917.       wmenubegc ();
  1918.       wmenuitem (0, 1, " Name     ", 0, 1, 0, NULL, 0, 0);
  1919.       wmenuitem (1, 1, " Password ", 0, 2, 0, NULL, 0, 0);
  1920.       wmenuitem (3, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  1921.       wmenuitem (3, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  1922.       wmenuitem (3, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  1923.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  1924.  
  1925.       DisplayTextField (0, 12, Name, 35, 35);
  1926.       DisplayTextField (1, 12, "", 15, 15);
  1927.  
  1928.       switch (menu_sel = wmenuget ()) {
  1929.          case 1:
  1930.             GetTextField (0, 12, Name, 35, 35);
  1931.             break;
  1932.          case 2:
  1933.             winpbeg (WHITE|_BLUE, WHITE|_BLUE);
  1934.             winpdef (1, 12, Pwd, "PPPPPPPPPPPPPPP", 0, 2, NULL, 0);
  1935.             if (winpread () == W_ESCPRESS)
  1936.                Pwd[0] = '\0';
  1937.             break;
  1938.          case 996:
  1939.             RetVal = TRUE;
  1940.             break;
  1941.          case 997:
  1942.             RetVal = FALSE;
  1943.             break;
  1944.       }
  1945.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  1946.  
  1947.    wclose ();
  1948.  
  1949.    return (RetVal);
  1950. }
  1951.  
  1952. USHORT CUserListDlg (PSZ Name, PSZ Search)
  1953. {
  1954.    short i, start = 0;
  1955.    CHAR Temp[128], Call[32], *p, **Array;
  1956.    USHORT RetVal = FALSE, DoAdd = TRUE;
  1957.    struct tm *ltm;
  1958.    class TUser *Data;
  1959.    class TCollection List;
  1960.  
  1961.    wopen (7, 2, 23, 77, 1, WHITE|_LGREY, WHITE|_LGREY);
  1962.    wshadow (DGREY|_BLACK);
  1963.    wtitle (" User List ", TCENTER, WHITE|_LGREY);
  1964.  
  1965.    sprintf (Temp, " %-27.27s %-5s %-10.10s %-16.16s %s ", "Name", "Level", "Limit", "City", "Last Call");
  1966.    wprints (0, 0, YELLOW|_LGREY, Temp);
  1967.  
  1968.    if (Search != NULL)
  1969.       strupr (Search);
  1970.  
  1971.    Data = new TUser (Cfg->UserFile);
  1972.    if (Data->First () == TRUE) {
  1973.       i = 0;
  1974.       List.Clear ();
  1975.       do {
  1976.          if (Search != NULL) {
  1977.             DoAdd = FALSE;
  1978.             strcpy (Temp, Data->Name);
  1979.             if (strstr (strupr (Temp), Search) != NULL)
  1980.                DoAdd = TRUE;
  1981.             else {
  1982.                strcpy (Temp, Data->RealName);
  1983.                if (strstr (strupr (Temp), Search) != NULL)
  1984.                   DoAdd = TRUE;
  1985.                else {
  1986.                   strcpy (Temp, Data->City);
  1987.                   if (strstr (strupr (Temp), Search) != NULL)
  1988.                      DoAdd = TRUE;
  1989.                }
  1990.             }
  1991.          }
  1992.          if (DoAdd == TRUE) {
  1993.             if (Data->LastCall == 0L)
  1994.                strcpy (Call, "Never");
  1995.             else {
  1996.                ltm = localtime ((time_t *)&Data->LastCall);
  1997.                sprintf (Call, "%02d/%02d/%04d", ltm->tm_mday, ltm->tm_mon + 1, ltm->tm_year + 1900, ltm->tm_hour, ltm->tm_min);
  1998.             }
  1999.             sprintf (Temp, " %-27.27s %5u %-10.10s %-16.16s %s ", Data->Name, Data->Level, Data->LimitClass, Data->City, Call);
  2000.             List.Add (Temp);
  2001.             if (!strcmp (Data->Name, Name))
  2002.                start = i;
  2003.             i++;
  2004.          }
  2005.       } while (Data->Next () == TRUE);
  2006.  
  2007.       if (List.Elements > 0) {
  2008.          i = 0;
  2009.          Array = (CHAR **)malloc ((List.Elements + 1) * sizeof (CHAR *));
  2010.          if ((p = (CHAR *)List.First ()) != NULL)
  2011.             do {
  2012.                Array[i++] = p;
  2013.             } while ((p = (CHAR *)List.Next ()) != NULL);
  2014.          Array[i] = NULL;
  2015.          if ((i = wpickstr (9, 3, 22, 76, 5, WHITE|_LGREY, WHITE|_LGREY, WHITE|_BLUE, Array, start, NULL)) != -1) {
  2016.             p = Array[i] + 1;
  2017.             p[27] = '\0';
  2018.             strcpy (Name, strtrim (p));
  2019.             RetVal = TRUE;
  2020.          }
  2021.          if (Array != NULL)
  2022.             free (Array);
  2023.       }
  2024.       else
  2025.          getxch ();
  2026.    }
  2027.    else
  2028.       getxch ();
  2029.  
  2030.    wclose ();
  2031.  
  2032.    if (Data != NULL)
  2033.       delete Data;
  2034.  
  2035.    return (RetVal);
  2036. }
  2037.  
  2038. USHORT CUserMoreDlg (class TUser *Data)
  2039. {
  2040.    short menu_sel = 996;
  2041.    USHORT RetVal = FALSE;
  2042.  
  2043.    wopen (8, 8, 16, 70, 1, WHITE|_LGREY, WHITE|_LGREY);
  2044.    wshadow (DGREY|_BLACK);
  2045.    wtitle (" More User Options ", TCENTER, WHITE|_LGREY);
  2046.  
  2047.    DisplayButton (5, 2, "   Ok   ");
  2048.    DisplayButton (5, 12, " Cancel ");
  2049.    DisplayButton (5, 22, "  Help  ");
  2050.  
  2051.    do {
  2052.       wmenubegc ();
  2053.       wmenuitem (0, 1, " E-Mail Address     ", 0, 1, 0, NULL, 0, 0);
  2054.       wmenuitem (1, 1, " Import E-Mail      ", 0, 2, 0, NULL, 0, 0);
  2055.       wmenuitem (2, 1, " POP3 Password      ", 0, 3, 0, NULL, 0, 0);
  2056.       wmenuitem (3, 1, " Use E-Mail Address ", 0, 4, 0, NULL, 0, 0);
  2057.       wmenuitem (5, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  2058.       wmenuitem (5, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  2059.       wmenuitem (5, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  2060.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  2061.  
  2062.       DisplayTextField (0, 22, Data->InetAddress, sizeof (Data->InetAddress), 38);
  2063.       wprints (1, 22, WHITE|_BLUE, (Data->ImportPOP3Mail == TRUE) ? "Yes" : "No ");
  2064.       DisplayTextField (2, 22, Data->Pop3Pwd, sizeof (Data->Pop3Pwd), 36);
  2065.       wprints (3, 22, WHITE|_BLUE, (Data->UseInetAddress == TRUE) ? "Yes" : "No ");
  2066.  
  2067.       switch (menu_sel = wmenuget ()) {
  2068.          case 1:
  2069.             GetTextField (0, 22, Data->InetAddress, sizeof (Data->InetAddress), 38);
  2070.             break;
  2071.          case 2:
  2072.             Data->ImportPOP3Mail = (Data->ImportPOP3Mail == TRUE) ? FALSE : TRUE;
  2073.             break;
  2074.          case 3:
  2075.             GetTextField (2, 22, Data->Pop3Pwd, sizeof (Data->Pop3Pwd), 36);
  2076.             break;
  2077.          case 4:
  2078.             Data->UseInetAddress = (Data->UseInetAddress == TRUE) ? FALSE : TRUE;
  2079.             break;
  2080.          case 996:
  2081.             RetVal = TRUE;
  2082.             break;
  2083.          case 997:
  2084.             RetVal = FALSE;
  2085.             break;
  2086.       }
  2087.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  2088.  
  2089.    wclose ();
  2090.  
  2091.    return (RetVal);
  2092. }
  2093.  
  2094. USHORT CUserDlg (VOID)
  2095. {
  2096.    short menu_sel = 1;
  2097.    CHAR Temp[48];
  2098.    USHORT RetVal = FALSE;
  2099.    class TUser *Data;
  2100.  
  2101.    Data = new TUser (Cfg->UserFile);
  2102.    if (Data->First () == FALSE)
  2103.       Data->Clear ();
  2104.  
  2105.    wopen (5, 5, 20, 74, 1, WHITE|_LGREY, WHITE|_LGREY);
  2106.    wshadow (DGREY|_BLACK);
  2107.    wtitle (" User Editor ", TCENTER, WHITE|_LGREY);
  2108.  
  2109.    DisplayButton (10, 12, "  More  ");
  2110.    DisplayButton (10, 22, "  Pwd.  ");
  2111.    DisplayButton (10, 32, " Search ");
  2112.    DisplayButton (10, 47, "    Security     ");
  2113.  
  2114.    DisplayButton (12,  2, " Change ");
  2115.    DisplayButton (12, 12, "  Add   ");
  2116.    DisplayButton (12, 22, " Delete ");
  2117.    DisplayButton (12, 32, "  List  ");
  2118.    DisplayButton (12, 47, "  Prev. ");
  2119.    DisplayButton (12, 57, "  Next  ");
  2120.  
  2121.    do {
  2122.       wmenubegc ();
  2123.       wmenuitem (0, 1, " Name        ", 0, 1, 0, NULL, 0, 0);
  2124.       wmenuitem (1, 1, " Real Name   ", 0, 2, 0, NULL, 0, 0);
  2125.       wmenuitem (2, 1, " Company     ", 0, 3, 0, NULL, 0, 0);
  2126.       wmenuitem (3, 1, " Address     ", 0, 4, 0, NULL, 0, 0);
  2127.       wmenuitem (4, 1, " City        ", 0, 5, 0, NULL, 0, 0);
  2128.       wmenuitem (5, 1, " Phone       ", 0, 6, 0, NULL, 0, 0);
  2129.       wmenuitem (6, 1, " Limit Class ", 0, 7, 0, NULL, 0, 0);
  2130.       wmenuitem (7, 1, " MailBox     ", 0, 8, 0, NULL, 0, 0);
  2131.       wmenuitem (8, 1, " Language    ", 0, 9, 0, NULL, 0, 0);
  2132.  
  2133.       wmenuitem (0, 51, " Gender   ", 0, 10, 0, NULL, 0, 0);
  2134.       wmenuitem (1, 51, " Width    ", 0, 11, 0, NULL, 0, 0);
  2135.       wmenuitem (2, 51, " Height   ", 0, 12, 0, NULL, 0, 0);
  2136.       wmenuitem (3, 51, " Calls    ", 0, 13, 0, NULL, 0, 0);
  2137.       wmenuitem (5, 51, " ANSI     ", 0, 14, 0, NULL, 0, 0);
  2138.       wmenuitem (6, 51, " Avatar   ", 0, 15, 0, NULL, 0, 0);
  2139.       wmenuitem (7, 51, " Colors   ", 0, 16, 0, NULL, 0, 0);
  2140.       wmenuitem (8, 51, " Hot-keys ", 0, 17, 0, NULL, 0, 0);
  2141.  
  2142.       wmenuitem (10, 12, "  More  ", 'M', 120, 0, NULL, 0, 0);
  2143.       wmenuitem (10, 22, "  Pwd.  ", 'w', 121, 0, NULL, 0, 0);
  2144.       wmenuitem (10, 32, " Search ", 'r', 122, 0, NULL, 0, 0);
  2145.       wmenuitem (10, 47, "    Security      ", 'S', 123, 0, NULL, 0, 0);
  2146.  
  2147.       wmenuitem (12,  2, " Change ", 'C', 996, 0, NULL, 0, 0);
  2148.       wmenuitem (12, 12, "  Add   ", 'A', 115, 0, NULL, 0, 0);
  2149.       wmenuitem (12, 22, " Delete ", 'D', 116, 0, NULL, 0, 0);
  2150.       wmenuitem (12, 32, "  List  ", 'L', 117, 0, NULL, 0, 0);
  2151.       wmenuitem (12, 47, "  Prev. ", 'P', 118, 0, NULL, 0, 0);
  2152.       wmenuitem (12, 57, "  Next  ", 'N', 119, 0, NULL, 0, 0);
  2153.  
  2154.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  2155.  
  2156.       DisplayTextField (0, 15, Data->Name, sizeof (Data->Name), 35);
  2157.       DisplayTextField (1, 15, Data->RealName, sizeof (Data->RealName), 35);
  2158.       DisplayTextField (2, 15, Data->Company, sizeof (Data->Company), 35);
  2159.       DisplayTextField (3, 15, Data->Address, sizeof (Data->Address), 35);
  2160.       DisplayTextField (4, 15, Data->City, sizeof (Data->City), 35);
  2161.       DisplayTextField (5, 15, Data->DayPhone, sizeof (Data->DayPhone), 35);
  2162.       DisplayTextField (6, 15, Data->LimitClass, sizeof (Data->LimitClass), 35);
  2163.       DisplayTextField (7, 15, Data->MailBox, sizeof (Data->MailBox), 35);
  2164.       DisplayTextField (8, 15, Data->Language, sizeof (Data->Language), 35);
  2165.  
  2166.       wprints (0, 62, WHITE|_BLUE, (Data->Sex == 0) ? "M" : "F");
  2167.       sprintf (Temp, "%u", Data->ScreenWidth);
  2168.       DisplayTextField (1, 62, Temp, 3, 3);
  2169.       sprintf (Temp, "%u", Data->ScreenHeight);
  2170.       DisplayTextField (2, 62, Temp, 3, 3);
  2171.       sprintf (Temp, "%lu", Data->TotalCalls);
  2172.       DisplayTextField (3, 62, Temp, 5, 5);
  2173.       wprints (5, 62, WHITE|_BLUE, (Data->Ansi == TRUE) ? "Yes" : "No ");
  2174.       wprints (6, 62, WHITE|_BLUE, (Data->Avatar == TRUE) ? "Yes" : "No ");
  2175.       wprints (7, 62, WHITE|_BLUE, (Data->Color == TRUE) ? "Yes" : "No ");
  2176.       wprints (8, 62, WHITE|_BLUE, (Data->HotKey == TRUE) ? "Yes" : "No ");
  2177.  
  2178.       switch (menu_sel = wmenuget ()) {
  2179.          case 1:
  2180.             GetTextField (0, 15, Data->Name, sizeof (Data->Name), 35);
  2181.             break;
  2182.          case 2:
  2183.             GetTextField (1, 15, Data->RealName, sizeof (Data->RealName), 35);
  2184.             break;
  2185.          case 3:
  2186.             GetTextField (2, 15, Data->Company, sizeof (Data->Company), 35);
  2187.             break;
  2188.          case 4:
  2189.             GetTextField (3, 15, Data->Address, sizeof (Data->Address), 35);
  2190.             break;
  2191.          case 5:
  2192.             GetTextField (4, 15, Data->City, sizeof (Data->City), 35);
  2193.             break;
  2194.          case 6:
  2195.             GetTextField (5, 15, Data->DayPhone, sizeof (Data->DayPhone), 35);
  2196.             break;
  2197.          case 7:
  2198.             GetTextField (6, 15, Data->LimitClass, sizeof (Data->LimitClass), 35);
  2199.             break;
  2200.          case 8:
  2201.             GetTextField (7, 15, Data->MailBox, sizeof (Data->MailBox), 35);
  2202.             break;
  2203.          case 9:
  2204.             GetTextField (8, 15, Data->Language, sizeof (Data->Language), 35);
  2205.             break;
  2206.          case 10:
  2207.             Data->Sex = (Data->Sex == 0) ? 1 : 0;
  2208.             break;
  2209.          case 11:
  2210.             sprintf (Temp, "%u", Data->ScreenWidth);
  2211.             GetTextField (1, 62, Temp, 3, 3);
  2212.             Data->ScreenWidth = (USHORT)atoi (Temp);
  2213.             break;
  2214.          case 12:
  2215.             sprintf (Temp, "%u", Data->ScreenHeight);
  2216.             GetTextField (2, 62, Temp, 3, 3);
  2217.             Data->ScreenHeight = (USHORT)atoi (Temp);
  2218.             break;
  2219.          case 13:
  2220.             sprintf (Temp, "%lu", Data->TotalCalls);
  2221.             GetTextField (3, 62, Temp, 5, 5);
  2222.             Data->TotalCalls = atol (Temp);
  2223.             break;
  2224.          case 14:
  2225.             Data->Ansi = (Data->Ansi == TRUE) ? FALSE : TRUE;
  2226.             break;
  2227.          case 15:
  2228.             Data->Avatar = (Data->Avatar == TRUE) ? FALSE : TRUE;
  2229.             break;
  2230.          case 16:
  2231.             Data->Color = (Data->Color == TRUE) ? FALSE : TRUE;
  2232.             break;
  2233.          case 17:
  2234.             Data->HotKey = (Data->HotKey == TRUE) ? FALSE : TRUE;
  2235.             break;
  2236.          case 115: {
  2237.             CHAR Name[48], Pwd[32];
  2238.  
  2239.             Name[0] = Pwd[0] = '\0';
  2240.             if (CAddUserDlg (Name, Pwd) == TRUE) {
  2241.                Data->Clear ();
  2242.                Data->ScreenWidth = 80;
  2243.                Data->ScreenHeight = 24;
  2244.                strcpy (Data->Name, Name);
  2245.                strcpy (Data->RealName, Name);
  2246.                Data->SetPassword (Pwd);
  2247.                Data->Level = Cfg->NewUserLevel;
  2248.                Data->AccessFlags = Cfg->NewUserFlags;
  2249.                Data->DenyFlags = Cfg->NewUserDenyFlags;
  2250.                strcpy (Data->LimitClass, Cfg->NewUserLimits);
  2251.                Data->Add ();
  2252.             }
  2253.             break;
  2254.          }
  2255.          case 116:
  2256.             if (MessageBox ("Delete User", "Are you really sure ?") == TRUE)
  2257.                Data->Delete ();
  2258.             break;
  2259.          case 117: {
  2260.             CHAR Name[48];
  2261.  
  2262.             strcpy (Name, Data->Name);
  2263.             if (CUserListDlg (Name, NULL) == TRUE)
  2264.                Data->GetData (Name, FALSE);
  2265.             break;
  2266.          }
  2267.          case 118:
  2268.             Data->Previous ();
  2269.             break;
  2270.          case 119:
  2271.             Data->Next ();
  2272.             break;
  2273.          case 120:
  2274.             CUserMoreDlg (Data);
  2275.             break;
  2276.          case 121:
  2277.             if (wopen (10, 25, 12, 54, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  2278.                wshadow (DGREY|_BLACK);
  2279.                wtitle (" Set Password ", TCENTER, WHITE|_LGREY);
  2280.  
  2281.                wprints (0, 1, WHITE|_GREEN, " Password ");
  2282.                Temp[0] = '\0';
  2283.                winpbeg (WHITE|_BLUE, WHITE|_BLUE);
  2284.                winpdef (0, 12, Temp, "PPPPPPPPPPPPPPP", 0, 2, NULL, 0);
  2285.                if (winpread () != W_ESCPRESS && Temp[0] != '\0')
  2286.                   Data->SetPassword (Temp);
  2287.                hidecur ();
  2288.                wclose ();
  2289.             }
  2290.             break;
  2291.          case 122: {
  2292.             CHAR Name[48], Search[48];
  2293.  
  2294.             if (wopen (10, 19, 12, 60, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  2295.                wshadow (DGREY|_BLACK);
  2296.                wtitle (" Search User ", TCENTER, WHITE|_LGREY);
  2297.  
  2298.                wprints (0, 1, WHITE|_GREEN, " String ");
  2299.                Search[0] = '\0';
  2300.                winpbeg (WHITE|_BLUE, WHITE|_BLUE);
  2301.                winpdef (0, 10, Search, "???????????????????????????", 0, 2, NULL, 0);
  2302.                if (winpread () != W_ESCPRESS && Search[0] != '\0') {
  2303.                   hidecur ();
  2304.                   wclose ();
  2305.  
  2306.                   strtrim (Search);
  2307.                   strcpy (Name, Data->Name);
  2308.                   if (CUserListDlg (Name, Search) == TRUE)
  2309.                      Data->GetData (Name, FALSE);
  2310.                }
  2311.                else {
  2312.                   hidecur ();
  2313.                   wclose ();
  2314.                }
  2315.             }
  2316.          }
  2317.          case 123:
  2318.             CSecurityDlg (" User Security ", &Data->Level, &Data->AccessFlags, &Data->DenyFlags);
  2319.             break;
  2320.          case 996:
  2321.             Data->Update ();
  2322.             break;
  2323.       }
  2324.    } while (menu_sel != -1);
  2325.  
  2326.    wclose ();
  2327.  
  2328.    if (Data != NULL)
  2329.       delete Data;
  2330.  
  2331.    return (RetVal);
  2332. }
  2333.  
  2334. VOID DisplayYesNo (USHORT y, USHORT x, USHORT flag, USHORT Required = FALSE)
  2335. {
  2336.    if (Required == FALSE) {
  2337.       if (flag == YES)
  2338.          wprints (y, x, WHITE|_BLUE, "Yes");
  2339.       else if (flag == NO)
  2340.          wprints (y, x, WHITE|_BLUE, "No ");
  2341.    }
  2342.    else {
  2343.       if (flag == YES)
  2344.          wprints (y, x, WHITE|_BLUE, "Yes     ");
  2345.       else if (flag == NO)
  2346.          wprints (y, x, WHITE|_BLUE, "No      ");
  2347.       else if (flag == REQUIRED)
  2348.          wprints (y, x, WHITE|_BLUE, "Required");
  2349.    }
  2350. }
  2351.  
  2352. VOID DisplayChoice1 (USHORT y, USHORT x, USHORT flag)
  2353. {
  2354.    if (flag == 1)
  2355.       wprints (y, x, WHITE|_BLUE, "Yes");
  2356.    else if (flag == 0)
  2357.       wprints (y, x, WHITE|_BLUE, "No ");
  2358.    else if (flag == 2)
  2359.       wprints (y, x, WHITE|_BLUE, "Ask");
  2360. }
  2361.  
  2362. VOID DisplayChoice2 (USHORT y, USHORT x, USHORT flag)
  2363. {
  2364.    if (flag == 1)
  2365.       wprints (y, x, WHITE|_BLUE, "Yes   ");
  2366.    else if (flag == 0)
  2367.       wprints (y, x, WHITE|_BLUE, "No    ");
  2368.    else if (flag == 2)
  2369.       wprints (y, x, WHITE|_BLUE, "Ask   ");
  2370.    else if (flag == 3)
  2371.       wprints (y, x, WHITE|_BLUE, "Detect");
  2372. }
  2373.  
  2374. VOID DisplayChoice3 (USHORT y, USHORT x, USHORT flag)
  2375. {
  2376.    if (flag == YES)
  2377.       wprints (y, x, WHITE|_BLUE, "Yes     ");
  2378.    else if (flag == NO)
  2379.       wprints (y, x, WHITE|_BLUE, "No      ");
  2380.    else if (flag == REQUIRED)
  2381.       wprints (y, x, WHITE|_BLUE, "Required");
  2382. }
  2383.  
  2384. VOID LimitClassShadow (VOID)
  2385. {
  2386.    wtitle (" Limit Classes ", TCENTER, WHITE|_CYAN);
  2387.    wshadow (DGREY|_BLACK);
  2388. }
  2389.  
  2390. USHORT CNewUsersDlg (VOID)
  2391. {
  2392.    short i, menu_sel = 1, maxlen, start;
  2393.    CHAR Temp[64], **Array, *p;
  2394.    USHORT RetVal = FALSE;
  2395.    class TCollection List;
  2396.    class TLimits *Limits;
  2397.  
  2398.    wopen (4, 9, 21, 70, 1, WHITE|_LGREY, WHITE|_LGREY);
  2399.    wshadow (DGREY|_BLACK);
  2400.    wtitle (" New Users ", TCENTER, WHITE|_LGREY);
  2401.  
  2402.    DisplayButton (14,  2, "   Ok   ");
  2403.    DisplayButton (14, 12, " Cancel ");
  2404.    DisplayButton (14, 22, "  Help  ");
  2405.  
  2406.    DisplayButton (14, 40, "    Security     ");
  2407.  
  2408.    do {
  2409.       wmenubegc ();
  2410.  
  2411.       wmenuitem ( 0,  1, " Use ANSI            ", 0, 1, 0, NULL, 0, 0);
  2412.       wmenuitem ( 1,  1, " Use AVATAR          ", 0, 2, 0, NULL, 0, 0);
  2413.       wmenuitem ( 2,  1, " Use colors          ", 0, 3, 0, NULL, 0, 0);
  2414.       wmenuitem ( 3,  1, " Use fullscr. editor ", 0, 4, 0, NULL, 0, 0);
  2415.       wmenuitem ( 4,  1, " Use fullscr. reader ", 0, 5, 0, NULL, 0, 0);
  2416.       wmenuitem ( 5,  1, " Use fullscr. lists  ", 0, 6, 0, NULL, 0, 0);
  2417.       wmenuitem ( 6,  1, " Ask hotkey          ", 0, 7, 0, NULL, 0, 0);
  2418.       wmenuitem ( 7,  1, " Ask IBM chars.      ", 0, 8, 0, NULL, 0, 0);
  2419.       wmenuitem ( 8,  1, " Ask lines           ", 0, 9, 0, NULL, 0, 0);
  2420.       wmenuitem ( 9,  1, " Page pause          ", 0, 10, 0, NULL, 0, 0);
  2421.       wmenuitem (10,  1, " Ask scrn. clear     ", 0, 11, 0, NULL, 0, 0);
  2422.  
  2423.       wmenuitem ( 2, 27, " Ask birthdate       ", 0, 12, 0, NULL, 0, 0);
  2424.       wmenuitem ( 3, 27, " New mail check      ", 0, 13, 0, NULL, 0, 0);
  2425.       wmenuitem ( 4, 27, " New files check     ", 0, 14, 0, NULL, 0, 0);
  2426.       wmenuitem ( 5, 27, " Ask real name       ", 0, 15, 0, NULL, 0, 0);
  2427.       wmenuitem ( 6, 27, " Company name        ", 0, 16, 0, NULL, 0, 0);
  2428.       wmenuitem ( 7, 27, " Address             ", 0, 17, 0, NULL, 0, 0);
  2429.       wmenuitem ( 8, 27, " City                ", 0, 18, 0, NULL, 0, 0);
  2430.       wmenuitem ( 9, 27, " Phone number        ", 0, 19, 0, NULL, 0, 0);
  2431.       wmenuitem (10, 27, " Gender              ", 0, 20, 0, NULL, 0, 0);
  2432.  
  2433.       wmenuitem (12, 1, " Limit Class     ", 0, 21, 0, NULL, 0, 0);
  2434.       wmenuitem (14, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  2435.       wmenuitem (14, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  2436.       wmenuitem (14, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  2437.       wmenuitem (14, 40, "    Security      ", 'S', 123, 0, NULL, 0, 0);
  2438.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  2439.  
  2440.       DisplayChoice2 (0, 23, Cfg->UseAnsi);
  2441.       DisplayChoice2 (1, 23, Cfg->UseAvatar);
  2442.       DisplayChoice1 (2, 23, Cfg->UseColor);
  2443.       DisplayChoice1 (3, 23, Cfg->UseFullScreenEditor);
  2444.       DisplayChoice1 (4, 23, Cfg->UseFullScreenReader);
  2445.       DisplayChoice1 (5, 23, Cfg->UseFullScreenLists);
  2446.       DisplayChoice1 (6, 23, Cfg->UseHotKey);
  2447.       DisplayChoice1 (7, 23, Cfg->UseIBMChars);
  2448.       DisplayChoice1 (8, 23, Cfg->AskLines);
  2449.       DisplayChoice1 (9, 23, Cfg->UsePause);
  2450.       DisplayChoice1 (10, 23, Cfg->UseScreenClear);
  2451.  
  2452.       DisplayChoice1 (2, 49, Cfg->AskBirthDate);
  2453.       DisplayChoice1 (3, 49, Cfg->AskMailCheck);
  2454.       DisplayChoice1 (4, 49, Cfg->AskFileCheck);
  2455.       DisplayChoice3 (5, 49, Cfg->AskAlias);
  2456.       DisplayChoice3 (6, 49, Cfg->AskCompanyName);
  2457.       DisplayChoice3 (7, 49, Cfg->AskAddress);
  2458.       DisplayChoice3 (8, 49, Cfg->AskCity);
  2459.       DisplayChoice3 (9, 49, Cfg->AskPhoneNumber);
  2460.       DisplayChoice3 (10, 49, Cfg->AskGender);
  2461.  
  2462.       sprintf (Temp, "%-16.16s", Cfg->NewUserLimits);
  2463.       wprints (12, 23, WHITE|_BLUE, Temp);
  2464.  
  2465.       switch (menu_sel = wmenuget ()) {
  2466.          case 1:
  2467.             Cfg->UseAnsi = (UCHAR)((Cfg->UseAnsi + 1) % 4);
  2468.             break;
  2469.          case 2:
  2470.             Cfg->UseAvatar = (UCHAR)((Cfg->UseAvatar + 1) % 4);
  2471.             break;
  2472.          case 3:
  2473.             Cfg->UseColor = (UCHAR)((Cfg->UseColor + 1) % 3);
  2474.             break;
  2475.          case 4:
  2476.             Cfg->UseFullScreenEditor = (UCHAR)((Cfg->UseFullScreenEditor + 1) % 3);
  2477.             break;
  2478.          case 5:
  2479.             Cfg->UseFullScreenReader = (UCHAR)((Cfg->UseFullScreenReader + 1) % 3);
  2480.             break;
  2481.          case 6:
  2482.             Cfg->UseFullScreenLists = (UCHAR)((Cfg->UseFullScreenLists + 1) % 3);
  2483.             break;
  2484.          case 7:
  2485.             Cfg->UseHotKey = (UCHAR)((Cfg->UseHotKey + 1) % 3);
  2486.             break;
  2487.          case 8:
  2488.             Cfg->UseIBMChars = (UCHAR)((Cfg->UseIBMChars + 1) % 3);
  2489.             break;
  2490.          case 9:
  2491.             Cfg->AskLines = (Cfg->AskLines == TRUE) ? FALSE : TRUE;
  2492.             break;
  2493.          case 10:
  2494.             Cfg->UsePause = (UCHAR)((Cfg->UsePause + 1) % 3);
  2495.             break;
  2496.          case 11:
  2497.             Cfg->UseScreenClear = (UCHAR)((Cfg->UseScreenClear + 1) % 3);
  2498.             break;
  2499.          case 12:
  2500.             Cfg->AskBirthDate = (Cfg->AskBirthDate == TRUE) ? FALSE : TRUE;
  2501.             break;
  2502.          case 13:
  2503.             Cfg->AskMailCheck = (UCHAR)((Cfg->AskMailCheck + 1) % 3);
  2504.             break;
  2505.          case 14:
  2506.             Cfg->AskFileCheck = (UCHAR)((Cfg->AskFileCheck + 1) % 3);
  2507.             break;
  2508.          case 15:
  2509.             Cfg->AskAlias = (UCHAR)((Cfg->AskAlias + 1) % 3);
  2510.             break;
  2511.          case 16:
  2512.             Cfg->AskCompanyName = (UCHAR)((Cfg->AskCompanyName + 1) % 3);
  2513.             break;
  2514.          case 17:
  2515.             Cfg->AskAddress = (UCHAR)((Cfg->AskAddress + 1) % 3);
  2516.             break;
  2517.          case 18:
  2518.             Cfg->AskCity = (UCHAR)((Cfg->AskCity + 1) % 3);
  2519.             break;
  2520.          case 19:
  2521.             Cfg->AskPhoneNumber = (UCHAR)((Cfg->AskPhoneNumber + 1) % 3);
  2522.             break;
  2523.          case 20:
  2524.             Cfg->AskGender = (UCHAR)((Cfg->AskGender + 1) % 3);
  2525.             break;
  2526.          case 21: {
  2527.             List.Clear ();
  2528.             start = maxlen = i = 0;
  2529.             if ((Limits = new TLimits (Cfg->SystemPath)) != NULL) {
  2530.                if (Limits->First () == TRUE)
  2531.                   do {
  2532.                      sprintf (Temp, " %-16.16s ", Limits->Key);
  2533.                      List.Add (Temp);
  2534.                      maxlen = (short)strlen (Temp);
  2535.                      if (!strcmp (Limits->Key, Cfg->NewUserLimits))
  2536.                         start = i;
  2537.                      i++;
  2538.                   } while (Limits->Next () == TRUE);
  2539.                delete Limits;
  2540.             }
  2541.             if (List.Elements > 0) {
  2542.                i = 0;
  2543.                Array = (CHAR **)malloc ((List.Elements + 1) * sizeof (CHAR *));
  2544.                if ((p = (CHAR *)List.First ()) != NULL)
  2545.                   do {
  2546.                      Array[i++] = p;
  2547.                   } while ((p = (CHAR *)List.Next ()) != NULL);
  2548.                Array[i] = NULL;
  2549.                if ((i = wpickstr (7, 40, 19, (short)(40 + maxlen + 1), 1, WHITE|_CYAN, BLACK|_CYAN, WHITE|_GREEN, Array, start, LimitClassShadow)) != -1) {
  2550.                   if ((p = strtok (Array[i], " ")) != NULL)
  2551.                      strcpy (Cfg->NewUserLimits, p);
  2552.                }
  2553.                if (Array != NULL)
  2554.                   free (Array);
  2555.             }
  2556.             break;
  2557.          }
  2558.          case 123:
  2559.             CSecurityDlg (" New Users Security ", &Cfg->NewUserLevel, &Cfg->NewUserFlags, &Cfg->NewUserDenyFlags);
  2560.             break;
  2561.          case 996:
  2562.             RetVal = TRUE;
  2563.             break;
  2564.          case 997:
  2565.             RetVal = FALSE;
  2566.             break;
  2567.       }
  2568.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  2569.  
  2570.    wclose ();
  2571.  
  2572.    return (RetVal);
  2573. }
  2574.  
  2575. USHORT CSelectNodeFlagDlg (class TNodeFlags *Data)
  2576. {
  2577.    short i, a, start = 0;
  2578.    CHAR Temp[128], *p, **Array;
  2579.    USHORT RetVal = FALSE;
  2580.    class TCollection List;
  2581.  
  2582.    if (Data->First () == TRUE) {
  2583.       i = 1;
  2584.       List.Clear ();
  2585.       do {
  2586.          sprintf (Temp, "%-9.9s │ %-25.25s", Data->Flags, Data->Cmd);
  2587.          List.Add (Temp);
  2588.          i++;
  2589.       } while (Data->Next () == TRUE);
  2590.  
  2591.       if (List.Elements > 0) {
  2592.          i = 0;
  2593.          Array = (CHAR **)malloc ((List.Elements + 1) * sizeof (CHAR *));
  2594.          if ((p = (CHAR *)List.First ()) != NULL)
  2595.             do {
  2596.                Array[i++] = p;
  2597.             } while ((p = (CHAR *)List.Next ()) != NULL);
  2598.          Array[i] = NULL;
  2599.          if ((i += 4) > 15)
  2600.             i = 15;
  2601.          if ((i = wpickstr (5, 15, i, 52, 5, BLACK|_CYAN, BLACK|_CYAN, YELLOW|_CYAN, Array, start, NULL)) != -1) {
  2602.             a = 0;
  2603.             if (Data->First () == TRUE)
  2604.                do {
  2605.                   if (a++ == i)
  2606.                      break;
  2607.                } while (Data->Next () == TRUE);
  2608.             RetVal = TRUE;
  2609.          }
  2610.          if (Array != NULL)
  2611.             free (Array);
  2612.       }
  2613.       else
  2614.          getxch ();
  2615.    }
  2616.    else
  2617.       getxch ();
  2618.  
  2619.    return (RetVal);
  2620. }
  2621.  
  2622. VOID CNodeFlagsDlg (VOID)
  2623. {
  2624.    short i, menu_sel = 996, sub_menu_sel;
  2625.    CHAR Temp[64], TempCmd[64];
  2626.    class TNodeFlags *Data;
  2627.  
  2628.    Data = new TNodeFlags (Cfg->SystemPath);
  2629.  
  2630.    wopen (3, 12, 21, 66, 1, WHITE|_LGREY, WHITE|_LGREY);
  2631.    wshadow (DGREY|_BLACK);
  2632.    wtitle (" Nodelist flags ", TCENTER, WHITE|_LGREY);
  2633.  
  2634.    DisplayButton (1, 42, "  Add   ");
  2635.    DisplayButton (3, 42, " Remove ");
  2636.    DisplayButton (5, 42, " Modify ");
  2637.  
  2638.    DisplayButton (15, 2, "   Ok   ");
  2639.    DisplayButton (15, 12, " Cancel ");
  2640.    DisplayButton (15, 22, "  Help  ");
  2641.  
  2642.    do {
  2643.       wmenubegc ();
  2644.       wmenuitem (1, 42, "  Add   ", 'A', 102, 0, NULL, 0, 0);
  2645.       wmenuitem (3, 42, " Remove ", 'R', 103, 0, NULL, 0, 0);
  2646.       wmenuitem (5, 42, " Modify ", 'M', 104, 0, NULL, 0, 0);
  2647.  
  2648.       wmenuitem (12, 1, " Call if        ", 0, 1, 0, NULL, 0, 0);
  2649.       wmenuitem (13, 1, " Don't call if  ", 0, 2, 0, NULL, 0, 0);
  2650.  
  2651.       wmenuitem (15, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  2652.       wmenuitem (15, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  2653.       wmenuitem (15, 22, "  Help  ", 'H', 998, 0, NULL, 0, 0);
  2654.       wmenuend ((short)menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  2655.  
  2656.       sprintf (Temp, " %-9.9s │ %-25.25s ", "", "");
  2657.       for (i = 0; i <= 9; i++)
  2658.          wprints ((short)(i + 1), 1, BLACK|_CYAN, Temp);
  2659.  
  2660.       sprintf (Temp, " %-9.9s │ %-25.25s ", "Flags", "Command");
  2661.       wprints (0, 1, BLACK|_GREEN, Temp);
  2662.  
  2663.       i = 0;
  2664.       if (Data->First () == TRUE)
  2665.          do {
  2666.             if (i <= 9) {
  2667.                sprintf (Temp, " %-9.9s │ %-25.25s ", Data->Flags, Data->Cmd);
  2668.                wprints ((short)(i + 1), 1, BLACK|_CYAN, Temp);
  2669.                i++;
  2670.             }
  2671.          } while (Data->Next () == TRUE);
  2672.  
  2673.       DisplayTextField (12, 18, Cfg->CallIf, 25, 25);
  2674.       DisplayTextField (13, 18, Cfg->DontCallIf, 25, 25);
  2675.  
  2676.       switch (menu_sel = wmenuget ()) {
  2677.          case 1:
  2678.             GetTextField (12, 18, Cfg->CallIf, 25, 25);
  2679.             break;
  2680.          case 2:
  2681.             GetTextField (13, 18, Cfg->DontCallIf, 25, 25);
  2682.             break;
  2683.          case 102:
  2684.             if (wopen (9, 18, 15, 58, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  2685.                wshadow (DGREY|_BLACK);
  2686.                wtitle (" Add Flag ", TCENTER, WHITE|_LGREY);
  2687.  
  2688.                DisplayButton (3, 2, "   Ok   ");
  2689.                DisplayButton (3, 12, " Cancel ");
  2690.  
  2691.                sub_menu_sel = 996;
  2692.                Temp[0] = TempCmd[0] = '\0';
  2693.  
  2694.                do {
  2695.                   wmenubegc ();
  2696.                   wmenuitem (0, 1, " Flags    ", 0, 1, 0, NULL, 0, 0);
  2697.                   wmenuitem (1, 1, " Command  ", 0, 2, 0, NULL, 0, 0);
  2698.  
  2699.                   wmenuitem (3, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  2700.                   wmenuitem (3, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  2701.                   wmenuend ((short)sub_menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  2702.  
  2703.                   DisplayTextField (0, 12, Temp, sizeof (Temp), 9);
  2704.                   DisplayTextField (1, 12, TempCmd, sizeof (TempCmd), 25);
  2705.  
  2706.                   switch (sub_menu_sel = wmenuget ()) {
  2707.                      case 1:
  2708.                         GetTextField (0, 12, Temp, sizeof (Temp), 9);
  2709.                         break;
  2710.                      case 2:
  2711.                         GetTextField (1, 12, TempCmd, sizeof (TempCmd), 25);
  2712.                         break;
  2713.                  }
  2714.                } while (sub_menu_sel != -1 && sub_menu_sel != 996 && sub_menu_sel != 997);
  2715.  
  2716.                if (sub_menu_sel == 996) {
  2717.                   strcpy (Data->Flags, Temp);
  2718.                   strcpy (Data->Cmd, TempCmd);
  2719.                   Data->Add ();
  2720.                }
  2721.  
  2722.                hidecur ();
  2723.                wclose ();
  2724.             }
  2725.             break;
  2726.          case 103:
  2727.             if (CSelectNodeFlagDlg (Data) == TRUE) {
  2728.                if (MessageBox ("Delete Item", "Are you really sure ?") == TRUE)
  2729.                   Data->Delete ();
  2730.             }
  2731.             break;
  2732.          case 104:
  2733.             if (CSelectNodeFlagDlg (Data) == TRUE) {
  2734.                if (wopen (9, 18, 15, 58, 1, WHITE|_LGREY, WHITE|_LGREY) > 0) {
  2735.                   wshadow (DGREY|_BLACK);
  2736.                   wtitle (" Modify Flag ", TCENTER, WHITE|_LGREY);
  2737.  
  2738.                   DisplayButton (3, 2, "   Ok   ");
  2739.                   DisplayButton (3, 12, " Cancel ");
  2740.  
  2741.                   strcpy (Temp, Data->Flags);
  2742.                   strcpy (TempCmd, Data->Cmd);
  2743.  
  2744.                   do {
  2745.                      wmenubegc ();
  2746.                      wmenuitem (0, 1, " Flags    ", 0, 1, 0, NULL, 0, 0);
  2747.                      wmenuitem (1, 1, " Command  ", 0, 2, 0, NULL, 0, 0);
  2748.  
  2749.                      wmenuitem (3, 2, "   Ok   ", 'O', 996, 0, NULL, 0, 0);
  2750.                      wmenuitem (3, 12, " Cancel ", 'C', 997, 0, NULL, 0, 0);
  2751.                      wmenuend ((short)sub_menu_sel, M_OMNI|M_SAVE, 0, 0, BLACK|_GREEN, YELLOW|_GREEN, DGREY|_GREEN, WHITE|_GREEN);
  2752.  
  2753.                      DisplayTextField (0, 12, Temp, sizeof (Temp), 9);
  2754.                      DisplayTextField (1, 12, TempCmd, sizeof (TempCmd), 25);
  2755.  
  2756.                      switch (sub_menu_sel = wmenuget ()) {
  2757.                         case 1:
  2758.                            GetTextField (0, 12, Temp, sizeof (Temp), 9);
  2759.                            break;
  2760.                         case 2:
  2761.                            GetTextField (1, 12, TempCmd, sizeof (TempCmd), 25);
  2762.                            break;
  2763.                     }
  2764.                   } while (sub_menu_sel != -1 && sub_menu_sel != 996 && sub_menu_sel != 997);
  2765.  
  2766.                   if (sub_menu_sel == 996) {
  2767.                      strcpy (Data->Flags, Temp);
  2768.                      strcpy (Data->Cmd, TempCmd);
  2769.                      Data->Update ();
  2770.                   }
  2771.  
  2772.                   hidecur ();
  2773.                   wclose ();
  2774.                }
  2775.             }
  2776.             break;
  2777.          case 996:
  2778.             Data->Save ();
  2779.             break;
  2780.          case 997:
  2781.             break;
  2782.       }
  2783.    } while (menu_sel != -1 && menu_sel != 996 && menu_sel != 997);
  2784.  
  2785.    delete Data;
  2786.  
  2787.    wclose ();
  2788. }
  2789.  
  2790.