📄 trapreg.cpp
字号:
SCODE sc = S_OK;
if (m_aEvents.GetSize() > 0) {
CRegistryKey regkey;
if (!regkeyParent.CreateSubKey(m_sName, regkey)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_REGKEY_NOT_FOUND;
}
}
CString sEnterpriseOID;
GetEnterpriseOID(sEnterpriseOID);
CRegistryValue regval;
regval.Set(SZ_REGKEY_SOURCE_ENTERPRISE_OID,
REG_SZ, (sEnterpriseOID.GetLength() + 1) * sizeof(TCHAR),
(LPBYTE)(LPCTSTR)sEnterpriseOID);
regkey.SetValue(regval);
DWORD dwAppend = 1;
regval.Set(SZ_REGKEY_SOURCE_APPEND, REG_DWORD, sizeof(DWORD), (LPBYTE) &dwAppend);
regkey.SetValue(regval);
sc = m_aEvents.Serialize(regkey);
regkey.Close();
}
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
return sc;
}
//*******************************************************************
// CXEventSource::GetEnterpriseOID
//
// Get the enterprise OID for this event source. The enterprise OID
// is composed of a prefix and suffix string concatenated together. The
// prefix string is an ASCII decimal value for the length of the suffix
// string. The suffix string is composed by separating each character of
// the name of this source by a "." character.
//
// Parameters:
// CString& sEnterpriseOID
// A reference to the string where the enterprise OID for this
// source will be returned.
//
// Returns:
// The enterprise OID in via the sEnterpriseOID reference.
//
//********************************************************************
void CXEventSource::GetEnterpriseOID(CString& sEnterpriseOID, BOOL bGetFullID)
{
CString sValue;
// Form the prefix string in sEnterpriseOID and compute the length
// of the prefix and suffix strings.
DecString(sValue, m_sName.GetLength());
if (bGetFullID) {
sEnterpriseOID = g_reg.m_params.m_sBaseEnterpriseOID + _T('.') + sValue;
}
else {
sEnterpriseOID = sValue;
}
// Append the suffix string to the prefix string by getting a pointer to
// the sEnterpriseOID buffer and allocating enough space to hold the
// combined strings.
LPCTSTR pszSrc = m_sName;
// Append the suffix by copying it to the destination buffer and inserting the
// "." separator characters as we go.
LONG iCh;
while (iCh = *pszSrc++) {
switch(sizeof(TCHAR)) {
case 1:
iCh &= 0x0ff;
break;
case 2:
iCh &= 0x0ffffL;
break;
default:
ASSERT(FALSE);
break;
}
DecString(sValue, iCh);
sEnterpriseOID += _T('.');
sEnterpriseOID += sValue;
}
}
///////////////////////////////////////////////////////////////////
// Class: CXEventArray
//
// This class implements an array of pointers to CXEvent objects.
// The events contained in this array correspond to the events that
// the user has configured in the main dialog. Don't confuse events
// with messages. Events are the subset of the messages that the
// user has selected to be translated into traps.
//
// For further information on how this CXEventArray fits into the
// scheme of things, please see the CXEventSource class header.
//////////////////////////////////////////////////////////////////
//************************************************************************
// CXEventArray::Deserialize
//
// Read an array of events from the registry for the given
// source.
//
// Parameters:
// CXEventSource* pEventSource
// Pointer to the event source who's events should be read.
//
// Returns:
// SCODE
// S_OK if successful.
// E_FAIL if an error occurs.
//
//************************************************************************
SCODE CXEventArray::Deserialize(CXEventSource* pEventSource)
{
if (!g_reg.SourceHasTraps(pEventSource->m_sName)) {
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerSource)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerSource;
return S_OK;
}
// Control comes here if we know that there are events configured
// for the event source that this event array is part of. We now
// need to load the events for this source by enumerating them
// from SNMP_EVENTS\EventLog\<event source>
CString sKey;
sKey = sKey + SZ_REGKEY_SOURCES + _T("\\") + pEventSource->m_sName;
CRegistryKey regkey;
if (!g_reg.m_regkeySnmp.GetSubKey(sKey, regkey)) {
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerSource)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerSource;
return S_OK;
}
// Enumerate the events for this source
CStringArray* pasEvents = regkey.EnumSubKeys();
if (pasEvents == NULL) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
regkey.Close();
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerSource)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerSource;
return E_FAIL;
}
// Iterate though all the events and add them as a sub-item
// under the event source.
LONG nEvents = (LONG)pasEvents->GetSize();
LONG nStepsDone = 0;
LONG nEventsPerStep = 0;
if (g_reg.m_nLoadStepsPerSource > 0) {
nEventsPerStep = nEvents / g_reg.m_nLoadStepsPerSource;
}
for (LONG iEvent=0; iEvent< nEvents; ++iEvent)
{
CString sEvent = pasEvents->GetAt(iEvent);
CXEvent* pEvent = new CXEvent(pEventSource);
SCODE sc = pEvent->Deserialize(regkey, sEvent);
if (sc == E_MESSAGE_NOT_FOUND) {
delete pEvent;
if (!g_reg.m_bSomeMessageWasNotFound) {
AfxMessageBox(IDS_ERR_MESSAGE_NOT_FOUND, MB_OK | MB_ICONEXCLAMATION);
g_reg.m_bSomeMessageWasNotFound = TRUE;
g_reg.SetDirty(TRUE);
}
continue;
}
if ((sc == S_LOAD_CANCELED) || FAILED(sc) ) {
delete pEvent;
delete pasEvents;
return sc;
}
if (nEventsPerStep > 0) {
if ((iEvent % nEventsPerStep) == (nEventsPerStep - 1)) {
if (g_reg.m_pdlgLoadProgress->StepProgress()) {
delete pasEvents;
return S_LOAD_CANCELED;
}
++g_reg.m_nLoadSteps;
++nStepsDone;
}
}
}
delete pasEvents;
regkey.Close();
if (nStepsDone < g_reg.m_nLoadStepsPerSource) {
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerSource - nStepsDone)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerSource - nStepsDone;
}
return S_OK;
}
//************************************************************************
// CXEventArray::Serialize
//
// Write the current configuration for the events contained in this array
// out to the registry.
//
// Parameters:
// CRegistryKey& regkeyParent
// An open registry key for the source that owns these events.
// The source key is located in SNMP_EVENTS\EventLogs\<source-key>
//
// Returns:
// SCODE
// S_OK = All events saved without errors.
// S_SAVE_CANCELED = No errors, but the user canceled the save.
// E_FAIL = An error occurs.
//
//************************************************************************
SCODE CXEventArray::Serialize(CRegistryKey& regkeyParent)
{
SCODE sc = S_OK;
LONG nEvents = GetSize();
for (LONG iEvent = 0; iEvent < nEvents; ++iEvent) {
SCODE scTemp = GetAt(iEvent)->Serialize(regkeyParent);
if (scTemp == S_SAVE_CANCELED) {
sc = S_SAVE_CANCELED;
break;
}
if (FAILED(scTemp)) {
if (g_bLostConnection) {
sc = E_REGKEY_LOST_CONNECTION;
}
else {
sc = E_FAIL;
}
break;
}
}
return sc;
}
//***********************************************************************
// CXEventArray::Add
//
// Add an event pointer to this array. Note that there is no assumption
// that the array owns the pointer. Someone must explicitly call the DeleteAll
// member to delete the pointers stored in this array.
//
// Parameters:
// CXEvent* pEvent
// Pointer to the event to add to this array.
//
// Returns:
// Nothing.
//
//***********************************************************************
void CXEventArray::Add(CXEvent* pEvent)
{
CBaseArray::Add(pEvent);
}
//***********************************************************************
// CXEventArray::FindEvent
//
// Given an event id, find the corresponding event in this array.
//
// Note that this array should never contain duplicate events.
//
// Parameters:
// DWORD dwId
// The event ID.
//
// Returns:
// CXEvent*
// A pointer to the desired event. NULL if the event was
// not found.
//
//***********************************************************************
CXEvent* CXEventArray::FindEvent(DWORD dwId)
{
LONG nEvents = GetSize();
for (LONG iEvent=0; iEvent < nEvents; ++iEvent) {
CXEvent* pEvent = GetAt(iEvent);
if (pEvent->m_message.m_dwId == dwId) {
return pEvent;
}
}
return NULL;
}
//***********************************************************************
// CXEventArray::FindEvent
//
// Given an event pointer, remove the event from this array.
//
// Parameters:
// CXEvent* pEventRemove
// A pointer to the event to remove.
//
// Returns:
// SCODE
// S_OK if the event was removed.
// E_FAIL if the event was not found in this array.
//
//***********************************************************************
SCODE CXEventArray::RemoveEvent(CXEvent* pEventRemove)
{
// Iterate through the event array to search for the specified event.
LONG nEvents = GetSize();
for (LONG iEvent=0; iEvent < nEvents; ++iEvent) {
CXEvent* pEvent = GetAt(iEvent);
if (pEvent == pEventRemove) {
RemoveAt(iEvent);
return S_OK;
}
}
return E_FAIL;
}
///////////////////////////////////////////////////////////////////
// Class: CXEvent
//
// This class implements an event. Events are the subset of the
// messages that the user selects to be translated into traps.
// Events, and not messages, are what the user configures.
//
// For further information on how this class fits into the
// scheme of things, please see the CXEventSource class header.
//////////////////////////////////////////////////////////////////
//*********************************************************************
// CXEvent::CXEvent
//
// Construct the event.
//
// Parameters:
// CXEventSource* pEventSource
// Pointer to the event source that has the potential to generate
// this event.
//
// Returns:
// Nothing.
//
//*********************************************************************
CXEvent::CXEvent(CXEventSource* pEventSource) : m_message(pEventSource)
{
m_dwCount = 0;
m_dwTimeInterval = 0;
m_pEventSource = pEventSource;
m_pEventSource->m_aEvents.Add(this);
}
//**********************************************************************
// CXEvent::CXEvent
//
// Construct an event. This form of the constructor creates an event
// directly from a CXMessage object. This is possible because the
// CXMessage object contains a back-pointer to its source.
//
// Parameters:
// CXMessage* pMessage
// Pointer to the message that is used as the event template.
//
// Returns:
// Nothing.
//**********************************************************************
CXEvent::CXEvent(CXMessage* pMessage) : m_message(pMessage->m_pEventSource)
{
m_pEventSource = pMessage->m_pEventSource;
m_message = *pMessage;
m_dwCount = 0;
m_dwTimeInterval = 0;
m_pEventSource->m_aEvents.Add(this);
}
//**********************************************************************
// CXEvent
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -