270 lines
6.8 KiB
C++
270 lines
6.8 KiB
C++
|
/*++
|
|||
|
|
|||
|
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));
|
|||
|
}
|
|||
|
|