home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 November / PCWorld_1999-11_cd.bin / Komunik / Sambar / _setup.1 / winmain.c < prev    next >
C/C++ Source or Header  |  1999-09-08  |  16KB  |  638 lines

  1. /*
  2. ** WINMAIN
  3. **
  4. **      This is the main driver for the Windows driver of the Sambar
  5. **        Server. 
  6. **
  7. **        Confidential Property of Tod Sambar
  8. **        (c) Copyright Tod Sambar 1995-1999
  9. **        All rights reserved.
  10. **
  11. **
  12. ** Syntax:
  13. **
  14. **      server    [-bst]
  15. **
  16. **            -b        Start a browser and load the home page.
  17. **            -s        Show the GUI on startup.
  18. **            -t        Don't trace to GUI display when in icon tray 
  19. **                    (performance optimization).
  20. **
  21. **
  22. ** History:
  23. ** Chg#    Date    Description                                                Resp
  24. ** ----    -------    -------------------------------------------------------    ----
  25. **        9MAR97     Created                                                    sambar
  26. **        5NOV97     Simplified interface                                    sambar
  27. **        18FEB98    Added real-time log display.                            sambar
  28. */
  29.  
  30. #include    <windows.h>
  31. #include    <stdio.h>
  32. #include    <io.h>
  33. #include    <fcntl.h>
  34. #include    <sys/types.h>
  35. #include    <sys/stat.h>
  36. #include    <share.h>
  37. #include    <process.h>
  38. #include    <sambar.h>
  39. #include    <resource.h>
  40.  
  41. /*
  42. ** Local Defines
  43. */
  44. #define SERVER_ID     1001
  45. #define SERVER_MSG     WM_USER + 69
  46. #define NAME        "Sambar Server"
  47.  
  48. static int            LogCount = 0;
  49. static HWND            MainWindow = NULL;
  50. static HWND            MainList = NULL;
  51. static HWND            HideButton = NULL;
  52. static HWND            PauseButton = NULL;
  53. static HWND            ClearButton = NULL;
  54. static HWND            ConnStats = NULL;
  55. static HWND            HConnStats = NULL;
  56. static HWND            ThreadStats = NULL;
  57. static HANDLE        MainInstance;
  58. static BOOL            ShellTray = FALSE;
  59. static BOOL            Showing = FALSE;
  60. static BOOL            Paused = FALSE;
  61. static BOOL            AlwaysTrace = TRUE;
  62. static BOOL            StartBrowser = FALSE;
  63.  
  64.  
  65. /*
  66. ** Local Prototypes
  67. */
  68. long __stdcall         WndProc(
  69.                     HWND         hWnd, 
  70.                     UINT         message, 
  71.                     WPARAM         wParam,
  72.                     LPARAM         lParam
  73.                     );
  74. void                DisplayMenu(
  75.                     HWND         hWnd
  76.                     );
  77. void                RestartServer(
  78.                     HWND         hWnd
  79.                     );
  80. void                ShutdownServer(
  81.                     HWND         hWnd
  82.                     );
  83. BOOL                 DisplayLoglines(
  84.                     HWND         hWnd
  85.                     );
  86. void                 HTTPLog(
  87.                     SA_CTX         *ctx,
  88.                     SA_HTTPLOG    *httplog
  89.                     );
  90. void                 GetArgs(
  91.                     LPSTR         cmdline
  92.                     );
  93.  
  94. int     __stdcall
  95. WinMain(HANDLE Instance, HANDLE PrevInstance, LPSTR CmdLine, int CmdShow)
  96. {
  97.     unsigned long    thread;
  98.     SA_BOOL            ver3;
  99.     SA_BOOL            stopped;
  100.     SA_INT            count;
  101.     SA_CTX            *ctx;
  102.     DWORD            dwVersion;        // To hold return value from GetVersion
  103.     MSG                message;
  104.     HWND            hWnd;
  105.     WNDCLASS        MainClass;
  106.     HICON            ServerIcon;
  107.     NOTIFYICONDATA    IconData;
  108.     SA_INT            len;
  109.     SA_INT            port;
  110.     char            tmp[256];
  111.     char            name[256];
  112.     char            homedir[1024];
  113.     char            buffer[2048];
  114.  
  115.  
  116.     /* Save the application Instance                                    */
  117.     MainInstance = Instance;
  118.  
  119.     /* If a Server is running, show it                                    */
  120.     hWnd = FindWindow(NAME, NULL);
  121.     if (hWnd)
  122.     {
  123.         if (IsIconic(hWnd))
  124.             ShowWindow(hWnd, SW_RESTORE);
  125.  
  126.         SetForegroundWindow(hWnd);
  127.         return (0);
  128.     } 
  129.  
  130.     SetErrorMode(SEM_FAILCRITICALERRORS |
  131.                  SEM_NOGPFAULTERRORBOX |
  132.                  SEM_NOOPENFILEERRORBOX);
  133.  
  134.     /* Process any command line arguments.                                */
  135.     GetArgs(CmdLine);
  136.  
  137.     /* Create the tray Icon resource                                    */
  138.     ServerIcon = LoadIcon(Instance, "SERVER_ICON");
  139.  
  140.     /* Create a window class                                            */
  141.     MainClass.style =             CS_HREDRAW | CS_VREDRAW;
  142.     MainClass.lpfnWndProc =        WndProc;
  143.     MainClass.cbClsExtra =         0;
  144.     MainClass.cbWndExtra =         0;
  145.     MainClass.hInstance =         Instance;
  146.     MainClass.hIcon =             ServerIcon;
  147.     MainClass.hCursor =         LoadCursor(NULL, IDC_ARROW);
  148.     MainClass.hbrBackground =     GetStockObject(LTGRAY_BRUSH);
  149.     MainClass.lpszMenuName =     NULL;
  150.     MainClass.lpszClassName =     NAME;
  151.  
  152.     if (!RegisterClass(&MainClass))
  153.         return (0);
  154.  
  155.     /* Determine if this is windows 3.51 -- change the window type        */
  156.     ver3 = 0;
  157.     dwVersion = GetVersion();
  158.     if (dwVersion < 0x80000000) 
  159.     {
  160.         if ((DWORD)(LOBYTE(LOWORD(dwVersion))) == 3)
  161.             ver3 = 1;
  162.     }
  163.  
  164.     /*
  165.     ** Start the Sambar Server.
  166.     ** On failure, the server will shutdown and destroy the MainWindow.
  167.     */
  168.     thread = _beginthread(sa_server, 0, (SA_VOID *)&MainWindow);
  169.     if (thread == -1)
  170.         return (0);
  171.  
  172.     /*
  173.     ** Wait for the server context to start up...
  174.     */
  175.     count = 0;
  176.     stopped = FALSE;
  177.     ctx = (SA_CTX *)NULL;
  178.     while ((!stopped) && (count < 20) && (ctx == (SA_CTX *)NULL))
  179.     {
  180.         if (sa_ctx_global(&ctx) != SA_SUCCEED)
  181.         {
  182.             Sleep(2000);
  183.  
  184.             /* Determine if the server has prematurely shut down        */
  185.             stopped = sa_stopped();
  186.         }
  187.  
  188.         count++;
  189.     }
  190.  
  191.     if (ctx == (SA_CTX *)NULL)
  192.     {
  193.         MessageBox(NULL, "Failure initializing server, see server.log", 
  194.             NAME, MB_OK | MB_ICONSTOP );
  195.         return (0);
  196.     }
  197.  
  198.     /* Create the main window                                            */
  199.     MainWindow = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, NAME, NAME,
  200.         (WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX),
  201.         CW_USEDEFAULT, 0, 600, 470, NULL, NULL, Instance, NULL);
  202.  
  203.     if (!MainWindow)
  204.     {
  205.         (SA_VOID)sa_shutdown(0);
  206.         return (0);
  207.     }
  208.  
  209.     /*
  210.     ** Display the Sambar Server machine/port
  211.     */
  212.     name[0] = '\0';
  213.     (SA_VOID)sa_ctx_props(ctx, SA_GET, SA_CTXPROP_SERVERSW, 
  214.         (SA_BYTE *)name, 255, &len);
  215.     hWnd = CreateWindow("STATIC", "Version", WS_CHILD | WS_VISIBLE, 
  216.         20, 15, 300, 20, MainWindow, NULL, Instance, NULL);
  217.     SetWindowText(hWnd, name);
  218.  
  219.     (SA_VOID)sa_ctx_props(ctx, SA_GET, SA_CTXPROP_BUILDID, 
  220.         (SA_BYTE *)tmp, 255, &len);
  221.     wsprintf(buffer, "Build: %s", tmp);
  222.     hWnd = CreateWindow("STATIC", "Build", WS_CHILD | WS_VISIBLE, 
  223.         350, 15, 300, 20, MainWindow, NULL, Instance, NULL);
  224.     SetWindowText(hWnd, buffer);
  225.  
  226.     hWnd = CreateWindow("STATIC", "Company", WS_CHILD | WS_VISIBLE, 
  227.         20, 40, 300, 20, MainWindow, NULL, Instance, NULL);
  228.     SetWindowText(hWnd, "Sambar Technologies");
  229.  
  230.     hWnd = CreateWindow("STATIC", "Copyright", WS_CHILD | WS_VISIBLE, 
  231.         20, 60, 300, 20, MainWindow, NULL, Instance, NULL);
  232.     SetWindowText(hWnd, "Copyright Tod Sambar 1996-1999");
  233.  
  234.     hWnd = CreateWindow("STATIC", "Reserved", WS_CHILD | WS_VISIBLE, 
  235.         20, 80, 300, 20, MainWindow, NULL, Instance, NULL);
  236.     SetWindowText(hWnd, "All rights reserved.");
  237.  
  238.     /* Setup the "real-time" statistics windows...                        */
  239.     ThreadStats = CreateWindow("STATIC", "Threads", WS_CHILD | WS_VISIBLE, 
  240.         350, 40, 300, 20, MainWindow, NULL, Instance, NULL);
  241.     SetWindowText(ThreadStats, "Server Threads: 0");
  242.  
  243.     HConnStats = CreateWindow("STATIC", "HConnections", WS_CHILD | WS_VISIBLE, 
  244.         350, 60, 300, 20, MainWindow, NULL, Instance, NULL);
  245.     SetWindowText(HConnStats, "HTTP Connections: 0");
  246.  
  247.     ConnStats = CreateWindow("STATIC", "Connections", WS_CHILD | WS_VISIBLE, 
  248.         350, 80, 300, 20, MainWindow, NULL, Instance, NULL);
  249.     SetWindowText(ConnStats, "Network Connections: 0");
  250.  
  251.     name[0] = '\0';
  252.     (SA_VOID)sa_ctx_props(ctx, SA_GET, SA_CTXPROP_SERVERNAME, 
  253.         (SA_BYTE *)name, 255, &len);
  254.     tmp[0] = '\0';
  255.     (SA_VOID)sa_ctx_props(ctx, SA_GET, SA_CTXPROP_SERVERIP, 
  256.         (SA_BYTE *)tmp, 64, &len);
  257.     (SA_VOID)sa_ctx_props(ctx, SA_GET, SA_CTXPROP_SERVERPORT, 
  258.         (SA_BYTE *)&port, sizeof(SA_INT), &len);
  259.     homedir[0] = '\0';
  260.     (SA_VOID)sa_ctx_props(ctx, SA_GET, SA_CTXPROP_HOMEDIR, 
  261.         (SA_BYTE *)homedir, 1024, &len);
  262.  
  263.     hWnd = CreateWindow("STATIC", "Server", WS_CHILD | WS_VISIBLE, 
  264.         20, 105, 300, 20, MainWindow, NULL, Instance, NULL);
  265.     wsprintf(buffer, "Sambar Server  '%s:%d'", name, port);
  266.     SetWindowText(hWnd, buffer);
  267.  
  268.     hWnd = CreateWindow("STATIC", "ipaddress", WS_CHILD | WS_VISIBLE, 
  269.         20, 125, 300, 20, MainWindow, NULL, Instance, NULL);
  270.     wsprintf(buffer, "IP Address: %s", tmp);
  271.     SetWindowText(hWnd, buffer);
  272.  
  273.     hWnd = CreateWindow("STATIC", "homedir", WS_CHILD | WS_VISIBLE, 
  274.         20, 145, 300, 20, MainWindow, NULL, Instance, NULL);
  275.     wsprintf(buffer, "Server Dir: %s", homedir);
  276.     SetWindowText(hWnd, buffer);
  277.  
  278.     /* Create a list box for the log display                            */
  279.     MainList = CreateWindow("LISTBOX", NULL, 
  280.                     WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL, 
  281.                     20, 170, 550, 240, MainWindow, (HMENU)1000, 
  282.                     Instance, NULL);
  283.  
  284.     if (!MainList)
  285.     {
  286.         MessageBox(NULL, "Failure creating list box.", 
  287.             NAME, MB_OK | MB_ICONSTOP );
  288.         (SA_VOID)sa_shutdown(0);
  289.         return (0);
  290.     }
  291.  
  292.     SendMessage(MainList, LB_SETHORIZONTALEXTENT, 2048, 0L);
  293.  
  294.     /*
  295.     ** Put the buttons in.
  296.     */
  297.     ClearButton = CreateWindow("BUTTON", "Clear", WS_CHILD | WS_VISIBLE, 
  298.         20, 400, 50, 25, MainWindow, NULL, Instance, NULL);
  299.     SetWindowText(ClearButton, "Clear");
  300.     if (!ClearButton)
  301.     {
  302.         MessageBox(NULL, "Failure creating clear button.", 
  303.             NAME, MB_OK | MB_ICONSTOP );
  304.         (SA_VOID)sa_shutdown(0);
  305.         return (0);
  306.     }
  307.  
  308.     PauseButton = CreateWindow("BUTTON", "Pause", WS_CHILD | WS_VISIBLE, 
  309.         240, 400, 90, 25, MainWindow, NULL, Instance, NULL);
  310.     SetWindowText(PauseButton, "Pause");
  311.     if (!PauseButton)
  312.     {
  313.         MessageBox(NULL, "Failure creating pause button.", 
  314.             NAME, MB_OK | MB_ICONSTOP );
  315.         (SA_VOID)sa_shutdown(0);
  316.         return (0);
  317.     }
  318.  
  319.     HideButton = CreateWindow("BUTTON", "Hide", WS_CHILD | WS_VISIBLE, 
  320.         520, 400, 50, 25, MainWindow, NULL, Instance, NULL);
  321.     SetWindowText(HideButton, "Hide");
  322.     if (!HideButton)
  323.     {
  324.         MessageBox(NULL, "Failure creating hide button.", 
  325.             NAME, MB_OK | MB_ICONSTOP );
  326.         (SA_VOID)sa_shutdown(0);
  327.         return (0);
  328.     }
  329.  
  330.     /* Add tray icon to system tray                                        */
  331.     IconData.cbSize             = sizeof(NOTIFYICONDATA);
  332.     IconData.hWnd                 = MainWindow;
  333.     IconData.uID                 = SERVER_ID;
  334.     IconData.uFlags             = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  335.     IconData.uCallbackMessage    = SERVER_MSG;
  336.     IconData.hIcon                = ServerIcon;
  337.     strcpy(IconData.szTip, "Sambar Server is Active");
  338.  
  339.     /* Win95 and NT4.0 only                                                */
  340.     if (!Shell_NotifyIcon(NIM_ADD, &IconData))
  341.     {
  342.         ShowWindow(MainWindow, CmdShow);
  343.         UpdateWindow(MainWindow);
  344.     }
  345.     else
  346.     {
  347.         ShellTray = TRUE;
  348.         ShowWindow(MainWindow, Showing ? SW_SHOW : SW_HIDE);
  349.     }
  350.  
  351.     /* Register the HTTP Log callback.                                    */
  352.     (SA_VOID)sa_ctx_props(ctx, SA_SET, SA_CTXPROP_HTTPLOGFUNC, 
  353.         (SA_BYTE *)HTTPLog, sizeof(SA_VOID *), (SA_INT *)NULL);
  354.  
  355.     /* Start the Web Browser to the home page                             */
  356.     if (StartBrowser)
  357.     {
  358.         if (port != 80)
  359.             wsprintf(buffer, "http://localhost:%d/", port);
  360.         else
  361.             strcpy(buffer, "http://localhost/");
  362.  
  363.         ShellExecute(GetTopWindow(NULL), "open", buffer, NULL, NULL, 
  364.             SW_SHOWNORMAL);
  365.     }
  366.  
  367.     /* Message loop                                                        */
  368.     while (GetMessage(&message, NULL, 0, 0))
  369.         DispatchMessage(&message);
  370.  
  371.     /* Shutdown the Sambar Server                                        */
  372.     (SA_VOID)sa_shutdown(0);
  373.  
  374.     Shell_NotifyIcon(NIM_DELETE, &IconData);
  375.     UnregisterClass(NAME, Instance);
  376.  
  377.     return (message.wParam);
  378. }
  379.  
  380. long __stdcall 
  381. WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  382. {
  383.     switch (message) 
  384.     {
  385.     case SERVER_MSG:
  386.         if ((wParam == SERVER_ID) && (lParam == WM_RBUTTONDOWN))
  387.         {
  388.             DisplayMenu(hWnd);
  389.         }
  390.         else if ((wParam == SERVER_ID) && (lParam == WM_LBUTTONDBLCLK))
  391.         {
  392.             Showing = TRUE;
  393.             ShowWindow(hWnd, SW_SHOW);
  394.         }
  395.         break;
  396.  
  397.     case WM_COMMAND:
  398.         if ((HWND)lParam == HideButton)
  399.         {
  400.             if (ShellTray)
  401.                 ShowWindow(MainWindow, SW_HIDE);
  402.             else
  403.                 ShowWindow(MainWindow, SW_MINIMIZE);
  404.  
  405.             LogCount = 1;
  406.             Showing = FALSE;
  407.             SendMessage(MainList, LB_RESETCONTENT, 0, 0);
  408.         }
  409.         else if ((HWND)lParam == PauseButton)
  410.         {
  411.             if (Paused)
  412.             {
  413.                 Paused = FALSE;
  414.                 sa_pause(TRUE);
  415.                 SetWindowText(PauseButton, "Pause");
  416.             }
  417.             else
  418.             {
  419.                 Paused = TRUE;
  420.                 sa_pause(FALSE);
  421.                 SetWindowText(PauseButton, "Un-Pause");
  422.             }
  423.         }
  424.         else if ((HWND)lParam == ClearButton)
  425.         {
  426.             /* Clear the list box                                        */
  427.             LogCount = 1;
  428.             SendMessage(MainList, LB_RESETCONTENT, 0, 0);
  429.         }
  430.         else
  431.         {
  432.             /* Unhandled message                                        */
  433.             DefWindowProc(hWnd, message, wParam, lParam);
  434.         }
  435.         break;
  436.  
  437.     case WM_DESTROY:
  438.         /* Shutdown the main window                                        */
  439.         PostQuitMessage(0);
  440.         break;
  441.  
  442.     default:
  443.         /* Unhandled Messages end up here (DefWindowProc)                */
  444.         return DefWindowProc(hWnd, message, wParam, lParam);
  445.     }
  446.  
  447.     return(0);
  448. }
  449.  
  450. void
  451. DisplayMenu(HWND hWnd)
  452. {
  453.     HMENU     MenuHnd;
  454.     POINT     MousePos;
  455.     int     ScreenWidth;
  456.     int     ScreenHeight;
  457.     int     SelItem;
  458.  
  459.     MenuHnd = CreatePopupMenu();
  460.     AppendMenu(MenuHnd, MF_ENABLED, 1, "Open");
  461.     AppendMenu(MenuHnd, MF_SEPARATOR, 0, NULL);
  462.     AppendMenu(MenuHnd, MF_ENABLED, 2, "Restart");
  463.     AppendMenu(MenuHnd, MF_ENABLED, 3, "Shutdown");
  464.  
  465.     //Get Mouse Pos
  466.     GetCursorPos(&MousePos);
  467.  
  468.     //Get Screen Metrics
  469.     ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  470.     ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  471.  
  472.     SetForegroundWindow(MainWindow);
  473.  
  474.     //Handle the different possible task bar locations
  475.     if ((MousePos.x >= (ScreenWidth / 2)) && (MousePos.y >= (ScreenHeight / 2)))
  476.     {
  477.         //Bottom or Right
  478.         SelItem = TrackPopupMenu(MenuHnd,
  479.             TPM_BOTTOMALIGN | TPM_RIGHTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON,
  480.             MousePos.x, ScreenHeight, 0, MainWindow, NULL);
  481.     }
  482.     else if (MousePos.y < (ScreenHeight / 2)) 
  483.     {
  484.         //Top
  485.         SelItem = TrackPopupMenu(MenuHnd,
  486.             TPM_TOPALIGN | TPM_RIGHTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON,
  487.             MousePos.x, MousePos.y, 0, MainWindow, NULL);
  488.     }
  489.     else 
  490.     {
  491.         //Left
  492.         SelItem = TrackPopupMenu(MenuHnd,
  493.             TPM_BOTTOMALIGN | TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON,
  494.             MousePos.x, ScreenHeight, 0, MainWindow, NULL);
  495.     }
  496.  
  497.     SetForegroundWindow(MainWindow);
  498.     DestroyMenu(MenuHnd);
  499.  
  500.     switch (SelItem)
  501.     {
  502.     case 1:
  503.         Showing = TRUE;
  504.         ShowWindow(MainWindow, SW_SHOW);
  505.         break;
  506.     case 2:
  507.         RestartServer(MainWindow);
  508.         break;
  509.     case 3:
  510.         ShutdownServer(MainWindow);
  511.         break;
  512.     default:
  513.         break;
  514.     }
  515. }
  516.  
  517. void
  518. ShutdownServer(HWND MainWindow)
  519. {
  520.     int Answer;
  521.  
  522.     Answer = MessageBox(MainWindow, 
  523.                 "Are you sure you want to shutdown the Sambar Server?",
  524.                 NAME, MB_YESNO | MB_ICONQUESTION);
  525.  
  526.     // If they do destroy the main window and let the the rest fall in place...
  527.     if (Answer == IDYES)
  528.         DestroyWindow(MainWindow);
  529. }
  530.  
  531. void
  532. RestartServer(HWND MainWindow)
  533. {
  534.     int Answer;
  535.  
  536.     Answer = MessageBox(MainWindow, 
  537.                 "Are you sure you want to restart the Sambar Server?",
  538.                 NAME, MB_YESNO | MB_ICONQUESTION);
  539.  
  540.     // If they do destroy the main window and let the the rest fall in place...
  541.     if (Answer == IDYES)
  542.         sa_shutdown(1);
  543. }
  544.  
  545.  
  546. void
  547. HTTPLog(SA_CTX *ctx, SA_HTTPLOG    *httplog)
  548. {
  549.     int        i;
  550.     int        n;
  551.     char    timestr[32];
  552.     char    str[2048];
  553.  
  554.     if (!MainList)
  555.         return;
  556.  
  557.     if ((!Showing) && (!AlwaysTrace))
  558.         return;
  559.  
  560.     LogCount++;
  561.     if (LogCount > 200)
  562.     {
  563.         LogCount = 1;
  564.         SendMessage(MainList, LB_RESETCONTENT, 0, 0);
  565.     }
  566.  
  567.     i = 0;
  568.     while ((httplog->timestamp[i] != '\0') && (httplog->timestamp[i] != ':'))
  569.         i++;
  570.  
  571.     n = 0;
  572.     while ((httplog->timestamp[i] != '\0') && 
  573.         (httplog->timestamp[i] != ' ') &&
  574.         (n < 16))
  575.     {
  576.         timestr[n] = httplog->timestamp[i];
  577.         n++;
  578.         i++;
  579.     }
  580.  
  581.     timestr[0] = '[';
  582.     timestr[n] = ']';
  583.     timestr[n+1] = '\0';
  584.  
  585.     sprintf(str, "[%s]  %s  %s  %ld  %s  %s    %ld", 
  586.         httplog->vhost, timestr, httplog->user, httplog->status, 
  587.         httplog->method, httplog->request, httplog->size);
  588.     SendMessage(MainList, LB_ADDSTRING, 0, (LPARAM)(LPSTR)str);
  589.     
  590.     n = SendMessage(MainList, LB_GETCOUNT, 0, 0);
  591.     SendMessage(MainList, LB_SETCURSEL, (unsigned int)n - 1, 0);
  592.  
  593.     sprintf(str, "Server Threads: %ld", httplog->threads);
  594.     SetWindowText(ThreadStats, str);
  595.     sprintf(str, "HTTP Connections: %ld", httplog->httpconns);
  596.     SetWindowText(HConnStats, str);
  597.     sprintf(str, "Network Connections: %ld", httplog->allconns);
  598.     SetWindowText(ConnStats, str);
  599.             
  600.     return;
  601. }
  602.  
  603. void
  604. GetArgs(LPSTR CmdLine)
  605. {
  606.     char    *p;
  607.  
  608.     if (CmdLine == NULL)
  609.         return;
  610.  
  611.     p = CmdLine;
  612.     while (*p != '\0')
  613.     {
  614.         switch ((int)*p)
  615.         {
  616.         case 'b':
  617.         case 'B':
  618.             StartBrowser = TRUE;
  619.             break;
  620.         case 's':
  621.         case 'S':
  622.             Showing = TRUE;
  623.             break;
  624.         case 't':
  625.         case 'T':
  626.             AlwaysTrace = FALSE;
  627.             break;
  628.         case '-':
  629.         default:
  630.             break;
  631.         }
  632.  
  633.         p++;
  634.     }
  635.  
  636.     return;
  637. }
  638.