|
|
// a small object to query and control the state of the w3 server
// created 4/14/97 BoydM
#include "stdafx.h"
#include "resource.h"
#include "ServCntr.h"
#include "mbobjs.h"
#include "pwsctrl.h"
#include <isvctrl.h>
#define SERVER_WINDOWCLASS_NAME INET_SERVER_WINDOW_CLASS
#define REGKEY_STP _T("SOFTWARE\\Microsoft\\INetStp")
#define REGKEY_INSTALLKEY _T("InstallPath")
extern BOOL g_fShutdownMode;
//------------------------------------------------------------------------
CW3ServerControl::CW3ServerControl() { OSVERSIONINFO info_os; info_os.dwOSVersionInfoSize = sizeof(info_os);
// record what sort of operating system we are running on
m_fIsWinNT = FALSE; if ( GetVersionEx( &info_os ) ) { if ( info_os.dwPlatformId == VER_PLATFORM_WIN32_NT ) m_fIsWinNT = TRUE; } }
//------------------------------------------------------------------------
int CW3ServerControl::GetServerState() { CWrapMetaBase mb; DWORD dw;
// if the service is totally shut down, return stopped
if ( g_fShutdownMode ) return MD_SERVER_STATE_STOPPED;
// see if inetinfo is running - win95 only
if ( !m_fIsWinNT && !IsInetinfoRunning() ) return MD_SERVER_STATE_STOPPED; // init the mb object. If it fails then the server app is probably not running
if ( !mb.FInit() ) { return MD_SERVER_STATE_STOPPED; }
// open the metabase so we can get the current state
if ( !mb.Open(MB_SERVER_KEY_UPDATE) ) { return MD_SERVER_STATE_STOPPED; }
// get the server status flag
if ( !mb.GetDword( _T(""), MD_SERVER_STATE, IIS_MD_UT_SERVER, &dw ) ) { DWORD err = GetLastError( ); if ( err == RPC_E_SERVERCALL_RETRYLATER ) { mb.Close(); return STATE_TRY_AGAIN; } } // close the metabase object
mb.Close();
// return the obtained state
return dw; }
//------------------------------------------------------------------------
BOOL CW3ServerControl::SetServerState( DWORD dwControlCode ) { CWrapMetaBase mb; BOOL fSuccess = FALSE; CString sz; DWORD err;
// if the metabase doesn't init, then the app isn't running - lauch it
if ( !mb.FInit() ) return FALSE;
// open the metabase object
if ( !mb.Open(SZ_MB_INSTANCE_OBJECT, METADATA_PERMISSION_WRITE) ) { err = GetLastError(); sz.LoadString( IDS_MetaError ); sz.Format( _T("%s\nError = %d"), sz, err ); AfxMessageBox( sz ); return FALSE; }
// set the verb into the metabase
if ( !mb.SetDword( _T(""), MD_SERVER_COMMAND, IIS_MD_UT_SERVER, dwControlCode ) ) { err = GetLastError(); sz.LoadString( IDS_MetaError ); sz.Format( _T("%s\nError = %d"), sz, err ); AfxMessageBox( sz ); } else fSuccess = TRUE;
// close the object
mb.Close();
// return the success flag
return fSuccess; }
//------------------------------------------------------------------------
BOOL CW3ServerControl::StartServer( BOOL fOutputCommandLineInfo ) { // just set the state in the metabase to do our thing
return SetServerState( MD_SERVER_COMMAND_START ); }
//------------------------------------------------------------------------
BOOL CW3ServerControl::W95LaunchInetInfo() { // start it
return W95StartW3SVC(); }
//------------------------------------------------------------------------
BOOL CW3ServerControl::StopServer( BOOL fOutputCommandLineInfo ) { // just set the state in the metabase to do our thing
return SetServerState( MD_SERVER_COMMAND_STOP ); }
//------------------------------------------------------------------------
BOOL CW3ServerControl::PauseServer() { // note that inetinfo must be running for this to work
// in either case, we now just pause the server
return SetServerState( MD_SERVER_COMMAND_PAUSE ); }
//------------------------------------------------------------------------
BOOL CW3ServerControl::ContinueServer() { // note that inetinfo must be running for this to work
// in either case, we now just pause the server
return SetServerState( MD_SERVER_COMMAND_CONTINUE ); }
//------------------------------------------------------------------------
// get the inetinfo path
BOOL CW3ServerControl::GetServerDirectory( CString &sz ) { HKEY hKey; TCHAR chBuff[MAX_PATH+1]; DWORD err, type; DWORD cbBuff;
// get the server install path from the registry
// open the registry key, if it exists
err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, // handle of open key
REGKEY_STP, // address of name of subkey to open
0, // reserved
KEY_READ, // security access mask
&hKey // address of handle of open key
);
// if we did not open the key for any reason (say... it doesn't exist)
// then leave right away
if ( err != ERROR_SUCCESS ) return FALSE;
cbBuff = sizeof(chBuff); type = REG_SZ; err = RegQueryValueEx( hKey, // handle of key to query
REGKEY_INSTALLKEY, // address of name of value to query
NULL, // reserved
&type, // address of buffer for value type
(PUCHAR)chBuff, // address of data buffer
&cbBuff // address of data buffer size
);
// close the key
RegCloseKey( hKey );
// if we did get the key for any reason (say... it doesn't exist)
// then leave right away
if ( err != ERROR_SUCCESS ) return FALSE;
// set the string
sz = chBuff;
// success
return TRUE; }
|