Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

345 lines
6.9 KiB

/**********************************************************************/
/** 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 <lmui.hxx>
#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 <blt.hxx>
#if defined(DEBUG)
static const CHAR szFileName[] = __FILE__;
#define _FILENAME_DEFINED_ONCE szFileName
#endif // DEBUG
#include <uiassert.hxx>
#include <dbgstr.hxx>
extern "C"
{
#include <winsock.h>
#include <atalkwsh.h>
#include <stdlib.h>
#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 )
{
cPrinters *= 2;
cbTuples = sizeof( WSH_NBP_TUPLE ) * cPrinters;
pwshTuple = (PWSH_NBP_TUPLE)::LocalReAlloc( pwshTuple,
cbTuples,
LMEM_MOVEABLE );
if ( pwshTuple == NULL )
{
err = ERROR_NOT_ENOUGH_MEMORY;
break;
}
}
else
{
pNbpLookup->pPrinters = pwshTuple;
pNbpLookup->cPrinters = cTuplesFound;
break;
}
} while( TRUE );
::ExitThread( err );
return err;
}