📄 trapreg.cpp
字号:
}
m_bShowConfigTypeBox = TRUE;
if (FAILED(sc)) {
if (sc == E_ACCESS_DENIED) {
AfxMessageBox(IDS_ERR_REG_NO_ACCESS, MB_OK | MB_ICONSTOP);
return E_ACCESS_DENIED;
}
else {
goto CONNECT_FAILURE;
}
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
return S_OK;
CONNECT_FAILURE:
CString sMessage;
sMessage.LoadString(IDS_CANTCONNECT);
if (pszComputerName != NULL) {
sMessage += pszComputerName;
}
AfxMessageBox((LPCTSTR) sMessage, MB_OK | MB_ICONSTOP);
return E_FAIL;
}
//****************************************************************************
// CTrapReg::BuildSourceHasTrapsMap
//
// This method fills the m_mapEventSources CMapStringToPtr object with the
// names of all the event sources that actually have events configured for them.
// When this map is used later, we only need to know whether or not a particular
// entry exists in the map, so the value associated with each entry is irrelevant.
//
// Why do we need m_mapEventSources? The reason is that we need a quick way to
// determine whether or not a particular source has events configured for it.
// This is used when all the event sources are being enumerated and we need to know
// whether or not to load the messages for the event source (an expensive operation).
// If a particular event source has events configured for it, then we need to load
// the messages so that the message text can be displayed. This is because the
// event configuration stored in the registry only contains the event id and not the
// message text.
//
// Parameters:
// None.
//
// Returns:
// SCODE
// S_OK if successful, otherwise E_FAIL.
//
//******************************************************************************
SCODE CTrapReg::BuildSourceHasTrapsMap()
{
CRegistryKey regkey;
if (!g_reg.m_regkeySnmp.GetSubKey(SZ_REGKEY_SOURCES, regkey)) {
// For a fresh installation, there is no source subkey.
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
return S_OK;
}
CStringArray* pasEventSources = regkey.EnumSubKeys();
regkey.Close();
if (pasEventSources == NULL) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
return S_OK;
}
CString sEventSource;
LONG nEventSources = (LONG)pasEventSources->GetSize();
for (LONG iEventSource = 0; iEventSource < nEventSources; ++iEventSource) {
sEventSource = pasEventSources->GetAt(iEventSource);
sEventSource.MakeUpper();
m_mapSourceHasTraps.SetAt(sEventSource, NULL);
}
delete pasEventSources;
return S_OK;
}
//**************************************************************************
// CTrapReg::Deserialize
//
// Read all the registry information (not including the event source messages) that
// is required by eventrap.exe into this object. Reading the messages for most
// event sources is delayed until the user actually requests it by selecting
// an event source in the event source tree control. If an event source has
// events that are being mapped into traps, then the messages for that event
// source are loaded because an event description in the registry does not contain
// the message text.
//
// Parameters:
// None.
//
// Returns:
// SCODE
// S_OK if successful.
// E_FAIL if a failure was detected. In the event of a failure, all
// of the appropriate message boxes will have been displayed.
//
//***************************************************************************
SCODE CTrapReg::Deserialize()
{
m_bSomeMessageWasNotFound = FALSE;
SetDirty(FALSE);
// Get the value for the configuration type.
CRegistryValue regval;
if (m_regkeyEventLog.GetValue(SZ_NAME_REGVAL_CONFIGTYPE, regval)) {
m_dwConfigType = *(DWORD*)regval.m_pData;
}
else {
if (g_bLostConnection) {
AfxMessageBox(IDS_ERROR_NOT_RESPONDING);
return E_REGKEY_LOST_CONNECTION;
}
// If the config type value doesn't exist, assume a custom configuration.
// This can happen because the setup program doesn't necessarily create
// this value.
m_dwConfigType = CONFIG_TYPE_CUSTOM;
}
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
SCODE sc = BuildSourceHasTrapsMap();
if (SUCCEEDED(sc)) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
// Load the event log list, the current event list and so on.
sc = m_params.Deserialize();
if (sc == S_LOAD_CANCELED) {
return sc;
}
if (SUCCEEDED(sc)) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
sc = m_aEventLogs.Deserialize();
if (sc == S_LOAD_CANCELED) {
return sc;
}
if (SUCCEEDED(sc)) {
if (m_nLoadSteps < LOAD_STEP_COUNT) {
if (m_pdlgLoadProgress->StepProgress(LOAD_STEP_COUNT - m_nLoadSteps)) {
return S_LOAD_CANCELED;
}
}
}
}
}
if (FAILED(sc)) {
if (sc == E_REGKEY_LOST_CONNECTION) {
AfxMessageBox(IDS_ERROR_NOT_RESPONDING);
}
else {
AfxMessageBox(IDS_WARNING_CANT_READ_CONFIG);
}
}
return sc;
}
//**************************************************************************
// CTrapReg::GetSaveProgressStepCount
//
// Get the number of steps for the save progress dialog. The number of steps
// is the number of events that will be written to SNMP_EVENTS\EventLog in
// the registry.
//
// Parameters:
// None.
//
// Returns:
// The number of steps to use for the save progress dialog.
//
//*************************************************************************
LONG CTrapReg::GetSaveProgressStepCount()
{
LONG nSteps = 0;
LONG nEventLogs = m_aEventLogs.GetSize();
for (LONG iEventLog = 0; iEventLog < nEventLogs; ++iEventLog) {
CXEventLog* pEventLog = m_aEventLogs[iEventLog];
LONG nEventSources = pEventLog->m_aEventSources.GetSize();
for (LONG iEventSource = 0; iEventSource < nEventSources; ++iEventSource) {
CXEventSource* pEventSource = pEventLog->m_aEventSources.GetAt(iEventSource);
nSteps += pEventSource->m_aEvents.GetSize();
}
}
return nSteps;
}
//**************************************************************************
// CTrapReg::Serialize
//
// Write eventrap's current configuration out to the registry.
//
// Parameters:
// None.
//
// Returns:
// SCODE
// S_OK if successful.
// E_FAIL if a failure was detected. In the event of a failure, all
// of the appropriate message boxes will have been displayed.
//
//***************************************************************************
SCODE CTrapReg::Serialize()
{
SCODE sc;
if (g_bLostConnection) {
sc = Connect(m_sComputerName, TRUE);
if (FAILED(sc)) {
if (g_bLostConnection) {
AfxMessageBox(IDS_ERROR_NOT_RESPONDING);
return E_REGKEY_LOST_CONNECTION;
}
return S_SAVE_CANCELED;
}
}
if (!m_bIsDirty) {
// The configuration state was not changed, so there is nothing to do.
return S_OK;
}
LONG nProgressSteps = GetSaveProgressStepCount();
if (nProgressSteps > 0) {
m_pdlgSaveProgress = new CDlgSaveProgress;
m_pdlgSaveProgress->Create(IDD_SAVE_PROGRESS);
m_pdlgSaveProgress->SetStepCount( nProgressSteps );
}
CRegistryValue regval;
regval.Set(SZ_NAME_REGVAL_CONFIGTYPE, REG_DWORD, sizeof(DWORD), (LPBYTE)&m_dwConfigType);
if (!m_regkeyEventLog.SetValue(regval)) {
if (g_bLostConnection) {
AfxMessageBox(IDS_ERROR_NOT_RESPONDING);
sc = E_REGKEY_LOST_CONNECTION;
}
else {
AfxMessageBox(IDS_WARNING_CANT_WRITE_CONFIG);
sc = S_SAVE_CANCELED;
}
}
else {
sc = m_aEventLogs.Serialize();
if (sc != S_SAVE_CANCELED) {
if (SUCCEEDED(sc)) {
sc = m_params.Serialize();
}
if (sc != S_SAVE_CANCELED)
SetDirty(FALSE);
if (FAILED(sc)) {
if (g_bLostConnection) {
AfxMessageBox(IDS_ERROR_NOT_RESPONDING);
}
else {
AfxMessageBox(IDS_WARNING_CANT_WRITE_CONFIG);
}
}
}
}
delete m_pdlgSaveProgress;
m_pdlgSaveProgress = NULL;
return sc;
}
void CTrapReg::SetDirty(BOOL bDirty)
{
m_bIsDirty = bDirty;
if (m_pbtnApply)
{
m_pbtnApply->EnableWindow(m_bIsDirty);
}
}
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// Class: CTrapParams
//
// This class represents the information stored in the
// SNMP_EVENTS\EventLog\Parameters registry key.
//
// Question: Why is it that the horizontal space in the gap between
// the lines at the top of this header appears to be very irregular?
//////////////////////////////////////////////////////////////////
//****************************************************************
// CTrapParams::CTrapParams
//
// Constructor for CTrapParams.
//
//
// Parameters:
// None.
//
// Returns:
// Nothing.
//
//****************************************************************
CTrapParams::CTrapParams()
{
m_trapsize.m_bTrimFlag = TRUE;
m_trapsize.m_dwMaxTrapSize = 4096;
m_trapsize.m_bTrimMessages = FALSE;
}
//********************************************************************
// CTrapParams::Deserialize
//
// Read the contents of this CTrapParams object from the registry.
//
// Parameters:
// None.
//
// Returns:
// SCODE
// S_OK if successful.
// E_FAIL if there was a problem reading the required information
// from the registry.
//********************************************************************
SCODE CTrapParams::Deserialize()
{
CRegistryKey regkeyParams;
if (!g_reg.m_regkeySnmp.GetSubKey(SZ_REGKEY_PARAMETERS, regkeyParams)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_REGKEY_NOT_FOUND;
}
}
CRegistryValue regval;
// !!!CR: There is no longer any reason to load the BASE OID
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_BASE_ENTERPRISE_OID, regval))
goto REGISTRY_FAILURE;
m_sBaseEnterpriseOID = (LPCTSTR)regval.m_pData;
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_TRIMFLAG, regval))
m_trapsize.m_bTrimFlag = FALSE;
else
m_trapsize.m_bTrimFlag = (*(DWORD*)regval.m_pData == 1);
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_MAXTRAP_SIZE, regval))
m_trapsize.m_dwMaxTrapSize = MAX_TRAP_SIZE;
else
m_trapsize.m_dwMaxTrapSize = *(DWORD*)regval.m_pData;
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_TRIM_MESSAGE, regval))
m_trapsize.m_bTrimMessages = TRUE;
else
m_trapsize.m_bTrimMessages = (*(DWORD*)regval.m_pData) != 0;
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_THRESHOLDENABLED, regval))
m_throttle.m_bIsEnabled = TRUE;
else
m_throttle.m_bIsEnabled = (*(DWORD*)regval.m_pData) != THROTTLE_DISABLED;
// Threshold trap count.
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_THRESHOLDCOUNT, regval) ||
*(DWORD*)regval.m_pData < 2)
m_throttle.m_nTraps = THRESHOLD_COUNT;
else
m_throttle.m_nTraps = *(DWORD*)regval.m_pData;
// Threshold time in seconds
if (!regkeyParams.GetValue(SZ_REGKEY_PARAMS_THRESHOLDTIME, regval))
m_throttle.m_nSeconds = THRESHOLD_TIME;
else
m_throttle.m_nSeconds = *(DWORD*)regval.m_pData;
if (regkeyParams.Close() != ERROR_SUCCESS) {
goto REGISTRY_FAILURE;
}
return S_OK;
REGISTRY_FAILURE:
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -