windows-nt/Source/XPSP1/NT/admin/netui/mprui/mpr/dlg1.cxx
2020-09-26 16:20:57 +08:00

600 lines
15 KiB
C++

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1995 **/
/**********************************************************************/
/*
dlg1.cxx
WNetConnectionDialog1* and WNetDisconnectDialog1* source
FILE HISTORY:
BruceFo 19-May-95 Created
*/
#define INCL_NETCONS
#define INCL_NETCONFIG
#define INCL_NETSERVICE
#define INCL_NETLIB
#define INCL_WINDOWS
#define INCL_NETERRORS
#define INCL_DOSERRORS
#include <lmui.hxx>
#define INCL_BLT_CONTROL
#define INCL_BLT_CLIENT
#define INCL_BLT_MSGPOPUP
#include <blt.hxx>
#include <mprconn.h>
//
// Export these using C-style syntax
//
extern "C"
{
#include <mpr.h>
}
#include <shlobj.h>
#include <shlobjp.h> // netplwiz.h stuff
//
// Null strings are quite often taken to be either a NULL pointer or a zero
//
#define IS_EMPTY_STRING(pch) ( !(pch) || !*(pch) )
#define MAX_NET_PATH MAX_PATH
DWORD
MPRUI_WNetConnectionDialog1Help(
LPCONNECTDLGSTRUCTW lpConnDlgStruct
);
DWORD
MPRUI_WNetDisconnectDialog1Help(
HWND hwndOwner,
LPWSTR lpLocalName,
LPWSTR lpRemoteName,
DWORD dwFlags
);
/*******************************************************************
NAME: MPRUI_WNetDisconnectDialog1W
SYNOPSIS:
ENTRY: lpDiscDlgStruct -
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 19-May-1995 Created
********************************************************************/
DWORD
MPRUI_WNetDisconnectDialog1W(
LPDISCDLGSTRUCTW lpDiscDlgStruct
)
{
DWORD status = WN_SUCCESS;
__try
{
if (NULL == lpDiscDlgStruct)
{
status = WN_BAD_POINTER;
}
else if ((lpDiscDlgStruct->cbStructure < sizeof(DISCDLGSTRUCTW))
|| ((lpDiscDlgStruct->lpLocalName == NULL) && (lpDiscDlgStruct->lpRemoteName == NULL))
)
{
status = ERROR_INVALID_PARAMETER;
}
else
{
status = MPRUI_WNetDisconnectDialog1Help(
lpDiscDlgStruct->hwndOwner,
lpDiscDlgStruct->lpLocalName,
lpDiscDlgStruct->lpRemoteName,
lpDiscDlgStruct->dwFlags);
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
status = WN_BAD_POINTER;
}
if (status != WN_SUCCESS)
{
SetLastError(status);
}
return status;
}
/*******************************************************************
NAME: MPRUI_WNetDisconnectDialog1A
SYNOPSIS:
ENTRY: lpDiscDlgStruct -
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 19-May-1995 Created
********************************************************************/
DWORD
MPRUI_WNetDisconnectDialog1A(
LPDISCDLGSTRUCTA lpDiscDlgStruct
)
{
APIERR err;
__try
{
if (NULL == lpDiscDlgStruct)
{
err = WN_BAD_POINTER;
}
else if ((lpDiscDlgStruct->cbStructure < sizeof(DISCDLGSTRUCTA))
|| ((lpDiscDlgStruct->lpLocalName == NULL) && (lpDiscDlgStruct->lpRemoteName == NULL))
)
{
err = ERROR_INVALID_PARAMETER;
}
else
{
DISCDLGSTRUCTW discDlgStructW;
NLS_STR nlsLocalName;
NLS_STR nlsRemoteName;
if ( (err = nlsRemoteName.MapCopyFrom(lpDiscDlgStruct->lpRemoteName))
|| (err = nlsLocalName.MapCopyFrom(lpDiscDlgStruct->lpLocalName))
)
{
// do nothing
}
if ( 0 == err )
{
discDlgStructW.cbStructure = sizeof(DISCDLGSTRUCTW);
discDlgStructW.hwndOwner = lpDiscDlgStruct->hwndOwner;
discDlgStructW.lpLocalName = (LPWSTR)nlsLocalName.QueryPch();
discDlgStructW.lpRemoteName = (LPWSTR)nlsRemoteName.QueryPch();
discDlgStructW.dwFlags = lpDiscDlgStruct->dwFlags;
err = MPRUI_WNetDisconnectDialog1W(&discDlgStructW);
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
err = WN_BAD_POINTER;
}
return err;
}
/*******************************************************************
NAME: MPRUI_WNetConnectionDialog1A
SYNOPSIS:
ENTRY: lpConnDlgStruct -
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 19-May-1995 Created
********************************************************************/
DWORD
MPRUI_WNetConnectionDialog1A(
LPCONNECTDLGSTRUCTA lpConnDlgStruct
)
{
APIERR err = WN_SUCCESS;
__try
{
if ((NULL == lpConnDlgStruct) || (NULL == lpConnDlgStruct->lpConnRes))
{
err = WN_BAD_POINTER;
}
else
{
if ((lpConnDlgStruct->dwFlags & CONNDLG_RO_PATH) &&
((lpConnDlgStruct->dwFlags & CONNDLG_USE_MRU)
|| (IS_EMPTY_STRING(lpConnDlgStruct->lpConnRes->lpRemoteName)))
)
{
// A read only remote path has been requested with
// a drop down MRU list or no remote path specified.
// Neither of these options are valid.
err = WN_BAD_VALUE;
}
else if ((lpConnDlgStruct->dwFlags & CONNDLG_PERSIST) &&
(lpConnDlgStruct->dwFlags & CONNDLG_NOT_PERSIST))
{
// Caller has specified inconsistent values.
err = WN_BAD_VALUE;
}
if (lpConnDlgStruct->lpConnRes->dwType != RESOURCETYPE_DISK)
{
// Only disk dialog is supported
err = WN_BAD_DEV_TYPE;
}
}
if (WN_SUCCESS == err)
{
NLS_STR nlsLocalName;
NLS_STR nlsRemoteName;
NLS_STR nlsComment;
NLS_STR nlsProvider;
if ( (err = nlsRemoteName.MapCopyFrom(lpConnDlgStruct->lpConnRes->lpRemoteName))
|| (err = nlsLocalName.MapCopyFrom(lpConnDlgStruct->lpConnRes->lpLocalName))
|| (err = nlsComment.MapCopyFrom(lpConnDlgStruct->lpConnRes->lpComment))
|| (err = nlsProvider.MapCopyFrom(lpConnDlgStruct->lpConnRes->lpProvider))
)
{
// do nothing
}
if ( 0 == err )
{
NETRESOURCEW netResourceW;
CONNECTDLGSTRUCTW connDlgStructW;
connDlgStructW.cbStructure = sizeof(CONNECTDLGSTRUCTW);
connDlgStructW.hwndOwner = lpConnDlgStruct->hwndOwner;
connDlgStructW.lpConnRes = &netResourceW;
connDlgStructW.dwFlags = lpConnDlgStruct->dwFlags;
connDlgStructW.dwDevNum = lpConnDlgStruct->dwDevNum;
netResourceW.dwScope = lpConnDlgStruct->lpConnRes->dwScope;
netResourceW.dwType = lpConnDlgStruct->lpConnRes->dwType;
netResourceW.dwDisplayType = lpConnDlgStruct->lpConnRes->dwDisplayType;
netResourceW.dwUsage = lpConnDlgStruct->lpConnRes->dwUsage;
netResourceW.lpLocalName = (LPWSTR)nlsLocalName.QueryPch();
netResourceW.lpRemoteName = (LPWSTR)nlsRemoteName.QueryPch();
netResourceW.lpComment = (LPWSTR)nlsComment.QueryPch();
netResourceW.lpProvider = (LPWSTR)nlsProvider.QueryPch();
err = MPRUI_WNetConnectionDialog1Help(&connDlgStructW);
if (err == WN_SUCCESS)
{
// Now copy back the one thing that is an "out" paramter
lpConnDlgStruct->dwDevNum = connDlgStructW.dwDevNum;
}
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
err = WN_BAD_POINTER;
}
return err;
}
/*******************************************************************
NAME: MPRUI_WNetConnectionDialog1W
SYNOPSIS:
ENTRY: lpConnDlgStruct -
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 19-May-1995 Created
********************************************************************/
DWORD
MPRUI_WNetConnectionDialog1W(
LPCONNECTDLGSTRUCTW lpConnDlgStruct
)
{
APIERR err = WN_SUCCESS;
__try
{
if ((NULL == lpConnDlgStruct) || (NULL == lpConnDlgStruct->lpConnRes))
{
err = WN_BAD_POINTER;
}
else
{
if ((lpConnDlgStruct->dwFlags & CONNDLG_RO_PATH) &&
((lpConnDlgStruct->dwFlags & CONNDLG_USE_MRU)
|| (IS_EMPTY_STRING(lpConnDlgStruct->lpConnRes->lpRemoteName)))
)
{
// A read only remote path has been requested with
// a drop down MRU list or no remote path specified.
// Neither of these options are valid.
err = WN_BAD_VALUE;
}
else if ((lpConnDlgStruct->dwFlags & CONNDLG_PERSIST) &&
(lpConnDlgStruct->dwFlags & CONNDLG_NOT_PERSIST))
{
// Caller has specified inconsistent values.
err = WN_BAD_VALUE;
}
if (lpConnDlgStruct->lpConnRes->dwType != RESOURCETYPE_DISK)
{
// Only disk dialog is supported
err = WN_BAD_DEV_TYPE;
}
}
if (WN_SUCCESS == err)
{
err = MPRUI_WNetConnectionDialog1Help(lpConnDlgStruct);
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
err = WN_BAD_POINTER;
}
return err;
}
/*******************************************************************
NAME: MPRUI_WNetConnectionDialog
SYNOPSIS: Entrypoint for the MPRUI_WNetConnectionDialog API
ENTRY: hwnd - Parent window handle suitable for hosting a dialog
dwType - one of RESOURCETYPE_DISK or RESOURCETYPE_PRINT
EXIT:
RETURNS:
NOTES:
HISTORY:
Johnl 22-Jan-1992 Commented, fixed
beng 31-Mar-1992 Unicode mumble
********************************************************************/
DWORD MPRUI_WNetConnectionDialog( HWND hwnd,
DWORD dwType )
{
NETRESOURCE netResource;
CONNECTDLGSTRUCT connDlgStruct;
if (dwType != RESOURCETYPE_DISK)
{
// Only disk dialog is supported
return WN_BAD_DEV_TYPE;
}
connDlgStruct.hwndOwner = hwnd;
connDlgStruct.lpConnRes = &netResource;
connDlgStruct.dwFlags = CONNDLG_USE_MRU;
::memsetf((LPSTR)&netResource,0,sizeof(netResource));
netResource.dwType = dwType;
return MPRUI_WNetConnectionDialog1Help(&connDlgStruct);
}
/*******************************************************************
NAME: MPRUI_WNetConnectionDialog1Help
SYNOPSIS: Helper function for MPRUI_WNetConnectionDialog1{A,W}.
Assumes parameters have been validated.
ENTRY: lpConnDlgStruct -
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 19-May-1995 Created
********************************************************************/
DWORD
MPRUI_WNetConnectionDialog1Help(
LPCONNECTDLGSTRUCTW lpConnDlgStruct
)
{
APIERR err;
HMODULE hModule;
ASSERT(lpConnDlgStruct->lpConnRes->dwType == RESOURCETYPE_DISK);
if ((lpConnDlgStruct->dwFlags &
(CONNDLG_RO_PATH | CONNDLG_USE_MRU)) == 0)
{
// If read-only or drop down MRU list not explicitly
// requested, then pick a default based upon whether
// or not the remote name was specified.
lpConnDlgStruct->dwFlags |=
(IS_EMPTY_STRING(lpConnDlgStruct->lpConnRes->lpRemoteName))
? CONNDLG_USE_MRU : CONNDLG_RO_PATH;
}
//
// Create the wizard. The third parameter indicates whether or not
// the user specified a read-only path in lpConnDlgStruct.
//
err = NetPlacesWizardDoModal(lpConnDlgStruct,
NETPLACES_WIZARD_MAPDRIVE,
lpConnDlgStruct->dwFlags & CONNDLG_RO_PATH);
//
// this should never happen, but just in case, we
// make sure we never pass internal errors out
//
if ( err >= IDS_UI_BASE )
{
err = ERROR_UNEXP_NET_ERR ;
}
return err;
}
/*******************************************************************
NAME: MPRUI_WNetDisconnectDialog1Help
SYNOPSIS:
ENTRY: lpDiscDlgStruct -
EXIT:
RETURNS:
NOTES:
HISTORY:
BruceFo 19-May-1995 Created
********************************************************************/
DWORD
MPRUI_WNetDisconnectDialog1Help(
HWND hwndOwner,
LPWSTR lpLocalName,
LPWSTR lpRemoteName,
DWORD dwFlags
)
{
AUTO_CURSOR cursHourGlass ;
OWNINGWND wndOwner( hwndOwner ) ;
DWORD dwCancelFlags = ((dwFlags & DISC_UPDATE_PROFILE) != 0) ? CONNECT_UPDATE_PROFILE : 0;
WCHAR* pszName = IS_EMPTY_STRING(lpLocalName) ? lpRemoteName : lpLocalName;
DWORD status = WNetCancelConnection2(pszName, dwCancelFlags, FALSE);
if (status != WN_SUCCESS)
{
// If the caller did not provide the remote name, go and get it.
// This enables the best error message to be produced (assuming
// that it is not the case that both the connection to the server
// has gone down and the provider does not keep the remote name
// locally).
WCHAR szRemoteName[MAX_NET_PATH] ;
ALIAS_STR nlsRemoteName(lpRemoteName ? lpRemoteName : L"");
ALIAS_STR nlsLocalName(lpLocalName ? lpLocalName : L"");
DWORD err = WN_SUCCESS;
if (!IS_EMPTY_STRING(lpLocalName) &&
IS_EMPTY_STRING(lpRemoteName)
)
{
DWORD dwBufferSize = MAX_NET_PATH;
err = WNetGetConnection(lpLocalName, szRemoteName, &dwBufferSize);
if ( (err != WN_SUCCESS) && (err != WN_CONNECTION_CLOSED) )
{
// error!
}
else
{
nlsRemoteName = szRemoteName;
}
}
if ( (err == WN_SUCCESS) || (err == WN_CONNECTION_CLOSED) )
{
if ( (status == WN_OPEN_FILES) ||
(status == WN_DEVICE_IN_USE) )
{
if ((dwFlags & DISC_NO_FORCE ) == 0)
{
// There are open files on this connection - ask user whether
// he REALLY wants to destroy it - then apply force.
switch ( MsgPopup(
wndOwner,
IDS_OPENFILES_WITH_NAME_WARNING,
MPSEV_WARNING,
MP_YESNO,
nlsLocalName,
nlsRemoteName ))
{
case IDYES:
status = WNetCancelConnection2(pszName, dwCancelFlags, TRUE);
break ;
case IDNO:
status = WN_CANCEL;
break ;
}
}
}
}
}
if ( (status != WN_SUCCESS) && (status != WN_CANCEL) )
{
MsgPopup( wndOwner, (MSGID) status );
}
return status;
}