|
|
//
// MODULE: LOCALREGCONNECT.CPP
//
// PURPOSE: read - write to the registry; simulate this in some cases where Online TS uses
// registry, but Local TS doesn't
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// AUTHOR: Oleg Kalosha, Joe Mabel
//
// ORIGINAL DATE: 8-24-98 in Online TS
//
// NOTES:
// 1. This file is for Local TS only
// 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.
// 3. >>> WORK IN PROGRESS !!!! JM 1/19/98
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.0 08-04-98 OK
// V3.0 09-10-98 JM backslashing; access log file info
// V3.1 01-19-98 JM branch out version exclusively for Local TS
#pragma warning(disable:4786)
#include "stdafx.h"
#include "apgtsregconnect.h"
#include "event.h"
#include "apgtsevt.h"
#include "apgtscls.h"
#include "apgts.h"
#include "apiwraps.h"
#include "CHMFileReader.h"
#define REG_LOCAL_TS_LOC _T("SOFTWARE\\Microsoft")
LPCTSTR CAPGTSRegConnector::RegSoftwareLoc() {return REG_LOCAL_TS_LOC;} #define REG_LOCAL_TS_PROGRAM _T("TShoot")
LPCTSTR CAPGTSRegConnector::RegThisProgram() {return REG_LOCAL_TS_PROGRAM;} // subordinate key, child to the above and parent to keys for individual troubleshooter topics.
#define REG_LOCAL_TS_LIST _T("TroubleshooterList")
// where the topic-specific resource path is located ("\TroubleshooterList\Topic_name\Path"):
#define TOPICRESOURCE_STR _T("Path")
// where the topic-specific resource path is located ("\TroubleshooterList\Topic_name\Path"):
#define TOPICFILE_EXTENSION_STR _T("FExtension")
// registry value defaults
// Most relevant values differ from Online TS
// (Looks like old Local TS uses the same default resource path as Online TS, so we'll
// preserve that here >>> till we work out what's right - JM 1/19/99)
#define DEF_FULLRESOURCE _T("c:\\inetsrv\\scripts\\apgts\\resource")
#define DEF_VROOTPATH _T("/scripts/apgts/apgts.dll") // (irrelevant in Local TS)
#define DEF_MAX_THREADS 1 // only 1 pool thread in Local TS
#define DEF_THREADS_PER_PROCESSOR 1 // only 1 pool thread in Local TS
#define DEF_MAX_WORK_QUEUE_ITEMS 1 // only 1 work queue item at a time in Local TS
#define DEF_COOKIE_LIFE_IN_MINS 90 // (irrelevant in Local TS)
#define DEF_RELOAD_DELAY 50 // (irrelevant in Local TS)
#define DEF_DETAILED_EVENT_LOGGING 0
#define DEF_TOPICFILE_EXTENSION _T(".dsc")
#define DEF_SNIFF_AUTOMATIC 1
#define DEF_SNIFF_MANUAL 1
////////////////////////////////////////////////////////////////////////////////////
// CAPGTSRegConnector::CRegistryInfo
////////////////////////////////////////////////////////////////////////////////////
void CAPGTSRegConnector::CRegistryInfo::SetToDefault() { // Attempt to extract a default resource path based upon the DLL name.
// It was a deliberate decision to utilize the existing global module handle.
strResourcePath= _T(""); if (INVALID_HANDLE_VALUE != ghModule) { // Build the default resource path from the module name.
DWORD len; TCHAR szModulePath[MAXBUF]; CString strModulePath;
len = ::GetModuleFileName( reinterpret_cast<HMODULE>(ghModule), szModulePath, MAXBUF - 1 ); if (len!=0) { szModulePath[len] = _T('\0'); strModulePath = szModulePath; strResourcePath = CAbstractFileReader::GetJustPath(strModulePath); if (!strResourcePath.IsEmpty()) strResourcePath += _T("\\resource\\"); } } if (strResourcePath.IsEmpty()) strResourcePath = DEF_FULLRESOURCE;
strVrootPath = DEF_VROOTPATH; dwMaxThreads = DEF_MAX_THREADS; dwThreadsPP = DEF_THREADS_PER_PROCESSOR; dwMaxWQItems = DEF_MAX_WORK_QUEUE_ITEMS; dwCookieLife = DEF_COOKIE_LIFE_IN_MINS; dwReloadDelay = DEF_RELOAD_DELAY; dwDetailedEventLogging = DEF_DETAILED_EVENT_LOGGING; dwSniffAutomatic = DEF_SNIFF_AUTOMATIC; dwSniffManual = DEF_SNIFF_MANUAL; strLogFilePath = DEF_FULLRESOURCE; strTopicFileExtension = DEF_TOPICFILE_EXTENSION; m_bIsRead = false; }
////////////////////////////////////////////////////////////////////////////////////
// CAPGTSRegConnector
////////////////////////////////////////////////////////////////////////////////////
CAPGTSRegConnector::CAPGTSRegConnector(const CString& strTopicName) : m_strTopicName(strTopicName) { Clear(); }
// OUTPUT maskChanged or-ed ERegConnector-based mask of elements that have been
// changed since last read
// OUTPUT maskCreated In Online TS, this is
// or-ed ERegConnector-based mask of elements that were created
// in registry (because they previously didn't exist in registry)
// In Local TS, it always returns 0, because we don't do this.
void CAPGTSRegConnector::ReadUpdateRegistry(int & maskChanged, int & maskCreated) { CRegUtil reg; bool was_created = false; CString str_tmp; DWORD dw_tmp = 0;
maskChanged = 0; maskCreated = 0; try { // [BC - 20010302] - Registry access needs to be restricted to run local TShoot
// for certain user accts, such as WinXP built in guest acct. To minimize change
// access only restricted for local TShoot, not online.
REGSAM samRegistryAccess= KEY_QUERY_VALUE | KEY_NOTIFY; if(RUNNING_ONLINE_TS()) samRegistryAccess= KEY_QUERY_VALUE | KEY_WRITE; if (reg.Create(HKEY_LOCAL_MACHINE, RegSoftwareLoc(), &was_created, samRegistryAccess)) { if(RUNNING_ONLINE_TS()) samRegistryAccess= KEY_READ | KEY_WRITE; if (reg.Create(RegThisProgram(), &was_created, samRegistryAccess)) { /////////////////////////////////////////////////////////////////////////////
// Working in ...\TShoot root key
reg.GetNumericValue(SNIFF_AUTOMATIC_STR, m_RegistryInfo.dwSniffAutomatic);
/////////////////////////////////////////////////////////////////////////////
// Working in ...\TShoot root key
reg.GetNumericValue(SNIFF_MANUAL_STR, m_RegistryInfo.dwSniffManual);
/////////////////////////////////////////////////////////////////////////////
// VROOTPATH_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// MAX_THREADS_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// THREADS_PER_PROCESSOR_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// MAX_WORK_QUEUE_ITEMS_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// COOKIE_LIFE_IN_MINS_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// RELOAD_DELAY_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// DETAILED_EVENT_LOGGING_STR code suppressed in Local TS
/////////////////////////////////////////////////////////////////////////////
// Now opening subkeys
bool bFullResourceStrExists = reg.GetStringValue(FULLRESOURCE_STR, str_tmp); bool bTopicResourceExists = false;
// check in troubleshooter list if topic-related resource path exists
// (it can be CHM file).
if (reg.Create(REG_LOCAL_TS_LIST, &was_created, KEY_READ)) { if (reg.Create(m_strTopicName, &was_created, KEY_READ)) { if (reg.GetStringValue(TOPICRESOURCE_STR, str_tmp)) { if (CCHMFileReader::IsPathToCHMfile(str_tmp)) str_tmp = CCHMFileReader::FormCHMPath(str_tmp); else BackslashIt(str_tmp, true); if (AssignString(m_RegistryInfo.strResourcePath, str_tmp, EV_GTS_SERVER_REG_CHG_DIR) ) { maskChanged |= eResourcePath; } bTopicResourceExists = true; } reg.GetStringValue(TOPICFILE_EXTENSION_STR, m_RegistryInfo.strTopicFileExtension); } }
if (bFullResourceStrExists && !bTopicResourceExists) { BackslashIt(str_tmp, true); if (AssignString(m_RegistryInfo.strResourcePath, str_tmp, EV_GTS_SERVER_REG_CHG_DIR) ) { maskChanged |= eResourcePath; } } } else throw CAPGTSRegConnectorException(__FILE__, __LINE__, reg, eProblemWithKey); } else throw CAPGTSRegConnectorException(__FILE__, __LINE__, reg, eProblemWithKey);
reg.Close(); /* /////////////////////////////////////////////////////////////////////////
///// >>> We are not using logging so far in the Local TS. Oleg. 02.01.99 //
////////////////////////////////////////////////////////////////////////////
// >>> The following may be irrelevant: I don't think we should ultimately be keeping
// such a log for Local TS. In any event, I've gotten rid of a bunch of certainly
// irrelevant code to read this from registry & make an entry in the event log. JM 1/19/99
// Set the log file path arbitrarily to the current setting of the resource path
m_RegistryInfo.strLogFilePath = m_RegistryInfo.strResourcePath;
// Set m_RegistryInfo.strLogFilePath to the setting from the registry.
// Note: The code here should remain identical with the code in the catch block
// below (excluding the call to throw of course).
BackslashIt( m_RegistryInfo.strLogFilePath, true); */ } catch (CAPGTSRegConnectorException&) { // Set m_RegistryInfo.strLogFilePath = m_RegistryInfo.strResourcePath in the
// case where we could not get the log file path from the registry.
BackslashIt( m_RegistryInfo.strLogFilePath, true );
// Rethrow the exception upward to be logged.
throw; } }
// RETURN desired number of pool threads. In Local TS, this is always 1!
DWORD CAPGTSRegConnector::GetDesiredThreadCount() { return 1; }
|