windows-nt/Source/XPSP1/NT/admin/netui/mprui/mpr/mprenum.cxx

354 lines
11 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1990, 1991 **/
/**********************************************************************/
/*
mprenum.cxx
Contains EnumerateShow.
FILE HISTORY:
Yi-HsinS 04-Mar-1993 Separated from mprbrows.cxx
*/
#define INCL_NETERRORS
#define INCL_DOSERRORS
#define INCL_WINDOWS
#define INCL_NETLIB
#define INCL_NETWKSTA
#include <lmui.hxx>
#define INCL_BLT_DIALOG
#define INCL_BLT_CONTROL
#define INCL_BLT_MSGPOPUP
#include <blt.hxx>
#include <string.hxx>
#include <uitrace.hxx>
#include <dbgstr.hxx>
#include <uibuffer.hxx>
#include <mprbrows.hxx>
#define MPRDBG(x) { ; }
#define MPRDBGEOL(x) { ; }
// prototype
APIERR EnumerateShowHelp(
HANDLE hEnum,
MPR_LBI **ppmprlbiParent,
MPR_LBI_CACHE *plbicache,
LPNETRESOURCE lpNetResource,
MPR_LBI *pmprlbi,
MPR_HIER_LISTBOX *pmprlb,
BOOL fDeleteChildren,
BOOL *pfSearchDialogUsed );
/*******************************************************************
NAME: ::EnumerateShow
SYNOPSIS: Enumerate the requested data
(providers, containers or connectable items).
(1) If the listbox passed in is not NULL,
then the data is added in the listbox
(2) If the listbox is NULL,
then return the data in the MPR_LBI_CACHE
ENTRY: uiScope - Scope for enumeration (see WNetOpenEnum)
uiType - Type of enumeration (see WNetOpenEnum)
uiUsage - Usage of enumeration (see WNetOpenEnum)
lpNetResource - Net resource (see WNetOpenEnum)
pmprlbi - Parent LBI to add enumeration to
pmprlb - Pointer to the MPR_HIER_LISTBOX
fDeleteChildren - TRUE if we need to delete the children
pfSearchDialogUsed
ppmprlbicache
EXIT:
RETURNS:
NOTES:
HISTORY:
Johnl 22-Jan-1992 Broke out from dialog, commented, fixed
YiHsinS 04-Mar-1993 Support multithread
********************************************************************/
APIERR EnumerateShow( HWND hwndOwner,
UINT uiScope,
UINT uiType,
UINT uiUsage,
LPNETRESOURCE lpNetResource,
MPR_LBI *pmprlbi,
MPR_HIER_LISTBOX *pmprlb,
BOOL fDeleteChildren,
BOOL *pfSearchDialogUsed,
MPR_LBI_CACHE **ppmprlbicache )
{
UIASSERT( WN_SUCCESS == NERR_Success );
if ( ppmprlbicache != NULL )
*ppmprlbicache = NULL;
APIERR err = NERR_Success;
MPR_LBI *pmprlbiParent = pmprlbi;
MPR_LBI_CACHE *plbicache = new MPR_LBI_CACHE();
if ( ( plbicache == NULL )
|| (( err = plbicache->QueryError()) != NERR_Success )
)
{
if ( err != NERR_Success )
delete plbicache;
return (err? err : ERROR_NOT_ENOUGH_MEMORY);
}
HANDLE hEnum;
err = WNetOpenEnum(uiScope, uiType, uiUsage, lpNetResource, &hEnum);
if ((err != WN_SUCCESS) && (hwndOwner != NULL))
{
//
// If hwndOwner is NULL, we shouldn't put any UI.
//
//
// If it failed because you are not authenticated yet,
// we need to let the user loggin to this network resource.
//
if (err == WN_NOT_AUTHENTICATED
|| err == ERROR_LOGON_FAILURE
|| err == WN_BAD_PASSWORD
|| err == WN_ACCESS_DENIED
)
{
// Retry with password dialog box.
err = WNetAddConnection3(hwndOwner, lpNetResource, NULL, NULL,
CONNECT_TEMPORARY | CONNECT_INTERACTIVE);
if (err == WN_SUCCESS)
{
// Retry WNetOpenEnum.
err = WNetOpenEnum(uiScope, uiType, uiUsage, lpNetResource, &hEnum);
}
}
}
if (err == WN_SUCCESS)
{
err = EnumerateShowHelp(
hEnum,
&pmprlbiParent,
plbicache,
lpNetResource,
pmprlbi,
pmprlb,
fDeleteChildren,
pfSearchDialogUsed );
WNetCloseEnum( hEnum );
}
else
{
// probable errors: WN_NO_NETWORK, WN_EXTENDED_ERROR, WN_BAD_VALUE,
// WN_NOT_CONTAINER
MPRDBGEOL( SZ("EnumerateShow OpenEnum > ") << (ULONG) err );
}
//
// Add all of the items in a single block to avoid the n^2 sort that would
// be done if they were added individually
//
if ( plbicache->QueryCount() > 0 )
{
plbicache->Sort();
if ( pmprlb != NULL )
{
pmprlb->SetRedraw( FALSE );
pmprlb->AddSortedItems( (HIER_LBI**) plbicache->QueryPtr(),
plbicache->QueryCount(),
pmprlbiParent );
pmprlb->SetRedraw( TRUE );
pmprlb->Invalidate();
delete plbicache;
plbicache = NULL;
}
else
{
UIASSERT( ppmprlbicache != NULL );
*ppmprlbicache = plbicache;
}
}
else
{
// nothing there and it isn't returned; delete the cache.
delete plbicache;
plbicache = NULL;
}
return err;
} // ::EnumerateShow
/*******************************************************************
NAME: ::EnumerateShowHelp
SYNOPSIS: A helper function for EnumerateShow. It handles the
actual enumeration.
ENTRY:
hEnum - enumeration handle from WNetOpenEnum
ppmprlbiParent - parent LBI
plbicache - the cache to put elements in
lpNetResource - Net resource of container (see WNetOpenEnum)
pmprlbi - Parent LBI to add enumeration to
pmprlb - Pointer to the MPR_HIER_LISTBOX
fDeleteChildren - TRUE if we need to delete the children
pfSearchDialogUsed
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 13-Sep-1995 Split from EnumerateShow for readability
********************************************************************/
APIERR EnumerateShowHelp(
HANDLE hEnum,
MPR_LBI **ppmprlbiParent,
MPR_LBI_CACHE *plbicache,
LPNETRESOURCE lpNetResource,
MPR_LBI *pmprlbi,
MPR_HIER_LISTBOX *pmprlb,
BOOL fDeleteChildren,
BOOL *pfSearchDialogUsed )
{
BUFFER buf( 1024 );
DWORD err;
DWORD dwEnumErr = buf.QueryError() ;
while ( dwEnumErr == NERR_Success )
{
DWORD dwCount = 0xffffffff; // Return as many as possible
DWORD dwBuffSize = buf.QuerySize() ;
dwEnumErr = WNetEnumResource( hEnum,
&dwCount,
buf.QueryPtr(),
&dwBuffSize );
MPRDBGEOL( SZ("EnumerateShow EnumResource >") << (ULONG) dwEnumErr ) ;
switch ( dwEnumErr )
{
case WN_SUCCESS:
case WN_NO_MORE_ENTRIES: // Success code, map below
if ( fDeleteChildren )
{
UIASSERT( pmprlb != NULL );
pmprlb->SetRedraw( FALSE );
fDeleteChildren = FALSE;
pmprlb->DeleteChildren( pmprlbi );
MPR_LBI * pmprlbiTemp = new MPR_LBI( lpNetResource );
if ( ( pmprlbiTemp == NULL )
|| ( err = pmprlbiTemp->QueryError() )
)
{
delete pmprlbiTemp;
pmprlbiTemp = NULL;
dwEnumErr = err ? err : ERROR_NOT_ENOUGH_MEMORY;
break;
}
if ( pmprlb->AddItem( pmprlbiTemp, pmprlbi ) < 0 )
{
// AddItem has already deleted the item we're trying
// to add, if it returns -1: don't delete it again.
pmprlbiTemp = NULL;
dwEnumErr = ERROR_NOT_ENOUGH_MEMORY;
break;
}
*ppmprlbiParent = pmprlbiTemp;
pmprlb->SetRedraw( TRUE );
}
if ( dwEnumErr == WN_SUCCESS )
{
//
// Add the Entries to the listbox with parent pmprlbi
//
MPRDBGEOL( SZ("EnumerateShow ")
<< (ULONG) dwCount << SZ(" Entries returned "));
NETRESOURCE *pnetres = (NETRESOURCE * )buf.QueryPtr();
for (INT i = 0; dwCount ; dwCount--, i++ )
{
if ( err = plbicache->AppendItem(
new MPR_LBI( &(pnetres[i])))
)
{
dwEnumErr = err ;
break ;
}
// if we are at top (lpNetResource==NULL) and
// we've been given a valid pfSearchDialogUsed
// pointer, then we go figure out if we need
// to display the "Search..." button.
if (lpNetResource == NULL &&
pfSearchDialogUsed != NULL)
{
if (::WNetGetSearchDialog(
pnetres[i].lpProvider) != NULL)
{
*pfSearchDialogUsed = TRUE ;
}
}
}
}
break ;
/* The buffer wasn't big enough for even one entry,
* resize it and try again.
*/
case WN_MORE_DATA:
if ( dwEnumErr = buf.Resize( buf.QuerySize()*2 ))
break;
/*
* Continue looping
*/
dwEnumErr = WN_SUCCESS;
break;
case WN_EXTENDED_ERROR:
case WN_NO_NETWORK:
break;
default:
MPRDBGEOL(SZ("EnumerateConnections - Unexpected return code from WNetEnumResource"));
break;
} // switch
} // while
UIASSERT( sizeof(APIERR) == sizeof( DWORD ));
return (dwEnumErr==WN_NO_MORE_ENTRIES ) ? NERR_Success : dwEnumErr;
} // ::EnumerateShowHelp