/********************************************************** * MainDialogProc * *----------------* * Description: * Main dialog proc for this sample ***********************************************************/ BOOL CALLBACK MainDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // This is set to be the window long in WM_INITDIALOG COperator *pThis = (COperator *) ::GetWindowLong( hDlg, GWL_USERDATA ); switch (uMsg) { case WM_INITDIALOG: { // Get the pointer to the COperator object from the lParam. // Store it in the window long as user data pThis = (COperator *) lParam; ::SetWindowLong( hDlg, GWL_USERDATA, (LPARAM) pThis ); // Hand the window handle to the event notification object // so that this window will get window messages about incoming calls pThis->m_pTAPIEventNotification->SetHWND( hDlg ); // Get the window handle pThis->m_hDlg = hDlg; // Wait for a call ::EnableWindow( ::GetDlgItem( hDlg, IDC_ANSWER ), FALSE ); pThis->SetStatusMessage( L"Waiting for a call..." ); return 0; } case WM_PRIVATETAPIEVENT: { // This message is received whenever a TAPI event occurs pThis->OnTapiEvent( (TAPI_EVENT) wParam, (IDispatch *) lParam ); return 0; } case WM_COMMAND: { if ( LOWORD(wParam) == IDCANCEL ) { // Quit EndDialog( hDlg, 0 ); return 1; } switch ( LOWORD(wParam) ) { case IDC_AUTOANSWER: { // Auto answer check box state was changed pThis->m_fAutoAnswer = !pThis->m_fAutoAnswer; return 1; } case IDC_ANSWER: { // Answer the call pThis->SetStatusMessage(L"Answering..."); if ( S_OK == pThis->AnswerTheCall() ) { pThis->SetStatusMessage(L"Connected"); ::EnableWindow( ::GetDlgItem( hDlg, IDC_ANSWER ), FALSE ); // Connected: Talk to the caller // PLEASE NOTE: This is a single-threaded app, so if the caller // hangs up after the call-handling sequence has started, the // app will not be notified until after the entire call sequence // has finished. // If you want to be able to cut the call-handling short because // the caller hung up, you need to have a separate thread listening // for TAPI's CS_DISCONNECT notification. HRESULT hrHandleCall = pThis->HandleCall(); if ( FAILED( hrHandleCall ) ) { if ( TAPI_E_DROPPED == hrHandleCall ) { pThis->SetStatusMessage( L"Caller hung up prematurely" ); } else { pThis->DoMessage( L"Error encountered handling the call" ); } } // Hang up if we still need to if ( NULL != pThis->m_pCall ) { // The caller is still around; hang up on him pThis->SetStatusMessage(L"Disconnecting..."); if (S_OK != pThis->DisconnectTheCall()) { pThis->DoMessage(L"Disconnect failed"); } } } else { ::EnableWindow( ::GetDlgItem( hDlg, IDC_ANSWER ), FALSE ); pThis->DoMessage(L"Answer failed"); } // Waiting for the next call... pThis->SetStatusMessage(L"Waiting for a call..."); return 1; } case IDC_DISCONNECTED: { // This message is sent from OnTapiEvent() // Disconnected notification -- release the call pThis->ReleaseTheCall(); ::EnableWindow( ::GetDlgItem( hDlg, IDC_ANSWER ), FALSE ); pThis->SetStatusMessage(L"Waiting for a call..."); return 1; } default: return 0; } } default: return 0; } } /* MainDialogProc */