windows-nt/Source/XPSP1/NT/net/snmp/subagent/snmpevnt/evntcmd/operation.cpp
2020-09-26 16:20:57 +08:00

260 lines
6.4 KiB
C++

#include <stdafx.h>
#include "Errors.h"
#include "Parser.h"
#include "Registry.h"
#include "EventCmd.h"
COperation::COperation(tOperation operation)
{
m_Operation = operation;
m_pNextOperation = NULL;
}
COperation::~COperation()
{
if (m_pNextOperation)
delete m_pNextOperation;
}
COperation* COperation::Insert(COperation *pOperation)
{
if (pOperation->m_Operation < m_Operation)
{
pOperation->m_pNextOperation = this;
return pOperation;
}
if (m_pNextOperation == NULL)
m_pNextOperation = pOperation;
else
m_pNextOperation = m_pNextOperation->Insert(pOperation);
return this;
}
COperation* COperation::GetNextOp()
{
return m_pNextOperation;
}
DWORD COperation::CheckedStrToDword(DWORD & dwDword, char *szDword)
{
dwDword = 0;
while (*szDword != '\0')
{
if (*szDword < '0' || *szDword > '9')
return ERROR_BAD_FORMAT;
dwDword *= 10;
dwDword += (*szDword++ - '0');
}
return ERROR_SUCCESS;
}
COpEvents::COpEvents(tOperation operation) : COperation(operation)
{
m_szEventSource = NULL;
m_dwEventID = 0;
m_dwCount = 1;
m_dwTime = 0;
}
COpEvents::~COpEvents()
{
if (m_szEventSource != NULL)
delete m_szEventSource;
}
DWORD COpEvents::ParseCmdArgs()
{
DWORD retCode;
char szToken[INPUT_TOKEN_SZ];
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) != ERROR_SUCCESS ||
(retCode = gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN16,
gParser.m_nLineNo,
gParser.m_nTokenNo);
return retCode;
}
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) != ERROR_SUCCESS ||
(retCode = gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN17,
gParser.m_nLineNo,
gParser.m_nTokenNo);
return retCode;
}
if (m_szEventSource != NULL)
delete m_szEventSource;
m_szEventSource = new char[sizeof(szToken) + 1];
strcpy(m_szEventSource, szToken);
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) != ERROR_SUCCESS ||
(retCode = gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken)) != ERROR_SUCCESS ||
(retCode = CheckedStrToDword(m_dwEventID, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN18,
gParser.m_nLineNo,
gParser.m_nTokenNo);
return retCode;
}
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) == ERROR_SUCCESS)
{
if (gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken) != ERROR_SUCCESS)
goto done;
if ((retCode = CheckedStrToDword(m_dwCount, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN19,
gParser.m_nLineNo,
gParser.m_nTokenNo);
return retCode;
}
}
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) == ERROR_SUCCESS)
{
if (gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken) != ERROR_SUCCESS)
goto done;
if ((retCode = CheckedStrToDword(m_dwTime, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN20,
gParser.m_nLineNo,
gParser.m_nTokenNo);
return retCode;
}
}
if (m_dwCount <= 1 && m_dwTime > 0)
{
_W(WARN_ALERT, IDS_ALRT_WRN21,
gParser.m_nLineNo,
gParser.m_nTokenNo,
m_dwTime);
m_dwTime = 0;
}
if (m_dwCount >= 2 && m_dwTime == 0)
{
_W(WARN_ALERT, IDS_ALRT_WRN22,
gParser.m_nLineNo,
gParser.m_nTokenNo,
m_dwCount,
m_dwTime);
}
done:
retCode = ERROR_SUCCESS;
if (m_dwCount >= 2 && m_dwTime == 0)
m_dwTime = 1;
_W(WARN_ATTENTION, IDS_ALRT_WRN23,
m_Operation == OP_ADD_EVENT ? "ADD" : "DELETE",
m_szEventSource,
m_dwEventID,
m_dwCount,
m_dwTime);
return retCode;
};
DWORD COpEvents::ProcessCommand()
{
DWORD retCode;
switch(m_Operation)
{
case OP_ADD_EVENT:
retCode = gRegistry.AddEvent(m_szEventSource, m_dwEventID, m_dwCount, m_dwTime);
break;
case OP_DEL_EVENT:
retCode = gRegistry.DelEvent(m_szEventSource, m_dwEventID);
break;
default:
return _E(ERROR_INTERNAL_ERROR, IDS_ERR02, m_Operation);
}
return retCode;
}
COpTraps::COpTraps(tOperation operation) : COperation(operation)
{
m_szCommunity = NULL;
m_szAddress = NULL;
}
COpTraps::~COpTraps()
{
if (m_szCommunity != NULL)
delete m_szCommunity;
if (m_szAddress != NULL)
delete m_szAddress;
}
DWORD COpTraps::ParseCmdArgs()
{
DWORD retCode;
char szToken[INPUT_TOKEN_SZ];
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) != ERROR_SUCCESS ||
(retCode = gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN24,
gParser.m_nLineNo,
gParser.m_nTokenNo);
return retCode;
}
if (m_szCommunity != NULL)
delete m_szCommunity;
m_szCommunity = new char[strlen(szToken)+1];
if (m_szCommunity == NULL)
return _E(ERROR_OUTOFMEMORY, IDS_ERR01);
strcpy(m_szCommunity, szToken);
if ((retCode = gParser.GetNextToken(szToken, INPUT_TOKEN_SZ)) != ERROR_SUCCESS ||
(retCode = gParser.CheckUnGetToken(KEYWORD_PRAGMA, szToken)) != ERROR_SUCCESS)
{
_W(WARN_ALERT, IDS_ALRT_WRN25,
gParser.m_nLineNo,
gParser.m_nTokenNo);
}
if (m_szAddress != NULL)
delete m_szAddress;
m_szAddress = new char [strlen(szToken) + 1];
if (m_szAddress == NULL)
return _E(ERROR_OUTOFMEMORY, IDS_ERR01);
strcpy(m_szAddress, szToken);
_W(WARN_ATTENTION, IDS_ATTN_WRN26,
m_Operation == OP_ADD_TRAP ? "ADD_TRAP_DEST" : "DELETE_TRAP_DEST",
m_szCommunity,
m_szAddress);
return ERROR_SUCCESS;
}
DWORD COpTraps::ProcessCommand()
{
DWORD retCode;
switch(m_Operation)
{
case OP_ADD_TRAP:
retCode = gRegistry.AddTrap(m_szCommunity, m_szAddress);
break;
case OP_DEL_TRAP:
retCode = gRegistry.DelTrap(m_szCommunity, m_szAddress);
break;
default:
return _E(ERROR_INTERNAL_ERROR, IDS_ERR03, m_Operation);
}
return retCode;
}