windows-nt/Source/XPSP1/NT/net/sfm/afp/ui/afpmgr/startafp.cxx

348 lines
7.8 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
startafp.cxx
This file contains the code for starting the AFP Service
FILE HISTORY:
NarenG 14-Oct-1992 Stole from srvsvc.cxx in server manager.
*/
#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 <lmsvc.hxx>
#include <lmosrv.hxx>
#include <svcman.hxx> // service controller wrappers
#include <dbgstr.hxx>
extern "C"
{
#include <winsvc.h> // service controller
#include <afpmgr.h>
#include <macfile.h>
#include <mnet.h>
}
#include <startafp.hxx>
/*******************************************************************
NAME: SERVICE_WAIT_DIALOG::SERVICE_WAIT_DIALOG
SYNOPSIS: constructor for SERVICE_WAIT
HISTORY:
ChuckC 07-Sep-1991 Created
********************************************************************/
SERVICE_WAIT_DIALOG::SERVICE_WAIT_DIALOG( HWND hWndOwner,
LM_SERVICE * plmsvc,
const TCHAR * pszDisplayName )
: DIALOG_WINDOW(MAKEINTRESOURCE( IDD_SERVICE_CTRL_DIALOG),
hWndOwner),
_timer( this, TIMER_FREQ, FALSE ),
_plmsvc(plmsvc),
_progress( this,
IDSC_PROGRESS,
IDI_PROGRESS_ICON_0,
IDI_PROGRESS_NUM_ICONS ),
_sltMessage( this, IDSC_ST_MESSAGE ),
_pszDisplayName( pszDisplayName ),
_nTickCounter( TIMER_MULT )
{
UIASSERT( pszDisplayName != NULL );
if ( QueryError() != NERR_Success )
{
return ;
}
//
// set the message.
//
ALIAS_STR nlsServer( pszDisplayName );
UIASSERT( nlsServer.QueryError() == NERR_Success );
RESOURCE_STR nlsMessage( IDS_STARTING_AFPSERVER_NOW );
APIERR err = nlsMessage.QueryError();
if( err == NERR_Success )
{
ISTR istrServer( nlsServer );
istrServer += 2;
err = nlsMessage.InsertParams( nlsServer[istrServer] );
}
if( err != NERR_Success )
{
ReportError( err );
return;
}
_sltMessage.SetText( nlsMessage );
//
// set polling timer
//
_timer.Enable( TRUE );
}
/*******************************************************************
NAME: SERVICE_WAIT_DIALOG::~SERVICE_WAIT_DIALOG
SYNOPSIS: destructor for SERVICE_WAIT_DIALOG. Stops
the timer if it has not already been stopped.
HISTORY:
ChuckC 07-Sep-1991 Created
********************************************************************/
SERVICE_WAIT_DIALOG::~SERVICE_WAIT_DIALOG( void )
{
_timer.Enable( FALSE );
}
/*******************************************************************
NAME: SERVICE_WAIT_DIALOG::OnTimerNotification
SYNOPSIS: Virtual callout invoked during WM_TIMER messages.
ENTRY: tid - TIMER_ID of this timer.
HISTORY:
KeithMo 06-Oct-1991 Created.
********************************************************************/
VOID SERVICE_WAIT_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 service to see if the operation is
// either complete or continuing as expected.
//
BOOL fDone;
APIERR err = _plmsvc->Poll( &fDone );
if (err != NERR_Success)
{
//
// Either an error occurred retrieving the
// service status OR the service is returning
// bogus state information.
//
Dismiss( err );
return;
}
if( fDone )
{
//
// The operation is complete.
//
Dismiss( NERR_Success );
return;
}
//
// If we made it this far, then the operation is
// continuing as expected. We'll have to wait for
// the next WM_TIMER message to recheck the service.
//
} // SERVICE_WAIT_DIALOG :: OnTimerNotification
/*******************************************************************
NAME: StartAfpService
SYNOPSIS: Starts the Afp Service on the local machine.
ENTRY: hWnd - "Owning" window handle.
pszComputerName - name of machine to start service on
RETURNS: APIERR - Any error encountered.
HISTORY:
NarenG 1-Oct-1992 Stole from original.
********************************************************************/
APIERR StartAfpService( HWND hWnd, const TCHAR * pszComputerName )
{
AUTO_CURSOR AutoCursor;
LM_SERVICE * psvc = new LM_SERVICE( pszComputerName,
(const TCHAR *)AFP_SERVICE_NAME );
APIERR err = ( psvc == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: psvc->QueryError();
if (err == NERR_Success)
{
//
// Initiate the Start
//
err = psvc->Start( NULL, POLL_TIMER_FREQ, POLL_DEFAULT_MAX_TRIES );
if ( err == NERR_Success )
{
UINT errDlg = NERR_Success;
//
// Invoke the wait dialog.
//
SERVICE_WAIT_DIALOG * pDlg = new SERVICE_WAIT_DIALOG(
hWnd,
psvc,
pszComputerName );
err = ( pDlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: pDlg->Process( &errDlg );
if( err == NERR_Success )
{
delete pDlg;
err = (APIERR)errDlg;
}
delete psvc;
}
}
return err;
} // StartAfpService
/*******************************************************************
NAME: IsAfpServiceRunning
SYNOPSIS: Checks to see if the AfpService is running on a given
machine.
ENTRY: hWnd - "Owning" window handle.
RETURNS: APIERR - Any error encountered.
HISTORY:
NarenG 1-Oct-1992 Stole from original.
********************************************************************/
APIERR IsAfpServiceRunning( const TCHAR * pszComputer, BOOL * fIsAfpRunning )
{
LPSERVICE_INFO_1 psvci1;
DWORD err;
SERVER_1 Server1( pszComputer );
if ( ( err = Server1.GetInfo() ) != NERR_Success )
{
return err;
}
if ( !(Server1.QueryServerType() & SV_TYPE_NT ) )
{
return IDS_NOT_NT;
}
//
// Find out if the AFP service is running on the given machine
//
err = ::MNetServiceGetInfo( pszComputer,
(const TCHAR *)AFP_SERVICE_NAME,
1,
(BYTE **)&psvci1 );
if ( err == NERR_BadServiceName )
{
return IDS_MACFILE_NOT_INSTALLED;
}
if( err != NERR_Success )
{
return err;
}
*fIsAfpRunning = (BOOL)(psvci1->svci1_status & SERVICE_INSTALLED);
::MNetApiBufferFree( (BYTE **)&psvci1 );
return err;
}