22 FProgressEvent(NULL), OnProgress(NULL),
23 FServerEvent(NULL), OnServer(NULL),
25 resourcesProcessed_(0){
39 void ServerEnumerator::debugOutput(
const AnsiString & operation,
const AnsiString & message)
44 void ServerEnumerator::addMessage(
const AnsiString& message,
const int level) {
45 debugOutput(
"Message", message);
46 if (FMessageEvent != NULL)
47 FMessageEvent(message, level);
50 void ServerEnumerator::addServer(
const AnsiString& remoteName,
const AnsiString& comment) {
51 debugOutput(
"Server", remoteName +
" \"" + comment +
" \"");
52 if (FServerEvent != NULL)
54 string lRemoteName = remoteName.c_str();
65 void ServerEnumerator::updateProgress(
const float complete) {
66 debugOutput(
"Progress", AnsiString().sprintf(
"%.0f", complete * 100));
67 if (FProgressEvent != NULL)
68 FProgressEvent(complete);
71 void ServerEnumerator::handleResource(
const NETRESOURCE& resource) {
73 if (resource.dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
75 AnsiString remoteName = resource.lpRemoteName;
76 if (1 == remoteName.Pos(AnsiString(
"\\\\")))
77 remoteName.Delete(1, 2);
78 addServer(remoteName, resource.lpComment);
79 addMessage(AnsiString().sprintf(
"\tFound node %s", remoteName.c_str()), 0);
83 void ServerEnumerator::netErrorHandler(
const DWORD dwErrorCode,
const AnsiString& errorFunction) {
84 DWORD dwWNetResult, dwLastError;
85 char szDescription[256];
87 AnsiString MessageStr;
92 if (dwErrorCode != ERROR_EXTENDED_ERROR)
95 addMessage(errorFunction, 2);
96 MessageStr = SysErrorMessage(dwErrorCode) +
".";
99 dwWNetResult = WNetGetLastError(&dwLastError, (LPSTR) szDescription,
100 sizeof(szDescription), (LPSTR) szProvider,
sizeof(szProvider));
102 if (dwWNetResult != NO_ERROR)
105 MessageStr = AnsiString().sprintf(
111 MessageStr = AnsiString().sprintf(
sWNetFailedFmt.c_str(), szProvider,
112 dwLastError, szDescription);
116 StringReplace(MessageStr,
"\r\n",
" ", TReplaceFlags() << rfReplaceAll);
118 addMessage(MessageStr, MessageSeverity);
122 BOOL ServerEnumerator::enumerateFunc(
const LPNETRESOURCE lpnr) {
123 DWORD dwResult, dwResultEnum;
125 DWORD cbBuffer = 16384;
126 DWORD cEntries = 0xFFFFFFFF;
127 LPNETRESOURCE lpnrLocal;
134 resourcesProcessed_ = 0;
142 updateProgress(((
float) resourcesProcessed_ / (
float) resourceTotal_));
144 resourcesProcessed_++;
146 dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
152 if ((dwResult != NO_ERROR )) {
164 lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);
166 dwResultEnum = WNetEnumResource(hEnum,
171 if (dwResultEnum == NO_ERROR) {
172 resourceTotal_ += cEntries;
173 for (i = 0; i < cEntries; i++) {
174 handleResource(lpnrLocal[i]);
177 if ((RESOURCEUSAGE_CONTAINER
178 == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER))
179 && !(lpnrLocal[i].dwDisplayType
180 == RESOURCEDISPLAYTYPE_SERVER)) {
182 AnsiString ObjectName;
184 if (lpnrLocal[i].lpRemoteName)
185 ObjectName = lpnrLocal[i].lpRemoteName;
187 ObjectName = lpnrLocal[i].lpProvider;
191 ObjectName.c_str()), 1);
194 enumerateFunc(&lpnrLocal[i]);
197 }
else if (dwResultEnum != ERROR_NO_MORE_ITEMS) {
198 netErrorHandler(dwResultEnum,
"WNetEnumResource");
201 GlobalFree((HGLOBAL) lpnrLocal);
202 }
while (dwResultEnum != ERROR_NO_MORE_ITEMS);
204 dwResult = WNetCloseEnum(hEnum);
206 if (dwResult != NO_ERROR) {
207 netErrorHandler(dwResult,
"WNetCloseEnum");