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.
 
 
 
 
 
 

229 lines
7.9 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
lmsvc.hxx
This file contains the class defintion for the LM_SERVICE class
FILE HISTORY:
ChuckC 19-Aug-1991 Created
ChuckC 23-Sep-1991 Code review changes.
Attended by JimH, KeithMo, EricCh, O-SimoP
terryk 07-Oct-1991 types changes for NT
terryk 17-Oct-1991 Add a destructor and change variable
to pointer
terryk 21-Oct-1991 change _pBuffer to BYTE * type
*/
#ifndef _LMSVC_HXX_
#define _LMSVC_HXX_
#include "base.hxx"
#include "string.hxx"
#include "uibuffer.hxx"
/*
* status of the service
*/
enum LM_SERVICE_STATUS
{
LM_SVC_STATUS_UNKNOWN,
LM_SVC_STARTED,
LM_SVC_STOPPED,
LM_SVC_PAUSED,
LM_SVC_STARTING,
LM_SVC_STOPPING,
LM_SVC_PAUSING,
LM_SVC_CONTINUING
} ;
/*
* other (secondary) status
*/
typedef struct {
BOOL fUnInstallable;
BOOL fPauseable;
BOOL fRdrDiskPaused;
BOOL fRdrPrintPaused;
BOOL fRdrCommPaused;
BOOL fHint;
ULONG ulSecCode;
ULONG ulCheckPointNum;
ULONG ulWaitTime; // in milliseconds
APIERR errExit;
APIERR errSpecific;
} LM_SERVICE_OTHER_STATUS ;
#define DEFAULT_MAX_TRIES 10
#define DEFAULT_SLEEP_TIME 3000
/*************************************************************************
NAME: LM_SERVICE
SYNOPSIS: class for controlling/querying Lan Manager services.
All Query methods return current status by querying the
service. No information is cached. All control operations
are asynchronous, ie. they return immediately, possibly
before the service achieves the desired state.
INTERFACE:
Start() - Start the service. Returns NERR_Success if
successful, API error otherwise.
Pause() - Pause the service. Returns NERR_Success if
successful, API error otherwise.
Continue() - Continue the service. Returns NERR_Success if
successful, API error otherwise.
Stop() - Stop the service. Returns NERR_Success if
successful, API error otherwise.
Poll() - Polls the service to see if one of the
above operations has completed.
IsStarted() - Returns TRUE if service is started, FALSE
otherwise.
IsPaused() - Returns TRUE if service is paused, FALSE
otherwise.
IsStopped() - Returns TRUE if service is stopped (ie. not
installed), FALSE otherwise.
IsStarting() - Returns TRUE if service is starting, FALSE
otherwise.
IsPausing() - Returns TRUE if service is pausing, FALSE
otherwise.
IsStopping() - Returns TRUE if service is stopping, FALSE
otherwise.
IsContinuing() - Returns TRUE if service is continuing, FALSE
otherwise.
IsInstalled() - Returns TRUE if service is not stopped, FALSE
otherwise. Identical to !IsStopped().
QueryStatus() - Returns LM_SERVICE_STATUS enumeration.
QueryFullStatus() - Returns LM_SERVICE_STATUS enumeration and
additional info like hints, checkpoint, etc.
QueryName() - Returns TCHAR * to service name.
QueryServerName() - Returns TCHAR * to server of focus.
PARENT: BASE
USES:
CAVEATS:
NOTES:
NetServiceGetInfo() is not used, we only do NetServiceControl(),
even to query status. By doing so, we are less efficient but
more accurate, since GetInfo() just looks at last recorded status
whereas Control() goes out to ask the service. If we need fast
Querys, we may revisit this.
HISTORY:
ChuckC 19-Aug-1991 Created
KeithMo 30-Sep-1991 Moved polling logic from UI_SERVICE
to LM_SERVICE.
**************************************************************************/
DLL_CLASS LM_SERVICE : public BASE
{
public:
APIERR Start( const TCHAR * pszArgs = NULL,
UINT uiSleepTime = DEFAULT_SLEEP_TIME,
UINT uiMaxTries = DEFAULT_MAX_TRIES );
APIERR Pause(UINT uiSleepTime = DEFAULT_SLEEP_TIME,
UINT uiMaxTries = DEFAULT_MAX_TRIES ) ;
APIERR Continue(UINT uiSleepTime = DEFAULT_SLEEP_TIME,
UINT uiMaxTries = DEFAULT_MAX_TRIES ) ;
APIERR Stop(UINT uiSleepTime = DEFAULT_SLEEP_TIME,
UINT uiMaxTries = DEFAULT_MAX_TRIES ) ;
APIERR Poll(BOOL * pfDone);
BOOL IsStarted(APIERR *pErr = NULL) ;
BOOL IsPaused(APIERR *pErr = NULL) ;
BOOL IsStopped(APIERR *pErr = NULL) ;
BOOL IsInstalled(APIERR *pErr = NULL) { return(!IsStopped(pErr)) ; }
BOOL IsStarting(APIERR *pErr = NULL) ;
BOOL IsPausing(APIERR *pErr = NULL) ;
BOOL IsStopping(APIERR *pErr = NULL) ;
BOOL IsContinuing(APIERR *pErr = NULL) ;
LM_SERVICE_STATUS QueryStatus(APIERR *pErr = NULL) ;
const TCHAR *QueryName(VOID) const {return _nlsService.QueryPch() ;}
const TCHAR *QueryServerName(VOID) const {return _nlsServer.QueryPch() ;}
APIERR QueryFullStatus(LM_SERVICE_STATUS *pSvcStat,
LM_SERVICE_OTHER_STATUS *pSvcOtherStat);
LM_SERVICE(const TCHAR *pszServer, const TCHAR *pszServiceName) ;
~LM_SERVICE();
APIERR QueryExitCode( VOID ) const;
APIERR QuerySpecificCode( VOID ) const
{ return _errSpecific; }
BOOL IsWellKnownService( VOID ) const
{ return _fIsWellKnownService; }
protected:
APIERR SetName(const TCHAR *pszServiceName) ;
APIERR SetServerName(const TCHAR *pszServerName) ;
private:
BYTE * _pBuffer ;
ULONG _ulServiceStatus ;
ULONG _ulServiceCode ;
LM_SERVICE_STATUS _svcStat ;
DECL_CLASS_NLS_STR(_nlsService,SNLEN) ;
DECL_CLASS_NLS_STR(_nlsServer,MAX_PATH) ;
UINT _uiMaxTries;
UINT _uiCurrentTry;
UINT _uiSleepTime;
ULONG _ulOldCheckPoint;
LM_SERVICE_STATUS _lmsvcDesiredStat;
LM_SERVICE_STATUS _lmsvcPollStat;
APIERR _errExit;
APIERR _errSpecific;
BOOL _fIsWellKnownService;
APIERR W_QueryStatus(LM_SERVICE_STATUS *pSvcStat,
LM_SERVICE_OTHER_STATUS *pSvcOtherStat = NULL);
APIERR W_ServiceStart( const TCHAR * pszArgs ) ;
APIERR W_ServiceControl(UINT opcode, UINT fbArg = 0) ;
VOID W_InterpretStatus( const service_info_2 * psvi2,
LM_SERVICE_STATUS * pSvcStat,
LM_SERVICE_OTHER_STATUS * pSvcOtherStat );
VOID W_ComputeOtherStatus(LM_SERVICE_OTHER_STATUS *pSvcOtherStat);
BOOL W_IsWellKnownService( VOID ) const;
};
#endif // _LMSVC_HXX_