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

3418 lines
73 KiB
C++

// 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
);
}