144 lines
2.4 KiB
C++
144 lines
2.4 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995-1996 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
Mid.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Implements the CMid class.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Mario Goertzel [MarioGo]
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
MarioGo 12-13-95 Bits 'n pieces
|
|||
|
MarioGo 02-01-96 Move binding handles out of mid
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include<or.hxx>
|
|||
|
|
|||
|
CRITICAL_SECTION gcsMidLock;
|
|||
|
|
|||
|
|
|||
|
RPC_BINDING_HANDLE
|
|||
|
CMid::GetBinding(
|
|||
|
OUT USHORT &index
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Gets an RPC binding handle to the remote machine.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
index - index into the string array contianed within
|
|||
|
this MID structure which can be passed to BindingFailed().
|
|||
|
Maybe modified even on failure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
0 - when no more binding are available.
|
|||
|
|
|||
|
non-zero - A binding to the machine.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PWSTR pwstrT;
|
|||
|
RPC_BINDING_HANDLE hserver;
|
|||
|
|
|||
|
if (IsLocal())
|
|||
|
{
|
|||
|
return(0);
|
|||
|
}
|
|||
|
|
|||
|
CMutexLock lock(&gcsMidLock);
|
|||
|
|
|||
|
// Loop until we get a binding handle or run out of string bindings.
|
|||
|
for (;;)
|
|||
|
{
|
|||
|
pwstrT = &_dsa.aStringArray[_iStringBinding];
|
|||
|
if (*pwstrT == 0)
|
|||
|
{
|
|||
|
// Reached the end of the string bindings; give up..
|
|||
|
_iStringBinding = 0;
|
|||
|
return(0);
|
|||
|
}
|
|||
|
|
|||
|
index = pwstrT - _dsa.aStringArray;
|
|||
|
|
|||
|
lock.Unlock();
|
|||
|
|
|||
|
if (_fDynamic)
|
|||
|
{
|
|||
|
// Create binding without an endpoint.
|
|||
|
hserver = ::GetBinding(pwstrT);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
hserver = GetBindingToOr(pwstrT);
|
|||
|
}
|
|||
|
|
|||
|
if (hserver != 0)
|
|||
|
{
|
|||
|
// index is already correct.
|
|||
|
return(hserver);
|
|||
|
}
|
|||
|
|
|||
|
lock.Lock();
|
|||
|
BindingFailed(index);
|
|||
|
}
|
|||
|
|
|||
|
ASSERT(0);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
CMid::BindingFailed(
|
|||
|
IN USHORT Index
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
What a call on a binding handle associated with an index
|
|||
|
returned from GetBinding() fails this routine must be
|
|||
|
call before the next call to GetBinding() to update
|
|||
|
the internal state.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Index - An index updated by a previous call to GetBinding().
|
|||
|
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
Maybe called with the gcsMidLock already held.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
USHORT newIndex;
|
|||
|
PWSTR pwstrT = &_dsa.aStringArray[Index];
|
|||
|
|
|||
|
pwstrT = OrStringSearch(pwstrT, 0) + 1;
|
|||
|
|
|||
|
newIndex = pwstrT - _dsa.aStringArray;
|
|||
|
|
|||
|
CMutexLock lock(&gcsMidLock);
|
|||
|
|
|||
|
if (newIndex > _iStringBinding)
|
|||
|
{
|
|||
|
_iStringBinding = newIndex;
|
|||
|
}
|
|||
|
}
|
|||
|
|