windows-nt/Source/XPSP1/NT/net/tapi/skywalker/apps/t3testph/updates.cpp
2020-09-26 16:20:57 +08:00

710 lines
15 KiB
C++

#include "stdafx.h"
#include "t3test.h"
#include "t3testD.h"
#include "calldlg.h"
#include "callnot.h"
#include "externs.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// UpdateMediaTypes
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::UpdateMediaTypes(
ITAddress * pAddress
)
{
long lMediaType;
ITMediaSupport * pMediaSupport;
HRESULT hr;
//
// get the media support interface
//
pAddress->QueryInterface(
IID_ITMediaSupport,
(void **)&pMediaSupport
);
//
// get the mediatype enumerator
//
pMediaSupport->get_MediaTypes(&lMediaType);
//
// release the interface
//
pMediaSupport->Release();
gbUpdatingStuff = TRUE;
//
// go through the supported mediatypes
//
DWORD dwMediaType = 1;
DWORD dwHold = (DWORD)lMediaType;
while (dwMediaType)
{
if ( dwMediaType & dwHold )
{
AddMediaType( (long) dwMediaType );
}
dwMediaType <<=1;
}
gbUpdatingStuff = FALSE;
//
// select the first
// media type
//
SelectFirstItem(
ghMediaTypesWnd,
ghMediaTypesRoot
);
//
// release and redo terminals
//
ReleaseTerminals();
ReleaseTerminalClasses();
if ( GetMediaType( &lMediaType ) )
{
UpdateTerminals( pAddress, lMediaType );
UpdateTerminalClasses( pAddress, lMediaType );
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// UpdateCalls
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::UpdateCalls(
ITAddress * pAddress
)
{
IEnumCall * pEnumCall;
HRESULT hr;
ITCallInfo * pCallInfo;
//
// enumerate the current calls
//
pAddress->EnumerateCalls( &pEnumCall );
//
// go through the list
// and add the calls to the tree
//
while (TRUE)
{
hr = pEnumCall->Next( 1, &pCallInfo, NULL);
if (S_OK != hr)
{
break;
}
AddCall(pCallInfo);
UpdateCall( pCallInfo );
//
// release this reference
//
pCallInfo->Release();
}
pEnumCall->Release();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// UpdateSelectedCalls
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::UpdateSelectedCalls(
ITPhone * pPhone
)
{
IEnumCall * pEnumCall;
HRESULT hr;
ITCallInfo * pCallInfo;
ITAutomatedPhoneControl * pPhoneControl;
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr)
{
return;
}
//
// enumerate the current calls
//
pPhoneControl->EnumerateSelectedCalls( &pEnumCall );
pPhoneControl->Release();
//
// go through the list
// and add the calls to the tree
//
while (TRUE)
{
hr = pEnumCall->Next( 1, &pCallInfo, NULL);
if (S_OK != hr)
{
break;
}
AddSelectedCall(pCallInfo);
//
// release this reference
//
pCallInfo->Release();
}
pEnumCall->Release();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// UpdateCall
//
// check the call's state and privelege, and update the call
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::UpdateCall( ITCallInfo * pCall )
{
HTREEITEM hItem, hParent;
TV_ITEM item;
CALL_PRIVILEGE cp;
CALL_STATE cs;
TV_INSERTSTRUCT tvi;
//
// get the first call
//
item.mask = TVIF_HANDLE | TVIF_PARAM;
hItem = TreeView_GetChild(
ghCallsWnd,
ghCallsRoot
);
//
// go through all the calls
// and look for the one that matches
// the one passed in
//
while (NULL != hItem)
{
item.hItem = hItem;
TreeView_GetItem(
ghCallsWnd,
&item
);
if ( item.lParam == (LPARAM)pCall )
{
break;
}
hItem = TreeView_GetNextSibling(
ghCallsWnd,
hItem
);
}
//
// did we find it?
//
if (NULL == hItem)
{
return;
}
hParent = hItem;
//
// delete the current children of the call
// node (these are the old privelege and state
//
hItem = TreeView_GetChild(
ghCallsWnd,
hItem
);
while (NULL != hItem)
{
HTREEITEM hNewItem;
hNewItem = TreeView_GetNextSibling(
ghCallsWnd,
hItem
);
TreeView_DeleteItem(
ghCallsWnd,
hItem
);
hItem = hNewItem;
}
tvi.hInsertAfter = TVI_LAST;
//
// get the current privilege
//
tvi.item.pszText = GetCallPrivilegeName( pCall );
//
// add it as a child of the
// call node
//
tvi.hParent = hParent;
tvi.item.mask = TVIF_TEXT;
TreeView_InsertItem(
ghCallsWnd,
&tvi
);
SysFreeString( tvi.item.pszText );
//
// get the current callstate
//
tvi.item.pszText = GetCallStateName( pCall );
//
// add it as a child of the call
// node
//
tvi.hParent = hParent;
tvi.item.mask = TVIF_TEXT;
TreeView_InsertItem(
ghCallsWnd,
&tvi
);
SysFreeString( tvi.item.pszText );
}
void CT3testDlg::UpdatePhones(
ITAddress * pAddress
)
{
ITAddress2 * pAddress2;
IEnumPhone * pEnumPhones;
HRESULT hr;
ITPhone * pPhone;
//
// get the address2 interface
//
hr = pAddress->QueryInterface(
IID_ITAddress2,
(void **) &pAddress2
);
if ( !SUCCEEDED(hr) )
{
return;
}
//
// enumerate the phones
//
pAddress2->EnumeratePhones( &pEnumPhones );
//
// go through the phones
//
while (TRUE)
{
hr = pEnumPhones->Next( 1, &pPhone, NULL);
if (S_OK != hr)
{
break;
}
AddPhone(pPhone);
UpdatePhone(pPhone);
//
// release
//
pPhone->Release();
}
//
// release enumerator
//
pEnumPhones->Release();
//
// release
//
pAddress2->Release();
//
// select
//
SelectFirstItem(
ghPhonesWnd,
ghPhonesRoot
);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// UpdatePhone
//
// check the call's state and privelege, and update the call
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::UpdatePhone( ITPhone * pPhone )
{
HTREEITEM hItem, hParent;
TV_ITEM item;
PHONE_PRIVILEGE pp;
TV_INSERTSTRUCT tvi;
//
// get the first phone
//
item.mask = TVIF_HANDLE | TVIF_PARAM;
hItem = TreeView_GetChild(
ghPhonesWnd,
ghPhonesRoot
);
//
// go through all the phones
// and look for the one that matches
// the one passed in
//
while (NULL != hItem)
{
item.hItem = hItem;
TreeView_GetItem(
ghPhonesWnd,
&item
);
if ( item.lParam == (LPARAM)pPhone )
{
break;
}
hItem = TreeView_GetNextSibling(
ghPhonesWnd,
hItem
);
}
//
// did we find it?
//
if (NULL == hItem)
{
return;
}
hParent = hItem;
//
// delete the current children of the phone
// node (these are the old privelege)
//
hItem = TreeView_GetChild(
ghPhonesWnd,
hItem
);
while (NULL != hItem)
{
HTREEITEM hNewItem;
hNewItem = TreeView_GetNextSibling(
ghPhonesWnd,
hItem
);
TreeView_DeleteItem(
ghPhonesWnd,
hItem
);
hItem = hNewItem;
}
tvi.hInsertAfter = TVI_LAST;
//
// get the current privilege
//
if (tvi.item.pszText = GetPhonePrivilegeName( pPhone ))
{
//
// add it as a child of the
// call node
//
tvi.hParent = hParent;
tvi.item.mask = TVIF_TEXT;
TreeView_InsertItem(
ghPhonesWnd,
&tvi
);
SysFreeString( tvi.item.pszText );
}
}
void CT3testDlg::UpdateTerminals(
ITAddress * pAddress,
long lMediaType
)
{
ITTerminalSupport * pTerminalSupport;
IEnumTerminal * pEnumTerminals;
HRESULT hr;
ITTerminal * pTerminal;
//
// get the terminalsupport interface
//
hr = pAddress->QueryInterface(
IID_ITTerminalSupport,
(void **) &pTerminalSupport
);
if ( !SUCCEEDED(hr) )
{
return;
}
//
// enumerate the terminals
//
pTerminalSupport->EnumerateStaticTerminals( &pEnumTerminals );
//
// go through the terminals
//
while (TRUE)
{
VARIANT_BOOL bSupport;
BSTR bstr;
long l;
hr = pEnumTerminals->Next( 1, &pTerminal, NULL);
if (S_OK != hr)
{
break;
}
//
// get the name
//
hr = pTerminal->get_Name( &bstr );
//
// if it's a unimodem or a direct sound
// device don't show it, cause they bother
// me
//
if (wcsstr( bstr, L"Voice Modem" ) || wcsstr( bstr, L"ds:" ) )
{
pTerminal->Release();
SysFreeString( bstr );
continue;
}
//
// free the name
//
SysFreeString( bstr );
//
// get the mediatype of the terminal
//
pTerminal->get_MediaType( &l );
//
// if it's the same as the selected mediatype
// show it
//
if ( l == lMediaType )
{
AddTerminal(pTerminal);
}
//
// release
//
pTerminal->Release();
}
//
// release enumerator
//
pEnumTerminals->Release();
//
// release
//
pTerminalSupport->Release();
//
// select
//
SelectFirstItem(
ghTerminalsWnd,
ghTerminalsRoot
);
}
void CT3testDlg::UpdateTerminalClasses(
ITAddress * pAddress,
long lMediaType
)
{
IEnumTerminalClass * pEnumTerminalClasses;
HRESULT hr;
ITTerminalSupport * pTerminalSupport;
hr = pAddress->QueryInterface(
IID_ITTerminalSupport,
(void **)&pTerminalSupport
);
if (!SUCCEEDED(hr))
{
return;
}
//
// now enum dymnamic
//
hr = pTerminalSupport->EnumerateDynamicTerminalClasses( &pEnumTerminalClasses );
if (S_OK == hr)
{
//
// go through all the classes
//
while (TRUE)
{
GUID * pDynTerminalClass = new GUID;
hr = pEnumTerminalClasses->Next(
1,
pDynTerminalClass,
NULL
);
if (S_OK != hr)
{
delete pDynTerminalClass;
break;
}
//
// manually match up mediatype and
// class
//
if ( (lMediaType == (long)LINEMEDIAMODE_VIDEO) &&
(*pDynTerminalClass == CLSID_VideoWindowTerm) )
{
AddTerminalClass(
pDynTerminalClass
);
}
#ifdef ENABLE_DIGIT_DETECTION_STUFF
else if ( (lMediaType == (long)LINEMEDIAMODE_AUTOMATEDVOICE) &&
( *pDynTerminalClass == CLSID_DigitTerminal ) )
{
AddTerminalClass(
pDynTerminalClass
);
}
else if ( ((lMediaType == (long)LINEMEDIAMODE_DATAMODEM) ||
(lMediaType == (long)LINEMEDIAMODE_G3FAX)) &&
(*pDynTerminalClass == CLSID_DataTerminal) )
{
AddTerminalClass( pDynTerminalClass );
}
#endif // ENABLE_DIGIT_DETECTION_STUFF
else
{
delete pDynTerminalClass;
}
}
//
// release enumerator
//
pEnumTerminalClasses->Release();
}
//
// release this interface
//
pTerminalSupport->Release();
}