/*++ Copyright (C) Microsoft Corporation, 1997 - 1998 All rights reserved. Module Name: asyncdlg.cxx Abstract: Asynchronous Dialog. Author: Steve Kiraly (SteveKi) 10-Feb-1997 Revision History: --*/ #include "precomp.hxx" #pragma hdrstop #include "asyncdlg.hxx" /*++ Routine Name: TAsyncDlg Routine Description: Asychronous dialog. This is a dialog which starts a worker thread to do its work. Note because a thread is started and this class is reference counted it must be instantiated from the heap. Arguments: Nothing. Return Value: Nothing. --*/ TAsyncDlg:: TAsyncDlg( IN HWND hwnd, IN TAsyncData *pData, IN UINT uResourceId ) : _pData( pData ), _hWnd( hwnd ), _uResourceId( uResourceId ), _bActive( FALSE ) { DBGMSG( DBG_TRACE, ( "TAsyncDlg::ctor.\n" ) ); } TAsyncDlg:: ~TAsyncDlg( VOID ) { DBGMSG( DBG_TRACE, ( "TAsyncDlg::dtor.\n" ) ); } BOOL TAsyncDlg:: bDoModal( VOID ) { // // Create a modal dialog. // return (BOOL)DialogBoxParam( ghInst, MAKEINTRESOURCE( _uResourceId ), _hWnd, MGenericDialog::SetupDlgProc, (LPARAM)this ); } VOID TAsyncDlg:: vSetTitle( IN LPCTSTR pszTitle ) { if( pszTitle && *pszTitle ) { // // Update the dialog title. // TStatusB bStatus; bStatus DBGCHK = _strTitle.bUpdate( pszTitle ); // // If the window is currently active then post // our special set title message. // if( _bActive ) { PostMessage( _hDlg, WM_COMMAND, WM_APP, 0 ); } } } BOOL TAsyncDlg:: bIsActive( VOID ) const { return _bActive; } BOOL TAsyncDlg:: bHandle_InitDialog( VOID ) { BOOL bRetval = FALSE; // // Indicate the dialog is active. // _bActive = TRUE; // // Start the animation. // HWND hwndAni = GetDlgItem( _hDlg, IDD_STATUS ); Animate_Open(hwndAni, MAKEINTRESOURCE( IDA_SEARCH ) ); Animate_Play(hwndAni, 0, -1, -1); // // Set the window title. // SetWindowText( _hDlg, _strTitle ); // // // Start the asynchronous thread. // bRetval = bStartAsyncThread(); if( !bRetval ) { vTerminate( IDCANCEL ); } return bRetval; } BOOL TAsyncDlg:: bHandle_Destroy( VOID ) { DBGMSG( DBG_TRACE, ( "TAsyncDlg::bHandle_Destroy.\n" ) ); Animate_Stop( GetDlgItem( _hDlg, IDD_STATUS ) ); _bActive = FALSE; return TRUE; } BOOL TAsyncDlg:: bHandleMessage( IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { BOOL bStatus = TRUE; switch( uMsg ) { case WM_INITDIALOG: bStatus = bHandle_InitDialog(); break; case WM_COMMAND: bStatus = bHandle_Command( GET_WM_COMMAND_ID( wParam, lParam ), wParam, lParam ); break; case WM_DESTROY: bStatus = bHandle_Destroy(); break; default: bStatus = FALSE; break; } bStatus &= _pData->bHandleMessage( this, uMsg, wParam, lParam ); return bStatus; } /*++ Routine Name: bHandle_Command Routine Description: Handles WM_COMMAND messages from the dialog box procedure. Arguments: uMsg - Command message( control ID ) wParam - dialog procedure passed wParam lParam - dialog procedure passed lParam Return Value: TRUE message handled, otherwise false. --*/ BOOL TAsyncDlg:: bHandle_Command( IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { BOOL bStatus = TRUE; switch( uMsg ) { case IDOK: case IDCANCEL: EndDialog( _hDlg, uMsg ); break; case IDC_CANCEL: vTerminate( IDCANCEL ); break; case WM_APP: SetWindowText( _hDlg, _strTitle ); break; default: bStatus = FALSE; break; } return bStatus; } /*++ Routine Name: bRefZeroed Routine Description: Called when the reference count drops to zero. Arguments: Nothing. Return Value: Nothing. --*/ VOID TAsyncDlg:: vRefZeroed( VOID ) { DBGMSG( DBG_TRACE, ( "TAsyncDlg::vRefZeroed.\n" ) ); // // Since we are reference counting the printer data object // we know that it is safe to delete ourselves now. // delete this; } VOID TAsyncDlg:: vTerminate( IN WPARAM wParam ) { PostMessage( _hDlg, WM_COMMAND, wParam, 0 ); } BOOL TAsyncDlg:: bStartAsyncThread( VOID ) { BOOL bStatus = FALSE; HANDLE hThread; DWORD dwIgnore; // // Ensure we bump the reference count. // vIncRef(); // // Create a save printui thread. // hThread = TSafeThread::Create( NULL, 0, reinterpret_cast( iProc ), this, 0, &dwIgnore ); // // Close the handle to the new thread if it was created. // if( hThread ) { CloseHandle( hThread ); bStatus = TRUE; } return bStatus; } INT TAsyncDlg:: iProc( IN TAsyncDlg *pDlg ) { // // Execute the callback. // pDlg->_pData->bAsyncWork( pDlg ); // // Terminate the async dialog. // pDlg->vTerminate( IDOK ); // // Release our reference to the async dialog. // pDlg->cDecRef(); return ERROR_SUCCESS; } /******************************************************************** TAsynchronous data class. ********************************************************************/ TAsyncData:: TAsyncData( VOID ) { DBGMSG( DBG_TRACE, ( "TAsyncData::ctor.\n" ) ); } TAsyncData:: ~TAsyncData( VOID ) { DBGMSG( DBG_TRACE, ( "TAsyncData::dtor.\n" ) ); } BOOL TAsyncData:: bHandleMessage( IN TAsyncDlg *pDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { return FALSE; }