316 lines
8.2 KiB
C++
316 lines
8.2 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1993 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
mprthred.cxx
|
|
Second thread for network connection dialog.
|
|
|
|
|
|
FILE HISTORY:
|
|
YiHsinS 4-Mar-1993 Created
|
|
|
|
*/
|
|
|
|
#define INCL_NETERRORS
|
|
#define INCL_WINDOWS_GDI
|
|
#define INCL_WINDOWS
|
|
#define INCL_DOSERRORS
|
|
#define INCL_NETLIB
|
|
#define INCL_NETWKSTA
|
|
#include <lmui.hxx>
|
|
|
|
#define INCL_BLT_DIALOG
|
|
#define INCL_BLT_CONTROL
|
|
#include <blt.hxx>
|
|
|
|
#include <strnumer.hxx> // HEX_STR
|
|
#include <uitrace.hxx>
|
|
|
|
#include <mprbrows.hxx>
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: MPR_ENUM_THREAD::MPR_ENUM_THREAD
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 4-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
MPR_ENUM_THREAD::MPR_ENUM_THREAD( HWND hwndDlg,
|
|
UINT uiType,
|
|
LPNETRESOURCE pnetresProvider,
|
|
const TCHAR *pszWkstaDomain )
|
|
: WIN32_THREAD( TRUE, 0, SZ("mprui.dll") ),
|
|
_hwndDlg( hwndDlg ),
|
|
_uiType ( uiType ),
|
|
_nlsWkstaDomain( pszWkstaDomain ),
|
|
_eventExitThread( NULL, FALSE ),
|
|
_fThreadIsTerminating( FALSE )
|
|
{
|
|
if ( QueryError() )
|
|
return;
|
|
|
|
APIERR err = NERR_Success;
|
|
if ( ((err = _eventExitThread.QueryError()) != NERR_Success )
|
|
|| ((err = _nlsWkstaDomain.QueryError()) != NERR_Success )
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
UIASSERT( pnetresProvider != NULL );
|
|
|
|
_netresProvider.dwScope = pnetresProvider->dwScope;
|
|
_netresProvider.dwType = pnetresProvider->dwType;
|
|
_netresProvider.dwDisplayType = pnetresProvider->dwDisplayType;
|
|
_netresProvider.dwUsage = pnetresProvider->dwUsage;
|
|
|
|
_netresProvider.lpRemoteName = NULL;
|
|
_netresProvider.lpLocalName = NULL;
|
|
_netresProvider.lpProvider = NULL;
|
|
_netresProvider.lpComment = NULL;
|
|
|
|
/* Note that we do new(count of characters) because we are using
|
|
* the transmutable type TCHAR.
|
|
*/
|
|
if ( pnetresProvider->lpRemoteName != NULL )
|
|
{
|
|
if ( (_netresProvider.lpRemoteName = new TCHAR[ ::strlenf( pnetresProvider->lpRemoteName ) + 1]) != NULL)
|
|
::strcpyf( _netresProvider.lpRemoteName, pnetresProvider->lpRemoteName);
|
|
else
|
|
ReportError( ERROR_NOT_ENOUGH_MEMORY ) ;
|
|
}
|
|
|
|
if ( pnetresProvider->lpLocalName != NULL )
|
|
{
|
|
if ((_netresProvider.lpLocalName = new TCHAR[ ::strlenf( pnetresProvider->lpLocalName ) + 1]) != NULL)
|
|
::strcpyf( _netresProvider.lpLocalName, pnetresProvider->lpLocalName);
|
|
else
|
|
ReportError( ERROR_NOT_ENOUGH_MEMORY ) ;
|
|
}
|
|
|
|
if ( pnetresProvider->lpProvider != NULL )
|
|
{
|
|
if ((_netresProvider.lpProvider = new TCHAR[ ::strlenf( pnetresProvider->lpProvider ) + 1]) != NULL)
|
|
::strcpyf( _netresProvider.lpProvider, pnetresProvider->lpProvider);
|
|
else
|
|
ReportError( ERROR_NOT_ENOUGH_MEMORY ) ;
|
|
}
|
|
|
|
if ( pnetresProvider->lpComment != NULL )
|
|
{
|
|
if ((_netresProvider.lpComment = new TCHAR[ ::strlenf( pnetresProvider->lpComment ) + 1])!=NULL )
|
|
::strcpyf( _netresProvider.lpComment, pnetresProvider->lpComment);
|
|
else
|
|
ReportError( ERROR_NOT_ENOUGH_MEMORY ) ;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: MPR_ENUM_THREAD::~MPR_ENUM_THREAD
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 4-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
MPR_ENUM_THREAD::~MPR_ENUM_THREAD()
|
|
{
|
|
delete _netresProvider.lpRemoteName;
|
|
delete _netresProvider.lpLocalName;
|
|
delete _netresProvider.lpProvider;
|
|
delete _netresProvider.lpComment;
|
|
_netresProvider.lpRemoteName = NULL;
|
|
_netresProvider.lpLocalName = NULL;
|
|
_netresProvider.lpProvider = NULL;
|
|
_netresProvider.lpComment = NULL;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: MPR_ENUM_THREAD::Main()
|
|
|
|
SYNOPSIS: Get the information needed to fill in the "Show" listbox
|
|
with the requested data (providers, containers or
|
|
connectable items)
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 4-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR MPR_ENUM_THREAD::Main( VOID )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
MPR_LBI_CACHE *pmprlbicacheDomain = NULL;
|
|
MPR_LBI_CACHE *pmprlbicacheServer = NULL;
|
|
|
|
INT i = -1;
|
|
if ( !_fThreadIsTerminating )
|
|
{
|
|
// The errors that happened in the following two EnumerateShow
|
|
// will be ignored. The cache returned will be NULL if error
|
|
// occurred so nothing needs to be added to the listbox.
|
|
|
|
// Get the domains
|
|
APIERR err1 = ::EnumerateShow(
|
|
_hwndDlg,
|
|
RESOURCE_GLOBALNET,
|
|
_uiType,
|
|
0,
|
|
&_netresProvider,
|
|
NULL,
|
|
NULL,
|
|
FALSE,
|
|
NULL,
|
|
&pmprlbicacheDomain );
|
|
|
|
|
|
if ( !_fThreadIsTerminating
|
|
&& ( err1 == NERR_Success )
|
|
&& ( _nlsWkstaDomain.QueryTextLength() != 0 )
|
|
&& ( (i = pmprlbicacheDomain->FindItem( _nlsWkstaDomain )) >= 0 )
|
|
)
|
|
{
|
|
// Get the servers, ignore the error
|
|
::EnumerateShow(
|
|
_hwndDlg,
|
|
RESOURCE_GLOBALNET,
|
|
_uiType,
|
|
0,
|
|
((pmprlbicacheDomain->QueryPtr())[i])->QueryLPNETRESOURCE(),
|
|
NULL,
|
|
NULL,
|
|
FALSE,
|
|
NULL,
|
|
&pmprlbicacheServer );
|
|
|
|
}
|
|
}
|
|
|
|
MPR_RETURN_CACHE p;
|
|
p.pcacheDomain = pmprlbicacheDomain;
|
|
p.pcacheServer = pmprlbicacheServer;
|
|
|
|
if ( !_fThreadIsTerminating )
|
|
{
|
|
if ( err == NERR_Success )
|
|
{
|
|
::SendMessage( _hwndDlg,
|
|
WM_LB_FILLED,
|
|
(WPARAM) FALSE, // No error!
|
|
(LPARAM) &p );
|
|
}
|
|
else
|
|
{
|
|
::SendMessage( _hwndDlg,
|
|
WM_LB_FILLED,
|
|
(WPARAM) TRUE, // Error occurred!
|
|
(LPARAM) err );
|
|
}
|
|
}
|
|
|
|
// The following cache will have already been freed if the
|
|
// dialog got and processed the SendMessage above.
|
|
if ( p.pcacheDomain != NULL )
|
|
{
|
|
(p.pcacheDomain)->DeleteAllItems();
|
|
delete p.pcacheDomain;
|
|
p.pcacheDomain = NULL;
|
|
}
|
|
|
|
if ( p.pcacheServer != NULL )
|
|
{
|
|
(p.pcacheServer)->DeleteAllItems();
|
|
delete p.pcacheServer;
|
|
p.pcacheServer = NULL;
|
|
}
|
|
|
|
switch ( ::WaitForSingleObject( _eventExitThread.QueryHandle(), INFINITE ))
|
|
{
|
|
// Time to exit the thread
|
|
case WAIT_OBJECT_0:
|
|
break;
|
|
|
|
// These two should not have happened, not a mutex and wait infinite
|
|
case WAIT_ABANDONED:
|
|
case WAIT_TIMEOUT:
|
|
UIASSERT( FALSE );
|
|
break;
|
|
|
|
default:
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
|
|
} // MPR_ENUM_THREAD::Main
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: MPR_ENUM_THREAD::PostMain()
|
|
|
|
SYNOPSIS: Clean up
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 4-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR MPR_ENUM_THREAD::PostMain( VOID )
|
|
{
|
|
TRACEEOL("MPR_ENUM_THREAD::PostMain - Deleting \"this\" for thread "
|
|
<< HEX_STR( (ULONG) QueryHandle() )) ;
|
|
|
|
DeleteAndExit( NERR_Success ) ; // This method should never return
|
|
|
|
UIASSERT( FALSE );
|
|
|
|
return NERR_Success;
|
|
|
|
} // MPR_ENUM_THREAD::PostMain
|
|
|