You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
592 lines
12 KiB
592 lines
12 KiB
// autoans.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "t3test.h"
|
|
#include "t3testd.h"
|
|
#include "autoans.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
|
|
extern DataPtrList gDataPtrList;
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// autoans dialog
|
|
|
|
|
|
autoans::autoans(CWnd* pParent /*=NULL*/)
|
|
: CDialog(autoans::IDD, pParent)
|
|
{
|
|
CT3testDlg::GetAddress( &m_pAddress );
|
|
|
|
}
|
|
|
|
|
|
void autoans::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(autoans)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BOOL autoans::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
PopulateListBox();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(autoans, CDialog)
|
|
//{{AFX_MSG_MAP(autoans)
|
|
ON_BN_CLICKED(IDC_TERMINALADD, OnTerminalAdd)
|
|
ON_BN_CLICKED(IDC_TERMINALREMOVE, OnTerminalRemove)
|
|
ON_WM_CLOSE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// autoans message handlers
|
|
|
|
void autoans::OnTerminalAdd()
|
|
{
|
|
LONG i;
|
|
ITTerminal * pTerminal;
|
|
|
|
i = SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETCURSEL,
|
|
0,
|
|
0
|
|
);
|
|
|
|
if ( i == LB_ERR )
|
|
{
|
|
return;
|
|
}
|
|
|
|
pTerminal = (ITTerminal *) SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_DELETESTRING,
|
|
i,
|
|
0
|
|
);
|
|
|
|
AddTerminalToListBox( pTerminal, TRUE );
|
|
}
|
|
else
|
|
{
|
|
AddDynamicTerminalToListBox( TRUE );
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void autoans::OnTerminalRemove()
|
|
{
|
|
LONG i;
|
|
ITTerminal * pTerminal;
|
|
|
|
i = SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETCURSEL,
|
|
0,
|
|
0
|
|
);
|
|
|
|
if ( i == LB_ERR )
|
|
{
|
|
return;
|
|
}
|
|
|
|
pTerminal = (ITTerminal *) SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_DELETESTRING,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
AddTerminalToListBox( pTerminal, FALSE );
|
|
}
|
|
|
|
}
|
|
|
|
void autoans::OnOK()
|
|
{
|
|
LONG i, count;
|
|
|
|
|
|
i = 0;
|
|
|
|
count = SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETCOUNT,
|
|
0,
|
|
0
|
|
);
|
|
|
|
|
|
for( i = 0; i < count; i++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
|
|
pTerminal = (ITTerminal *)SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
AddTerminalToAAList( pTerminal );
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->Release();
|
|
}
|
|
}
|
|
|
|
count = SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETCOUNT,
|
|
0,
|
|
0
|
|
);
|
|
|
|
for ( i = 0; i < count; i++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
pTerminal = (ITTerminal *)SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->Release();
|
|
}
|
|
}
|
|
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
void autoans::OnCancel()
|
|
{
|
|
LONG i, count;
|
|
|
|
|
|
i = 0;
|
|
|
|
count = SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETCOUNT,
|
|
0,
|
|
0
|
|
);
|
|
|
|
|
|
for( i = 0; i < count; i++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
|
|
pTerminal = (ITTerminal *)SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->Release();
|
|
}
|
|
}
|
|
|
|
|
|
count = SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETCOUNT,
|
|
0,
|
|
0
|
|
);
|
|
|
|
for ( i = 0; i < count; i++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
pTerminal = (ITTerminal *)SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->Release();
|
|
}
|
|
}
|
|
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void autoans::PopulateListBox()
|
|
{
|
|
ITTerminalSupport * pTerminalSupport;
|
|
IEnumTerminal * pEnumTerminal;
|
|
IEnumTerminalClass * pEnumClasses;
|
|
HRESULT hr;
|
|
|
|
if ( NULL == m_pAddress )
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_pAddress->QueryInterface(
|
|
IID_ITTerminalSupport,
|
|
(void **) &pTerminalSupport
|
|
);
|
|
|
|
pTerminalSupport->EnumerateStaticTerminals( &pEnumTerminal );
|
|
|
|
while (TRUE)
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
hr = pEnumTerminal->Next(
|
|
1,
|
|
&pTerminal,
|
|
NULL
|
|
);
|
|
|
|
if ( S_OK != hr )
|
|
{
|
|
break;
|
|
}
|
|
|
|
AddTerminalToListBox( pTerminal, FALSE );
|
|
|
|
// pTerminal->Release();
|
|
}
|
|
|
|
pEnumTerminal->Release();
|
|
|
|
pTerminalSupport->EnumerateDynamicTerminalClasses( &pEnumClasses );
|
|
|
|
while (TRUE)
|
|
{
|
|
GUID guid;
|
|
|
|
hr = pEnumClasses->Next(
|
|
1,
|
|
&guid,
|
|
NULL
|
|
);
|
|
|
|
if ( S_OK != hr )
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ( guid == CLSID_VideoWindowTerm )
|
|
{
|
|
AddDynamicTerminalToListBox( FALSE );
|
|
}
|
|
|
|
}
|
|
|
|
pEnumClasses->Release();
|
|
|
|
pTerminalSupport->Release();
|
|
}
|
|
|
|
void
|
|
autoans::AddTerminalToListBox( ITTerminal * pTerminal, BOOL bSelected )
|
|
{
|
|
HRESULT hr;
|
|
LONG i;
|
|
DWORD dwLB;
|
|
BSTR bstrName;
|
|
WCHAR szBuffer[256];
|
|
TERMINAL_DIRECTION td;
|
|
|
|
dwLB = (bSelected ? IDC_SELECTED : IDC_NOTSELECTED);
|
|
|
|
hr = pTerminal->get_Name( &bstrName );
|
|
pTerminal->get_Direction( &td );
|
|
|
|
if ( td == TD_RENDER )
|
|
{
|
|
wsprintfW(szBuffer, L"%s [Playback]", bstrName);
|
|
}
|
|
else
|
|
{
|
|
wsprintfW(szBuffer, L"%s [Record]", bstrName);
|
|
}
|
|
|
|
i = SendDlgItemMessage(
|
|
dwLB,
|
|
LB_ADDSTRING,
|
|
0,
|
|
(LPARAM)szBuffer
|
|
);
|
|
|
|
SysFreeString( bstrName );
|
|
|
|
SendDlgItemMessage(
|
|
dwLB,
|
|
LB_SETITEMDATA,
|
|
(WPARAM) i,
|
|
(LPARAM) pTerminal
|
|
);
|
|
|
|
}
|
|
|
|
void
|
|
autoans::AddDynamicTerminalToListBox( BOOL bSelected )
|
|
{
|
|
LONG i;
|
|
DWORD dwLB;
|
|
|
|
dwLB = (bSelected ? IDC_SELECTED : IDC_NOTSELECTED);
|
|
|
|
|
|
i = SendDlgItemMessage(
|
|
dwLB,
|
|
LB_ADDSTRING,
|
|
0,
|
|
(LPARAM)L"Video Window"
|
|
);
|
|
|
|
SendDlgItemMessage(
|
|
dwLB,
|
|
LB_SETITEMDATA,
|
|
(WPARAM) i,
|
|
(LPARAM) 0
|
|
);
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
void autoans::AddTerminalToAAList( ITTerminal * pTerminal )
|
|
{
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->AddRef();
|
|
}
|
|
|
|
m_TerminalPtrList.push_back( pTerminal );
|
|
}
|
|
|
|
|
|
void autoans::OnClose()
|
|
{
|
|
LONG i, count;
|
|
|
|
|
|
i = 0;
|
|
|
|
count = SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETCOUNT,
|
|
0,
|
|
0
|
|
);
|
|
|
|
|
|
for( i = 0; i < count; i++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
|
|
pTerminal = (ITTerminal *)SendDlgItemMessage(
|
|
IDC_SELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->Release();
|
|
}
|
|
}
|
|
|
|
|
|
count = SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETCOUNT,
|
|
0,
|
|
0
|
|
);
|
|
|
|
for ( i = 0; i < count; i++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
pTerminal = (ITTerminal *)SendDlgItemMessage(
|
|
IDC_NOTSELECTED,
|
|
LB_GETITEMDATA,
|
|
i,
|
|
0
|
|
);
|
|
|
|
if ( NULL != pTerminal )
|
|
{
|
|
pTerminal->Release();
|
|
}
|
|
}
|
|
|
|
CDialog::OnClose();
|
|
|
|
}
|
|
|
|
void
|
|
CT3testDlg::DoAutoAnswer(
|
|
ITCallInfo * pCall
|
|
)
|
|
{
|
|
ITAddress * pAddress;
|
|
ITBasicCallControl * pBCC;
|
|
HRESULT hr;
|
|
DataPtrList::iterator iter,end;
|
|
TerminalPtrList::iterator terminaliter, terminalend;
|
|
DWORD dwSize;
|
|
ITTerminalSupport * pTerminalSupport;
|
|
BSTR bstrTerminalClass;
|
|
PWSTR pwstr;
|
|
|
|
|
|
StringFromIID(CLSID_VideoWindowTerm,&pwstr);
|
|
bstrTerminalClass = SysAllocString( pwstr );
|
|
CoTaskMemFree( pwstr );
|
|
|
|
hr = pCall->get_Address( &pAddress );
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
hr = pAddress->QueryInterface(
|
|
IID_ITTerminalSupport,
|
|
(void **) &pTerminalSupport
|
|
);
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
pAddress->Release();
|
|
return;
|
|
}
|
|
|
|
hr = pCall->QueryInterface(
|
|
IID_ITBasicCallControl,
|
|
(void **)&pBCC
|
|
);
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
pTerminalSupport->Release();
|
|
pAddress->Release();
|
|
return;
|
|
}
|
|
|
|
iter = gDataPtrList.begin();
|
|
end = gDataPtrList.end();
|
|
|
|
for ( ; iter != end ; iter++ )
|
|
{
|
|
if ( (*iter)->pAddress == pAddress )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
pAddress->Release();
|
|
|
|
if ( iter == end )
|
|
{
|
|
pBCC->Release();
|
|
pTerminalSupport->Release();
|
|
return;
|
|
}
|
|
|
|
dwSize = (*iter)->pTerminalPtrList->size();
|
|
|
|
if ( 0 == dwSize )
|
|
{
|
|
pTerminalSupport->Release();
|
|
pBCC->Release();
|
|
return ;
|
|
}
|
|
|
|
terminaliter = (*iter)->pTerminalPtrList->begin();
|
|
terminalend = (*iter)->pTerminalPtrList->end();
|
|
|
|
for( ; terminaliter != terminalend ; terminaliter++ )
|
|
{
|
|
ITTerminal * pTerminal;
|
|
|
|
if ( NULL == (*terminaliter) )
|
|
{
|
|
hr = pTerminalSupport->CreateTerminal(
|
|
bstrTerminalClass,
|
|
(long)LINEMEDIAMODE_VIDEO,
|
|
TD_RENDER,
|
|
&pTerminal
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pTerminal = *terminaliter;
|
|
}
|
|
|
|
// hr = pBCC->SelectTerminal( pTerminal );
|
|
|
|
// if ( !SUCCEEDED(hr) )
|
|
// {
|
|
// }
|
|
|
|
}
|
|
|
|
hr = pBCC->Answer();
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
}
|
|
|
|
pBCC->Release();
|
|
pTerminalSupport->Release();
|
|
SysFreeString( bstrTerminalClass );
|
|
}
|