|
|
/**********************************************************************/ /** 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; }
|