Beispiel #1
0
/**********************************************************
* 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 */