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

Ftp客户端

开发平台:

Visual C++

  1. // netnode.cpp
  2. #include "stdafx.h"
  3. #include "netmanager.h"
  4. #include "NetNode.h"
  5. // Initialize static data members
  6. int CNetNode::m_platformID = -1;
  7. // The default constructor is to create the root node
  8. CNetNode::CNetNode() :
  9.   m_haveEnumerated(FALSE),
  10.   m_isRoot(TRUE),
  11.   m_pNetResource(NULL),
  12.   m_nodeArray(NULL),
  13.   m_nodeCount(0)
  14. {
  15.   m_text = "Network"; // top-level network node
  16.   m_pNetResource = new NETRESOURCE;
  17.   m_pNetResource->dwScope = RESOURCE_GLOBALNET;
  18.   m_pNetResource->dwType = RESOURCETYPE_ANY;
  19.   m_pNetResource->dwUsage = RESOURCEUSAGE_CONTAINER;
  20.   m_pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_ROOT;
  21.   m_pNetResource->lpLocalName = NULL;
  22.   m_pNetResource->lpRemoteName = NULL;
  23.   m_pNetResource->lpComment = NULL;
  24.   m_pNetResource->lpProvider = NULL;
  25. }
  26. // This constructor constructs a non-root node, such as
  27. // a network provider, workgroup/domain, computer, or share
  28. CNetNode::CNetNode(LPNETRESOURCE pNetResource) :
  29.   m_haveEnumerated(FALSE),
  30.   m_isRoot(FALSE),
  31.   m_nodeArray(NULL),
  32.   m_nodeCount(0)
  33. {
  34.   // Calculate the size of the netresource structure
  35.   // plus the strings that it points to
  36.   DWORD size = sizeof(NETRESOURCE);
  37.   if (pNetResource->lpLocalName)
  38.     size += (strlen(pNetResource->lpLocalName) + 1);
  39.   if (pNetResource->lpComment)
  40.     size += (strlen(pNetResource->lpComment) + 1);
  41.   if (pNetResource->lpProvider)
  42.     size += (strlen(pNetResource->lpProvider) + 1);
  43.   if (pNetResource->lpRemoteName)
  44.     size += (strlen(pNetResource->lpRemoteName) + 1);
  45.   // Allocate a contiguous block of memory for the
  46.   // netresource and its strings
  47.   m_pNetResource = (LPNETRESOURCE) new char[size];
  48.   // Copy the base netresource structure
  49.   memcpy(m_pNetResource, pNetResource,
  50.    sizeof(NETRESOURCE));
  51.   // Move the strings into the new netresource area
  52.   char * pString = ((char *) m_pNetResource) +
  53.     sizeof(NETRESOURCE);
  54.   if (pNetResource->lpLocalName)
  55.   {
  56.     strcpy(pString, pNetResource->lpLocalName);
  57.     m_pNetResource->lpLocalName = pString;
  58.     pString += (strlen(pNetResource->lpLocalName) + 1);
  59.   }
  60.   if (pNetResource->lpComment)
  61.   {
  62.     strcpy(pString, pNetResource->lpComment);
  63.     m_pNetResource->lpComment = pString;
  64.     pString += (strlen(pNetResource->lpComment) + 1);
  65.   }
  66.   if (pNetResource->lpProvider)
  67.   {
  68.     strcpy(pString, pNetResource->lpProvider);
  69.     m_pNetResource->lpProvider = pString;
  70.     pString += (strlen(pNetResource->lpProvider) + 1);
  71.   }
  72.   if (pNetResource->lpRemoteName)
  73.   {
  74.     strcpy(pString, pNetResource->lpRemoteName);
  75.     m_pNetResource->lpRemoteName = pString;
  76.     m_text = pString;
  77.     pString += (strlen(pNetResource->lpRemoteName) + 1);
  78.   }
  79.   else
  80.   {
  81.     m_text = "Unknown";
  82.   }
  83. }
  84. CNetNode::~CNetNode()
  85. {
  86.   if (m_pNetResource)
  87.     delete m_pNetResource;
  88.   // Delete all child nodes
  89.   for (DWORD i = 0; i < m_nodeCount; i++)
  90.   {
  91.     if (m_nodeArray[i])
  92.      delete m_nodeArray[i];
  93.   }
  94.   delete [] m_nodeArray;
  95.   m_nodeArray = NULL;
  96.   m_nodeCount = 0;
  97. }
  98. DWORD CNetNode::EnumerateNetwork()
  99. {
  100.   static const DWORD  ENUM_BUF_SIZE = 16000;
  101.   if (m_haveEnumerated)
  102.     return(0);
  103.   // Special case for Win95 root node
  104.   if (m_isRoot && PlatformIsWindows95())
  105.     return(EnumerateNetworkWin95Root());
  106.   DWORD         enumBufSize = ENUM_BUF_SIZE;
  107.   DWORD         enumNumEntries = 0xffffffff;
  108.   HANDLE        hEnum = NULL;
  109.   LPNETRESOURCE pNetResBuf = NULL;
  110.   DWORD         ret = 0;
  111.   ret = WNetOpenEnum(RESOURCE_GLOBALNET,
  112.     RESOURCETYPE_ANY,
  113.      0,
  114.      m_pNetResource,
  115.      &hEnum);
  116.   if (ret == NO_ERROR)
  117.   {
  118.     pNetResBuf = (LPNETRESOURCE) new char[enumBufSize];
  119.     ret = WNetEnumResource(hEnum,
  120.        &enumNumEntries,
  121.       pNetResBuf,
  122.       &enumBufSize);
  123.   }
  124.   if (ret == NO_ERROR)
  125.   {
  126.     m_haveEnumerated = TRUE;
  127.     m_nodeCount = enumNumEntries;
  128.     m_nodeArray = new CNetNode * [m_nodeCount];
  129.     memset(m_nodeArray, 0, m_nodeCount * sizeof(CNetNode *));
  130.     CNetNode * pNetNode;
  131.     for (DWORD i = 0; i < enumNumEntries; i++)
  132.     {
  133.       pNetNode = new CNetNode(&pNetResBuf[i]);
  134.       m_nodeArray[i] = pNetNode;
  135.     }
  136.   }
  137.   if (pNetResBuf)
  138.     delete [] pNetResBuf;
  139.   if (hEnum)
  140.     ret = WNetCloseEnum(hEnum);
  141.   return(ret);
  142. }
  143. int CNetNode::InitPlatformID()
  144. {
  145.   if (m_platformID < 0)
  146.   {
  147.     OSVERSIONINFO   osvi;
  148.     memset(&osvi, 0, sizeof(OSVERSIONINFO));
  149.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  150.     DWORD ret = ::GetVersionEx(&osvi);
  151.     m_platformID = osvi.dwPlatformId;
  152.   }
  153.   return(m_platformID);
  154. }
  155. DWORD CNetNode::EnumerateNetworkWin95Root()
  156. {
  157.   // Win95 does not return the top-level network providers
  158.   // in the same manner as NT, so we get the provider names
  159.   // from the registry.
  160.   char netProviders[4096];
  161.   DWORD numProviders;
  162.   memset(netProviders, 0, sizeof(netProviders));
  163.   EnumerateWin95NetProviders(netProviders, &numProviders);
  164.   if (numProviders == 0)
  165.     return(ERROR_NO_NETWORK);
  166.   CNetNode * pNetNode;
  167.   m_haveEnumerated = TRUE;
  168.   m_nodeCount = numProviders;
  169.   m_nodeArray = new CNetNode * [m_nodeCount];
  170.   memset(m_nodeArray, 0, m_nodeCount * sizeof(CNetNode *));
  171.   NETRESOURCE netResource;
  172.   netResource.dwType = RESOURCETYPE_ANY;
  173. #if(WINVER >= 0x0400)
  174.   netResource.dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK;
  175. #else
  176.   netResource.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC;
  177. #endif
  178.   netResource.lpLocalName = NULL;
  179.   netResource.lpRemoteName = NULL;
  180.   netResource.lpComment = NULL;
  181.   netResource.dwUsage = RESOURCEUSAGE_CONTAINER;
  182.   netResource.dwScope = RESOURCE_GLOBALNET;
  183.   char * pNetProvider = netProviders;
  184.   for (DWORD i = 0; i < numProviders; i++)
  185.   {
  186.     netResource.lpProvider = pNetProvider;
  187.     pNetNode = new CNetNode(&netResource);
  188.     m_nodeArray[i] = pNetNode;
  189.     pNetNode->m_text =
  190.       pNetNode->m_pNetResource->lpProvider;
  191.     pNetProvider = pNetProvider + strlen(pNetProvider) + 1;
  192.   }
  193.   return(0);
  194. }
  195. void CNetNode::EnumerateWin95NetProviders(char *
  196.   pNetProviders, DWORD * pNumNetProviders)
  197. {
  198.   // This routine is specific to Win95, because the registry
  199.   // structure on NT is slightly different
  200.   DWORD   ret;
  201.   HKEY    hKeyProviderOrder = NULL;
  202.   HKEY    hKeyProviderName = NULL;
  203.   ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  204.     "System\CurrentControlSet\"  // continued...
  205.     "control\NetworkProvider\Order",
  206.     0,
  207.     KEY_QUERY_VALUE,
  208.     &hKeyProviderOrder);
  209.   if (ret)
  210.     return;
  211.   char        providerServiceName[MAX_PATH];
  212.   char        providerData[MAX_PATH];
  213.   char        providerNameKey[MAX_PATH];
  214.   char        providerName[MAX_PATH];
  215.   DWORD       buflenProviderServiceName;
  216.   DWORD       buflenProviderName;
  217.   DWORD       buflenData;
  218.   DWORD       regType;
  219.   DWORD index = 0;
  220.   while (1)
  221.   {
  222.     buflenProviderServiceName = MAX_PATH;
  223.     buflenProviderName = MAX_PATH;
  224.     buflenData = MAX_PATH;
  225.     // Get a network provider "service name"
  226.     ret = RegEnumValue(hKeyProviderOrder,
  227.       index,
  228.       providerServiceName,
  229.       &buflenProviderServiceName,
  230.       NULL,
  231.       &regType,
  232.       (LPBYTE) providerData,
  233.       &buflenData);
  234.     if (ret)
  235.       break;
  236.     strcpy(providerNameKey,
  237.       "System\CurrentControlSet\Services\");
  238.     strcat(providerNameKey, providerServiceName);
  239.     strcat(providerNameKey, "\NetworkProvider");
  240.     ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  241.       providerNameKey,
  242.       0,
  243.       KEY_QUERY_VALUE,
  244.       &hKeyProviderName);
  245.     if (ret)
  246.       break;
  247.     // Get the provider name
  248.     ret = RegQueryValueEx(hKeyProviderName,
  249.       "Name",
  250.       NULL,
  251.       &regType,
  252.       (LPBYTE) providerName,
  253.       &buflenProviderName);
  254.     if (hKeyProviderName)
  255.       RegCloseKey(hKeyProviderName);
  256.     if (ret)
  257.       break;
  258.     strcat(pNetProviders, providerName);
  259.     pNetProviders = pNetProviders +
  260.       strlen(providerName) + 1;
  261.     index++;
  262.   }
  263.   if (hKeyProviderOrder)
  264.     RegCloseKey(hKeyProviderOrder);
  265.   *pNumNetProviders = index;
  266. }