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.
 
 
 
 
 
 

379 lines
6.8 KiB

/*++
Copyright (c) 1998 - 2000 Microsoft Corporation
Module Name:
cblist.cpp
Abstract:
Definitions of methods for CALL_BRIDGE_LIST container.
Revision History:
1. 31-Jul-1998 -- File creation Ajay Chitturi (ajaych)
2. 15-Jul-1999 -- Arlie Davis (arlied)
3. 14-Feb-2000 -- Added method to remove call Ilya Kleyman (ilyak)
bridges by connected interface
--*/
#include "stdafx.h"
CALL_BRIDGE_LIST CallBridgeList;
CALL_BRIDGE_LIST::CALL_BRIDGE_LIST (
void
)
/*++
Routine Description:
Constructor for CALL_BRIDGE_LIST class
Arguments:
None
Return Values:
None
Notes:
--*/
{
IsEnabled = FALSE;
} // CALL_BRIDGE_LIST::CALL_BRIDGE_LIST
CALL_BRIDGE_LIST::~CALL_BRIDGE_LIST (
void
)
/*++
Routine Description:
Destructor for CALL_BRIDGE_LIST class
Arguments:
None
Return Values:
None
Notes:
--*/
{
assert (!IsEnabled);
assert (CallArray.Length == 0);
CallArray.Free();
} // CALL_BRIDGE_LIST::~CALL_BRIDGE_LIST
void
CALL_BRIDGE_LIST::Start (
void
)
/*++
Routine Description:
Activates the container
Arguments:
None
Return Values:
None
Notes:
--*/
{
Lock();
IsEnabled = TRUE;
Unlock();
} // CALL_BRIDGE_LIST::Start
void
CALL_BRIDGE_LIST::Stop (
void
)
/*++
Routine Description:
Deactivates the container. Terminates and removes
all contained items.
Arguments:
None
Return Values:
None
Notes:
--*/
{
CALL_BRIDGE * CallBridge;
Lock ();
IsEnabled = FALSE;
while (CallArray.GetLength()) {
CallBridge = CallArray [0].CallBridge;
CallBridge -> AddRef ();
Unlock();
CallBridge -> TerminateExternal();
Lock();
CallBridge -> Release ();
}
CallArray.Free();
Unlock();
} // CALL_BRIDGE_LIST::Stop
HRESULT
CALL_BRIDGE_LIST::InsertCallBridge (
IN CALL_BRIDGE * CallBridge
)
/*++
Routine Description:
Insert an item into the container
Arguments:
CallBridge -- item to be inserted
Return Values:
S_OK - if insertion was successful
E_OUTOFMEMORY - if insertion failed due to the lack of memory
E_FAIL - if insertion failed because the container was not enabled
E_ABORT - if insertion failed because maximum number of concurrent
H.323 connections is exceeded
Notes:
--*/
{
CALL_BRIDGE_ENTRY * Entry;
HRESULT Result;
DWORD Index;
Lock();
if (IsEnabled) {
if (CallArray.Length <= MAX_NUM_CALL_BRIDGES) {
if (CallArray.BinarySearch ((SEARCH_FUNC_CALL_BRIDGE_ENTRY)CALL_BRIDGE_LIST::BinarySearchFunc,
CallBridge, &Index)) {
DebugF (_T("H323: 0x%x already exists in CallBridgeList.\n"), CallBridge);
Result = S_OK;
}
else {
Entry = CallArray.AllocAtPos (Index);
if (Entry) {
Entry -> CallBridge = CallBridge;
Entry -> CallBridge -> AddRef();
Result = S_OK;
}
else {
DebugF (_T("H323: 0x%x allocation failure when inserting in CallBridgeList.\n"), CallBridge);
Result = E_OUTOFMEMORY;
}
}
} else {
return E_ABORT;
}
} else {
Result = E_FAIL;
}
Unlock();
return Result;
} // CALL_BRIDGE_LIST::InsertCallBridge
HRESULT
CALL_BRIDGE_LIST::RemoveCallBridge (
IN CALL_BRIDGE * CallBridge
)
/*++
Routine Description:
Removes an entry from the container
Arguments:
CallBridge - item to removed
Return Values:
S_OK - if removal was successful
S_FALSE - if removal failed because the entry
was not in the container
Notes:
--*/
{
DWORD Index;
HRESULT Result;
Lock();
if (CallArray.BinarySearch ((SEARCH_FUNC_CALL_BRIDGE_ENTRY)CALL_BRIDGE_LIST::BinarySearchFunc,
CallBridge, &Index)) {
CallArray.DeleteAtPos (Index);
Result = S_OK;
}
else {
DebugF (_T("H323: 0x%x could not be removed from the array because it is not there.\n"), CallBridge);
Result = S_FALSE;
}
Unlock();
if (Result == S_OK)
CallBridge -> Release ();
return Result;
} // CALL_BRIDGE_LIST::RemoveCallBridge
void
CALL_BRIDGE_LIST::OnInterfaceShutdown (
IN DWORD InterfaceAddress // host order
)
/*++
Routine Description:
Searches through the list of CALL_BRIDGES, and terminates
all of them that proxy a connection through the interface specified.
Arguments:
InterfaceAddress - address of the interface, H.323 connections
through which are to be terminated.
Return Values:
Notes:
--*/
{
DWORD ArrayIndex = 0;
CALL_BRIDGE* CallBridge;
CALL_BRIDGE** CallBridgeHolder;
DYNAMIC_ARRAY <CALL_BRIDGE*> TempArray;
Lock ();
while (ArrayIndex < CallArray.GetLength()) {
CallBridge = CallArray[ArrayIndex].CallBridge;
if (CallBridge -> IsConnectionThrough (InterfaceAddress))
{
DebugF (_T("Q931: 0x%x terminating (killing all connections through %08X).\n"),
CallBridge, InterfaceAddress);
CallBridgeHolder = TempArray.AllocAtEnd ();
if (NULL == CallBridgeHolder) {
Debug (_T("CALL_BRIDGE_LIST::OnInterfaceShutdown - unable to grow array.\n"));
} else {
CallBridge -> AddRef ();
*CallBridgeHolder = CallBridge;
}
}
ArrayIndex++;
}
Unlock ();
ArrayIndex = 0;
while (ArrayIndex < TempArray.GetLength ()) {
CallBridge = TempArray[ArrayIndex];
CallBridge -> OnInterfaceShutdown ();
CallBridge -> Release ();
ArrayIndex++;
}
} // CALL_BRIDGE_LIST::OnInterfaceShutdown
// static
INT
CALL_BRIDGE_LIST::BinarySearchFunc (
IN const CALL_BRIDGE * SearchKey,
IN const CALL_BRIDGE_ENTRY * Comparand
)
/*++
Routine Description:
Compares an entry with a key. Used by a binary search
procedure.
Arguments:
SearchKey - self-explanatory
Comparand - self-explanatory
Return Values:
1 if SearchKey is considered greater than Comparand
-1 if SearchKey is considered less than Comparand
0 if SearchKey is considered equal to Comparand
Notes:
Static method
--*/
{
const CALL_BRIDGE * ComparandA;
const CALL_BRIDGE * ComparandB;
ComparandA = SearchKey;
ComparandB = Comparand -> CallBridge;
if (ComparandA < ComparandB) return -1;
if (ComparandA > ComparandB) return 1;
return 0;
} // CALL_BRIDGE_LIST::BinarySearchFunc