|
|
// t3testDlg.cpp : implementation file
//
#include "stdafx.h"
#include <control.h> // for IVideoWindow
#include "t3test.h"
#include "t3testD.h"
#include "calldlg.h"
#include "callnot.h"
#include "uuids.h"
#include "autoans.h"
#include "confdlg.h"
#include "ilsdlg.h"
#include "rate.h"
#ifdef _DEBUG
#ifndef _WIN64 // mfc 4.2's heap debugging features generate warnings on win64
#define new DEBUG_NEW
#endif
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
ITTAPI * gpTapi; IConnectionPoint * gpCP; HWND ghAddressesWnd; HWND ghTerminalsWnd; HWND ghMediaTypesWnd; HWND ghCallsWnd; HWND ghPhonesWnd; HWND ghSelectedCallsWnd; HWND ghSelectedWnd; HWND ghCreatedWnd; HWND ghClassesWnd; HWND ghListenWnd; HTREEITEM ghAddressesRoot; HTREEITEM ghTerminalsRoot; HTREEITEM ghMediaTypesRoot; HTREEITEM ghCallsRoot; HTREEITEM ghPhonesRoot; HTREEITEM ghSelectedCallsRoot; HTREEITEM ghSelectedRoot; HTREEITEM ghCreatedRoot; HTREEITEM ghClassesRoot; HTREEITEM ghListenRoot;
#ifdef ENABLE_DIGIT_DETECTION_STUFF
CDigitDetectionNotification * gpDigitNotification; #endif // ENABLE_DIGIT_DETECTION_STUFF
long gulAdvise; BOOL gbUpdatingStuff = FALSE; BOOL gfShuttingDown = FALSE;
DataPtrList gDataPtrList; extern CT3testApp theApp;
const BSTR TAPIMEDIATYPE_String_Audio = L"{028ED8C2-DC7A-11D0-8ED3-00C04FB6809F}"; const BSTR TAPIMEDIATYPE_String_Video = L"{028ED8C4-DC7A-11D0-8ED3-00C04FB6809F}";
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog { public: CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected: //{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CT3testDlg dialog
CT3testDlg::CT3testDlg(CWnd* pParent /*=NULL*/) : CDialog(CT3testDlg::IDD, pParent) { //{{AFX_DATA_INIT(CT3testDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CT3testDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CT3testDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CT3testDlg, CDialog) //{{AFX_MSG_MAP(CT3testDlg)
ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_DESTROY() ON_NOTIFY(TVN_SELCHANGED, IDC_ADDRESSES, OnSelchangedAddresses) ON_BN_CLICKED(IDC_ADDTERMINAL, OnAddterminal) ON_BN_CLICKED(IDC_REMOVETERMINAL, OnRemoveterminal) ON_BN_CLICKED(IDC_CREATECALL, OnCreatecall) ON_BN_CLICKED(IDC_CONNECT, OnConnect) ON_BN_CLICKED(IDC_DROP, OnDrop) ON_BN_CLICKED(IDC_ANSWER, OnAnswer) ON_BN_CLICKED(IDC_LISTEN, OnListen) ON_NOTIFY(TVN_SELCHANGED, IDC_CALLS, OnSelchangedCalls) ON_NOTIFY(TVN_SELCHANGED, IDC_PHONES, OnSelchangedPhones) ON_BN_CLICKED(IDC_RELEASE, OnRelease) ON_BN_CLICKED(IDC_CREATE, OnCreateTerminal) ON_BN_CLICKED(IDC_RELEASETERMINAL, OnReleaseterminal) ON_BN_CLICKED(IDC_ADDCREATED, OnAddcreated) ON_BN_CLICKED(IDC_ADDNULL, OnAddnull) ON_BN_CLICKED(IDC_ADDTOLISTEN, OnAddtolisten) ON_BN_CLICKED(IDC_LISTENALL, OnListenall) ON_BN_CLICKED(IDC_CONFIGAUTOANSWER, OnConfigAutoAnswer) ON_BN_CLICKED(IDC_ILS, OnILS) ON_BN_CLICKED(IDC_RATE, OnRate) ON_BN_CLICKED(IDC_OPENPHONE, OnOpenPhone) ON_BN_CLICKED(IDC_CLOSEPHONE, OnClosePhone) ON_BN_CLICKED(IDC_STARTTONE, OnStartTone) ON_BN_CLICKED(IDC_STOPTONE, OnStopTone) ON_BN_CLICKED(IDC_STARTRING, OnStartRing) ON_BN_CLICKED(IDC_STOPRING, OnStopRing) ON_BN_CLICKED(IDC_BUSYTONE, OnBusyTone) ON_BN_CLICKED(IDC_RINGBACKTONE, OnRingBackTone) ON_BN_CLICKED(IDC_ERRORTONE, OnErrorTone) ON_BN_CLICKED(IDC_PHONEAUTOON, OnPhoneAutoOn) ON_BN_CLICKED(IDC_PHONEAUTOOFF, OnPhoneAutoOff) ON_BN_CLICKED(IDC_PHONESPEAKERONHOOK, OnPhoneSpeakerOnHook) ON_BN_CLICKED(IDC_PHONESPEAKEROFFHOOK, OnPhoneSpeakerOffHook) ON_BN_CLICKED(IDC_SELECTCALL, OnSelectCall) ON_BN_CLICKED(IDC_UNSELECTCALL, OnUnselectCall) ON_NOTIFY(TVN_SELCHANGED, IDC_MEDIATYPES, OnSelchangedMediatypes) ON_NOTIFY(NM_RCLICK, IDC_SELECTEDTERMINALS, OnRclickSelectedterminals)
#ifdef ENABLE_DIGIT_DETECTION_STUFF
ON_COMMAND(ID_GENERATE, OnGenerate) ON_COMMAND(ID_MODESUPPORTED, OnModesSupported) ON_COMMAND(ID_MODESUPPORTED2, OnModesSupported2) ON_COMMAND(ID_STARTDETECT, OnStartDetect) ON_COMMAND(ID_STOPDETECT, OnStopDetect) #endif // ENABLE_DIGIT_DETECTION_STUFF
ON_COMMAND(ID_PARK1, OnPark1) ON_COMMAND(ID_PARK2, OnPark2) ON_COMMAND(ID_HANDOFF1, OnHandoff1) ON_COMMAND(ID_HANDOFF2, OnHandoff2) ON_COMMAND(ID_UNPARK, OnUnpark) ON_COMMAND(ID_PICKUP1, OnPickup1) ON_COMMAND(ID_PICKUP2, OnPickup2)
ON_WM_CLOSE() ON_MESSAGE(WM_USER+101, OnTapiEvent) ON_NOTIFY(NM_RCLICK, IDC_CALLS, OnRclickCalls) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CT3testDlg message handlers
BOOL CT3testDlg::OnInitDialog() { CDialog::OnInitDialog();
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
HRESULT hr;
//
// coinit
//
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); //hr = CoInitialize(NULL);
if (hr != S_OK) { MessageBox(L"CoInitialize failed", MB_OK);
return FALSE; }
//
// create the tapi object
//
hr = CoCreateInstance( CLSID_TAPI, NULL, CLSCTX_INPROC_SERVER, IID_ITTAPI, (LPVOID *)&gpTapi );
if (hr != S_OK) { ::MessageBox(NULL, L"CoCreateInstance on TAPI failed", NULL, MB_OK); return TRUE; }
//
// initialize tapi
//
hr = gpTapi->Initialize();
if (hr != S_OK) { ::MessageBox(NULL, L"TAPI initialize failed", NULL, MB_OK); gpTapi->Release(); return TRUE; }
// Set the Event filter to only give us only the events we process
gpTapi->put_EventFilter(TE_CALLNOTIFICATION | \ TE_CALLSTATE | \ TE_CALLHUB | \ TE_CALLMEDIA | \ TE_TAPIOBJECT | \ TE_ADDRESS | \ TE_PHONEEVENT );
//
// intialize the tree controls
//
InitializeTrees();
//
// intialize the address tree control
//
InitializeAddressTree();
//
// register the main event interface
//
RegisterEventInterface();
//
// register for call notification for
// all addresses for outgoing calls
//
RegisterForCallNotifications(); return TRUE; // return TRUE unless you set the focus to a control
}
void CT3testDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CT3testDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CT3testDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }
void CT3testDlg::OnFinalRelease() { // TODO: Add your specialized code here and/or call the base class
CDialog::OnFinalRelease(); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// SelectFirstItem
//
// selects the first item under the hroot node in hwnd.
// this is used to make sure that something is selected
// in the window at all times.
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::SelectFirstItem( HWND hWnd, HTREEITEM hRoot ) { HTREEITEM hChild;
//
// get the first item
//
hChild = TreeView_GetChild( hWnd, hRoot );
//
// select it
//
TreeView_SelectItem( hWnd, hChild );
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// DeleteSelectedItem
//
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::DeleteSelectedItem( HWND hWnd ) { HTREEITEM hItem;
//
// get current selections
//
hItem = TreeView_GetSelection( hWnd );
//
// delete it
//
TreeView_DeleteItem( hWnd, hItem ); }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// InitializeAddressTree
// initialize the address tree control with
// the address objects
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::InitializeAddressTree() { IEnumAddress * pEnumAddress; ITAddress * pAddress; HTREEITEM hChild; HRESULT hr; long l; DWORD dwCount = 0; //
// get the address enumerator
//
hr = gpTapi->EnumerateAddresses( &pEnumAddress );
if (S_OK != hr) { gpTapi->Release(); gpTapi = NULL;
return; }
//
// go through all the address objects
// and add them to the address treecontrol
//
while (TRUE) { AADATA * pData; hr = pEnumAddress->Next( 1, &pAddress, NULL );
if (S_OK != hr) { break; }
AddAddressToTree( pAddress );
pAddress->Release();
pData = (AADATA *)CoTaskMemAlloc( sizeof ( AADATA ) ); pData->pAddress = pAddress; pData->pTerminalPtrList = new TerminalPtrList; gDataPtrList.push_back( pData );
dwCount++; }
//
// release the enumerator
//
pEnumAddress->Release();
//
// select the first item
//
if (dwCount > 0) { SelectFirstItem( ghAddressesWnd, ghAddressesRoot ); } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// RegisterEventInterface
//
// registers the ITTAPIEventNotification interface
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void CT3testDlg::RegisterEventInterface() { CTAPIEventNotification * pTAPIEventNotification; IConnectionPointContainer * pCPC; IConnectionPoint * pCP; IUnknown * pUnk; //
// create the object
//
pTAPIEventNotification = new CTAPIEventNotification;
//
// get the connectionpointcontainer interface
// from the tapi object
//
gpTapi->QueryInterface( IID_IConnectionPointContainer, (void **) &pCPC );
//
// get the connectionpoint we are
// looking for
//
pCPC->FindConnectionPoint( IID_ITTAPIEventNotification, &gpCP );
pCPC->Release();
pTAPIEventNotification->QueryInterface( IID_IUnknown, (void **)&pUnk );
//
// call the advise method to tell tapi
// about the interface
//
gpCP->Advise( pUnk, (ULONG *)&gulAdvise );
//
// release our reference to
// it
//
pUnk->Release(); }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// RegisterForCallNotifications
//
// registers for call state notifications for all
// addresses for outgoing calls
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::RegisterForCallNotifications() { VARIANT var;
var.vt = VT_ARRAY; var.parray = NULL; gpTapi->SetCallHubTracking(var, VARIANT_TRUE); }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// InitializeTrees
//
// Create and labels the tree controls
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::InitializeTrees() { TV_INSERTSTRUCT tvi;
tvi.hParent = TVI_ROOT; tvi.hInsertAfter = TVI_FIRST; tvi.item.mask = TVIF_TEXT;
//
// address tree
//
tvi.item.pszText = L"Addresses";
ghAddressesWnd = GetDlgItem( IDC_ADDRESSES )->m_hWnd; ghAddressesRoot = TreeView_InsertItem( ghAddressesWnd, &tvi );
//
// mediatypes tree
//
tvi.item.pszText = L"MediaTypes";
ghMediaTypesWnd = GetDlgItem( IDC_MEDIATYPES )->m_hWnd; ghMediaTypesRoot = TreeView_InsertItem( ghMediaTypesWnd, &tvi );
//
// terminals tree
//
tvi.item.pszText = L"Terminals";
ghTerminalsWnd = GetDlgItem( IDC_TERMINALS )->m_hWnd; ghTerminalsRoot = TreeView_InsertItem( ghTerminalsWnd, &tvi );
//
// calls tree
//
tvi.item.pszText = L"Calls"; ghCallsWnd = GetDlgItem( IDC_CALLS )->m_hWnd; ghCallsRoot = TreeView_InsertItem( ghCallsWnd, &tvi );
//
// phones tree
//
tvi.item.pszText = L"Phones";
ghPhonesWnd = GetDlgItem( IDC_PHONES )->m_hWnd; ghPhonesRoot = TreeView_InsertItem( ghPhonesWnd, &tvi );
//
// selected calls tree
//
tvi.item.pszText = L"Selected Calls"; ghSelectedCallsWnd = GetDlgItem( IDC_SELECTEDCALLS )->m_hWnd; ghSelectedCallsRoot = TreeView_InsertItem( ghSelectedCallsWnd, &tvi );
//
// selected media terminals tree
//
tvi.item.pszText = L"Selected Media Terminals"; ghSelectedWnd = GetDlgItem( IDC_SELECTEDTERMINALS )->m_hWnd; ghSelectedRoot = TreeView_InsertItem( ghSelectedWnd, &tvi );
//
// dynamic terminal classes tree
//
tvi.item.pszText = L"Dynamic Terminal Classes"; ghClassesWnd = GetDlgItem( IDC_DYNAMICCLASSES )->m_hWnd; ghClassesRoot = TreeView_InsertItem( ghClassesWnd, &tvi );
//
// created terminals tree
//
tvi.item.pszText = L"Created Terminals"; ghCreatedWnd = GetDlgItem( IDC_CREATEDTERMINALS )->m_hWnd; ghCreatedRoot = TreeView_InsertItem( ghCreatedWnd, &tvi );
//
// listen mediatypes tree
//
tvi.item.pszText = L"Listen MediaTypes"; ghListenWnd = GetDlgItem( IDC_LISTENMEDIAMODES )->m_hWnd; ghListenRoot = TreeView_InsertItem( ghListenWnd, &tvi ); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnDestroy
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnDestroy() { CDialog::OnDestroy();
gfShuttingDown = TRUE;
//
// Release everything
//
ReleaseMediaTypes(); ReleaseTerminals(); ReleaseCalls(); ReleasePhones(); ReleaseSelectedTerminals(); ReleaseSelectedCalls(); ReleaseCreatedTerminals(); ReleaseTerminalClasses(); ReleaseListen(); ReleaseAddresses();
DataPtrList::iterator iter, end;
iter = gDataPtrList.begin(); end = gDataPtrList.end(); for( ; iter != end; iter++ ) { FreeData( *iter );
delete (*iter)->pTerminalPtrList; CoTaskMemFree( *iter ); }
gDataPtrList.clear();
if (NULL != gpCP) { gpCP->Unadvise(gulAdvise); gpCP->Release(); } //
// shutdown TAPI
//
if (NULL != gpTapi) { gpTapi->Shutdown(); gpTapi->Release(); }
}
void DoAddressCapStuff(ITTAPI * pTapi); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnSelChangedAddresses
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnSelchangedAddresses(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; ITAddress * pAddress;
*pResult = 0;
//
// free all the stuff related to
// the address selected. this stuff
// will all be refilled in
//
ReleaseMediaTypes(); ReleaseListen(); ReleaseCalls(); ReleasePhones(); ReleaseSelectedCalls(); ReleaseSelectedTerminals(); ReleaseCreatedTerminals();
//
// get the currently selected address
//
if (!GetAddress( &pAddress )) { return; }
//
// update these trees
//
if ( !gfShuttingDown ) { UpdateMediaTypes( pAddress ); UpdateCalls( pAddress ); UpdatePhones( pAddress ); } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnSelChangedPhones
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnSelchangedPhones(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; ITPhone * pPhone;
*pResult = 0;
//
// free all the stuff related to
// the phone selected. this stuff
// will all be refilled in
//
ReleaseSelectedCalls();
//
// get the currently selected phone
//
if (!GetPhone( &pPhone )) { return; }
//
// update these trees
//
if ( !gfShuttingDown ) { UpdateSelectedCalls( pPhone );
} }
/////////////////////////////////////////////////////////////////
// IsVideoCaptureStream
//
// Returns true if the stream is for video capture
/////////////////////////////////////////////////////////////////
BOOL CT3testDlg::IsVideoCaptureStream( ITStream * pStream ) { TERMINAL_DIRECTION tdStreamDirection; long lStreamMediaType;
if ( FAILED( pStream ->get_Direction(&tdStreamDirection) ) ) { return FALSE; } if ( FAILED( pStream ->get_MediaType(&lStreamMediaType) ) ) { return FALSE; }
return (tdStreamDirection == TD_CAPTURE) && (lStreamMediaType == TAPIMEDIATYPE_VIDEO); }
/////////////////////////////////////////////////////////////////
// EnablePreview
//
// Selects a video render terminal on a video capture stream,
// thereby enabling video preview.
/////////////////////////////////////////////////////////////////
HRESULT CT3testDlg::EnablePreview( ITStream * pStream ) { ITTerminal * pTerminal;
HRESULT hr = GetVideoRenderTerminal(&pTerminal);
if ( SUCCEEDED(hr) ) { hr = pStream->SelectTerminal(pTerminal);
pTerminal->Release(); }
return hr; }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// SelectTerminalOnCall
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
HRESULT CT3testDlg::SelectTerminalOnCall( ITTerminal * pTerminal, ITCallInfo * pCall ) { ITStreamControl * pStreamControl; TERMINAL_DIRECTION termtd; long lTermMediaType; HRESULT hr;
pTerminal->get_Direction( &termtd ); pTerminal->get_MediaType( &lTermMediaType ); hr = pCall->QueryInterface( IID_ITStreamControl, (void**) &pStreamControl );
if ( SUCCEEDED(hr) ) { IEnumStream * pEnumStreams; hr = pStreamControl->EnumerateStreams( &pEnumStreams );
if ( SUCCEEDED(hr) ) { while (TRUE) { ITStream * pStream; long lMediaType; TERMINAL_DIRECTION td; hr = pEnumStreams->Next( 1, &pStream, NULL );
if ( S_OK != hr ) { hr = E_FAIL; // didn't select it anywhere
break; }
pStream->get_MediaType( &lMediaType ); pStream->get_Direction( &td );
if ( ( lMediaType == lTermMediaType ) && ( td == termtd) ) { hr = pStream->SelectTerminal( pTerminal );
if ( FAILED(hr) ) { ::MessageBox(NULL, L"SelectTerminals failed", NULL, MB_OK); } else { //
// Also enable preview on the video capture stream.
//
if ( IsVideoCaptureStream( pStream ) ) { EnablePreview( pStream ); }
pStream->Release(); break; } } pStream->Release(); }
pEnumStreams->Release(); }
pStreamControl->Release(); }
return hr; }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnAddTerminal
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnAddterminal() { ITCallInfo * pCall; ITTerminal * pTerminal; HRESULT hr = S_OK;
//
// get the selected call
//
if (!(GetCall( &pCall ))) { return; }
//
// get the selected terminal
//
if (!(GetTerminal( &pTerminal ))) { return; }
if (S_OK != hr) { ::MessageBox(NULL, L"SelectTerminals failed", NULL, MB_OK); return; } hr = SelectTerminalOnCall(pTerminal, pCall);
if ( FAILED(hr) ) { return; }
//
// put the terminal in the
// tree
//
AddSelectedTerminal( pTerminal ); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// RemovePreview
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::RemovePreview( ITStream * pStream ) { //
// This is a video capture stream and we've unselected the
// video capture terminal. If there is a video render
// terminal on the stream, then unselect it now.
//
IEnumTerminal * pEnum;
if ( FAILED( pStream->EnumerateTerminals( &pEnum ) ) ) { return; }
ITTerminal * pTerminal;
if ( S_OK == pEnum->Next(1, &pTerminal, NULL) ) { pStream->UnselectTerminal( pTerminal ); pTerminal->Release(); }
pEnum->Release(); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnRemoveTerminal
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnRemoveterminal() { ITTerminal * pTerminal; ITCallInfo * pCall; HTREEITEM hItem; HRESULT hr; ITBasicCallControl * pBCC;
//
// get current call
//
if (!GetCall( &pCall )) { return; }
//
// get current terminal
//
if (!GetSelectedTerminal(&pTerminal)) { return; }
TERMINAL_DIRECTION termtd; long lTermMediaType;
pTerminal->get_Direction( &termtd ); pTerminal->get_MediaType( &lTermMediaType );
ITStreamControl * pStreamControl; hr = pCall->QueryInterface( IID_ITStreamControl, (void**) &pStreamControl );
BOOL bFound = FALSE;
if ( SUCCEEDED(hr) ) { IEnumStream * pEnumStreams; hr = pStreamControl->EnumerateStreams( &pEnumStreams );
if ( SUCCEEDED(hr) ) { while ( ! bFound ) { ITStream * pStream; long lMediaType; TERMINAL_DIRECTION td; hr = pEnumStreams->Next( 1, &pStream, NULL );
if ( S_OK != hr ) { break; }
pStream->get_MediaType( &lMediaType ); pStream->get_Direction( &td );
if ( ( lMediaType == lTermMediaType ) && ( td == termtd) ) { hr = pStream->UnselectTerminal( pTerminal );
if ( !SUCCEEDED(hr) ) { ::MessageBox(NULL, L"UnselectTerminals failed", NULL, MB_OK); } else { if ( IsVideoCaptureStream( pStream ) ) { RemovePreview( pStream ); }
bFound = TRUE; }
} pStream->Release(); }
pEnumStreams->Release(); }
pStreamControl->Release(); }
if ( !bFound ) { return; }
//
// remove it from tree
//
hItem = TreeView_GetSelection( ghSelectedWnd ); TreeView_DeleteItem( ghSelectedWnd, hItem );
//
// release tree's reference to
// the terminal
//
pTerminal->Release();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnCreateCall
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnCreatecall() { ITAddress * pAddress; HRESULT hr; ITBasicCallControl * pCall; ITCallInfo * pCallInfo; BOOL bConference = FALSE; BOOL lAddressType = LINEADDRESSTYPE_PHONENUMBER; BSTR bstrDestAddress; ITAddressCapabilities * pAddressCaps; long lType = 0; ITMediaSupport * pMediaSupport; long lSupportedMediaTypes, lMediaTypes = 0; //
// get the current address
//
if (!GetAddress( &pAddress )) { return; }
hr = pAddress->QueryInterface(IID_ITAddressCapabilities, (void**)&pAddressCaps);
hr = pAddressCaps->get_AddressCapability( AC_ADDRESSTYPES, &lType );
if ( SUCCEEDED(hr) && (LINEADDRESSTYPE_SDP & lType) ) { bConference = TRUE; lAddressType = LINEADDRESSTYPE_SDP; }
if ( SUCCEEDED(hr) && (LINEADDRESSTYPE_DOMAINNAME & lType) ) { lAddressType = LINEADDRESSTYPE_DOMAINNAME; }
pAddressCaps->Release(); if ( !bConference ) { //
// create the dialog to get the
// dial string
//
CCreateCallDlg Dlg( this );
if (IDOK == Dlg.DoModal()) { //
// create a call with the
// string input in the dialog
//
bstrDestAddress = SysAllocString( Dlg.m_pszDestAddress ); } else { return; } } else { CConfDlg Dlg;
if ( IDOK == Dlg.DoModal() ) { bstrDestAddress = Dlg.m_bstrDestAddress; } else { return; } }
//
// Find out if the address supports audio, video, or both.
//
pAddress->QueryInterface( IID_ITMediaSupport, (void**)&pMediaSupport );
pMediaSupport->get_MediaTypes( &lSupportedMediaTypes ); pMediaSupport->Release();
if ( lSupportedMediaTypes & TAPIMEDIATYPE_AUDIO ) { lMediaTypes |= TAPIMEDIATYPE_AUDIO; }
if ( lSupportedMediaTypes & TAPIMEDIATYPE_VIDEO ) { lMediaTypes |= TAPIMEDIATYPE_VIDEO; }
if ( lMediaTypes == 0 ) { if ( lSupportedMediaTypes & TAPIMEDIATYPE_DATAMODEM ) { lMediaTypes |= TAPIMEDIATYPE_DATAMODEM; } }
//
// Create the call.
//
hr = pAddress->CreateCall( bstrDestAddress, lAddressType, lMediaTypes, &pCall );
SysFreeString( bstrDestAddress );
if (S_OK != hr) { ::MessageBox(NULL, L"CreateCall failed", NULL, MB_OK); return; }
//
// get the callinfo interface
//
pCall->QueryInterface( IID_ITCallInfo, (void **)&pCallInfo );
//
// add the call to the tree
//
AddCall(pCallInfo);
//
// update the callinfo
//
UpdateCall( pCallInfo );
//
// release this inteface
//
pCallInfo->Release();
//
// note that we keep a global reference to the call
// (CreateCall returns with a reference count of 1)
// so the call does not get destroyed. When we want
// the call to actually be destroyed, then we
// release twice.
//
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnOpenPhone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnOpenPhone() { ITPhone * pPhone; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// call connect
//
hr = pPhone->Open( PP_OWNER );
if (S_OK != hr) { ::MessageBox(NULL, L"Open failed", NULL, MB_OK); return; }
UpdatePhone( pPhone ); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnClosePhone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnClosePhone() { ITPhone * pPhone; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// call connect
//
hr = pPhone->Close();
if (S_OK != hr) { ::MessageBox(NULL, L"Close failed", NULL, MB_OK); return; } UpdatePhone( pPhone ); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnStartTone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnStartTone() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StartTone(PT_NORMALDIALTONE, 5000);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StartTone failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnBusyTone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnBusyTone() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StartTone(PT_BUSY, 10000);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StartTone failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnRingBackTone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnRingBackTone() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StartTone(PT_RINGBACK, 10000);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StartTone failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnErrorTone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnErrorTone() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StartTone(PT_ERRORTONE, 10000);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StartTone failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnStopTone
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnStopTone() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StopTone();
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StopTone failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnSelectCall
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnSelectCall() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; ITCallInfo * pCall; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the current call
//
if (!GetCall( &pCall )) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
hr = pPhoneControl->SelectCall( pCall, VARIANT_TRUE );
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"OnSelectCall failed", NULL, MB_OK); return; }
//
// put the call in the
// tree
//
AddSelectedCall( pCall );
//
// add the selected terminals to the tree
//
ITTerminal * pTerminal; IEnumTerminal * pEnum; ITAddress * pAddress;
if (!GetAddress( &pAddress )) { return; }
if ( FAILED( pPhone->EnumerateTerminals( pAddress, &pEnum ) ) ) { return; }
while ( S_OK == pEnum->Next(1, &pTerminal, NULL) ) { AddSelectedTerminal( pTerminal ); pTerminal->Release(); }
pEnum->Release(); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnUnselectCall
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnUnselectCall() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; ITCallInfo * pCall; HRESULT hr = S_OK; HTREEITEM hItem;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the selected call
//
if (!GetSelectedCall( &pCall )) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
hr = pPhoneControl->UnselectCall( pCall );
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"OnUnselectCall failed", NULL, MB_OK); return; }
//
// remove it from tree
//
hItem = TreeView_GetSelection( ghSelectedCallsWnd ); TreeView_DeleteItem( ghSelectedCallsWnd, hItem );
//
// release tree's reference to
// the terminal
//
pCall->Release(); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnPhoneAutoOn
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnPhoneAutoOn() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
hr = pPhoneControl->put_PhoneHandlingEnabled(VARIANT_TRUE);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"OnPhoneAutoOn failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnPhoneAutoOff
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnPhoneAutoOff() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
hr = pPhoneControl->put_PhoneHandlingEnabled(VARIANT_FALSE);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"OnPhoneAutoOff failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnPhoneSpeakerOnHook
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnPhoneSpeakerOnHook() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
hr = pPhone->put_HookSwitchState( PHSD_SPEAKERPHONE, PHSS_ONHOOK );
if (S_OK != hr) { ::MessageBox(NULL, L"OnPhoneSpeakerOnHook failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnPhoneSpeakerOffHook
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnPhoneSpeakerOffHook() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
hr = pPhone->put_HookSwitchState( PHSD_SPEAKERPHONE, PHSS_OFFHOOK );
if (S_OK != hr) { ::MessageBox(NULL, L"OnPhoneSpeakerOffHook failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnStartRing
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnStartRing() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StartRinger(0, 0);
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StartRing failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnStopRing
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnStopRing() { ITPhone * pPhone; ITAutomatedPhoneControl * pPhoneControl; HRESULT hr = S_OK;
//
// get the current phone
//
if (!GetPhone( &pPhone)) { return; }
//
// get the automated phone control interface
//
hr = pPhone->QueryInterface(IID_ITAutomatedPhoneControl, (void **)&pPhoneControl);
if (S_OK != hr) { ::MessageBox(NULL, L"QueryInterface failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pPhoneControl->StopRinger();
pPhoneControl->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"StopRing failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnConnect
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnConnect() { ITBasicCallControl * pCall; ITCallInfo * pCallInfo; HRESULT hr = S_OK;
//
// get the current call
//
if (!GetCall( &pCallInfo)) { return; }
//
// get the call control interface
//
hr = pCallInfo->QueryInterface(IID_ITBasicCallControl, (void **)&pCall); if (S_OK != hr) { ::MessageBox(NULL, L"Connect failed", NULL, MB_OK); return; }
//
// call connect
//
hr = pCall->Connect( FALSE );
//
// release this interface
//
pCall->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"Connect failed", NULL, MB_OK); return; } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnDrop
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnDrop() { ITBasicCallControl * pCall; ITCallInfo * pCallInfo; HRESULT hr = S_OK;
//
// get the current call
//
if (!GetCall( &pCallInfo )) { return; }
//
// get the bcc interface
//
hr = pCallInfo->QueryInterface( IID_ITBasicCallControl, (void **)&pCall );
if (S_OK != hr) { ::MessageBox(NULL, L"Disconnect failed", NULL, MB_OK); return; }
//
// call disconnect
//
hr = pCall->Disconnect( DC_NORMAL );
//
// release this reference
//
pCall->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"Disconnect failed", NULL, MB_OK); } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnDrop
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnAnswer() { ITCallInfo * pCallInfo; ITBasicCallControl * pCall; HRESULT hr = S_OK;
//
// get the current call
//
if (!GetCall( &pCallInfo)) { return; }
//
// get the bcc interface
//
hr = pCallInfo->QueryInterface(IID_ITBasicCallControl, (void **)&pCall); if (S_OK != hr) { ::MessageBox(NULL, L"Answer failed", NULL, MB_OK); return; }
//
// answer it
//
hr = pCall->Answer( );
//
// release this interface
//
pCall->Release();
if (S_OK != hr) { ::MessageBox(NULL, L"Answer failed", NULL, MB_OK); } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnListen
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnListen() { ITAddress * pAddress; HRESULT hr = S_OK; DWORD dwCookie; HTREEITEM hItem; long ulRegister; DWORD dwMediaMode = 0;
//
// get the current address
//
if (!GetAddress( &pAddress )) { return; }
hItem = TreeView_GetChild( ghListenWnd, ghListenRoot );
while (NULL != hItem) { TV_ITEM item;
item.mask = TVIF_HANDLE | TVIF_PARAM; item.hItem = hItem;
//
// get it
//
TreeView_GetItem( ghListenWnd, &item );
dwMediaMode |= (DWORD)(item.lParam);
hItem = TreeView_GetNextSibling( ghAddressesWnd, hItem );
}
hr = gpTapi->RegisterCallNotifications( pAddress, VARIANT_TRUE, VARIANT_TRUE, (long)dwMediaMode, gulAdvise, &ulRegister );
if (S_OK != hr) { ::MessageBox(NULL, L"RegisterCallNotifications failed", NULL, MB_OK); }
//
// release all the mediatypes
// in the listen tree
//
ReleaseListen(); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnSelChangedCalls
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnSelchangedCalls(NMHDR* pNMHDR, LRESULT* pResult) { }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnRelease()
//
// this is called to release all references to a call
//
// if a call is selected it has two references - once for
// the tree control, and once for our global reference.
// release both here.
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnRelease() { ITCallInfo * pCallInfo;
//
// get the call
//
if (!GetCall( &pCallInfo )) { return; }
//
// these depend on the call,
// so release them
//
ReleaseSelectedTerminals(); ReleaseCreatedTerminals();
//
// delete it from the tree
//
DeleteSelectedItem( ghCallsWnd );
//
// release once for the tree view
//
pCallInfo->Release();
//
// release a second time for our global reference
//
pCallInfo->Release();
}
void CT3testDlg::HelpCreateTerminal( ITTerminalSupport * pTerminalSupport, BSTR bstrClass, long lMediaType, TERMINAL_DIRECTION dir ) { ITTerminal * pTerminal; HRESULT hr; //
// create it
//
hr = pTerminalSupport->CreateTerminal( bstrClass, lMediaType, dir, &pTerminal );
if (S_OK != hr) { return; }
//
// ZoltanS:
// We do nothing special with our video windows. Just make them visible
// all the time. If this isn't a video window we just skip this step.
//
IVideoWindow * pWindow;
if ( SUCCEEDED( pTerminal->QueryInterface(IID_IVideoWindow, (void **) &pWindow) ) ) { pWindow->put_AutoShow( VARIANT_TRUE );
pWindow->Release(); }
//
// add the terminal
//
AddCreatedTerminal( pTerminal );
//
// release our reference
//
pTerminal->Release(); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// GetVideoRenderTerminal
//
// this is used to create a video render terminal for preview
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
HRESULT CT3testDlg::GetVideoRenderTerminal(ITTerminal ** ppTerminal) { //
// Get the current address
//
ITAddress * pAddress;
if (!GetAddress( &pAddress )) { return E_FAIL; }
//
// get the terminal support interface
//
ITTerminalSupport * pTerminalSupport; HRESULT hr;
hr = pAddress->QueryInterface( IID_ITTerminalSupport, (void **) &pTerminalSupport );
if ( FAILED(hr) ) { return hr; }
//
// Construct a BSTR for the correct IID.
//
LPOLESTR lpTerminalClass;
hr = StringFromIID(CLSID_VideoWindowTerm, &lpTerminalClass);
BSTR bstrTerminalClass;
if ( FAILED(hr) ) { pTerminalSupport->Release(); return hr; }
bstrTerminalClass = SysAllocString ( lpTerminalClass );
CoTaskMemFree( lpTerminalClass );
if ( bstrTerminalClass == NULL ) { pTerminalSupport->Release(); return E_OUTOFMEMORY; } //
// create it
//
hr = pTerminalSupport->CreateTerminal( bstrTerminalClass, TAPIMEDIATYPE_VIDEO, TD_RENDER, ppTerminal );
pTerminalSupport->Release();
if ( FAILED(hr) ) { *ppTerminal = NULL; return hr; }
//
// We do nothing special with our video windows. Just make them visible
// all the time.
//
IVideoWindow * pWindow;
if ( FAILED( (*ppTerminal)->QueryInterface(IID_IVideoWindow, (void **) &pWindow) ) ) { (*ppTerminal)->Release(); *ppTerminal = NULL;
return hr; }
pWindow->put_AutoShow( VARIANT_TRUE );
pWindow->Release();
return S_OK; }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnCreateTerminal
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnCreateTerminal() { //
// Get the selected media type.
//
long lMediaType;
if (!GetMediaType( &lMediaType )) { return; }
//
// Get the current address
//
ITAddress * pAddress;
if (!GetAddress( &pAddress )) { return; }
//
// Get the selected terminal class.
//
BSTR bstrClass;
if (!GetTerminalClass( &bstrClass )) { return; }
//
// get the terminal support interface
//
ITTerminalSupport * pTerminalSupport; HRESULT hr;
hr = pAddress->QueryInterface( IID_ITTerminalSupport, (void **) &pTerminalSupport );
if ( FAILED(hr) ) { SysFreeString( bstrClass ); return; }
//
// Convert the terminal class from a BSTR to an IID.
//
IID iidTerminalClass;
IIDFromString( bstrClass, &iidTerminalClass );
//
// Create and add the terminal.
//
if ( CLSID_VideoWindowTerm == iidTerminalClass ) { HelpCreateTerminal( pTerminalSupport, bstrClass, lMediaType, TD_RENDER ); }
//
// Release references.
//
pTerminalSupport->Release();
SysFreeString(bstrClass); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnReleaseTerminal
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnReleaseterminal() { ITTerminal * pTerminal;
//
// get the terminal
//
if (GetCreatedTerminal( &pTerminal )) { //
// and release it!
//
pTerminal->Release();
//
// delete it from the tree
//
DeleteSelectedItem( ghCreatedWnd ); } }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnAddCreated
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnAddcreated() { ITTerminal * pTerminal; ITCallInfo * pCall; HRESULT hr = S_OK; ITBasicCallControl * pBCC;
//
// get the current call
//
if (!(GetCall( &pCall ))) { return; }
//
// GetCreatedTerminal
//
if (!GetCreatedTerminal( &pTerminal )) { return; }
//
// Select the terminal on the call.
//
hr = SelectTerminalOnCall(pTerminal, pCall);
if ( FAILED(hr) ) { ::MessageBox(NULL, L"SelectTerminals failed", NULL, MB_OK); return; }
//
// add to the selected window
//
AddSelectedTerminal( pTerminal );
//
// delete from the created window
//
DeleteSelectedItem( ghCreatedWnd );
//
// release because there was a reference to
// this terminal in the created wnd
//
pTerminal->Release(); return; }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnAddNull
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnAddnull() { return; }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnAddToListen
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnAddtolisten() { long lMediaType;
//
// get the current mediatype
//
if (!GetMediaType( &lMediaType )) { return; }
//
// add it
//
AddListen( lMediaType ); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnListenAll
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnListenall() { ITAddress * pAddress; HRESULT hr = S_OK; long ulRegister; long lMediaType; ITMediaSupport * pMediaSupport; //
// get the currently selected address
//
if (!GetAddress( &pAddress )) { return; }
pAddress->QueryInterface( IID_ITMediaSupport, (void **)&pMediaSupport ); pMediaSupport->get_MediaTypes( &lMediaType ); //
// register
//
gpTapi->RegisterCallNotifications( pAddress, TRUE, TRUE, lMediaType, gulAdvise, &ulRegister );
if (S_OK != hr) { ::MessageBox(NULL, L"RegisterCallTypes failed", NULL, MB_OK); }
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// OnSelChangedMedia
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
void CT3testDlg::OnSelchangedMediatypes(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; long lMediaType; ITAddress * pAddress; HRESULT hr;
*pResult = 0;
if (gbUpdatingStuff) return;
//
// get the current mediatype
//
if (!GetMediaType( &lMediaType )) { return; }
//
// get the current address
//
if (!GetAddress( &pAddress )) { return; }
//
// we only show terminals that relate
// to the selected mediatype
// so get rid of the old ones
//
ReleaseTerminals(); ReleaseTerminalClasses();
UpdateTerminals( pAddress, lMediaType ); UpdateTerminalClasses( pAddress, lMediaType ); }
void CT3testDlg::OnRclickSelectedterminals(NMHDR* pNMHDR, LRESULT* pResult) { POINT pt; HTREEITEM hItem; TV_HITTESTINFO hittestinfo; RECT rc;
*pResult = 0;
//
// get the location of the cursor
//
GetCursorPos( &pt );
//
// get the control's window
//
::GetWindowRect( ghSelectedWnd, &rc );
//
// adjust the point to
// the child's coords
//
hittestinfo.pt.x = pt.x - rc.left; hittestinfo.pt.y = pt.y - rc.top;
//
// hittest to get the tree view item
//
hItem = TreeView_HitTest( ghSelectedWnd, &hittestinfo );
//
// only display a menu if the mouse is actually
// over the item (TVHT_ONITEM)
//
if (hItem == NULL || (!(hittestinfo.flags & TVHT_ONITEM)) ) { return; }
//
// select that item (right clicking will not select
// by default
//
TreeView_Select( ghSelectedWnd, hItem, TVGN_CARET );
CreateSelectedTerminalMenu( pt, m_hWnd ); }
#ifdef ENABLE_DIGIT_DETECTION_STUFF
void CT3testDlg::OnModesSupported() { ITTerminal * pTerminal; ITDigitGenerationTerminal * pDigitGeneration; HRESULT hr = S_OK; LONG lDigits;
if (!GetSelectedTerminal(&pTerminal)) { return; }
hr = pTerminal->QueryInterface( IID_ITDigitGenerationTerminal, (void **) &pDigitGeneration );
if (!SUCCEEDED(hr)) { return; }
pDigitGeneration->get_ModesSupported( &lDigits );
pDigitGeneration->Release(); }
void CT3testDlg::OnGenerate() { ITTerminal * pTerminal; ITDigitGenerationTerminal * pDigitGeneration; HRESULT hr = S_OK;
if (!GetSelectedTerminal(&pTerminal)) { return; }
hr = pTerminal->QueryInterface( IID_ITDigitGenerationTerminal, (void **) &pDigitGeneration );
if (!SUCCEEDED(hr)) { return; }
hr = pDigitGeneration->Generate( L"12345", LINEDIGITMODE_DTMF );
pDigitGeneration->Release(); }
void CT3testDlg::OnModesSupported2() { ITTerminal * pTerminal; ITDigitDetectionTerminal * pDigitDetection; HRESULT hr = S_OK; LONG lDigits;
if (!GetSelectedTerminal(&pTerminal)) { return; }
hr = pTerminal->QueryInterface( IID_ITDigitDetectionTerminal, (void **) &pDigitDetection );
if (!SUCCEEDED(hr)) { return; }
pDigitDetection->get_ModesSupported( &lDigits );
pDigitDetection->Release(); }
void CT3testDlg::OnStartDetect() { ITTerminal * pTerminal; ITDigitDetectionTerminal * pDigitDetection; HRESULT hr = S_OK; LONG lDigits; ULONG ulAdvise; IConnectionPointContainer * pCPC; IConnectionPoint * pCP; if (!GetSelectedTerminal(&pTerminal)) { return; }
hr = pTerminal->QueryInterface( IID_ITDigitDetectionTerminal, (void **) &pDigitDetection );
if (!SUCCEEDED(hr)) { return; }
hr = pTerminal->QueryInterface( IID_IConnectionPointContainer, (void **)&pCPC );
if (!SUCCEEDED(hr)) { pDigitDetection->Release(); return; }
gpDigitNotification = new CDigitDetectionNotification; hr = pCPC->FindConnectionPoint( IID_ITDigitDetectionNotification, &pCP );
pCPC->Release();
IUnknown * pUnk; gpDigitNotification->QueryInterface( IID_IUnknown, (void**)&pUnk ); hr = pCP->Advise( pUnk, &ulAdvise );
pUnk->Release(); pCP->Release(); pDigitDetection->StartDetect(LINEDIGITMODE_DTMF);
pDigitDetection->Release(); }
void CT3testDlg::OnStopDetect() { ITTerminal * pTerminal; ITDigitDetectionTerminal * pDigitDetection; HRESULT hr = S_OK; LONG lDigits;
if (!GetSelectedTerminal(&pTerminal)) { return; }
hr = pTerminal->QueryInterface( IID_ITDigitDetectionTerminal, (void **) &pDigitDetection );
if (!SUCCEEDED(hr)) { return; }
pDigitDetection->StopDetect();
pDigitDetection->Release(); }
#endif // ENABLE_DIGIT_DETECTION_STUFF
void CT3testDlg::OnRclickCalls(NMHDR* pNMHDR, LRESULT* pResult) { POINT pt; HTREEITEM hItem; TV_HITTESTINFO hittestinfo; RECT rc;
*pResult = 0;
//
// get the location of the cursor
//
GetCursorPos( &pt );
//
// get the control's window
//
::GetWindowRect( ghCallsWnd, &rc );
//
// adjust the point to
// the child's coords
//
hittestinfo.pt.x = pt.x - rc.left; hittestinfo.pt.y = pt.y - rc.top;
//
// hittest to get the tree view item
//
hItem = TreeView_HitTest( ghCallsWnd, &hittestinfo );
//
// only display a menu if the mouse is actually
// over the item (TVHT_ONITEM)
//
if (hItem == NULL || (!(hittestinfo.flags & TVHT_ONITEM)) ) { return; }
//
// select that item (right clicking will not select
// by default
//
TreeView_Select( ghCallsWnd, hItem, TVGN_CARET );
}
void CT3testDlg::OnConfigAutoAnswer() { ITAddress * pAddress; autoans dlg; DataPtrList::iterator dataiter, dataend; if (!GetAddress( &pAddress ) ) { return; }
dataiter = gDataPtrList.begin(); dataend = gDataPtrList.end();
for ( ; dataiter != dataend; dataiter++ ) { if ( pAddress == (*dataiter)->pAddress ) { break; } }
if ( dataiter == dataend ) { return; }
FreeData( (*dataiter) ); if (IDOK == dlg.DoModal()) { TerminalPtrList::iterator iter, end; DWORD dwCount; long lRegister; HRESULT hr; long lMediaType = 0; dwCount = dlg.m_TerminalPtrList.size();
if ( 0 == dwCount ) { return; } iter = dlg.m_TerminalPtrList.begin(); end = dlg.m_TerminalPtrList.end(); for ( ; iter != end ; iter++ ) { long l; (*dataiter)->pTerminalPtrList->push_back( *iter );
if ( NULL != (*iter) ) { (*iter)->get_MediaType( &l ); lMediaType |= l; } else { lMediaType |= (long)LINEMEDIAMODE_VIDEO; }
}
//
// call register call types
//
hr = gpTapi->RegisterCallNotifications( pAddress, VARIANT_FALSE, VARIANT_TRUE, lMediaType, 0, &lRegister );
}
} void CT3testDlg::FreeData( AADATA * pData ) { TerminalPtrList::iterator iter, end;
iter = pData->pTerminalPtrList->begin(); end = pData->pTerminalPtrList->end();
for ( ; iter != end; iter++ ) { if ( NULL != (*iter) ) { (*iter)->Release(); } }
pData->pTerminalPtrList->clear(); }
void CT3testDlg::OnClose() { CDialog::OnClose(); }
void CT3testDlg::OnILS() { CILSDlg dlg;
if (IDOK == dlg.DoModal()) { } }
void CT3testDlg::OnRate() { CRateDlg dlg; ITCallInfo * pCallInfo;
if ( !GetCall( &pCallInfo ) ) { return; }
if (IDOK == dlg.DoModal() ) { pCallInfo->put_CallInfoLong(CIL_MINRATE, dlg.m_dwMinRate ); pCallInfo->put_CallInfoLong(CIL_MAXRATE, dlg.m_dwMaxRate ); } }
void CT3testDlg::OnPark1() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr; //
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void**)&pBCC ); hr = pBCC->ParkDirect( L"101"); pBCC->Release();
} void CT3testDlg::OnPark2() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr; BSTR pAddress;
//
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void **)&pBCC );
hr = pBCC->ParkIndirect( &pAddress );
SysFreeString( pAddress );
pBCC->Release();
} void CT3testDlg::OnHandoff1() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr;
//
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void **)&pBCC );
pBCC->HandoffDirect( L"tb20.exe" );
pBCC->Release(); } void CT3testDlg::OnHandoff2() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr;
//
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void **)&pBCC );
pBCC->HandoffIndirect( TAPIMEDIATYPE_AUDIO );
pBCC->Release();
} void CT3testDlg::OnUnpark() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr;
//
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void **)&pBCC );
pBCC->Unpark();
pBCC->Release(); } void CT3testDlg::OnPickup1() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr;
//
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void **)&pBCC );
pBCC->Pickup( NULL );
pBCC->Release(); } void CT3testDlg::OnPickup2() { ITCallInfo * pCall; ITBasicCallControl * pBCC; HRESULT hr;
//
// get the call in question
//
if (!GetCall( &pCall )) { return; }
pCall->QueryInterface( IID_ITBasicCallControl, (void **)&pBCC );
}
|