/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corp., 1991 **/ /**********************************************************************/ /* getprint.cxx This file contains the code for the GET_PRINTERS_DIALOG. FILE HISTORY: NarenG 25-May-1993 Created */ #define INCL_NET #define INCL_NETLIB #define INCL_WINDOWS #define INCL_WINDOWS_GDI #define INCL_NETERRORS #define INCL_DOSERRORS #include #define INCL_BLT_WINDOW #define INCL_BLT_DIALOG #define INCL_BLT_CONTROL #define INCL_BLT_CLIENT #define INCL_BLT_EVENT #define INCL_BLT_MISC #define INCL_BLT_MSGPOPUP #define INCL_BLT_TIMER #define INCL_BLT_CC #include #if defined(DEBUG) static const CHAR szFileName[] = __FILE__; #define _FILENAME_DEFINED_ONCE szFileName #endif // DEBUG #include #include extern "C" { #include #include #include #include "atalkmon.h" #include "dialogs.h" DWORD DoNBPLookup( LPVOID Parameter ); } #include "getprint.hxx" /******************************************************************* NAME: GET_PRINTERS_DIALOG::GET_PRINTERS_DIALOG SYNOPSIS: constructor for GET_PRINTERS_DIALOG HISTORY: NarenG 25-May-1993 Stole from AFPMGR ********************************************************************/ GET_PRINTERS_DIALOG::GET_PRINTERS_DIALOG( HWND hWndOwner, PNBP_LOOKUP_STRUCT pBuffer ) : DIALOG_WINDOW(MAKEINTRESOURCE( IDD_GET_PRINTERS_DIALOG ), hWndOwner), _timer( this, TIMER_FREQ, FALSE ), _progress(this, IDGP_PROGRESS, IDI_PROGRESS_ICON_0, IDI_PROGRESS_NUM_ICONS), _sltMessage( this, IDGP_ST_MESSAGE ), _nTickCounter( TIMER_MULT ) { if ( QueryError() != NERR_Success ) { return ; } // // Begin NBP lookup // DWORD tidNBPLookup; _hthreadNBPLookup = ::CreateThread( NULL, // Default security attributes 0, // Default stack size ::DoNBPLookup, // Start address pBuffer, // Thread parameter 0, // Run immediately &tidNBPLookup // Thread id ); if ( _hthreadNBPLookup == NULL ) { ReportError( ::GetLastError() ); return; } // // set the message. // DWORD err; NLS_STR nlsMessage; NLS_STR nlsZoneName( pBuffer->wchZone ); if ( (( err = nlsMessage.QueryError() ) != NERR_Success ) || (( err = nlsZoneName.QueryError() ) != NERR_Success ) ) { ReportError( err ); return; } if ( ::_wcsicmp( pBuffer->wchZone, (LPWSTR)TEXT("*") ) == 0 ) { nlsMessage.Load( IDS_NO_ZONE_FOR_PRINTERS ); } else { nlsMessage.Load( IDS_GETTING_PRINTERS_ON_ZONE ); err = nlsMessage.InsertParams( nlsZoneName ); } if( err != NERR_Success ) { ReportError( err ); return; } _sltMessage.SetText( nlsMessage ); // // set polling timer // _timer.Enable( TRUE ); return; } /******************************************************************* NAME: GET_PRINTERS_DIALOG::~GET_PRINTERS_DIALOG SYNOPSIS: destructor for SERVICE_WAIT_DIALOG. Stops the timer if it has not already been stopped. HISTORY: NarenG 25-May-1992 Created ********************************************************************/ GET_PRINTERS_DIALOG::~GET_PRINTERS_DIALOG( VOID ) { _timer.Enable( FALSE ); } /******************************************************************* NAME: GET_PRINTERS_DIALOG::OnTimerNotification SYNOPSIS: Virtual callout invoked during WM_TIMER messages. ENTRY: tid - TIMER_ID of this timer. HISTORY: NarenG 25-May-1992 Created ********************************************************************/ VOID GET_PRINTERS_DIALOG :: OnTimerNotification( TIMER_ID tid ) { // // Bag-out if it's not our timer. // if( tid != _timer.QueryID() ) { TIMER_CALLOUT :: OnTimerNotification( tid ); return; } // // Advance the progress indicator. // _progress.Advance(); // // No need to continue if we're just amusing the user. // if( --_nTickCounter > 0 ) { return; } _nTickCounter = TIMER_MULT; // // Poll the thread doing the lookup to see if the operation is // either complete or continuing as expected. // DWORD dwRetCode = ::WaitForSingleObject( _hthreadNBPLookup, 0 ); switch ( dwRetCode ) { case WAIT_OBJECT_0: if( !::GetExitCodeThread( _hthreadNBPLookup, &dwRetCode )) { dwRetCode = ::GetLastError(); } ::CloseHandle( _hthreadNBPLookup ); if ( dwRetCode != NO_ERROR ) { ::MsgPopup( this, dwRetCode ); } Dismiss( TRUE ); break; case WAIT_TIMEOUT: break; case WAIT_ABANDONED: default: ::CloseHandle( _hthreadNBPLookup ); Dismiss( FALSE ); break; } return; } // GET_PRINTERS_DIALOG :: OnTimerNotification BOOL GET_PRINTERS_DIALOG :: OnCancel ( VOID ) { return ( FALSE ); } BOOL GET_PRINTERS_DIALOG :: OnOK ( VOID ) { return ( FALSE ); } /******************************************************************* NAME: GET_PRINTERS_DIALOG::OnTimerNotification SYNOPSIS: Virtual callout invoked during WM_TIMER messages. ENTRY: tid - TIMER_ID of this timer. HISTORY: NarenG 25-May-1992 Created ********************************************************************/ DWORD DoNBPLookup( LPVOID Parameter ) { PNBP_LOOKUP_STRUCT pNbpLookup = (PNBP_LOOKUP_STRUCT)Parameter; CHAR chZone[MAX_ENTITY+1]; PWSH_NBP_TUPLE pwshTuple; DWORD err; DWORD cbTuples; DWORD cPrinters = 100; DWORD cTuplesFound = 0; SOCKET hSocket = pNbpLookup->hSocket; ::wcstombs( chZone, pNbpLookup->wchZone, sizeof( chZone ) ); cbTuples = ( sizeof( WSH_NBP_TUPLE ) * cPrinters ); pwshTuple = (PWSH_NBP_TUPLE)::LocalAlloc( LPTR, cbTuples ); if ( pwshTuple == NULL ) { return( ERROR_NOT_ENOUGH_MEMORY ); } do { err = ::WinSockNbpLookup( hSocket, chZone, ATALKMON_RELEASED_TYPE, "=", pwshTuple, cbTuples, &cTuplesFound ); if ( err != NO_ERROR ) { ::LocalFree( pwshTuple ); break; } if ( cTuplesFound == cPrinters ) { PWSH_NBP_TUPLE pTmpwshTuple = NULL; cPrinters *= 2; cbTuples = sizeof( WSH_NBP_TUPLE ) * cPrinters; pTmpwshTuple = (PWSH_NBP_TUPLE)::LocalReAlloc( pwshTuple, cbTuples, LMEM_MOVEABLE ); if ( pTmpwshTuple == NULL ) { err = ERROR_NOT_ENOUGH_MEMORY; break; } pwshTuple = pTmpwshTuple; } else { pNbpLookup->pPrinters = pwshTuple; pNbpLookup->cPrinters = cTuplesFound; break; } } while( TRUE ); ::ExitThread( err ); return err; }