Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
6.8 KiB

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
connperf.cxx
Abstract:
Contains the entry points for the WinNet Resource Info API supported
by the Multi-Provider Router. The following functions are in this file:
MultinetGetConnectionPerformanceW
Author:
Anirudh Sahni (anirudhs) 22-Jan-1996
Environment:
User Mode -Win32
Notes:
Revision History:
22-Jan-1996 anirudhs
Created
05-May-1999 jschwart
Make provider addition/removal dynamic
--*/
//
// INCLUDES
//
#include "precomp.hxx"
//===================================================================
// CGetConnection
//
// This class retrieves the remote name and provider responsible for
// a redirected device.
// CODEWORK: This can/should replace MprGetConnection if we can be
// sure that the error picking logic is equivalent. Code needs to be
// added to handle remembered connections.
//===================================================================
class CGetConnection : public CRoutedOperation
{
public:
CGetConnection(
LPWSTR lpLocalName, // IN
LPWSTR lpRemoteName, // OUT
LPDWORD lpBufferSize, // IN OUT
LPWSTR lpProviderName // IN OPTIONAL
) :
CRoutedOperation(DBGPARM("GetConnection")
PROVIDERFUNC(GetConnection)),
_lpLocalName (lpLocalName),
_lpRemoteName (lpRemoteName),
_lpBufferSize (lpBufferSize),
_lpProviderName (lpProviderName)
{ }
PROVIDER * LastProvider() const // expose the base class' method
{ return (CRoutedOperation::LastProvider()); }
private:
LPWSTR _lpLocalName;
LPWSTR _lpRemoteName;
LPDWORD _lpBufferSize;
LPWSTR _lpProviderName;
DECLARE_CROUTED
};
DWORD
CGetConnection::ValidateRoutedParameters(
LPCWSTR * ppProviderName,
LPCWSTR * ppRemoteName,
LPCWSTR * ppLocalName
)
{
if (MprDeviceType(_lpLocalName) != REDIR_DEVICE)
{
return WN_BAD_LOCALNAME;
}
//
// Let the base class validate the provider name, if one was supplied
//
*ppProviderName = _lpProviderName;
*ppLocalName = _lpLocalName;
return WN_SUCCESS;
}
DWORD
CGetConnection::TestProvider(
const PROVIDER * pProvider
)
{
ASSERT_INITIALIZED(NETWORK);
return pProvider->GetConnection(_lpLocalName, _lpRemoteName, _lpBufferSize);
}
//===================================================================
// MultinetGetConnectionPerformanceW
//===================================================================
class CGetConnectionPerformance : public CRoutedOperation
{
public:
CGetConnectionPerformance(
LPNETRESOURCEW lpNetResource,
LPNETCONNECTINFOSTRUCT lpNetConnectInfo
) :
CRoutedOperation(DBGPARM("GetConnectionPerformance")
PROVIDERFUNC(GetConnectionPerformance)),
_lpNetResource (lpNetResource),
_lpNetConnectInfo(lpNetConnectInfo)
{ }
private:
LPNETRESOURCEW _lpNetResource;
LPNETCONNECTINFOSTRUCT _lpNetConnectInfo;
LPWSTR _pRemoteName;
WCHAR _wszBuffer[MAX_PATH+1];
DECLARE_CROUTED
};
DWORD
CGetConnectionPerformance::ValidateRoutedParameters(
LPCWSTR * ppProviderName,
LPCWSTR * ppRemoteName,
LPCWSTR * ppLocalName
)
{
if (!(ARGUMENT_PRESENT(_lpNetResource) &&
ARGUMENT_PRESENT(_lpNetConnectInfo)))
{
return WN_BAD_POINTER;
}
if (_lpNetConnectInfo->cbStructure < sizeof(NETCONNECTINFOSTRUCT))
{
return WN_BAD_VALUE;
}
//
// Zero out the output structure, except for the first field.
//
memset((&_lpNetConnectInfo->cbStructure) + 1,
0,
sizeof(*_lpNetConnectInfo) - sizeof(_lpNetConnectInfo->cbStructure));
if (IS_EMPTY_STRING(_lpNetResource->lpLocalName))
{
//
// No local name is specified, so a remote name should be specified.
//
_pRemoteName = _lpNetResource->lpRemoteName;
if (IS_EMPTY_STRING(_pRemoteName))
{
return WN_BAD_NETNAME;
}
// Let the base class validate the provider name, if specified.
*ppProviderName = _lpNetResource->lpProvider;
}
else
{
//
// A local name is specified. Try to identify the remote name,
// and, as a side effect, the provider that made the connection.
//
DWORD cchBuffer = LENGTH(_wszBuffer);
CGetConnection GetConn(_lpNetResource->lpLocalName,
_wszBuffer,
&cchBuffer,
_lpNetResource->lpProvider);
DWORD status = GetConn.Perform(FALSE);
if (status != WN_SUCCESS)
{
ASSERT(status != WN_MORE_DATA);
return status;
}
_pRemoteName = _wszBuffer;
// A somewhat roundabout way of telling the base class the real provider
*ppProviderName = GetConn.LastProvider()->Resource.lpProvider;
}
// Have the base class cache the remote name (again). Note that
// the local name, if present, was checked by CGetConnection
*ppRemoteName = _pRemoteName;
*ppLocalName = NULL;
return WN_SUCCESS;
}
DWORD
CGetConnectionPerformance::TestProvider(
const PROVIDER * pProvider
)
{
ASSERT_INITIALIZED(NETWORK);
//
// CODEWORK -- We should try to resolve the local name here
// per connection and if it succeeds, then call
// the provider's GetConnectionPerformance. We
// could then remove the use of CGetConnection
// from ValidateRoutedParameters.
//
return (pProvider->GetConnectionPerformance(
_pRemoteName,
_lpNetConnectInfo));
}
DWORD
MultinetGetConnectionPerformanceW(
LPNETRESOURCEW lpNetResource,
LPNETCONNECTINFOSTRUCT lpNetConnectInfo
)
/*++
Routine Description:
This API returns information about the expected performance of a
connection used to access a network resource.
Arguments:
lpNetResource -
lpNetConnectInfo -
Return Value:
WN_SUCCESS - Indicates the operation was successful.
Other errors -
--*/
{
CGetConnectionPerformance GetConnPerf(lpNetResource, lpNetConnectInfo);
return (GetConnPerf.Perform(TRUE));
}