|
|
//
// MODULE: APGTSREGCONNECT.H
//
// PURPOSE: read - write to the registry
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// AUTHOR: Oleg Kalosha
//
// ORIGINAL DATE: 8-24-98
//
// NOTES:
// 1. This file is shared by Local TS and Online TS, but implemented separately in each.
// The relevant CPP files are OnlineRegConnect.cpp and LocalRegConnect.cpp, respectively.
// 2. If we are moving toward a COM object at some point, we will probably have to establish an
// abstract class in lieu of CAPGTSRegConnector and have Online & Local TS's each derive their
// own version. Meanwhile (1/99), we share a common interface (defined in APGTSRegConnect.h)
// but implement it differently.
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.0 08-04-98 OK
//
#ifndef __APGTSREGCONNECT_H_
#define __APGTSREGCONNECT_H_
#include "BaseException.h"
#include "Stateless.h"
#include "regutil.h"
#include "MutexOwner.h"
#include "commonregconnect.h"
// no registry parameter can be larger than this value
#define ABS_MAX_REG_PARAM_VAL 10000
class CAPGTSRegConnectorException; // find class declaration under
// CAPGTSRegConnector class declaration
////////////////////////////////////////////////////////////////////////////////////
// CAPGTSRegConnector
// Performs connection of APGTS project to the registry,
// that means loading data stored in the registry,
// creation of keys and values if not presented in the registry,
// detecting what kind of registry - stored data has recently been changed.
////////////////////////////////////////////////////////////////////////////////////
class CAPGTSRegConnector { public: enum ERegConnector { eIndefinite = 0x0, eResourcePath = 0x1, eVrootPath = 0x2, eMaxThreads = 0x4, // 0x8 is currently unassigned
eThreadsPP = 0x10, eMaxWQItems = 0x20, eCookieLife = 0x40, eReloadDelay = 0x80, // 0x100 is currently unassigned
eDetailedEventLogging= 0x200, eLogFilePath = 0x400, // only appropriate in Local Troubleshooter
eTopicFileExtension = 0x800, // currently appropriate only in Local Troubleshooter
eSniffAutomatic = 0x1000, eSniffManual = 0x2000,
// the rest just for use in exception handling
eProblemWithLogKey = 0x4000, // problem with key to IIS area where we get log file path
eProblemWithKey = 0x8000 };
public: static CString & StringFromConnector(ERegConnector e, CString & str); static ERegConnector ConnectorFromString( const CString & str); static void AddBackslash(CString & str); static void BackslashIt(CString & str, bool bForce); static bool IsNumeric(ERegConnector e); static bool IsString(ERegConnector e);
protected: static bool AssignString(CString & strPersist, const CString & strNew, DWORD dwEvent); static bool AssignNumeric(DWORD & dwPersist, DWORD dwNew, DWORD dwEvent, DWORD dwEventDecrease =0); static bool ForceRangeOfNumeric(DWORD & dw, DWORD dwDefault, DWORD dwEvent, DWORD dwMin=1, DWORD dwMax=ABS_MAX_REG_PARAM_VAL);
protected: struct CRegistryInfo { CString strResourcePath; // DEF_FULLRESOURCE: resource directory
// (configuration/support files)
CString strVrootPath; // DEF_VROOTPATH: local web URL to the DLL
DWORD dwMaxThreads; // desired number of pool threads
DWORD dwThreadsPP; // (On Microsoft's server farm,
// this system runs on a 4-processor box.)
// If dwThreadsPP * (number of processors) > dwMaxThreads,
// dwMaxThreads wins out as a limitation
DWORD dwMaxWQItems; // Maximum size of Pool Queue (number of work items
// not yet picked up by a pool thread)
DWORD dwCookieLife; // cookie life in minutes
DWORD dwReloadDelay; // Amount of time (in seconds) file system must settle
// down before we try to read from files
DWORD dwDetailedEventLogging; // really a boolean
CString strLogFilePath; // Defaults to DEF_FULLRESOURCE, but expect always to
// override that with the location of the IIS log.
CString strTopicFileExtension; // appropriate only in Local Troubleshooter
DWORD dwSniffAutomatic; // {1/0} control automatic sniffing
DWORD dwSniffManual; // {1/0} control manual sniffing
bool m_bIsRead; // indicates that there has been at least one attempt to read the registry
CRegistryInfo() {SetToDefault();} void SetToDefault(); };
CRegistryInfo m_RegistryInfo; static CMutexOwner s_mx; CString m_strTopicName; // This string is ignored in the Online Troubleshooter.
// Done under the guise of binary compatibility.
public: CAPGTSRegConnector( const CString& strTopicName ); // strTopicName is ignored in the Online Troubleshooter.
// Done under the guise of binary compatibility.
~CAPGTSRegConnector();
bool Exists(); // the root key (In Online TS, "HKEY_LOCAL_MACHINE\SOFTWARE\\ISAPITroubleShoot") exists
bool IsRead(); bool Read(int & maskChanged, int & maskCreated); // pump data into m_RegistryInfo -
// PLUS sets absent data in registry to default.
DWORD GetDesiredThreadCount(); bool GetNumericInfo(ERegConnector, DWORD&); // returns registry data - numeric
bool GetStringInfo(ERegConnector, CString&); // returns registry data - string
bool SetOneValue(const CString & strName, const CString & strValue, bool &bChanged); protected: void Lock(); void Unlock();
protected: void ReadUpdateRegistry(int & maskChanged, int & maskCreated); CString ThisProgramFullKey(); void SetNumericValue(CRegUtil ®, ERegConnector e, DWORD dwValue); void SetStringValue(CRegUtil ®, ERegConnector e, CString strValue); bool SetOneNumericValue(ERegConnector e, DWORD dwValue); bool SetOneStringValue(ERegConnector e, const CString & strValue);
private: void Clear(); LPCTSTR RegSoftwareLoc(); LPCTSTR RegThisProgram(); };
////////////////////////////////////////////////////////////////////////////////////
// CAPGTSRegConnectorException
////////////////////////////////////////////////////////////////////////////////////
class CAPGTSRegConnectorException : public CBaseException { public: CAPGTSRegConnector::ERegConnector eVariable; CRegUtil& regUtil; // we are supposed to get WinErr (return of failed ::Reg function)
// from the regUtil variable
public: // source_file is LPCSTR rather than LPCTSTR because __FILE__ is char[35]
CAPGTSRegConnectorException(LPCSTR source_file, int line, CRegUtil& reg_util, CAPGTSRegConnector::ERegConnector variable =CAPGTSRegConnector::eIndefinite) : CBaseException(source_file, line), regUtil(reg_util), eVariable(variable) {} void Close() {regUtil.Close();} void Log(); };
#endif
|