home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / lora299s.zip / INETSERV.CPP < prev    next >
C/C++ Source or Header  |  1996-07-04  |  24KB  |  841 lines

  1.  
  2. // ----------------------------------------------------------------------
  3. // LoraBBS Professional Edition - Version 3.00.6
  4. // Copyright (c) 1996 by Marco Maccaferri. All rights reserved.
  5. //
  6. // History:
  7. //    13/06/96 - Initial coding.
  8. // ----------------------------------------------------------------------
  9.  
  10. #include "_ldefs.h"
  11. #include "inetserv.h"
  12. #include "lora.h"
  13.  
  14. #if defined(__NT__)
  15. #define DS_3DLOOK           0x0004L
  16. #define DS_CENTER           0x0800L
  17.  
  18. #define WS_EX_WINDOWEDGE        0x00000100L
  19. #define WS_EX_CLIENTEDGE        0x00000200L
  20.  
  21. #define WS_EX_OVERLAPPEDWINDOW  (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
  22. #endif
  23.  
  24. #if defined(__OS2__)
  25. #define IDOK            1
  26. #define IDCANCEL        2
  27. #endif
  28.  
  29. #define WMU_ADDITEM        1
  30. #define WMU_CLEAR          2
  31.  
  32. #if defined(__OS2__)
  33. HAB  hab;
  34. HWND hwndMainFrame, hwndMainClient;
  35. #elif defined(__NT__)
  36. HINSTANCE hinst;
  37. HWND hwndMainClient, hwndMainList;
  38. #endif
  39.  
  40. #if defined(__OS2__)
  41. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  42. #elif defined(__NT__)
  43. BOOL CALLBACK AboutDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  44. #endif
  45. {
  46.    switch (msg) {
  47. #if defined(__OS2__)
  48.       case WM_INITDLG: {
  49.          RECTL Dlg;
  50.          SWP swp;
  51.  
  52.          WinQueryWindowPos (hwndMainFrame, &swp);
  53.          WinQueryWindowRect (hwnd, &Dlg);
  54.          WinSetWindowPos (hwnd, HWND_TOP, swp.x + ((swp.cx - Dlg.xRight) / 2), swp.y + swp.cy - Dlg.yTop - 48, 0, 0, SWP_MOVE);
  55.          break;
  56.       }
  57. #elif defined(__NT__)
  58.       case WM_INITDIALOG:
  59.          return ((BOOL)TRUE);
  60.  
  61.       case WM_CTLCOLORBTN:
  62.       case WM_CTLCOLORSTATIC:
  63.       case WM_CTLCOLORDLG: {
  64.          LOGBRUSH logBrush;
  65.  
  66.          SetBkColor ((HDC)wParam, GetSysColor (COLOR_MENU));
  67.  
  68.          logBrush.lbStyle = BS_SOLID;
  69.          logBrush.lbColor = GetSysColor (COLOR_MENU);
  70.          logBrush.lbHatch = 0;
  71.  
  72.          return ((BOOL)CreateBrushIndirect (&logBrush));
  73.       }
  74. #endif
  75.  
  76. #if defined(__OS2__)
  77.       case WM_ERASEBACKGROUND:
  78.          return ((MRESULT)TRUE);
  79. #endif
  80.  
  81.       case WM_CLOSE:
  82. #if defined(__OS2__)
  83.          WinDismissDlg (hwnd, TRUE);
  84. #elif defined(__NT__)
  85.          EndDialog (hwnd, FALSE);
  86. #endif
  87.          break;
  88.    }
  89.  
  90. #if defined(__OS2__)
  91.    return (WinDefDlgProc (hwnd, msg, mp1, mp2));
  92. #elif defined(__NT__)
  93.    return ((BOOL)FALSE);
  94. #endif
  95. }
  96.  
  97. // ---------------------------------------------------------------------------
  98.  
  99. class TPMLog : public TLog
  100. {
  101. public:
  102.    TPMLog (HWND hwnd);
  103.    ~TPMLog (void);
  104.  
  105.    VOID   Write (PSZ pszFormat, ...);
  106.    VOID   WriteSend (PSZ pszFormat, ...);
  107.  
  108. private:
  109.    HWND   hwndList;
  110. #if defined(__OS2__)
  111.    HMTX   hmtx;
  112. #endif
  113. };
  114.  
  115. TPMLog::TPMLog (HWND hwnd)
  116. {
  117.    hwndList = hwnd;
  118. #if defined(__OS2__)
  119.    DosCreateMutexSem ("\\SEM32\\INETLOG", &hmtx, 0L, FALSE);
  120. #endif
  121. }
  122.  
  123. TPMLog::~TPMLog (void)
  124. {
  125. #if defined(__OS2__)
  126.    DosCloseMutexSem (hmtx);
  127. #endif
  128. }
  129.  
  130. VOID TPMLog::Write (PSZ pszFormat, ...)
  131. {
  132.    va_list arglist;
  133.    PSZ MsgTemp;
  134.    time_t t;
  135.    struct tm *timep;
  136.  
  137. #if defined(__OS2__)
  138.    DosRequestMutexSem (hmtx, -1);
  139. #endif
  140.  
  141.    va_start (arglist, pszFormat);
  142.    vsprintf (Buffer, pszFormat, arglist);
  143.    va_end (arglist);
  144.  
  145.    t = time (NULL);
  146.    timep = localtime (&t);
  147.    sprintf (Temp, "%c %02d %3s %02d:%02d:%02d %s %s", Buffer[0], timep->tm_mday, Months[timep->tm_mon], timep->tm_hour, timep->tm_min, timep->tm_sec, "LORA", &Buffer[1]);
  148.  
  149.    if (fp != NULL) {
  150.       fprintf (fp, "%s\n", Temp);
  151.       fflush (fp);
  152.    }
  153.  
  154.    if (hwndList != NULL) {
  155.       sprintf (Temp, "%c %02d:%02d %s", Buffer[0], timep->tm_hour, timep->tm_min, &Buffer[1]);
  156.       if ((MsgTemp = (PSZ)malloc (strlen (Temp) + 1)) != NULL) {
  157.          strcpy (MsgTemp, Temp);
  158. #if defined(__OS2__)
  159.          WinPostMsg (hwndList, WM_USER, MPFROMSHORT (WMU_ADDITEM), MPFROMP (MsgTemp));
  160. #elif defined(__NT__)
  161.          PostMessage (hwndList, WM_USER, WMU_ADDITEM, (LPARAM)MsgTemp);
  162. #endif
  163.       }
  164.    }
  165.  
  166. #if defined(__OS2__)
  167.    DosReleaseMutexSem (hmtx);
  168. #endif
  169. }
  170.  
  171. VOID TPMLog::WriteSend (PSZ pszFormat, ...)
  172. {
  173.    va_list arglist;
  174.    PSZ MsgTemp;
  175.    time_t t;
  176.    struct tm *timep;
  177.  
  178. #if defined(__OS2__)
  179.    DosRequestMutexSem (hmtx, -1);
  180. #endif
  181.  
  182.    va_start (arglist, pszFormat);
  183.    vsprintf (Buffer, pszFormat, arglist);
  184.    va_end (arglist);
  185.  
  186.    t = time (NULL);
  187.    timep = localtime (&t);
  188.    sprintf (Temp, "%c %02d %3s %02d:%02d:%02d %s %s", Buffer[0], timep->tm_mday, Months[timep->tm_mon], timep->tm_hour, timep->tm_min, timep->tm_sec, "LORA", &Buffer[1]);
  189.  
  190.    if (fp != NULL) {
  191.       fprintf (fp, "%s\n", Temp);
  192.       fflush (fp);
  193.    }
  194.  
  195.    if (hwndList != NULL) {
  196.       sprintf (Temp, "%c %02d:%02d %s", Buffer[0], timep->tm_hour, timep->tm_min, &Buffer[1]);
  197.       if ((MsgTemp = (PSZ)malloc (strlen (Temp) + 1)) != NULL) {
  198.          strcpy (MsgTemp, Temp);
  199. #if defined(__OS2__)
  200.          WinSendMsg (hwndList, WM_USER, MPFROMSHORT (WMU_ADDITEM), MPFROMP (MsgTemp));
  201. #elif defined(__NT__)
  202.          SendMessage (hwndList, WM_USER, WMU_ADDITEM, (LPARAM)MsgTemp);
  203. #endif
  204.       }
  205.    }
  206.  
  207. #if defined(__OS2__)
  208.    DosReleaseMutexSem (hmtx);
  209. #endif
  210. }
  211.  
  212. // ----------------------------------------------------------------------------
  213.  
  214. #define MAX_TELNET_SLOTS      16
  215.  
  216. USHORT TelnetSlots[MAX_TELNET_SLOTS];
  217. class  TConfig *Cfg;
  218. class  TPMLog *Log;
  219. class  TTcpip *Web, *Mail, *Pop, *Ftp, *Telnet, *News;
  220.  
  221. // ----------------------------------------------------------------------------
  222.  
  223. VOID WebThread (PVOID Args)
  224. {
  225.    class TTcpip *Data;
  226.    class TWeb *Server;
  227.  
  228. #if defined(__OS2__)
  229.    DosSetPriority (PRTYS_THREAD, PRTYC_IDLETIME, PRTYD_MAXIMUM, 0);
  230. #endif
  231.  
  232.    if ((Data = (class TTcpip *)Args) != NULL) {
  233.       if ((Server = new TWeb) != NULL) {
  234.          Server->Tcp = Data;
  235.          Server->Cfg = Cfg;
  236.          Server->Log = Log;
  237.          Server->Run ();
  238.       }
  239.       delete Data;
  240.    }
  241.  
  242.    _endthread ();
  243. }
  244.  
  245. VOID FtpThread (PVOID Args)
  246. {
  247.    class TTcpip *Data;
  248.    class TFTP *Server;
  249.  
  250. #if defined(__OS2__)
  251.    DosSetPriority (PRTYS_THREAD, PRTYC_IDLETIME, PRTYD_MAXIMUM, 0);
  252. #endif
  253.  
  254.    if ((Data = (class TTcpip *)Args) != NULL) {
  255.       if ((Server = new TFTP) != NULL) {
  256.          Server->Tcp = Data;
  257.          Server->Cfg = Cfg;
  258.          Server->Log = Log;
  259.          strcpy (Server->ClientIP, Data->ClientIP);
  260.          if (Server->Login () == TRUE)
  261.             Server->Run ();
  262.       }
  263.       delete Data;
  264.    }
  265.  
  266.    _endthread ();
  267. }
  268.  
  269. VOID PopThread (PVOID Args)
  270. {
  271.    class TTcpip *Data;
  272.    class TPOP3 *Server;
  273.  
  274. #if defined(__OS2__)
  275.    DosSetPriority (PRTYS_THREAD, PRTYC_IDLETIME, PRTYD_MAXIMUM, 0);
  276. #endif
  277.  
  278.    if ((Data = (class TTcpip *)Args) != NULL) {
  279.       if ((Server = new TPOP3) != NULL) {
  280.          Server->Tcp = Data;
  281.          Server->Cfg = Cfg;
  282.          Server->Log = Log;
  283.          Server->Run ();
  284.       }
  285.       delete Data;
  286.    }
  287.  
  288.    _endthread ();
  289. }
  290.  
  291. VOID NewsThread (PVOID Args)
  292. {
  293.    class TTcpip *Data;
  294.    class TNNTP *Server;
  295.  
  296. #if defined(__OS2__)
  297.    DosSetPriority (PRTYS_THREAD, PRTYC_IDLETIME, PRTYD_MAXIMUM, 0);
  298. #endif
  299.  
  300.    if ((Data = (class TTcpip *)Args) != NULL) {
  301.       if ((Server = new TNNTP) != NULL) {
  302.          Server->Tcp = Data;
  303.          Server->Cfg = Cfg;
  304.          Server->Log = Log;
  305.          Server->Run ();
  306.       }
  307.       delete Data;
  308.    }
  309.  
  310.    _endthread ();
  311. }
  312.  
  313. VOID BbsThread (PVOID Args)
  314. {
  315.    USHORT i, Mailer, Task = 1;
  316.    CHAR Temp[128];
  317.    class TTcpip *Data;
  318.    class TBbs *Bbs;
  319.    class TLog *Log;
  320.  
  321. #if defined(__OS2__)
  322.    DosSetPriority (PRTYS_THREAD, PRTYC_IDLETIME, PRTYD_MAXIMUM, 0);
  323. #endif
  324.  
  325.    if ((Data = (class TTcpip *)Args) != NULL) {
  326.       Mailer = FALSE;
  327.       for (i = 0; i < MAX_TELNET_SLOTS; i++) {
  328.          if (TelnetSlots[i] == FALSE) {
  329.             TelnetSlots[i] = TRUE;
  330.             Task = (USHORT)(Cfg->TaskNumber + i);
  331.             break;
  332.          }
  333.       }
  334.       if (i < MAX_TELNET_SLOTS) {
  335.          if ((Log = new TLog) != NULL) {
  336.             sprintf (Temp, Cfg->LogFile, Task);
  337.             Log->Open (Temp);
  338.          }
  339.          if ((Bbs = new TBbs) != NULL) {
  340.             Bbs->Log = Log;
  341.             Bbs->Cfg = Cfg;
  342.             Bbs->Com = Data;
  343.             Bbs->Task = Task;
  344.  
  345.             Data->SendBytes ((UCHAR *)"\xFF\xFD\x01\xFF\xFD\x00\xFF\xFB\x01\xFF\xFB\x00", 12);
  346.  
  347.             Bbs->Run ();
  348.             Mailer = Bbs->Mailer;
  349.             delete Bbs;
  350.          }
  351.          if (Log != NULL)
  352.             delete Log;
  353.  
  354.          TelnetSlots[i] = FALSE;
  355.       }
  356.       delete Data;
  357.    }
  358.  
  359.    _endthread ();
  360. }
  361.  
  362. // ----------------------------------------------------------------------------
  363.  
  364. #if defined(__NT__)
  365. USHORT Win95DialogBox (HINSTANCE hinst, PSZ Dialog, HWND hwnd, DLGPROC DialogProc)
  366. {
  367.    USHORT RetVal = FALSE;
  368.    HRSRC hrsrc;
  369.    HGLOBAL hGlobal;
  370.    DLGTEMPLATE *dlgTemplate;
  371.  
  372.    if ((hrsrc = FindResource (NULL, Dialog, RT_DIALOG)) != NULL) {
  373.       if ((hGlobal = LoadResource (NULL, hrsrc)) != NULL) {
  374.          if ((dlgTemplate = (DLGTEMPLATE *)LockResource (hGlobal)) != NULL) {
  375.             dlgTemplate->style |= DS_3DLOOK|DS_CENTER;
  376.             RetVal = (USHORT)DialogBoxIndirect (hinst, dlgTemplate, hwnd, (DLGPROC)DialogProc);
  377.          }
  378.       }
  379.       FreeResource (hrsrc);
  380.    }
  381.  
  382.    return (RetVal);
  383. }
  384. #endif
  385.  
  386. #if defined(__OS2__)
  387. MRESULT EXPENTRY MainWinProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  388. #elif defined(__NT__)
  389. LRESULT CALLBACK MainWinProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  390. #endif
  391. {
  392.    switch (msg) {
  393.       case WM_CREATE: {
  394.          CHAR Temp[128];
  395. #if defined(__OS2__)
  396.          HWND hwndMainList;
  397.  
  398.          if ((hwndMainList = WinCreateWindow (hwnd, WC_LISTBOX, NULL, LS_NOADJUSTPOS|LS_HORZSCROLL|WS_GROUP|WS_TABSTOP|WS_VISIBLE, 0, 0, 0, 0, hwnd, HWND_TOP, 101, NULL, NULL)) != NULLHANDLE)
  399.             WinSetPresParam (hwndMainList, PP_FONTNAMESIZE, 14, "11.System VIO");
  400. #elif defined(__NT__)
  401.          LOGFONT logFont;
  402.          HFONT hFont;
  403.  
  404.          if ((hwndMainList = CreateWindow ("LISTBOX", "", LBS_NOINTEGRALHEIGHT|LBS_MULTIPLESEL|WS_CHILD, 0, 0, 100, 50, hwnd, NULL, hinst, NULL)) != NULL) {
  405.             logFont.lfHeight = 12;
  406.             logFont.lfWidth = 8;
  407.             logFont.lfEscapement = 0;
  408.             logFont.lfOrientation = 0;
  409.             logFont.lfWeight = FW_NORMAL;
  410.             logFont.lfItalic = FALSE;
  411.             logFont.lfUnderline = FALSE;
  412.             logFont.lfStrikeOut = FALSE;
  413.             logFont.lfCharSet = OEM_CHARSET;
  414.             logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
  415.             logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  416.             logFont.lfQuality = DEFAULT_QUALITY;
  417.             logFont.lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;
  418.             strcpy (logFont.lfFaceName, "Fixedsys");
  419.             if ((hFont = CreateFontIndirect (&logFont)) != NULL)
  420.                SendMessage (hwndMainList, WM_SETFONT, (WPARAM)hFont, MAKELPARAM (FALSE, 0));
  421.             ShowWindow (hwndMainList, SW_SHOW);
  422.          }
  423. #endif
  424.          if (hwndMainList != NULL) {
  425.             if ((Log = new TPMLog (hwnd)) != NULL) {
  426.                if (Cfg->LogFile[0] != '\0')
  427.                   sprintf (Temp, "lora%u.log", Cfg->TaskNumber);
  428.                else
  429.                   sprintf (Temp, Cfg->LogFile, Cfg->TaskNumber);
  430.  
  431.                Log->Open (Temp);
  432. #if defined(__OS2__)
  433.                Log->Write ("+Begin, v%s (OS/2)", VERSION);
  434. #elif defined(__NT__)
  435.                Log->Write ("+Begin, v%s (Win32)", VERSION);
  436. #endif
  437.                Log->Write ("+Message-base sharing is enabled");
  438.             }
  439.          }
  440.          break;
  441.       }
  442.  
  443. #if defined(__NT__)
  444.       case WM_CTLCOLORLISTBOX: {
  445.          LOGBRUSH logBrush;
  446.  
  447.          SetBkColor ((HDC)wParam, GetSysColor (COLOR_WINDOW));
  448.  
  449.          logBrush.lbStyle = BS_SOLID;
  450.          logBrush.lbColor = GetSysColor (COLOR_WINDOW);
  451.          logBrush.lbHatch = 0;
  452.  
  453.          return ((BOOL)CreateBrushIndirect (&logBrush));
  454.       }
  455. #endif
  456.  
  457.       case WM_USER:
  458. #if defined(__OS2__)
  459.          switch (SHORT1FROMMP (mp1)) {
  460. #elif defined(__NT__)
  461.          switch (wParam) {
  462. #endif
  463.             case WMU_ADDITEM: {
  464.                USHORT Item;
  465.  
  466. #if defined(__OS2__)
  467.                if ((USHORT)WinSendMsg (WinWindowFromID (hwnd, 101), LM_QUERYITEMCOUNT, 0L, 0L) > 200)
  468.                   WinSendMsg (WinWindowFromID (hwnd, 101), LM_DELETEITEM, MPFROMSHORT (0), 0L);
  469.  
  470.                Item = (USHORT)WinSendMsg (WinWindowFromID (hwnd, 101), LM_INSERTITEM, MPFROMSHORT (LIT_END), mp2);
  471.                WinSendMsg (WinWindowFromID (hwnd, 101), LM_SELECTITEM, MPFROMSHORT (Item), MPFROMSHORT (TRUE));
  472.                free ((PSZ)mp2);
  473. #elif defined(__NT__)
  474.                SendMessage (hwndMainList, LB_SETSEL, FALSE, (LPARAM)-1);
  475.                Item = (USHORT)SendMessage (hwndMainList, LB_ADDSTRING, 0, lParam);
  476.                SendMessage (hwndMainList, LB_SETSEL, TRUE, (LPARAM)Item);
  477.                free ((PSZ)lParam);
  478. #endif
  479.                break;
  480.             }
  481.  
  482.             case WMU_CLEAR:
  483. #if defined(__OS2__)
  484.                WinSendMsg (WinWindowFromID (hwnd, 101), LM_DELETEALL, 0L, 0L);
  485. #elif defined(__NT__)
  486. #endif
  487.                break;
  488.          }
  489.          break;
  490.  
  491.       case WM_TIMER: {
  492.          USHORT Socket;
  493.          class TTcpip *Data;
  494.  
  495.          if (Web != NULL) {
  496.             if ((Socket = Web->WaitClient ()) != 0) {
  497.                Log->Write (":Web: Incoming from %s (%s)", Web->ClientName, Web->ClientIP);
  498.                if ((Data = new TTcpip) != NULL) {
  499.                   Data->Initialize (0, Socket);
  500. #if defined(__BORLANDC__)
  501.                   _beginthread (WebThread, 8192, (PVOID)Data);
  502. #elif defined(_MSC_VER)
  503.                   DWORD ThreadId;
  504.  
  505.                   CreateThread (NULL, 8192, (LPTHREAD_START_ROUTINE)WebThread, (PVOID)Data, 0L, &ThreadId);
  506. #else
  507.                   _beginthread (WebThread, NULL, 8192U, (PVOID)Data);
  508. #endif
  509.                }
  510.             }
  511.          }
  512.          if (Ftp != NULL) {
  513.             if ((Socket = Ftp->WaitClient ()) != 0) {
  514.                Log->Write (":FTP: Incoming from %s (%s)", Ftp->ClientName, Ftp->ClientIP);
  515.                if ((Data = new TTcpip) != NULL) {
  516.                   Data->Initialize (0, Socket);
  517.                   strcpy (Data->ClientIP, Ftp->ClientIP);
  518. #if defined(__BORLANDC__)
  519.                   _beginthread (FtpThread, 8192, (PVOID)Data);
  520. #elif defined(_MSC_VER)
  521.                   DWORD ThreadId;
  522.  
  523.                   CreateThread (NULL, 8192, (LPTHREAD_START_ROUTINE)FtpThread, (PVOID)Data, 0L, &ThreadId);
  524. #else
  525.                   _beginthread (FtpThread, NULL, 32768U, (PVOID)Data);
  526. #endif
  527.                }
  528.             }
  529.          }
  530.          if (Telnet != NULL) {
  531.             if ((Socket = Telnet->WaitClient ()) != 0) {
  532.                Log->Write (":Telnet: Incoming from %s (%s)", Telnet->ClientName, Telnet->ClientIP);
  533.                if ((Data = new TTcpip) != NULL) {
  534.                   Data->Initialize (0, Socket);
  535. #if defined(__BORLANDC__)
  536.                   _beginthread (BbsThread, 8192, (PVOID)Data);
  537. #elif defined(_MSC_VER)
  538.                   DWORD ThreadId;
  539.  
  540.                   CreateThread (NULL, 8192, (LPTHREAD_START_ROUTINE)BbsThread, (PVOID)Data, 0L, &ThreadId);
  541. #else
  542.                   _beginthread (BbsThread, NULL, 32768U, (PVOID)Data);
  543. #endif
  544.                }
  545.             }
  546.          }
  547.          if (Pop != NULL) {
  548.             if ((Socket = Pop->WaitClient ()) != 0) {
  549.                Log->Write (":POP3: Incoming from %s (%s)", Pop->ClientName, Pop->ClientIP);
  550.                if ((Data = new TTcpip) != NULL) {
  551.                   Data->Initialize (0, Socket);
  552. #if defined(__BORLANDC__)
  553.                   _beginthread (PopThread, 8192, (PVOID)Data);
  554. #elif defined(_MSC_VER)
  555.                   DWORD ThreadId;
  556.  
  557.                   CreateThread (NULL, 8192, (LPTHREAD_START_ROUTINE)PopThread, (PVOID)Data, 0L, &ThreadId);
  558. #else
  559.                   _beginthread (PopThread, NULL, 8192, (PVOID)Data);
  560. #endif
  561.                }
  562.             }
  563.          }
  564.          if (News != NULL) {
  565.             if ((Socket = News->WaitClient ()) != 0) {
  566.                Log->Write (":NNTP: Incoming from %s (%s)", News->ClientName, News->ClientIP);
  567.                if ((Data = new TTcpip) != NULL) {
  568.                   Data->Initialize (0, Socket);
  569. #if defined(__BORLANDC__)
  570.                   _beginthread (NewsThread, 8192, (PVOID)Data);
  571. #elif defined(_MSC_VER)
  572.                   DWORD ThreadId;
  573.  
  574.                   CreateThread (NULL, 8192, (LPTHREAD_START_ROUTINE)NewsThread, (PVOID)Data, 0L, &ThreadId);
  575. #else
  576.                   _beginthread (NewsThread, NULL, 8192, (PVOID)Data);
  577. #endif
  578.                }
  579.             }
  580.          }
  581.  
  582.          if (Telnet == NULL) {
  583.             if ((Telnet = new TTcpip) != NULL) {
  584.                if (Telnet->Initialize (23) == TRUE)
  585.                   Log->Write ("+Telnet Server started on port 23");
  586.                else {
  587.                   delete Telnet;
  588.                   Telnet = NULL;
  589.                }
  590.             }
  591.          }
  592.          if (Ftp == NULL) {
  593.             if ((Ftp = new TTcpip) != NULL) {
  594.                if (Ftp->Initialize (21) == TRUE)
  595.                   Log->Write ("+FTP Server started on port 21");
  596.                else {
  597.                   delete Ftp;
  598.                   Ftp = NULL;
  599.                }
  600.             }
  601.          }
  602.          if (Web == NULL) {
  603.             if ((Web = new TTcpip) != NULL) {
  604.                if (Web->Initialize (80) == TRUE)
  605.                   Log->Write ("+HTTP Server started on port 80");
  606.                else {
  607.                   delete Web;
  608.                   Web = NULL;
  609.                }
  610.             }
  611.          }
  612.          if (Pop == NULL) {
  613.             if ((Pop = new TTcpip) != NULL) {
  614.                if (Pop->Initialize (110) == TRUE)
  615.                   Log->Write ("+POP3 Server started on port 110");
  616.                else {
  617.                   delete Pop;
  618.                   Pop = NULL;
  619.                }
  620.             }
  621.          }
  622.          if (News == NULL) {
  623.             if ((News = new TTcpip) != NULL) {
  624.                if (News->Initialize (119) == TRUE)
  625.                   Log->Write ("+NNTP Server started on port 119");
  626.                else {
  627.                   delete News;
  628.                   News = NULL;
  629.                }
  630.             }
  631.          }
  632.          break;
  633.       }
  634.  
  635.       case WM_SIZE:
  636. #if defined(__OS2__)
  637.          WinSetWindowPos (WinWindowFromID (hwnd, 101), NULLHANDLE, 0, 0, SHORT1FROMMP (mp2), SHORT2FROMMP (mp2), SWP_SIZE|SWP_SHOW);
  638. #elif defined(__NT__)
  639.          MoveWindow (hwndMainList, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE);
  640. #endif
  641.          break;
  642.  
  643. #if defined(__OS2__)
  644.       case WM_ERASEBACKGROUND:
  645.          return ((MRESULT)TRUE);
  646. #endif
  647.  
  648.       case WM_COMMAND:
  649. #if defined(__OS2__)
  650.          switch (SHORT1FROMMP (mp1)) {
  651. #elif defined(__NT__)
  652.          switch (wParam) {
  653. #endif
  654.             case 206:      // Global / Internet Options
  655. #if defined(__OS2__)
  656.                if ((USHORT)WinDlgBox (HWND_DESKTOP, hwnd, InternetDlgProc, NULLHANDLE, 23, NULL) == TRUE)
  657. #elif defined(__NT__)
  658.                if (Win95DialogBox (hinst, "INTERNET", hwnd, (DLGPROC)InternetDlgProc) == TRUE)
  659. #endif
  660.                   Cfg->Save ();
  661.                break;
  662.          }
  663.          break;
  664.  
  665. #if defined(__OS2__)
  666.       case WM_CONTROL:
  667.          break;
  668. #endif
  669.  
  670. #if defined(__OS2__)
  671.       case WM_CLOSE:
  672. #elif defined(__NT__)
  673.       case WM_DESTROY:
  674. #endif
  675.          if (Log != NULL) {
  676.             Log->Write (":End");
  677.             Log->WriteBlank ();
  678.             delete Log;
  679.          }
  680. #if defined(__NT__)
  681.          PostQuitMessage (0);
  682. #endif
  683.          break;
  684.    }
  685.  
  686. #if defined(__OS2__)
  687.    return (WinDefWindowProc (hwnd, msg, mp1, mp2));
  688. #elif defined(__NT__)
  689.    return (DefWindowProc (hwnd, msg, wParam, lParam));
  690. #endif
  691. }
  692.  
  693. #if defined(__OS2__)
  694. void main (int argc, char *argv[])
  695. {
  696.    int i;
  697.    USHORT Task = 1;
  698.    CHAR Title[128], *Config = NULL, *Channel = NULL;
  699.    HMQ hmq;
  700.    QMSG qmsg;
  701.    ULONG flFrame;
  702.    POINTL aptl[2];
  703. //   HACCEL haccel;
  704.  
  705.    Log = NULL;
  706.    Web = Mail = Pop = Ftp = Telnet = News = NULL;
  707.  
  708.    for (i = 1; i < argc; i++) {
  709.       if (!stricmp (argv[i], "/LINE")) {
  710.          i++;
  711.          Task = (USHORT)atoi (argv[i]);
  712.       }
  713.       else if (Config == NULL)
  714.          Config = argv[i];
  715.       else if (Channel == NULL)
  716.          Channel = argv[i];
  717.    }
  718.  
  719.    if ((Cfg = new TConfig) != NULL) {
  720.       Cfg->TaskNumber = Task;
  721.       if (Cfg->Load (Config, Channel) == FALSE)
  722.          Cfg->Default ();
  723.    }
  724.  
  725.    if ((hab = WinInitialize (0)) != 0) {
  726.       if ((hmq = WinCreateMsgQueue (hab, 0)) != 0) {
  727.          WinRegisterClass (hab, "MAIN_WINDOW", MainWinProc, CS_CLIPCHILDREN|CS_SIZEREDRAW|CS_MOVENOTIFY, 0);
  728.  
  729.          flFrame = (FCF_TASKLIST|FCF_TITLEBAR|FCF_SYSMENU|FCF_MINMAX|FCF_SIZEBORDER|FCF_NOBYTEALIGN|FCF_MENU);
  730.          if ((hwndMainFrame = WinCreateStdWindow (HWND_DESKTOP, 0, &flFrame, "MAIN_WINDOW", NULL, 0, NULLHANDLE, 257, &hwndMainClient)) != NULLHANDLE) {
  731.             sprintf (Title, "%s Internet Server v%s%s", NAME, VERSION, "");
  732.             WinSetWindowText (hwndMainFrame, Title);
  733.  
  734.             aptl[ 0 ].x = 60;
  735.             aptl[ 0 ].y = 100;
  736.             aptl[ 1 ].x = 250;
  737.             aptl[ 1 ].y = 100;
  738.             WinMapDlgPoints (HWND_DESKTOP, aptl, 2, TRUE);
  739.             WinSetWindowPos (hwndMainFrame, NULLHANDLE, aptl[0].x, aptl[0].y, aptl[1].x, aptl[1].y, SWP_SIZE|SWP_MOVE|SWP_SHOW|SWP_ACTIVATE);
  740.  
  741.             WinStartTimer (hab, hwndMainClient, 1, 50);
  742.  
  743.             while (WinGetMsg (hab, &qmsg, NULLHANDLE, 0, 0)) {
  744.                WinDispatchMsg (hab, &qmsg);
  745.             }
  746.  
  747.             WinStopTimer (hab, hwndMainClient, 1);
  748.             WinDestroyWindow (hwndMainFrame);
  749.          }
  750.  
  751.          WinDestroyMsgQueue (hmq);
  752.       }
  753.       WinTerminate (hab);
  754.    }
  755.  
  756.    if (Cfg != NULL)
  757.       delete Cfg;
  758. }
  759. #elif defined(__NT__)
  760. int PASCAL WinMain (HINSTANCE hinstCurrent, HINSTANCE hinstPrevious, LPSTR lpszCmdLine, int nCmdShow)
  761. {
  762.    MSG msg;
  763.    WNDCLASS wc;
  764.  
  765.    Log = NULL;
  766.    Modem = NULL;
  767.    Events = NULL;
  768.    hwndModemClient = NULL;
  769.    lpszCmdLine = lpszCmdLine;
  770.  
  771.    if ((Cfg = new TConfig) != NULL) {
  772.       if (Cfg->Load () == FALSE)
  773.          Cfg->Default ();
  774.       if ((Events = new TEvents (Cfg->SchedulerFile)) != NULL)
  775.          Events->Load ();
  776.       Outbound = new TOutbound (Cfg->Outbound);
  777.    }
  778.  
  779.    if (hinstPrevious == NULL) {
  780.       wc.style         = 0;
  781.       wc.lpfnWndProc   = MainWinProc;
  782.       wc.cbClsExtra    = 0;
  783.       wc.cbWndExtra    = 0;
  784.       wc.hInstance     = hinstCurrent;
  785.       wc.hIcon         = NULL;
  786.       wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
  787.       wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  788.       wc.lpszMenuName  = "MENU_1";
  789.       wc.lpszClassName = "MAIN_WINDOW";
  790.  
  791.       if (!RegisterClass (&wc))
  792.          return (FALSE);
  793.  
  794.       wc.style         = 0;
  795.       wc.lpfnWndProc   = ModemWinProc;
  796.       wc.cbClsExtra    = 0;
  797.       wc.cbWndExtra    = 0;
  798.       wc.hInstance     = hinstCurrent;
  799.       wc.hIcon         = NULL;
  800.       wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
  801.       wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  802.       wc.lpszMenuName  = NULL;
  803.       wc.lpszClassName = "MODEM_WINDOW";
  804.  
  805.       if (!RegisterClass (&wc))
  806.          return (FALSE);
  807.    }
  808.  
  809.    hinst = hinstCurrent;
  810.    msg.wParam = FALSE;
  811.  
  812.    if ((hwndMainClient = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, "MAIN_WINDOW", "LoraBBS v3.00 (Unregistered)", WS_OVERLAPPEDWINDOW, 170, 240, 400, 200, NULL, NULL, hinstCurrent, NULL)) != NULL) {
  813.       ShowWindow (hwndMainClient, nCmdShow);
  814.  
  815.       Status = 0;
  816.       SetTimer (hwndMainClient, 1, MODEM_DELAY, NULL);
  817.       if (Events != NULL)
  818.          SetTimer (hwndMainClient, 2, EVENTS_DELAY, NULL);
  819.  
  820.       while (GetMessage (&msg, NULL, 0, 0)) {
  821.          TranslateMessage (&msg);
  822.          DispatchMessage (&msg);
  823.       }
  824.  
  825.       if (Events != NULL)
  826.          KillTimer (hwndMainClient, 2);
  827.       KillTimer (hwndMainClient, 1);
  828.    }
  829.  
  830.    if (Cfg != NULL)
  831.       delete Cfg;
  832.    if (Events != NULL)
  833.       delete Events;
  834.    if (Outbound != NULL)
  835.       delete Outbound;
  836.  
  837.    return ((int)msg.wParam);
  838. }
  839. #endif
  840.  
  841.