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

Ftp客户端

开发平台:

Visual C++

  1. // PageGeneral.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NetManager.h"
  5. #include "PageGeneral.h"
  6. #include "GlobalsExtern.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CPageGeneral property page
  14. IMPLEMENT_DYNCREATE(CPageGeneral, CPropertyPage)
  15. CPageGeneral::CPageGeneral() : CPropertyPage(CPageGeneral::IDD)
  16. {
  17. //{{AFX_DATA_INIT(CPageGeneral)
  18. m_sDisplayType = _T("");
  19. m_sLocalName = _T("");
  20. m_sProvider = _T("");
  21. m_sRemoteName = _T("");
  22. m_sScope = _T("");
  23. m_sType = _T("");
  24. m_sUsage = _T("");
  25. m_sComment = _T("");
  26. m_dwPingTimeout = 1000;
  27. m_bPingPacket = 32;
  28. //}}AFX_DATA_INIT
  29. }
  30. CPageGeneral::~CPageGeneral()
  31. {
  32. }
  33. void CPageGeneral::DoDataExchange(CDataExchange* pDX)
  34. {
  35. CPropertyPage::DoDataExchange(pDX);
  36. //{{AFX_DATA_MAP(CPageGeneral)
  37. DDX_Control(pDX, IDC_RESOLVE, m_Resolve);
  38. DDX_Control(pDX, IDC_PING, m_Ping);
  39. DDX_Control(pDX, IDC_ENUMERATE, m_Enumerate);
  40. DDX_Control(pDX, IDC_ADDRESS, m_Address);
  41. DDX_Control(pDX, IDC_TREE, m_Tree);
  42. DDX_Text(pDX, IDC_DISPLAY_TYPE, m_sDisplayType);
  43. DDX_Text(pDX, IDC_LOCAL_NAME, m_sLocalName);
  44. DDX_Text(pDX, IDC_PROVIDER, m_sProvider);
  45. DDX_Text(pDX, IDC_REMOTE_NAME, m_sRemoteName);
  46. DDX_Text(pDX, IDC_SCOPE, m_sScope);
  47. DDX_Text(pDX, IDC_TYPE, m_sType);
  48. DDX_Text(pDX, IDC_USAGE, m_sUsage);
  49. DDX_Text(pDX, IDC_COMMENT, m_sComment);
  50. DDX_Text(pDX, IDC_PING_TIMEOUT, m_dwPingTimeout);
  51. DDV_MinMaxDWord(pDX, m_dwPingTimeout, 0, 100000);
  52. DDX_Text(pDX, IDC_PING_PACKET, m_bPingPacket);
  53. //}}AFX_DATA_MAP
  54. }
  55. BEGIN_MESSAGE_MAP(CPageGeneral, CPropertyPage)
  56. //{{AFX_MSG_MAP(CPageGeneral)
  57. ON_BN_CLICKED(IDC_RESOLVE, OnResolve)
  58. ON_NOTIFY(TVN_ITEMEXPANDING, IDC_TREE, OnItemexpandingTree)
  59. ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree)
  60. ON_BN_CLICKED(IDC_ENUMERATE, OnEnumerate)
  61. ON_BN_CLICKED(IDC_PING, OnPing)
  62. ON_EN_CHANGE(IDC_ADDRESS, OnChangeAddress)
  63. //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CPageGeneral message handlers
  67. BOOL CPageGeneral::OnInitDialog() 
  68. {
  69. CPropertyPage::OnInitDialog();
  70.   m_ToolTip.Create(this);
  71.   m_ToolTip.Activate(TRUE);
  72.   CWnd* pWnd = GetWindow(GW_CHILD);
  73.   while(pWnd)
  74.   {
  75.     int nID = pWnd->GetDlgCtrlID();
  76.     if (nID != -1)
  77.       m_ToolTip.AddTool(pWnd, pWnd->GetDlgCtrlID());
  78.     pWnd = pWnd->GetWindow(GW_HWNDNEXT);
  79.   }
  80. return TRUE;  // return TRUE unless you set the focus to a control
  81.               // EXCEPTION: OCX Property Pages should return FALSE
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. UINT g_ResolveAddress(LPVOID pParam)
  85. {
  86.   CString sAddress = *((CString*)pParam);
  87.   delete ((CString*)pParam);
  88.   CString sResolved;
  89.   unsigned long ulIP;
  90.   hostent* pHostent;
  91.   sockaddr_in sin;
  92.   ulIP = inet_addr(sAddress);
  93.   if(ulIP != INADDR_NONE)
  94.   {
  95.     sin.sin_family = AF_INET;
  96.     sin.sin_addr.S_un.S_addr = ulIP;
  97.     pHostent = gethostbyaddr((char*)&sin.sin_addr, 4, PF_INET);
  98.     if(pHostent)
  99.       sResolved = pHostent->h_name;
  100.     else
  101.     {
  102.       g_WriteToOutput(TRUE, "[Resolve] Cannot resolve " + sAddress);
  103.       return 0;
  104.     }
  105.   }
  106.   else
  107.   {
  108.     in_addr inetAddr;
  109.     pHostent = gethostbyname(sAddress);
  110.     if(pHostent)
  111.     {
  112.       LPSTR szAddr;
  113.       ulIP = *(DWORD*)(*pHostent->h_addr_list);
  114.       inetAddr.s_addr = ulIP;
  115.       szAddr = inet_ntoa(inetAddr);
  116.       sResolved = szAddr;
  117.     }
  118.     else
  119.     {
  120.       g_WriteToOutput(TRUE, "[Resolve] Cannot resolve " + sAddress);
  121.       return 0;
  122.     }
  123.   }
  124.   g_WriteToOutput(TRUE, "[Resolve] " + sAddress + " -> " + sResolved);
  125.   return 0;
  126. }
  127. /////////////////////////////////////////////////////////////////////////////
  128. void CPageGeneral::OnResolve() 
  129. {
  130.   g_AnimateWait->Play(0, -1, -1);
  131.   CString sResolveAddress;
  132.   m_Address.GetWindowText(sResolveAddress);
  133.   CString* psAddress = new CString(sResolveAddress);
  134.   AfxBeginThread(g_ResolveAddress, psAddress);
  135. }
  136. /////////////////////////////////////////////////////////////////////////////
  137. void CPageGeneral::OnChangeAddress() 
  138. {
  139.   CString sText;
  140.   m_Address.GetWindowText(sText);
  141.   if(sText != "")
  142.   {
  143.     m_Resolve.EnableWindow(TRUE);
  144.     m_Enumerate.EnableWindow(TRUE);
  145.     m_Ping.EnableWindow(TRUE);
  146.     GetDlgItem(IDC_PING_PACKET)->EnableWindow(TRUE);
  147.     GetDlgItem(IDC_PING_TIMEOUT)->EnableWindow(TRUE);
  148.   }
  149.   else
  150.   {
  151.     m_Resolve.EnableWindow(FALSE);
  152.     m_Enumerate.EnableWindow(FALSE);
  153.     m_Ping.EnableWindow(FALSE);
  154.     GetDlgItem(IDC_PING_PACKET)->EnableWindow(FALSE);
  155.     GetDlgItem(IDC_PING_TIMEOUT)->EnableWindow(FALSE);
  156.   }
  157. }
  158. /////////////////////////////////////////////////////////////////////////////
  159. void CPageGeneral::CreateRootNode()
  160. {
  161.   m_pRootNode = new CNetNode;   // Create the root network node (use default constructor)
  162.   AddNodeToTree(m_pRootNode, TVI_ROOT);   // Add root node to tree
  163.   UpdateDisplay(NULL);
  164. }
  165. /////////////////////////////////////////////////////////////////////////////
  166. void CPageGeneral::AddNodeToTree(CNetNode* pNode, HTREEITEM parent)
  167. {
  168.   TV_INSERTSTRUCT    tvIns = { 0 };
  169.   tvIns.hParent = parent;
  170.   tvIns.hInsertAfter = TVI_SORT;
  171.   tvIns.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM;
  172.   // It is safe to cast away the const-ness here because
  173.   // we do not allow the tree labels to be edited
  174.   tvIns.item.pszText =
  175.     (char *) ((const char *)pNode->GetText());
  176.   if (pNode->IsContainer())
  177.     tvIns.item.cChildren = 1;
  178.   tvIns.item.lParam = (LPARAM) pNode;
  179.   HTREEITEM hItem = m_Tree.InsertItem(&tvIns);
  180. }
  181. /////////////////////////////////////////////////////////////////////////////
  182. void CPageGeneral::OnItemexpandingTree(NMHDR* pNMHDR, LRESULT* pResult) 
  183. {
  184.   NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  185.   
  186.   LPTV_ITEM pParent = &pNMTreeView->itemNew;
  187.   // Assume we will return FALSE,
  188.   // allowing the expansion to occur
  189.   *pResult = FALSE;
  190.   // If the action is NOT expand, or if we have
  191.   // already expanded at least once, we don't need
  192.   // to do anything here
  193.   if ( pNMTreeView->action != TVE_EXPAND ||
  194.        (pParent->state & TVIS_EXPANDEDONCE) )
  195.     return;
  196.   // Get a handle to the parent item
  197.   TV_ITEM    tvItem;
  198.   tvItem.hItem = pParent->hItem;
  199.   tvItem.mask = TVIF_HANDLE;
  200.   m_Tree.GetItem(&tvItem);
  201.   // We are expanding an item for the first time
  202.   // Enumerate its children and add them to the tree
  203.   DWORD   numChildren = 0;
  204.   DWORD   ret = 0;
  205.   CNetNode * pParentNode = (CNetNode *) pParent->lParam;
  206.   {
  207.     CWaitCursor  wc;  // display hourglass cursor
  208.     ret = pParentNode->EnumerateNetwork();
  209.   }
  210.   if (ret)
  211.   {
  212.     static const DWORD maxMsgLen = 1024;
  213.     CString errMsg;
  214.     char * pMsgBuf = errMsg.GetBuffer(maxMsgLen);
  215.     DWORD formatRet = FormatMessage(
  216.       FORMAT_MESSAGE_IGNORE_INSERTS |
  217.       FORMAT_MESSAGE_FROM_SYSTEM,
  218.       NULL, ret, 0, pMsgBuf, maxMsgLen, NULL);
  219.     errMsg.ReleaseBuffer();
  220.     if (formatRet == 0)
  221.       errMsg.Format("Network enumeration failed.  nn"
  222.       "Error code: %lu.", ret);
  223.     MessageBox(errMsg, "Error",
  224.      MB_ICONEXCLAMATION | MB_OK);
  225.   }
  226.   else
  227.   {
  228.     CNetNode * pChildNode;
  229.     numChildren = pParentNode->GetChildCount();
  230.     for (DWORD i = 0; i < numChildren; i++)
  231.     {
  232.       pChildNode = pParentNode->GetChildNode(i);
  233.       AddNodeToTree(pChildNode, tvItem.hItem);
  234.     }
  235.   }
  236.   // If there are no child items, or an error occurred,
  237.   // remove the "+" from the parent item by indicating
  238.   // it has no child items
  239.   if (ret || numChildren == 0)
  240.   {
  241.     tvItem.mask |= TVIF_CHILDREN;
  242.     tvItem.cChildren = 0;
  243.     m_Tree.SetItem(&tvItem);
  244.     // indicate that tree expansion should NOT occur
  245.     *pResult = TRUE;
  246.   }
  247. }
  248. /////////////////////////////////////////////////////////////////////////////
  249. void CPageGeneral::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
  250. {
  251.   NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  252.   LPTV_ITEM pNewItem = &pNMTreeView->itemNew;
  253.   UpdateDisplay(pNewItem);
  254.   *pResult = 0;
  255. }
  256. /////////////////////////////////////////////////////////////////////////////
  257. void CPageGeneral::UpdateDisplay(LPTV_ITEM pItem)
  258. {
  259.   CNetNode* pNode;
  260.   if (pItem == NULL)
  261.     pNode = m_pRootNode;
  262.   else
  263.     pNode = (CNetNode*)pItem->lParam;
  264.   // Get text items from net node
  265.   m_sLocalName = pNode->GetLocalName();
  266.   m_sRemoteName = pNode->GetRemoteName();
  267.   m_sComment = pNode->GetComment();
  268.   m_sProvider = pNode->GetProvider();
  269.   // Get numeric items from net node
  270.   DWORD scope = pNode->GetScope();
  271.   DWORD type = pNode->GetType();
  272.   DWORD displayType = pNode->GetDisplayType();
  273.   DWORD usage = pNode->GetUsage();
  274.   // Convert numeric codes to text for display
  275.   if (scope == RESOURCE_CONNECTED)
  276.       m_sScope = "CONNECTED";
  277.   else if (scope == RESOURCE_GLOBALNET)
  278.       m_sScope = "GLOBALNET";
  279.   else if (scope == RESOURCE_REMEMBERED)
  280.       m_sScope = "REMEMBERED";
  281. #if(WINVER >= 0x0400)
  282.   else if (scope == RESOURCE_RECENT)
  283.       m_sScope = "RECENT";
  284.   else if (scope == RESOURCE_CONTEXT)
  285.       m_sScope = "CONTEXT";
  286. #endif // WINVER >= 0x0400
  287.   if (type == RESOURCETYPE_UNKNOWN)
  288.     m_sType = "UNKNOWN";
  289.   else
  290.   {
  291.     m_sType = "";
  292.     if (type & RESOURCETYPE_ANY)
  293.       m_sType += "ANY ";
  294.     if (type & RESOURCETYPE_DISK)
  295.       m_sType += "DISK ";
  296.     if (type & RESOURCETYPE_PRINT)
  297.       m_sType += "PRINT ";
  298.   }
  299.     
  300.   if (displayType == RESOURCEDISPLAYTYPE_GENERIC)
  301.     m_sDisplayType = "GENERIC";
  302.   else if (displayType == RESOURCEDISPLAYTYPE_DOMAIN)
  303.     m_sDisplayType = "DOMAIN";
  304.   else if (displayType == RESOURCEDISPLAYTYPE_SERVER)
  305.     m_sDisplayType = "SERVER";
  306.   else if (displayType == RESOURCEDISPLAYTYPE_SHARE)
  307.     m_sDisplayType = "SHARE";
  308.   else if (displayType == RESOURCEDISPLAYTYPE_FILE)
  309.     m_sDisplayType = "FILE";
  310.   else if (displayType == RESOURCEDISPLAYTYPE_GROUP)
  311.     m_sDisplayType = "GROUP";
  312. #if(WINVER >= 0x0400)
  313.   else if (displayType == RESOURCEDISPLAYTYPE_NETWORK)
  314.     m_sDisplayType = "NETWORK";
  315.   else if (displayType == RESOURCEDISPLAYTYPE_ROOT)
  316.     m_sDisplayType = "ROOT";
  317.   else if (displayType == RESOURCEDISPLAYTYPE_SHAREADMIN)
  318.     m_sDisplayType = "SHAREADMIN";
  319.   else if (displayType == RESOURCEDISPLAYTYPE_DIRECTORY)
  320.     m_sDisplayType = "DIRECTORY";
  321. #endif /* WINVER >= 0x0400 */
  322.   else if (displayType == RESOURCEDISPLAYTYPE_TREE)
  323.     m_sDisplayType = "TREE";
  324.   m_sUsage = "";
  325. #if(WINVER >= 0x0400)
  326.   if ((usage & RESOURCEUSAGE_ALL) == RESOURCEUSAGE_ALL)
  327.     m_sUsage += "ALL ";
  328.   else
  329. #endif
  330.   {
  331.     if (usage & RESOURCEUSAGE_CONNECTABLE)
  332.       m_sUsage += "CONNECTABLE ";
  333.     if (usage & RESOURCEUSAGE_CONTAINER)
  334.       m_sUsage += "CONTAINER ";
  335.   }
  336.   if (usage & RESOURCEUSAGE_NOLOCALDEVICE)
  337.     m_sUsage += "NOLOCALDEVICE ";
  338.   if (usage & RESOURCEUSAGE_SIBLING)
  339.     m_sUsage += "SIBLING ";
  340.   UpdateData(FALSE);  // copy member variables to screen
  341. }
  342. /////////////////////////////////////////////////////////////////////////////
  343. UINT g_Enumerate(LPVOID pParam)
  344. {
  345.   CString sAddress = *((CString*)pParam);
  346.   delete ((CString*)pParam);
  347.   g_WriteToOutput(TRUE, "[Enumerate] Started: " + sAddress);
  348.   g_AnimateWait->Play(0, -1, -1);
  349.   CString sOutput;
  350.   hostent* pHostent;
  351.   unsigned long ulIpAddress = inet_addr(sAddress);
  352.   if(ulIpAddress == INADDR_NONE)
  353.   {
  354.     pHostent = gethostbyname(sAddress);
  355.     if(pHostent)
  356.       ulIpAddress = *(DWORD*)(*pHostent->h_addr_list);
  357.   }
  358.   ulIpAddress &= 0x00ffffff;
  359.   for(int i = 0; i < 255; i++)
  360.   {
  361.     if(pHostent = gethostbyaddr((LPCSTR)&ulIpAddress, 4, PF_INET))
  362.     {
  363.       sOutput = pHostent->h_name;
  364.       in_addr inaddr;
  365.       inaddr.s_addr = ulIpAddress;
  366.       CString sIpAddress = inet_ntoa(inaddr);
  367.       g_WriteToOutput(TRUE, sOutput + " - " + sIpAddress);
  368.     }
  369.     ulIpAddress += 0x01000000;
  370.   }
  371.   g_WriteToOutput(TRUE, "[Enumerate] Finished...");
  372.   return 0;
  373. }
  374. /////////////////////////////////////////////////////////////////////////////
  375. void CPageGeneral::OnEnumerate() 
  376. {
  377.   CString sAddress;
  378.   m_Address.GetWindowText(sAddress);
  379.   CString* psAddress = new CString(sAddress);
  380.   AfxBeginThread(g_Enumerate, psAddress);
  381. }
  382. /////////////////////////////////////////////////////////////////////////////
  383. void CPageGeneral::OnPing() 
  384. {
  385.   if(UpdateData())
  386.   {
  387.     CString sAddress;
  388.     m_Address.GetWindowText(sAddress);
  389.     char* psOutput = new char[1000];
  390.     if(m_p.Ping(sAddress, m_pr, 10, m_dwPingTimeout, m_bPingPacket))
  391.     {
  392.       hostent* phostent = gethostbyaddr((char*)&m_pr.Address.S_un.S_addr, 4, PF_INET);
  393.       sprintf(psOutput, "[Ping] %d.%d.%d.%d [%s], replied in RTT:%d ms", 
  394.            m_pr.Address.S_un.S_un_b.s_b1, m_pr.Address.S_un.S_un_b.s_b2, m_pr.Address.S_un.S_un_b.s_b3, 
  395.            m_pr.Address.S_un.S_un_b.s_b4, phostent->h_name, m_pr.RTT);
  396.     }
  397.     else
  398.       sprintf(psOutput, "[Ping] Error %d", GetLastError());
  399.   
  400.     g_WriteToOutput(TRUE, psOutput);
  401.     delete psOutput;
  402.   }
  403. }
  404. /////////////////////////////////////////////////////////////////////////////
  405. BOOL CPageGeneral::PreTranslateMessage(MSG* pMsg) 
  406. {
  407.   // transate the message based on TTM_WINDOWFROMPOINT
  408.   MSG msg = *pMsg;
  409.   msg.hwnd = (HWND)m_ToolTip.SendMessage(TTM_WINDOWFROMPOINT, 0, (LPARAM)&msg.pt);
  410.   CPoint pt = pMsg->pt;
  411.   if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
  412.           ::ScreenToClient(msg.hwnd, &pt);
  413.   msg.lParam = MAKELONG(pt.x, pt.y);
  414.   // Let the ToolTip process this message.
  415.   m_ToolTip.RelayEvent(&msg);
  416. return CPropertyPage::PreTranslateMessage(pMsg);
  417. }
  418. /////////////////////////////////////////////////////////////////////////////