363 lines
9.7 KiB
C++
363 lines
9.7 KiB
C++
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "t3test.h"
|
||
|
#include "t3testd.h"
|
||
|
#include "callnot.h"
|
||
|
#include "control.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 CWnd * gpmainwnd;
|
||
|
|
||
|
HandleVideoWindowCrap(
|
||
|
ITCallInfo * pCallInfo
|
||
|
);
|
||
|
|
||
|
HRESULT
|
||
|
STDMETHODCALLTYPE
|
||
|
CTAPIEventNotification::Event(
|
||
|
TAPI_EVENT TapiEvent,
|
||
|
IDispatch * pEvent
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
|
||
|
pEvent->AddRef();
|
||
|
|
||
|
hr = PostMessage( gpmainwnd->m_hWnd, WM_USER+101, (WPARAM)TapiEvent, (LPARAM)pEvent );
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
afx_msg LONG CT3testDlg::OnTapiEvent(UINT u, LONG_PTR l)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
TAPI_EVENT TapiEvent;
|
||
|
IDispatch * pEvent;
|
||
|
|
||
|
TapiEvent = (TAPI_EVENT)u;
|
||
|
pEvent = (IDispatch *)l;
|
||
|
|
||
|
switch (TapiEvent)
|
||
|
{
|
||
|
case TE_CALLNOTIFICATION:
|
||
|
{
|
||
|
ITAddress * pAddress;
|
||
|
ITAddress * pCallAddress;
|
||
|
ITCallInfo * pCallInfo;
|
||
|
ITCallNotificationEvent * pCallNotify;
|
||
|
|
||
|
|
||
|
//
|
||
|
// get the currently selected address
|
||
|
//
|
||
|
if (CT3testDlg::GetAddress( &pAddress ))
|
||
|
{
|
||
|
//
|
||
|
// get the event
|
||
|
//
|
||
|
pEvent->QueryInterface(IID_ITCallNotificationEvent, (void **)&pCallNotify );
|
||
|
//
|
||
|
// get the call
|
||
|
//
|
||
|
pCallNotify->get_Call( &pCallInfo );
|
||
|
//
|
||
|
// get the call's event
|
||
|
//
|
||
|
pCallInfo->get_Address( &pCallAddress );
|
||
|
|
||
|
//
|
||
|
// if this call is supposed to be on this
|
||
|
// address, add it to the UI
|
||
|
//
|
||
|
if (pAddress == pCallAddress)
|
||
|
{
|
||
|
// need to add a second reference for
|
||
|
// the tree view
|
||
|
CT3testDlg::AddCall( pCallInfo );
|
||
|
}
|
||
|
|
||
|
CALL_PRIVILEGE cp;
|
||
|
CALL_STATE cs;
|
||
|
|
||
|
pCallInfo->get_Privilege( &cp );
|
||
|
|
||
|
if ( CP_OWNER == cp )
|
||
|
{
|
||
|
DoAutoAnswer( pCallInfo );
|
||
|
}
|
||
|
|
||
|
pCallInfo->get_CallState(&cs);
|
||
|
|
||
|
//
|
||
|
// release our references
|
||
|
// keep refernce to the call or it will
|
||
|
// be destroyed
|
||
|
//
|
||
|
pCallAddress->Release();
|
||
|
pCallNotify->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case TE_CALLSTATE:
|
||
|
{
|
||
|
ITCallStateEvent * pCallStateEvent;
|
||
|
ITCallInfo * pCallInfo;
|
||
|
CALL_STATE cs;
|
||
|
|
||
|
|
||
|
hr = pEvent->QueryInterface(IID_ITCallStateEvent, (void **)&pCallStateEvent);
|
||
|
|
||
|
pCallStateEvent->get_Call( &pCallInfo );
|
||
|
|
||
|
CT3testDlg::UpdateCall( pCallInfo );
|
||
|
|
||
|
pCallStateEvent->get_State(
|
||
|
&cs
|
||
|
);
|
||
|
|
||
|
if (CS_CONNECTED == cs)
|
||
|
{
|
||
|
// HandleVideoWindowCrap( pCallInfo );
|
||
|
}
|
||
|
|
||
|
pCallInfo->Release();
|
||
|
pCallStateEvent->Release();
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case TE_CALLHUB:
|
||
|
{
|
||
|
CT3testDlg::HandleCallHubEvent( pEvent );
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case TE_TAPIOBJECT:
|
||
|
{
|
||
|
CT3testDlg::HandleTapiObjectMessage( pEvent );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case TE_CALLMEDIA:
|
||
|
{
|
||
|
WCHAR * pwstrEvent;
|
||
|
WCHAR * pwstrCause;
|
||
|
|
||
|
ITCallMediaEvent * pCallMediaEvent;
|
||
|
hr = pEvent->QueryInterface( IID_ITCallMediaEvent,
|
||
|
(void **)&pCallMediaEvent );
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
pwstrEvent = pwstrCause = L"can't get event interface";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CALL_MEDIA_EVENT cme;
|
||
|
hr = pCallMediaEvent->get_Event( &cme );
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
pwstrEvent = L"can't get event type";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch ( cme )
|
||
|
{
|
||
|
case CME_NEW_STREAM:
|
||
|
pwstrEvent = L"CME_NEW_STREAM";
|
||
|
break;
|
||
|
|
||
|
case CME_STREAM_FAIL:
|
||
|
pwstrEvent = L"CME_STREAM_FAIL";
|
||
|
break;
|
||
|
|
||
|
case CME_TERMINAL_FAIL:
|
||
|
pwstrEvent = L"CME_TERMINAL_FAIL";
|
||
|
break;
|
||
|
|
||
|
case CME_STREAM_NOT_USED:
|
||
|
pwstrEvent = L"CME_STREAM_NOT_USED";
|
||
|
break;
|
||
|
|
||
|
case CME_STREAM_ACTIVE:
|
||
|
pwstrEvent = L"CME_STREAM_ACTIVE";
|
||
|
break;
|
||
|
|
||
|
case CME_STREAM_INACTIVE:
|
||
|
pwstrEvent = L"CME_STREAM_INACTIVE";
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
pwstrEvent = L"type undefined";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CALL_MEDIA_EVENT_CAUSE cmec;
|
||
|
|
||
|
hr = pCallMediaEvent->get_Cause( &cmec );
|
||
|
|
||
|
pCallMediaEvent->Release();
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
pwstrCause = L"can't get event cause";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch ( cmec )
|
||
|
{
|
||
|
case CMC_UNKNOWN:
|
||
|
pwstrCause = L"CMC_UNKNOWN";
|
||
|
break;
|
||
|
|
||
|
case CMC_BAD_DEVICE:
|
||
|
pwstrCause = L"CMC_BAD_DEVICE";
|
||
|
break;
|
||
|
|
||
|
case CMC_CONNECT_FAIL:
|
||
|
pwstrCause = L"CMC_CONNECT_FAIL";
|
||
|
break;
|
||
|
|
||
|
case CMC_LOCAL_REQUEST:
|
||
|
pwstrCause = L"CMC_LOCAL_REQUEST";
|
||
|
break;
|
||
|
|
||
|
case CMC_REMOTE_REQUEST:
|
||
|
pwstrCause = L"CMC_REMOTE_REQUEST";
|
||
|
break;
|
||
|
|
||
|
case CMC_MEDIA_TIMEOUT:
|
||
|
pwstrCause = L"CMC_MEDIA_TIMEOUT";
|
||
|
break;
|
||
|
|
||
|
case CMC_MEDIA_RECOVERED:
|
||
|
pwstrCause = L"CMC_MEDIA_RECOVERED";
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
pwstrCause = L"cause undefined";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
::MessageBox(NULL, pwstrEvent, pwstrCause, MB_OK);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case TE_ADDRESS:
|
||
|
{
|
||
|
ITAddressEvent * pAddressEvent;
|
||
|
ITTerminal * pTerminal;
|
||
|
ITAddress * pAddress;
|
||
|
LONG lMediaType;
|
||
|
LONG lSelectedMediaType;
|
||
|
BSTR bstrName = NULL;
|
||
|
ADDRESS_EVENT ae;
|
||
|
|
||
|
hr = pEvent->QueryInterface(IID_ITAddressEvent, (void **)&pAddressEvent);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = pAddressEvent->get_Event( &ae );
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = pAddressEvent->get_Terminal( &pTerminal );
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = pTerminal->get_Name( &bstrName );
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
switch(ae)
|
||
|
{
|
||
|
case AE_NEWTERMINAL:
|
||
|
::MessageBox(NULL, bstrName, L"AE_NEWTERMINAL", MB_OK);
|
||
|
break;
|
||
|
|
||
|
case AE_REMOVETERMINAL:
|
||
|
::MessageBox(NULL, bstrName, L"AE_REMOVETERMINAL", MB_OK);
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
SysFreeString( bstrName );
|
||
|
|
||
|
hr = pAddressEvent->get_Address( &pAddress );
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = pTerminal->get_MediaType( &lMediaType );
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (CT3testDlg::GetMediaType( &lSelectedMediaType ) && ( lSelectedMediaType == lMediaType))
|
||
|
{
|
||
|
CT3testDlg::ReleaseTerminals();
|
||
|
CT3testDlg::UpdateTerminals( pAddress, lMediaType );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pAddress->Release();
|
||
|
}
|
||
|
}
|
||
|
pTerminal->Release();
|
||
|
}
|
||
|
}
|
||
|
pAddressEvent->Release();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pEvent->Release();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef ENABLE_DIGIT_DETECTION_STUFF
|
||
|
|
||
|
HRESULT
|
||
|
STDMETHODCALLTYPE
|
||
|
CDigitDetectionNotification::DigitDetected(
|
||
|
unsigned char ucDigit,
|
||
|
TAPI_DIGITMODE DigitMode,
|
||
|
long ulTickCount
|
||
|
)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
#endif // ENABLE_DIGIT_DETECTION_STUFF
|
||
|
|
||
|
|