184 lines
6.6 KiB
C
184 lines
6.6 KiB
C
|
//
|
||
|
// MODULE: APGTSREGCONNECT.H
|
||
|
//
|
||
|
// PURPOSE: read - write to the registry
|
||
|
//
|
||
|
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
|
||
|
//
|
||
|
// 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
|