476 lines
10 KiB
C++
476 lines
10 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();
|
|
|
|
}
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
|
|
//
|
|
// 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::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();
|
|
|
|
}
|