windows-nt/Source/XPSP1/NT/admin/netui/shellui/misc/getfocus.cxx
2020-09-26 16:20:57 +08:00

267 lines
8.5 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
GETFOCUS.CXX
Popup a dialog box and ask for the domain or server name
FILE HISTORY:
terryk 18-Nov-1991 Created
terryk 26-Nov-1991 Code review changes. reviewed by jonn
johnl
Yi-HsinS31-Dec-1991 Unicode work - change strlen() to
QueryTextSize()
*/
#define INCL_WINDOWS_GDI
#define INCL_WINDOWS
#define INCL_DOSERRORS
#define INCL_NETCONS
#define INCL_NETERRORS
#define INCL_NETLIB
#define INCL_ICANON
#define INCL_NETSERVER
#include <lmui.hxx>
#if defined(DEBUG)
static const CHAR szFileName[] = __FILE__;
#define _FILENAME_DEFINED_ONCE szFileName
#endif
#include <uiassert.hxx>
#define INCL_BLT_DIALOG
#define INCL_BLT_CONTROL
#define INCL_BLT_MSGPOPUP
#define INCL_BLT_CLIENT
#define INCL_BLT_APP
#define INCL_BLT_TIMER
#include <blt.hxx>
#include <string.hxx>
#include <uitrace.hxx>
#include <focusdlg.hxx>
#include <wnetdev.hxx>
extern "C"
{
#include <uiexport.h>
#include <wnet16.h>
#include <uigenhlp.h>
}
#define THIS_DLL_NAME SZ("ntlanman.dll")
#define DEFAULT_NETWORK_HELP_FILE SZ("network.hlp")
/*******************************************************************
NAME: I_SystemFocusDialog
SYNOPSIS: Popup a dialog box and get the domain or server name
ENTRY: hwndOwner - owner window handle
nSelectionType - Determines what items the user can select
pszName - the string buffer which contains the
return value. It can be either domain name or server
name. ( server name will start with "\\" )
cchBuffSize - the max buf size of pszName
pfOK - TRUE if user hits OK button. FALSE if user
hits a CANCEL button.
EXIT: LPWSTR pszName - if user hits okay button, it will
return either a domain name or a server name. (
server name always starts with "\\" ). It will be
undefined if the user hits Cancel button.
BOOL *pfOK - TRUE if user hits ok button. FALSE
otherwise.
RETURNS: UINT - (APIERR) - NERR_Success if the operation is succeed.
NERR_BufTooSmall, the string buffer is too
small. It will not set the string if the
buffer is too small.
NOTES: The reason the return type is UINT and not APIERR is because
APIERR is not a public definition, and this API is exported
for public use.
HISTORY:
terryk 18-Nov-1991 Created
terryk 19-Nov-1991 Name changed
JohnL 22-Apr-1992 Allowed inclusion specification
********************************************************************/
UINT I_SystemFocusDialog( HWND hwndOwner,
UINT nSelectionType,
LPWSTR pszName,
UINT cchBuffSize,
BOOL * pfOK,
LPWSTR pszHelpFile,
DWORD nHelpContext )
{
static BOOL fLoadedCurrentDll = FALSE;
APIERR err ;
if ( err = InitShellUI() )
{
return err ;
}
//
// Because select computer dialog has a second thread,
// we need to do a loadlibrary again to prevent
// the dll from unloading itself while the second thread
// is still active.
//
// JonN 01/28/00 PREFIX bug 444915
// Because STANDALONE_SET_FOCUS_DLG is liable to launch a second thread
// which will survive DIALOG::Process(), we increment the library
// refcount. We can't decrement it because we don't know when
// this thread will complete, so the library remains loaded
// for the life of the process.
//
// This is not an ideal solution. The thread should take care of
// its own refcounting needs. However, this is downlevel code
// used only by the oldest clients, and I don't feel comfortable
// making this kind of change which could cause unpredictable problems.
// I think the wisest course is to leave this alone, and continue to
// migrate clients towards Object Picker.
if ( !fLoadedCurrentDll )
{
HANDLE handle = ::LoadLibraryEx( THIS_DLL_NAME,
NULL,
LOAD_WITH_ALTERED_SEARCH_PATH );
if ( handle == NULL )
return ::GetLastError();
fLoadedCurrentDll = TRUE;
}
UINT nSel = nSelectionType & 0x0000FFFF;
ULONG maskDomainSources = nSelectionType >> 16;
if ( maskDomainSources == 0 )
maskDomainSources = BROWSE_LM2X_DOMAINS;
enum SELECTION_TYPE seltype ;
switch ( nSel )
{
case FOCUSDLG_DOMAINS_ONLY:
seltype = SEL_DOM_ONLY ;
break ;
case FOCUSDLG_SERVERS_ONLY:
seltype = SEL_SRV_ONLY ;
break ;
case FOCUSDLG_SERVERS_AND_DOMAINS:
seltype = SEL_SRV_AND_DOM ;
break ;
default:
return ERROR_INVALID_PARAMETER ;
}
// Create a standalone set focus dialog box and get the input
// form the user
NLS_STR nlsName;
STANDALONE_SET_FOCUS_DLG ssfdlg( hwndOwner,
&nlsName,
nHelpContext,
seltype,
maskDomainSources,
NULL,
pszHelpFile );
err = ssfdlg.Process( pfOK );
if ( err != NERR_Success )
{
::MsgPopup( hwndOwner, err );
*pfOK = FALSE;
return err;
}
if ( *pfOK == TRUE )
{
if (( nlsName.QueryTextLength() + 1 ) > cchBuffSize )
{
*pfOK = FALSE;
return NERR_BufTooSmall;
}
::strcpyf( pszName, nlsName.QueryPch() );
}
return NERR_Success;
} // GetSystemFocusDialog END
/*******************************************************************
NAME: ServerBrowseDialogA0
SYNOPSIS: dialog box to browse for servers
ENTRY: hwndOwner - owner window handle
pszName - the string buffer which contains the
return value. It can be either domain name or server
name. ( server name will start with "\\" )
cchBuffSize - the max buf size of pszName
EXIT: LPWSTR pszName - if user hits okay button, it will
return either a domain name or a server name. (
server name always starts with "\\" ). It will be
undefined if the user hits Cancel button.
RETURNS: UINT - (APIERR) - NERR_Success if the operation is succeed.
WN_CANCEL - The user cancelled the dialog box.
NERR_BufTooSmall, the string buffer is too
small. It will not set the string if the
buffer is too small.
NOTES:
HISTORY:
ChuckC 28-Mar-1993 Created
AnirudhS 03-Oct-1995 Handle WN_CANCEL case
********************************************************************/
DWORD ServerBrowseDialogA0(HWND hwnd,
CHAR *pchBuffer,
DWORD cchBufSize)
{
NLS_STR nlsServer ;
TCHAR szServer[MAX_PATH] ;
BOOL fOK ;
UINT err ;
::memsetf(pchBuffer,0,cchBufSize) ;
if (err = (UINT) nlsServer.QueryError())
return err ;
err = I_SystemFocusDialog ( hwnd,
FOCUSDLG_SERVERS_ONLY,
szServer,
MAX_PATH,
&fOK,
DEFAULT_NETWORK_HELP_FILE,
HC_GENHELP_BROWSESERVERS ) ;
if (err == NERR_Success && !fOK)
{
err = WN_CANCEL;
}
if (err != NERR_Success)
return err ;
err = (UINT) nlsServer.CopyFrom(szServer) ;
if (err == NERR_Success)
{
err = (UINT) nlsServer.MapCopyTo(pchBuffer, cchBufSize) ;
}
return err ;
}