PagePeople.cpp
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:35k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // PagePeople.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NetManager.h"
  5. #include "PagePeople.h"
  6. #include "PagePeopleList.h"
  7. #include "GlobalsExtern.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // finger
  15. #define WSVERSION 0x101                   // Windows Sockets version
  16. #define INET_ADDR inet_addr            // WS DLL has the right inet_addr
  17. typedef unsigned long IPA;
  18. typedef IPA FAR *LPIPA;
  19. typedef LPIPA FAR *LPPIPA;
  20. #define FE_ERROR    1     // finger operation was not successful
  21. #define FE_NOPORT   2     // failure to resolve finger service to a port 
  22. #define FE_NOHOST   3     // failure to resolve host specifier
  23. #define FE_NOSOCK   4     // failure to obtain socket for connection
  24. #define FE_NOCONN   5     // failure to connect to remote finger server
  25. #define FE_NOSEND   6     // failure to send finger query
  26. #define FE_NORECV   7     // failure to receive finger data
  27. IPA g_GetHostAddr(char*);
  28. bool g_Finger(CString, CString, CString&);
  29. UINT g_FingerThread(LPVOID);
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CPagePeople property page
  32. IMPLEMENT_DYNCREATE(CPagePeople, CPropertyPage)
  33. CPagePeople::CPagePeople() : CPropertyPage(CPagePeople::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CPagePeople)
  36. m_sServer = _T("");
  37. m_sUser = _T("");
  38. m_nPeopleMinutes = 0;
  39. m_bOnStart = FALSE;
  40. m_bOnEnd = FALSE;
  41. //}}AFX_DATA_INIT
  42. }
  43. CPagePeople::~CPagePeople()
  44. {
  45. }
  46. void CPagePeople::DoDataExchange(CDataExchange* pDX)
  47. {
  48. CPropertyPage::DoDataExchange(pDX);
  49. //{{AFX_DATA_MAP(CPagePeople)
  50. DDX_Control(pDX, IDC_LOCAL_NET, m_LocalNet);
  51. DDX_Control(pDX, IDC_SPIN_PEOPLE, m_PeopleSpin);
  52. DDX_Control(pDX, IDB_CHECK_ALL, m_CheckAll);
  53. DDX_Control(pDX, IDB_ACTIVE, m_Active);
  54. DDX_Control(pDX, IDB_ISMANUAL, m_IsManual);
  55. DDX_Control(pDX, IDB_ACTIVE_MAIL, m_ActiveMail);
  56. DDX_Control(pDX, IDB_EVERY, m_Every);
  57. DDX_Control(pDX, IDC_FINGERUSER, m_User);
  58. DDX_Control(pDX, IDC_FINGERSERVER, m_Server);
  59. DDX_Text(pDX, IDC_FINGERSERVER, m_sServer);
  60. DDV_MaxChars(pDX, m_sServer, 40);
  61. DDX_Text(pDX, IDC_FINGERUSER, m_sUser);
  62. DDV_MaxChars(pDX, m_sUser, 40);
  63. DDX_Text(pDX, IDC_MINUTES, m_nPeopleMinutes);
  64. DDV_MinMaxInt(pDX, m_nPeopleMinutes, 0, 10000);
  65. DDX_Check(pDX, IDB_ONSTART, m_bOnStart);
  66. DDX_Check(pDX, IDB_ONEND, m_bOnEnd);
  67. //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(CPagePeople, CPropertyPage)
  70. //{{AFX_MSG_MAP(CPagePeople)
  71. ON_BN_CLICKED(IDB_REMOVE, OnRemove)
  72. ON_BN_CLICKED(IDB_FINGER, OnFinger)
  73. ON_BN_CLICKED(IDB_FINGER_MANUAL, OnFingerManual)
  74. ON_BN_CLICKED(IDC_FINGER_CURRENT, OnFingerCurrent)
  75. ON_NOTIFY(NM_DBLCLK, IDC_SERVERTREE, OnDblclkServertree)
  76. ON_BN_CLICKED(IDB_ACTIVE, OnActive)
  77. ON_BN_CLICKED(IDB_ACTIVE_MAIL, OnActiveMail)
  78. ON_BN_CLICKED(IDB_ISMANUAL, OnIsManual)
  79. ON_BN_CLICKED(IDB_CHECK_ALL, OnCheckAll)
  80. ON_BN_CLICKED(IDB_EVERY, OnEvery)
  81. ON_EN_KILLFOCUS(IDC_MINUTES, OnKillfocusMinutes)
  82. ON_BN_CLICKED(IDC_LOCAL_NET, OnLocalNet)
  83. ON_EN_CHANGE(IDC_FINGERSERVER, OnChangeFingerserver)
  84. ON_EN_CHANGE(IDC_FINGERUSER, OnChangeFingeruser)
  85. //}}AFX_MSG_MAP
  86. END_MESSAGE_MAP()
  87. /////////////////////////////////////////////////////////////////////////////
  88. // CPagePeople message handlers
  89. BOOL CPagePeople::OnInitDialog() 
  90. {
  91. CPropertyPage::OnInitDialog();
  92.   m_ToolTip.Create(this);
  93.   m_ToolTip.Activate(TRUE);
  94.   CWnd* pWnd = GetWindow(GW_CHILD);
  95.   while(pWnd)
  96.   {
  97.     int nID = pWnd->GetDlgCtrlID();
  98.     if (nID != -1)
  99.       m_ToolTip.AddTool(pWnd, pWnd->GetDlgCtrlID());
  100.     pWnd = pWnd->GetWindow(GW_HWNDNEXT);
  101.   }
  102.   m_ServerTree.SubclassDlgItem(IDC_SERVERTREE, this);
  103.   m_PeopleSpin.SetRange(0, 10000);
  104. // image list ---------------------------------------------------------------
  105.   HICON Icon0 = g_pThisApp->LoadIcon(IDI_SERVER);
  106.   HICON Icon1 = g_pThisApp->LoadIcon(IDI_USER);
  107.   HICON Icon2 = g_pThisApp->LoadIcon(IDI_MANUAL);
  108.   HICON Icon3 = g_pThisApp->LoadIcon(IDI_MAIL);
  109.   HICON Icon4 = g_pThisApp->LoadIcon(IDI_LINE);
  110.   m_ImagesSmall.Create(16, 16, ILC_COLORDDB | ILC_MASK, 5, 0);
  111.   m_ImagesLarge.Create(32, 32, ILC_COLORDDB | ILC_MASK, 5, 0);
  112.   m_ImagesSmall.Add(Icon0);
  113.   m_ImagesSmall.Add(Icon1);
  114.   m_ImagesSmall.Add(Icon2);
  115.   m_ImagesSmall.Add(Icon3);
  116.   m_ImagesSmall.Add(Icon4);
  117.   m_ImagesLarge.Add(Icon0);
  118.   m_ImagesLarge.Add(Icon1);
  119.   m_ImagesLarge.Add(Icon2);
  120.   m_ImagesLarge.Add(Icon3);
  121.   m_ImagesLarge.Add(Icon4);
  122.   SetSmallImages();
  123. return TRUE;  // return TRUE unless you set the focus to a control
  124.               // EXCEPTION: OCX Property Pages should return FALSE
  125. }
  126. /////////////////////////////////////////////////////////////////////////////
  127. void CPagePeople::SetSmallImages()
  128. {
  129.   m_ServerTree.SetImageList(&m_ImagesSmall, TVSIL_NORMAL);
  130.   m_ServerTree.SetImageList(&m_ImagesSmall, TVSIL_STATE);
  131. }
  132. /////////////////////////////////////////////////////////////////////////////
  133. void CPagePeople::SetLargeImages()
  134. {
  135.   m_ServerTree.SetImageList(&m_ImagesLarge, TVSIL_NORMAL);
  136.   m_ServerTree.SetImageList(&m_ImagesLarge, TVSIL_STATE);
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. void CPagePeople::AddServer() 
  140. {
  141.   UpdateData();
  142.   if(!m_sServer.IsEmpty())
  143.   {
  144.     AddServer(m_sServer, 0);
  145.     g_WriteToHistory(TRUE, "[People] Added " + m_sServer);
  146.     m_Server.SetWindowText("");
  147.   }
  148.   else
  149.     AfxMessageBox("You must enter a server");
  150.   m_ServerTree.RedrawWindow();
  151. }
  152. /////////////////////////////////////////////////////////////////////////////
  153. void CPagePeople::AddUser() 
  154. {
  155.   UpdateData();
  156.   if(m_sUser != "")
  157.   {
  158.     HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  159.     if(hCurrItem)
  160.     {
  161.       HTREEITEM hCurrServer;
  162.       if(hCurrServer = m_ServerTree.GetParentItem(hCurrItem))
  163.         hCurrItem = hCurrServer;
  164.       AddUser(hCurrItem, m_sUser, 0);
  165.       g_WriteToHistory(TRUE, "[People] Added " + m_sUser + " to " + m_ServerTree.GetItemText(hCurrItem));
  166.       m_User.SetWindowText("");
  167.     }
  168.     else
  169.       AfxMessageBox("Select a server");
  170.   }
  171.   else
  172.     AfxMessageBox("You must enter a user");
  173.   m_ServerTree.RedrawWindow();
  174. }
  175. /////////////////////////////////////////////////////////////////////////////
  176. void CPagePeople::OnRemove() 
  177. {
  178.   HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  179.   if(hCurrItem)
  180.   {
  181.     if(MessageBox("Remove this item???", NULL, MB_ICONQUESTION | MB_YESNO) == IDYES)
  182.     {
  183.       g_WriteToHistory(TRUE, "[People] Removed " + m_ServerTree.GetItemText(hCurrItem));
  184.       m_ServerTree.DeleteItem(hCurrItem);
  185.     }
  186.   }
  187.   else
  188.     AfxMessageBox("Nothing selected");
  189. }
  190. /////////////////////////////////////////////////////////////////////////////
  191. void CPagePeople::OnIsManual() 
  192. {
  193.   HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  194.   if((m_ServerTree.GetItemState(hCurrItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MANUAL))
  195.     m_ServerTree.SetItemState(hCurrItem, INDEXTOSTATEIMAGEMASK(ICON_EMPTY), TVIS_STATEIMAGEMASK);
  196.   else
  197.     m_ServerTree.SetItemState(hCurrItem, INDEXTOSTATEIMAGEMASK(ICON_MANUAL), TVIS_STATEIMAGEMASK);
  198. }
  199. /////////////////////////////////////////////////////////////////////////////
  200. void CPagePeople::OnActive() 
  201. {
  202.   HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  203.   m_ServerTree.SetItemData(hCurrItem, 0);
  204.   if(m_ServerTree.GetItemState(hCurrItem, TVIF_STATE) & TVIS_BOLD)
  205.     m_ServerTree.SetItemState(hCurrItem, NULL, TVIS_BOLD);
  206.   else
  207.     m_ServerTree.SetItemState(hCurrItem, TVIS_BOLD, TVIS_BOLD);
  208.   IfCanCheckAll();
  209. }
  210. /////////////////////////////////////////////////////////////////////////////
  211. void CPagePeople::OnActiveMail() 
  212. {
  213.   HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  214.   if((m_ServerTree.GetItemState(hCurrItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MAIL))
  215.     m_ServerTree.SetItemState(hCurrItem, INDEXTOSTATEIMAGEMASK(ICON_EMPTY), TVIS_STATEIMAGEMASK);
  216.   else
  217.     m_ServerTree.SetItemState(hCurrItem, INDEXTOSTATEIMAGEMASK(ICON_MAIL), TVIS_STATEIMAGEMASK);
  218.   IfCanCheckAll();
  219. }
  220. /////////////////////////////////////////////////////////////////////////////
  221. void CPagePeople::OnDblclkServertree(NMHDR* pNMHDR, LRESULT* pResult) 
  222. {
  223.   HTREEITEM hParentItem;
  224.   HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  225.   CString sServer;
  226.   CString sUser;
  227.   sUser = m_ServerTree.GetItemText(hCurrItem);
  228.   if(hParentItem = m_ServerTree.GetParentItem(hCurrItem))
  229.   {
  230.     sServer = m_ServerTree.GetItemText(hParentItem);
  231.     if((m_ServerTree.GetItemState(hParentItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MANUAL))
  232.       FingerManual(sServer, sUser);       // manual finger
  233.     else
  234.     {
  235.       CStringArray* pasFinger = new CStringArray;
  236.       pasFinger->Add(sServer);
  237.       pasFinger->Add(sUser);
  238.       AfxBeginThread(g_FingerThread, pasFinger);
  239.     }
  240.   }  
  241. *pResult = 0;
  242. }
  243. /////////////////////////////////////////////////////////////////////////////
  244. void CPagePeople::OnFingerManual() 
  245. {
  246.   UpdateData();
  247.   if(m_sServer == "" || m_sUser == "")
  248.     AfxMessageBox("You must enter a server and a user!");
  249.   else
  250.   {
  251.     CString sUserFind = m_sUser;
  252.     if(sUserFind.GetAt(0) == '"')
  253.       sUserFind = sUserFind.Mid(1, sUserFind.GetLength()-2);
  254.     FingerManual(m_sServer, sUserFind);
  255.   }
  256. }
  257. /////////////////////////////////////////////////////////////////////////////
  258. void CPagePeople::FingerManual(CString sServer, CString sUser) 
  259. {
  260.   CString sFingerText;
  261.   if(g_Finger(sServer, sUser, sFingerText))
  262.   {
  263.     CString sUserFind = sUser;
  264.     if(sUserFind.GetAt(0) == '"')
  265.       sUserFind = sUserFind.Mid(1, sUserFind.GetLength()-2);
  266.     sUserFind.MakeUpper();
  267.     sFingerText.MakeUpper();
  268.     CString sOutput;
  269.     if(sFingerText.Find(sUserFind) != -1)
  270.       sOutput = "[People] User " + sUser + " is ON-Line!";
  271.     else
  272.       sOutput = "[People] User " + sUser + " is OFF-Line!";
  273.     g_WriteToHistory(TRUE, sOutput);
  274.   }
  275.   else
  276.   {
  277.     CString sOutputText = g_MakeWindowsTextLines(sFingerText);
  278.     g_WriteToHistory(TRUE, sOutputText);
  279.   }
  280. }
  281. /////////////////////////////////////////////////////////////////////////////
  282. void CPagePeople::OnCheckAll() 
  283. {
  284.   ResetServersAndUsers();
  285.   CString sOutput;
  286.   CheckAll(sOutput);
  287.   g_WriteToOutput(TRUE, sOutput);
  288. }
  289. /////////////////////////////////////////////////////////////////////////////
  290. void CPagePeople::OnEvery() 
  291. {
  292.   if(m_Every.GetCheck())
  293.   {
  294.     UINT nSpeed = m_nPeopleMinutes * TIMER_DELAY;
  295.     if(nSpeed == 0)
  296.       nSpeed = 10*1000;
  297.     ResetServersAndUsers();
  298.     GetParentOwner()->SetTimer(TIMER_PEOPLE_ID, nSpeed, NULL);
  299.     g_AnimatePeople->Play(0, -1, -1);
  300.     g_WriteToHistory(TRUE, "[People] Monitoring started...");
  301.     g_pMainWnd->GetMenu()->CheckMenuItem(IDM_PEOPLEMONITOR, MF_CHECKED | MF_BYCOMMAND);
  302.   }
  303.   else
  304.   {
  305.     g_AnimatePeople->Play(0, 0, 0);
  306.     GetParentOwner()->KillTimer(TIMER_PEOPLE_ID);
  307.     g_WriteToHistory(TRUE, "[People] Monitoring stopped...");
  308.     g_pMainWnd->GetMenu()->CheckMenuItem(IDM_PEOPLEMONITOR, MF_UNCHECKED | MF_BYCOMMAND);
  309.   }
  310. }
  311. /////////////////////////////////////////////////////////////////////////////
  312. void CPagePeople::OnKillfocusMinutes() 
  313. {
  314.   UpdateData(); 
  315.   if(m_Every.GetCheck())
  316.   {
  317.     UINT nSpeed = m_nPeopleMinutes * TIMER_DELAY;
  318.     if(nSpeed == 0)
  319.       nSpeed = 10*1000;
  320.     GetParentOwner()->SetTimer(TIMER_PEOPLE_ID, nSpeed, NULL);
  321.   }
  322. }
  323. /////////////////////////////////////////////////////////////////////////////
  324. void CPagePeople::ResetServersAndUsers()
  325. {
  326.   HTREEITEM hServerItem = m_ServerTree.GetRootItem();
  327.   HTREEITEM hUserItem;
  328.   CString sItem;
  329.   do
  330.   {
  331.     sItem = m_ServerTree.GetItemText(hServerItem);
  332.     m_ServerTree.SetItemData(hServerItem, 0);
  333.     if(hUserItem = m_ServerTree.GetChildItem(hServerItem))
  334.     {
  335.       do
  336.       {
  337.         sItem = m_ServerTree.GetItemText(hUserItem);
  338.         m_ServerTree.SetItemData(hUserItem, 0);
  339.         hUserItem = m_ServerTree.GetNextSiblingItem(hUserItem);
  340.       }
  341.       while(hUserItem);
  342.     }
  343.     hServerItem = m_ServerTree.GetNextSiblingItem(hServerItem);
  344.   }
  345.   while(hServerItem);
  346. }
  347. /////////////////////////////////////////////////////////////////////////////
  348. bool CPagePeople::IfCanCheckAll()
  349. {
  350.   bool bResult = FALSE;
  351.   bool bServer;
  352.   HTREEITEM hServerItem = m_ServerTree.GetRootItem();
  353.   HTREEITEM hUserItem;
  354.   CString sItem;
  355.   do
  356.   {
  357.     bServer = FALSE;
  358.     if(m_ServerTree.GetItemState(hServerItem, TVIF_STATE) & TVIS_BOLD)
  359.       bServer = TRUE;
  360.     if(hUserItem = m_ServerTree.GetChildItem(hServerItem))
  361.     {
  362.       do
  363.       {
  364.         if(bServer == TRUE)
  365.         {
  366.           if(m_ServerTree.GetItemState(hUserItem, TVIF_STATE) & TVIS_BOLD)
  367.             bResult = TRUE;
  368.           if((m_ServerTree.GetItemState(hUserItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MAIL))
  369.             bResult = TRUE;
  370.         }
  371.         hUserItem = m_ServerTree.GetNextSiblingItem(hUserItem);
  372.       }
  373.       while(hUserItem);
  374.     }
  375.     hServerItem = m_ServerTree.GetNextSiblingItem(hServerItem);
  376.   }
  377.   while(hServerItem);
  378.   if(bResult)
  379.   {
  380.     m_CheckAll.EnableWindow(TRUE);
  381.     m_Every.EnableWindow(TRUE);
  382.     g_pMainWnd->GetMenu()->EnableMenuItem(IDM_PEOPLEMONITOR, MF_ENABLED);
  383.   }
  384.   else
  385.   {
  386.     m_CheckAll.EnableWindow(FALSE);
  387.     m_Every.EnableWindow(FALSE);
  388.     g_pMainWnd->GetMenu()->CheckMenuItem(IDM_PEOPLEMONITOR, MF_UNCHECKED | MF_BYCOMMAND);
  389.     g_pMainWnd->GetMenu()->EnableMenuItem(IDM_PEOPLEMONITOR, MF_GRAYED);
  390.     m_Every.SetCheck(0);
  391.     g_AnimatePeople->Play(0, 0, 0);
  392.     GetParentOwner()->KillTimer(TIMER_PEOPLE_ID);
  393.   }
  394.   return bResult;
  395. }
  396. /////////////////////////////////////////////////////////////////////////////
  397. bool CPagePeople::CheckAll(CString& sOutputText)
  398. {
  399. #define   USER_CHECKED_ACTIVE   1
  400. #define   USER_CHECKED_MAIL     2
  401.   bool bCheckStatus = false;
  402.   if(IfCanCheckAll())
  403.   {
  404.     HTREEITEM hServerItem = m_ServerTree.GetRootItem();
  405.     HTREEITEM hUserItem;
  406.     CString sServer, sUser, sUserFind;
  407.     CString sFingerText, sFingerTextNM;
  408.     DWORD dwUserData;
  409.     int n;
  410.     bool bFingerStatus;
  411.     do
  412.     {
  413.       if(m_ServerTree.GetItemState(hServerItem, TVIF_STATE) & TVIS_BOLD) // is the server active?
  414.       {
  415.         bFingerStatus = false;
  416.         sFingerText = "";
  417.         sFingerTextNM = "";
  418.         if(hUserItem = m_ServerTree.GetChildItem(hServerItem))
  419.         {
  420.           do
  421.           {
  422.             dwUserData = m_ServerTree.GetItemData(hUserItem);     // get the data
  423.             // login or logout ------------------------------------------------
  424.         
  425.             if((m_ServerTree.GetItemState(hUserItem, TVIF_STATE) & TVIS_BOLD)) // is the user active?
  426.             {
  427.               if(!bFingerStatus)
  428.               {
  429.                 bFingerStatus = true;
  430.                 sServer = m_ServerTree.GetItemText(hServerItem);
  431.                 if(!g_Finger(sServer, "", sFingerText))
  432.                 {
  433.                   sOutputText += g_MakeWindowsTextLines(sFingerText);
  434.                   sOutputText += "rn";
  435.                   bCheckStatus = true;
  436.                 }
  437.                 else
  438.                   sFingerText.MakeUpper();
  439.               }
  440.               sUser = m_ServerTree.GetItemText(hUserItem);
  441.               if((n = sUser.Find('.')) != -1)
  442.                 sUser.SetAt(n, ' ');  
  443.               if((n = sUser.Find('_')) != -1)
  444.                 sUser.SetAt(n, ' ');  
  445.               sUserFind = sUser;
  446.               sUserFind.MakeUpper();
  447.               if(sUserFind.GetAt(0) == '"')
  448.                 sUserFind = sUserFind.Mid(1, sUserFind.GetLength() - 2);
  449.               if(sFingerText.Find(sUserFind) != -1)
  450.               {
  451.                 if(!(dwUserData & USER_CHECKED_ACTIVE))
  452.                 {
  453.                   dwUserData |= USER_CHECKED_ACTIVE;
  454.                   sOutputText += ("[People] User " + sUser + " is ON-Line! (" + sServer +")rn");
  455.                   bCheckStatus = true;
  456.                 }
  457.               }
  458.               else
  459.               {
  460.                 if(dwUserData & USER_CHECKED_ACTIVE)
  461.                 {
  462.                   dwUserData ^= USER_CHECKED_ACTIVE;
  463.                   sOutputText += ("[People] User " + sUser + " is OFF-Line! (" + sServer + ")rn");
  464.                   bCheckStatus = true;
  465.                 }
  466.               }
  467.             }
  468.             // new mail -------------------------------------------------------
  469.         
  470.             if((m_ServerTree.GetItemState(hUserItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MAIL)) // kontrolovat mail?
  471.             {
  472.               sServer = m_ServerTree.GetItemText(hServerItem);
  473.               sUser = m_ServerTree.GetItemText(hUserItem);
  474.               if(!g_Finger(sServer, sUser, sFingerTextNM))
  475.               {
  476.                 sOutputText += g_MakeWindowsTextLines(sFingerTextNM);
  477.                 sOutputText += "rn";
  478.                 bCheckStatus = true;
  479.               }
  480.               else
  481.               {
  482.                 sFingerTextNM.MakeUpper();
  483.                 if(!(sFingerTextNM.Find("NO MAIL") != -1 || sFingerTextNM.Find("NO UNREAD") != -1))
  484.                   if(!(dwUserData & USER_CHECKED_MAIL))
  485.                   {
  486.                     dwUserData |= USER_CHECKED_MAIL;
  487.                     sOutputText += ("[People] User " + sUser + " has New Mail! (" + sServer + ")rn");
  488.                     bCheckStatus = true;
  489.                   }
  490.               }
  491.             }
  492.             // ----------------------------------------------------------------
  493.             m_ServerTree.SetItemData(hUserItem, dwUserData);
  494.             hUserItem = m_ServerTree.GetNextSiblingItem(hUserItem);
  495.           }
  496.           while(hUserItem);
  497.         }
  498.       }
  499.       hServerItem = m_ServerTree.GetNextSiblingItem(hServerItem);
  500.     }
  501.     while(hServerItem);
  502.     if(!bCheckStatus)
  503.       sOutputText = "[People] - No changes, Nobody Onlinern";
  504.   }
  505.   else
  506.     sOutputText = "[People] - Nothing to checkrn";
  507.   return bCheckStatus;
  508. }
  509. /////////////////////////////////////////////////////////////////////////////
  510. UINT g_LocalNet(LPVOID pParam)
  511. {
  512.   CPagePeople* pOwner = (CPagePeople*)pParam;
  513.   CString sIpAddress;
  514.   unsigned long ulIpAddress = 0x0;
  515.   hostent* phe;
  516.   char abHostName[255];
  517.   if((!gethostname(abHostName, sizeof(abHostName)))  &&
  518.      ((phe = gethostbyname(abHostName)) != NULL) &&
  519.      (phe->h_length == 4))
  520.   {
  521.     CopyMemory(&ulIpAddress, phe->h_addr, 4);
  522.     ulIpAddress &= 0x00ffffff;
  523.     CString sIP;
  524.     for(int i = 0; i < 255; i++)
  525.   {
  526.   if(phe = gethostbyaddr((LPCSTR)&ulIpAddress, 4, PF_INET))
  527.       {
  528.         pOwner->AddServer(phe->h_name, 0);
  529.         in_addr inaddr;
  530.         inaddr.s_addr = ulIpAddress;
  531.         CString sIpAddress = inet_ntoa(inaddr);
  532.       }
  533.       ulIpAddress += 0x01000000;
  534.     }
  535.   }
  536.   g_AnimateWait->Play(0, 0, 0);
  537.   g_WriteToOutput(TRUE, "[People] Looking up hostnames finished...");
  538.   return 0;
  539. }
  540. /////////////////////////////////////////////////////////////////////////////
  541. void CPagePeople::OnLocalNet() 
  542. {
  543.   AfxBeginThread(g_LocalNet, this);
  544.   g_WriteToOutput(TRUE, "[People] Looking up hostnames, please wait...");
  545. }
  546. /////////////////////////////////////////////////////////////////////////////
  547. BOOL CPagePeople::PreTranslateMessage(MSG* pMsg) 
  548. {
  549.   // transate the message based on TTM_WINDOWFROMPOINT
  550.   MSG msg = *pMsg;
  551.   msg.hwnd = (HWND)m_ToolTip.SendMessage(TTM_WINDOWFROMPOINT, 0, (LPARAM)&msg.pt);
  552.   CPoint pt = pMsg->pt;
  553.   if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
  554.           ::ScreenToClient(msg.hwnd, &pt);
  555.   msg.lParam = MAKELONG(pt.x, pt.y);
  556.   // Let the ToolTip process this message.
  557.   m_ToolTip.RelayEvent(&msg);
  558.   if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
  559.   {
  560.     switch(GetFocus()->GetDlgCtrlID())
  561.     {
  562.       case IDC_FINGERSERVER:
  563.         AddServer();
  564.         break;
  565.       case IDC_FINGERUSER:
  566.         AddUser();
  567.         break;
  568.       case IDC_MINUTES:
  569.         m_Every.SetFocus();
  570.         break;
  571.     }
  572.   }
  573. return CPropertyPage::PreTranslateMessage(pMsg);
  574. }
  575. /////////////////////////////////////////////////////////////////////////////
  576. void CPagePeople::OnChangeFingerserver() 
  577. {
  578.   UpdateData();
  579.   CString sServer;
  580.   m_Server.GetWindowText(sServer);
  581.   CString sUser;
  582.   m_User.GetWindowText(sUser);
  583.   if(sServer != "")
  584.    GetDlgItem(IDB_FINGER)->EnableWindow(TRUE);
  585.   else
  586.    GetDlgItem(IDB_FINGER)->EnableWindow(FALSE);
  587.   if(sServer != "" && sUser != "")
  588.    GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(TRUE);
  589.   else
  590.    GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(FALSE);
  591. }
  592. /////////////////////////////////////////////////////////////////////////////
  593. void CPagePeople::OnChangeFingeruser() 
  594. {
  595.   UpdateData();
  596.   CString sServer;
  597.   m_Server.GetWindowText(sServer);
  598.   CString sUser;
  599.   m_User.GetWindowText(sUser);
  600.   if(sUser != "" && sServer != "")
  601.    GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(TRUE);
  602.   else
  603.    GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(FALSE);
  604. }
  605. ///////////////////////////////////////////////////////////////////////////////
  606. // GetHostAddr -- gets host's internet address. Interprets argument first    //
  607. // as dotted internet address string, and failing that, as a DNS host name.  //
  608. ///////////////////////////////////////////////////////////////////////////////
  609. IPA g_GetHostAddr(char* szHostName)
  610. {
  611.   IPA ipa;
  612.   HOSTENT FAR *phe; // pts to host info struct (internally allocated)
  613.   if((ipa = INET_ADDR(szHostName)) != INADDR_NONE)
  614.     return ipa;
  615.   if(phe = gethostbyname(szHostName))
  616.   {
  617.     ipa = *(IPA FAR*)*(phe->h_addr_list);
  618.     return ipa;
  619.   }
  620.   return INADDR_NONE;
  621. }
  622. ///////////////////////////////////////////////////////////////////////////////
  623. // Finger -- queries remote finger server for list of users currently        //
  624. // logged in. We start by resolving the finger tcp service                   //
  625. // to a port number, and then we resolve the host specifier to an IP address.//
  626. // Finger then establishes the connection, submits query, and retrieves      //
  627. // results.                                                                  //
  628. ///////////////////////////////////////////////////////////////////////////////
  629. bool g_Finger(CString sHost, CString sUser, CString& sFingerOutput)
  630. {
  631.   g_AnimateWait->Play(0, -1, -1);           // start animation
  632.   bool bFingerRet = true;                   // assume success
  633.   SERVENT FAR *pse;                         // pts to "service" data (internally allocated)
  634.   char szHostName[40];
  635.   char szUserName[40];
  636.   strcpy(szHostName, sHost);
  637.   strcpy(szUserName, sUser);
  638.   if(pse = getservbyname("finger", NULL))   // looking for finger tcp port
  639.   {
  640.     UINT FingerPort;                       // hold the data returned by getservbyname
  641.                                             // because the standard says you *must* copy this
  642.                                             // data out before calling any winsock API function
  643.     IPA ipa;                                // holds internet protocol address
  644.     FingerPort = pse->s_port;
  645.     if((ipa = g_GetHostAddr((szHostName))) != INADDR_NONE)
  646.     {
  647.       SOCKET strFingerSocket;               // communications end point
  648.       if((strFingerSocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0)
  649.       {
  650.         SOCKADDR_IN strFingerServer;
  651.         memset(&strFingerServer, 0, sizeof(strFingerServer));   // address of the finger server
  652.         strFingerServer.sin_family = AF_INET;
  653.         strFingerServer.sin_port = FingerPort;
  654.         strFingerServer.sin_addr.s_addr = ipa;
  655.         // establish a stream connection to server
  656.         if(!connect(strFingerSocket, (SOCKADDR *)&strFingerServer, sizeof(strFingerServer)))
  657.         {
  658.           char msg[40 + 3];
  659.           int msglen;
  660.           strcpy(msg, szUserName);
  661.           strcat(msg, "rn");
  662.           msglen = strlen(msg);
  663.           if(send(strFingerSocket, msg, msglen, 0) == msglen)
  664.           {
  665.             static char buf[500];               // receive buffer
  666.             int nchars;                         // n chars just received, or error
  667.             while((nchars = recv(strFingerSocket, (char FAR *)&buf, sizeof(buf), 0)) > 0)
  668.             {
  669.               *(buf + nchars) = 0;
  670.               sFingerOutput += buf;
  671.             }
  672.             if (nchars < 0)
  673.             {
  674.               sFingerOutput = "[People] Finger Error (error during receive) - " + sHost;  //FE_NORECV
  675.               bFingerRet = false;
  676.             }
  677.           }
  678.           else
  679.           {
  680.             sFingerOutput = "[People] Finger Error (didn't send it (all) - " + sHost;     //FE_NOSEND
  681.             bFingerRet = false;
  682.           }
  683.         }
  684.         else
  685.         {
  686.           sFingerOutput = "[People] Finger Error (cannot connect to server) - " + sHost;  //FE_NOCONN
  687.           closesocket(strFingerSocket);
  688.           bFingerRet = false;
  689.         }
  690.       }
  691.       else
  692.       {
  693.         sFingerOutput = "[People] Finger Error (cannot get socket) - " + sHost;           //FE_NOSOCK
  694.         bFingerRet = false;
  695.       }
  696.     }
  697.     else
  698.     {
  699.       sFingerOutput = "[People] Finger Error (don't recognize host name) - " + sHost;     //FE_NOHOST 
  700.       bFingerRet = false;
  701.     }
  702.   }
  703.   else
  704.   {
  705.     sFingerOutput = "[People] Finger Error (can't find port) - " + sHost;          //FE_NOPORT
  706.     bFingerRet = false;
  707.   }
  708.   g_AnimateWait->Play(0, 0, 0);
  709.   return (bFingerRet);
  710. }
  711. /////////////////////////////////////////////////////////////////////////////
  712. UINT g_FingerThread(LPVOID pParam)
  713. {
  714.   CString sHost = ((CStringArray*)pParam)->GetAt(0);
  715.   CString sUser = ((CStringArray*)pParam)->GetAt(1);
  716.   ((CStringArray*)pParam)->RemoveAll();
  717.   delete ((CStringArray*)pParam);
  718.   CString sOutput;
  719.   g_AnimateWait->Play(0, -1, -1);           // start animation
  720.   SERVENT FAR *pse;                         // pts to "service" data (internally allocated)
  721.   char szHostName[40];
  722.   char szUserName[40];
  723.   strcpy(szHostName, sHost);
  724.   strcpy(szUserName, sUser);
  725.   if(pse = getservbyname("finger", NULL))   // looking for finger tcp port
  726.   {
  727.     UINT FingerPort;                       // hold the data returned by getservbyname
  728.                                             // because the standard says you *must* copy this
  729.                                             // data out before calling any winsock API function
  730.     IPA ipa;                                // holds internet protocol address
  731.     FingerPort = pse->s_port;
  732.     if((ipa = g_GetHostAddr((szHostName))) != INADDR_NONE)
  733.     {
  734.       SOCKET strFingerSocket;               // communications end point
  735.       if((strFingerSocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0)
  736.       {
  737.         SOCKADDR_IN strFingerServer;
  738.         memset(&strFingerServer, 0, sizeof(strFingerServer));   // address of the finger server
  739.         strFingerServer.sin_family = AF_INET;
  740.         strFingerServer.sin_port = FingerPort;
  741.         strFingerServer.sin_addr.s_addr = ipa;
  742.         // establish a stream connection to server
  743.         if(!connect(strFingerSocket, (SOCKADDR *)&strFingerServer, sizeof(strFingerServer)))
  744.         {
  745.           char msg[40 + 3];
  746.           int msglen;
  747.           strcpy(msg, szUserName);
  748.           strcat(msg, "rn");
  749.           msglen = strlen(msg);
  750.           if(send(strFingerSocket, msg, msglen, 0) == msglen)
  751.           {
  752.             static char buf[500];               // receive buffer
  753.             int nchars;                         // n chars just received, or error
  754.             while((nchars = recv(strFingerSocket, (char FAR *)&buf, sizeof(buf), 0)) > 0)
  755.             {
  756.               *(buf + nchars) = 0;
  757.               sOutput += buf;
  758.             }
  759.             if (nchars < 0)
  760.               sOutput = "[People] Finger Error (error during receive) - " + sHost;  //FE_NORECV
  761.           }
  762.           else
  763.             sOutput = "[People] Finger Error (didn't send it (all) - " + sHost;     //FE_NOSEND
  764.         }
  765.         else
  766.         {
  767.           sOutput = "[People] Finger Error (cannot connect to server) - " + sHost;  //FE_NOCONN
  768.           closesocket(strFingerSocket);
  769.         }
  770.       }
  771.       else
  772.         sOutput = "[People] Finger Error (cannot get socket) - " + sHost;           //FE_NOSOCK
  773.     }
  774.     else
  775.       sOutput = "[People] Finger Error (don't recognize host name) - " + sHost;     //FE_NOHOST 
  776.   }
  777.   else
  778.     sOutput = "[People] Finger Error (can't find port) - " + sHost;                 //FE_NOPORT
  779.   g_AnimateWait->Play(0, 0, 0);
  780.   CString sOutputText = g_MakeWindowsTextLines(sOutput);
  781.   g_WriteToOutput(TRUE, sOutputText);
  782.   return 0;
  783. }
  784. /////////////////////////////////////////////////////////////////////////////
  785. void CPagePeople::OnFinger() 
  786. {
  787.   UpdateData();
  788.   CStringArray* pasFinger = new CStringArray;
  789.   pasFinger->Add(m_sServer);
  790.   pasFinger->Add(m_sUser);
  791.   AfxBeginThread(g_FingerThread, pasFinger);
  792. }
  793. /////////////////////////////////////////////////////////////////////////////
  794. void CPagePeople::OnFingerCurrent() 
  795. {
  796.   bool bManual = false;
  797.   HTREEITEM hParentItem;
  798.   HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
  799.   if(hCurrItem)
  800.   {
  801.     CString sServer;
  802.     CString sUser;
  803.     sUser = m_ServerTree.GetItemText(hCurrItem);
  804.     if(hParentItem = m_ServerTree.GetParentItem(hCurrItem))
  805.     {
  806.       sServer = m_ServerTree.GetItemText(hParentItem);
  807.       if((m_ServerTree.GetItemState(hParentItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MANUAL))
  808.         bManual = true;
  809.     }  
  810.     else
  811.     {
  812.       sServer = sUser;
  813.       sUser = "";
  814.     }
  815.     if(bManual)
  816.       FingerManual(sServer, sUser);       // manual finger
  817.     else
  818.     {
  819.       CStringArray* pasFinger = new CStringArray;
  820.       pasFinger->Add(sServer);
  821.       pasFinger->Add(sUser);
  822.       AfxBeginThread(g_FingerThread, pasFinger);
  823.     }
  824.   }
  825.   else
  826.     AfxMessageBox("Nothing selected");
  827. }
  828. /////////////////////////////////////////////////////////////////////////////
  829. int CPagePeople::GetTreeItemNum(HTREEITEM hFirstItem)
  830. {
  831.   if(!hFirstItem)
  832.     return 0;
  833.   int i = 0;
  834.   do
  835.   {
  836.     i++;
  837.     hFirstItem = m_ServerTree.GetNextSiblingItem(hFirstItem);
  838.   }
  839.   while(hFirstItem);
  840.   return i;
  841. }
  842. /////////////////////////////////////////////////////////////////////////////
  843. void CPagePeople::Serialize(CArchive& ar) 
  844. {
  845. if (ar.IsStoring())
  846. { // storing code
  847.     ar << m_bOnStart;
  848.     ar << m_bOnEnd;
  849.     ar << m_nPeopleMinutes;
  850.     CString sValue;
  851.     int nValue;
  852.     HTREEITEM hServerItem = m_ServerTree.GetRootItem();
  853.     HTREEITEM hUserItem;
  854.     ar << GetTreeItemNum(hServerItem); // first save the number of servers
  855.     while(hServerItem)
  856.     {
  857.       nValue = 0;
  858.       if(m_ServerTree.GetItemState(hServerItem, TVIF_STATE) & TVIS_BOLD)
  859.         nValue = nValue | 1;
  860.       if((m_ServerTree.GetItemState(hServerItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MANUAL))
  861.         nValue = nValue | 2;
  862.       ar << m_ServerTree.GetItemText(hServerItem);
  863.       ar << nValue;
  864.  
  865.       if((hUserItem = m_ServerTree.GetChildItem(hServerItem)) == NULL)
  866.       {
  867.         ar << 0;      // first save the number of users
  868.       }
  869.       else
  870.       {
  871.         ar << GetTreeItemNum(hUserItem);      // first save the number of users
  872.         while(hUserItem)
  873.         {
  874.           nValue = 0;
  875.           if(m_ServerTree.GetItemState(hUserItem, TVIF_STATE) & TVIS_BOLD)
  876.             nValue = nValue | 1;
  877.           if((m_ServerTree.GetItemState(hUserItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MAIL))
  878.             nValue = nValue | 2;
  879.           ar << m_ServerTree.GetItemText(hUserItem);
  880.           ar << nValue;
  881.           hUserItem = m_ServerTree.GetNextSiblingItem(hUserItem);
  882.         }
  883.       }
  884.       hServerItem = m_ServerTree.GetNextSiblingItem(hServerItem);
  885.     }
  886. }
  887. else
  888. { // loading code
  889.     ar >> m_bOnStart;
  890.     ar >> m_bOnEnd;
  891.     ar >> m_nPeopleMinutes;
  892.     CString sItem;
  893.     int nServerNum;
  894.     int nUserNum;
  895.     int nValue;
  896.     HTREEITEM hItem;
  897.     ar >> nServerNum;
  898.     for(int i = 0; i < nServerNum; i++)
  899.     {
  900.       ar >> sItem;
  901.       ar >> nValue;
  902.       hItem = AddServer(sItem, nValue);
  903.       ar >> nUserNum;
  904.       for(int j = 0; j < nUserNum; j++)
  905.       {
  906.         ar >> sItem;
  907.         ar >> nValue;
  908.         AddUser(hItem, sItem, nValue);
  909.       }
  910.     }
  911.     if(m_ServerTree.GetRootItem())
  912.       m_ServerTree.SelectItem(m_ServerTree.GetRootItem());
  913.     if(IfCanCheckAll())
  914.     {
  915.       if(g_bPeopleMonitoring)
  916.       {
  917.         m_Every.SetCheck(1);
  918.         OnEvery();
  919.       }
  920.     }
  921.     else
  922.       m_Every.SetCheck(0);
  923.     if(!g_bPeopleImages)
  924.       SetSmallImages();
  925.     else
  926.       SetLargeImages();
  927. }
  928. }
  929. /////////////////////////////////////////////////////////////////////////////
  930. HTREEITEM CPagePeople::AddServer(LPCTSTR sServer, int nValue)
  931. {
  932. TV_INSERTSTRUCT hItem;
  933. hItem.item.mask = (TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_STATE);
  934.   hItem.item.pszText = (LPSTR)sServer;
  935.   hItem.item.iImage = ICON_SERVER;
  936.   hItem.item.iSelectedImage = ICON_SERVER;
  937.   hItem.hParent = TVI_ROOT;
  938.   switch(nValue)
  939.   {
  940.     case 0:
  941.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_EMPTY);
  942.       hItem.item.stateMask = TVIS_STATEIMAGEMASK;
  943.       break;
  944.     case 1:
  945.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_EMPTY) | TVIS_BOLD;
  946.       hItem.item.stateMask = TVIS_STATEIMAGEMASK | TVIS_BOLD;
  947.       break;
  948.     case 2:
  949.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_MANUAL);
  950.       hItem.item.stateMask = TVIS_STATEIMAGEMASK;
  951.       break;
  952.     default:
  953.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_MANUAL) | TVIS_BOLD;
  954.       hItem.item.stateMask = TVIS_STATEIMAGEMASK | TVIS_BOLD;
  955.   }
  956.   return m_ServerTree.InsertItem(&hItem);
  957. }
  958. /////////////////////////////////////////////////////////////////////////////
  959. void CPagePeople::AddUser(HTREEITEM hServer, LPCTSTR sUser, int nValue)
  960. {
  961. TV_INSERTSTRUCT hItem;
  962. hItem.item.mask = (TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_STATE);
  963.   hItem.item.pszText = (LPSTR)sUser;
  964.   hItem.item.iImage = ICON_USER;
  965.   hItem.item.iSelectedImage = ICON_USER;
  966.   hItem.hParent = hServer;
  967.   switch(nValue)
  968.   {
  969.     case 0:
  970.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_EMPTY);
  971.       hItem.item.stateMask = TVIS_STATEIMAGEMASK;
  972.       break;
  973.     case 1:
  974.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_EMPTY) | TVIS_BOLD;
  975.       hItem.item.stateMask = TVIS_STATEIMAGEMASK | TVIS_BOLD;
  976.       break;
  977.     case 2:
  978.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_MAIL);
  979.       hItem.item.stateMask = TVIS_STATEIMAGEMASK;
  980.       break;
  981.     default:
  982.       hItem.item.state = INDEXTOSTATEIMAGEMASK(ICON_MAIL) | TVIS_BOLD;
  983.       hItem.item.stateMask = TVIS_STATEIMAGEMASK | TVIS_BOLD;
  984.   }
  985. m_ServerTree.InsertItem(&hItem);
  986. }
  987. /////////////////////////////////////////////////////////////////////////////