windows-nt/Source/XPSP1/NT/net/winnet/mprprop.cxx
2020-09-26 16:20:57 +08:00

366 lines
9.4 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1992 **/
/**********************************************************************/
/*
MPRProp.cxx
This file contains the implementation for the
WNetGetPropertyTextW
WNetPropertyDialogW
FILE HISTORY:
05-May-1999 jschwart
Make provider addition/removal dynamic
27-May-1994 danl
WNetGetPropertyTextW & WNetPropertyDialogW: If no provider
claims the connection in question, then we try all providers.
The actual rule is that we need to pass it to the lanman
provider anyway (so it can check for a share). But to play
completely fair, we'll pass it to everyone.
Johnl 07-Jan-1991 Boilerplated from Danl's code
*/
#include "precomp.hxx"
DWORD
WNetGetPropertyTextW (
DWORD iButton,
DWORD nPropSel,
LPTSTR lpszName,
LPTSTR lpszButtonName,
DWORD nButtonNameLength,
DWORD nType
)
/*++
Routine Description:
Arguments:
Return Value:
Note:
--*/
{
DWORD status=WN_SUCCESS;
LPPROVIDER provider;
BOOL fcnSupported = FALSE; // Is fcn supported by a provider?
DWORD providerIndex;
LPDWORD index;
DWORD indexArray[DEFAULT_MAX_PROVIDERS];
DWORD numProviders;
DWORD statusFlag = 0; // used to indicate major error types
DWORD i;
MprCheckProviders();
CProviderSharedLock PLock;
INIT_IF_NECESSARY(NETWORK_LEVEL,status);
index = indexArray;
//
// Find the Provider Index associated with the drive letter in
// the pathname (lpszName).
// NOTE: This function handles exceptions.
//
status = MprFindProviderForPath(lpszName, &providerIndex);
if (status != WN_SUCCESS) {
MPR_LOG1(ERROR,"WNetGetPropertyText: Couldn't find provider for this "
"path. Error = %d\n",status);
//
// Find the list of providers to call for this request.
// Since no provider claimed this path, then
// we need to at least try the lanman provider.
// Actually we'll give them all a chance.
//
status = MprFindCallOrder(
NULL,
&index,
&numProviders,
NETWORK_TYPE);
if (status != WN_SUCCESS) {
return(status);
}
}
else {
numProviders = 1;
index[0] = providerIndex;
}
//
// Loop through the list of providers until one answers the request,
// or the list is exhausted.
//
for (i=0; i<numProviders; i++) {
//
// Call the appropriate provider's API entry point
//
provider = GlobalProviderInfo + index[i];
if (provider->GetPropertyText != NULL) {
fcnSupported = TRUE;
__try {
status = provider->GetPropertyText(
iButton,
nPropSel,
lpszName,
lpszButtonName,
nButtonNameLength,
nType
);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
status = GetExceptionCode();
if (status != EXCEPTION_ACCESS_VIOLATION) {
MPR_LOG(ERROR,"WNetGetPropertyText:Unexpected Exception "
"0x%lx\n",status);
}
status = WN_BAD_POINTER;
}
if (status == WN_NO_NETWORK) {
statusFlag |= NO_NET;
}
else if ((status == WN_NOT_CONNECTED) ||
(status == WN_BAD_LOCALNAME)){
statusFlag |= BAD_NAME;
}
else {
//
// If it wasn't one of those errors, then the provider
// must have accepted responsiblity for the request.
// so we exit and process the results. Note that the
// statusFlag is cleared because we want to ignore other
// error information that we gathered up until now.
//
statusFlag = 0;
break;
}
} // End if this provider supports GetPropertyText.
}
if (fcnSupported == FALSE) {
//
// No providers in the list support the API function. Therefore,
// we assume that no networks are installed.
//
status = WN_NOT_SUPPORTED;
}
//
// If memory was allocated by MprFindCallOrder, free it.
//
if (index != indexArray) {
LocalFree(index);
}
//
// Handle special errors.
//
if (statusFlag == (NO_NET | BAD_NAME)) {
//
// Check to see if there was a mix of special errors that occured.
// If so, pass back the combined error message. Otherwise, let the
// last error returned get passed back.
//
status = WN_NO_NET_OR_BAD_PATH;
}
if (status != WN_SUCCESS){
SetLastError(status);
}
//
// Handle normal errors passed back from the provider
//
return(status);
}
DWORD
WNetPropertyDialogW (
HWND hwndParent,
DWORD iButton,
DWORD nPropSel,
LPTSTR lpszName,
DWORD nType
)
/*++
Routine Description:
Arguments:
Return Value:
Note:
--*/
{
DWORD status=WN_SUCCESS;
LPPROVIDER provider;
BOOL fcnSupported = FALSE; // Is fcn supported by a provider?
DWORD providerIndex;
LPDWORD index;
DWORD indexArray[DEFAULT_MAX_PROVIDERS];
DWORD numProviders;
DWORD statusFlag = 0; // used to indicate major error types
DWORD i;
MprCheckProviders();
CProviderSharedLock PLock;
INIT_IF_NECESSARY(NETWORK_LEVEL,status);
index = indexArray;
//
// Find the Provider Index associated with the drive letter in
// the pathname (lpszName).
// NOTE: This function handles exceptions.
//
status = MprFindProviderForPath(lpszName, &providerIndex);
if (status != WN_SUCCESS) {
MPR_LOG1(ERROR,"WNetPropertyDialog: Couldn't find provider for this "
"path. Error = %d\n",status);
//
// Find the list of providers to call for this request.
// Since no provider claimed this path, then
// we need to at least try the lanman provider.
// Actually we'll give them all a chance.
//
status = MprFindCallOrder(
NULL,
&index,
&numProviders,
NETWORK_TYPE);
if (status != WN_SUCCESS) {
return(status);
}
}
else {
numProviders = 1;
index[0] = providerIndex;
}
//
// Loop through the list of providers until one answers the request,
// or the list is exhausted.
//
for (i=0; i<numProviders; i++) {
//
// Call the appropriate provider's API entry point
//
provider = GlobalProviderInfo + index[i];
if (provider->PropertyDialog != NULL) {
fcnSupported = TRUE;
__try {
status = provider->PropertyDialog(
hwndParent,
iButton,
nPropSel,
lpszName,
nType
);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
status = GetExceptionCode();
if (status != EXCEPTION_ACCESS_VIOLATION) {
MPR_LOG(ERROR,"WNetPropertyDialog:Unexpected Exception "
"0x%lx\n",status);
}
status = WN_BAD_POINTER;
}
if (status == WN_NO_NETWORK) {
statusFlag |= NO_NET;
}
else if ((status == WN_NOT_CONNECTED) ||
(status == WN_BAD_LOCALNAME)){
statusFlag |= BAD_NAME;
}
else {
//
// If it wasn't one of those errors, then the provider
// must have accepted responsiblity for the request.
// so we exit and process the results. Note that the
// statusFlag is cleared because we want to ignore other
// error information that we gathered up until now.
//
statusFlag = 0;
break;
}
} // End if this provider supports PropertyDialog
}
if (fcnSupported == FALSE) {
//
// No providers in the list support the API function. Therefore,
// we assume that no networks are installed.
//
status = WN_NOT_SUPPORTED;
}
//
// If memory was allocated by MprFindCallOrder, free it.
//
if (index != indexArray) {
LocalFree(index);
}
//
// Handle special errors.
//
if (statusFlag == (NO_NET | BAD_NAME)) {
//
// Check to see if there was a mix of special errors that occured.
// If so, pass back the combined error message. Otherwise, let the
// last error returned get passed back.
//
status = WN_NO_NET_OR_BAD_PATH;
}
//
// Handle normal errors passed back from the provider
//
if (status != WN_SUCCESS){
SetLastError(status);
}
return(status);
}