From 8bbef2865455754425a84b86680a89bff8aa7691 Mon Sep 17 00:00:00 2001 From: gcontini <1121667+gcontini@users.noreply.github.com> Date: 周六, 19 10月 2019 08:50:45 +0800 Subject: [PATCH] issue #64 , issue #56 (part) --- src/library/base/EventRegistry.cpp | 188 +++++++++++++++++++++++++++++----------------- 1 files changed, 119 insertions(+), 69 deletions(-) diff --git a/src/library/base/EventRegistry.cpp b/src/library/base/EventRegistry.cpp index 389ee42..ec9d4c1 100644 --- a/src/library/base/EventRegistry.cpp +++ b/src/library/base/EventRegistry.cpp @@ -2,106 +2,151 @@ * EventRegistry.cpp * * Created on: Mar 30, 2014 - * + * */ -#include "EventRegistry.h" #include <cstddef> #include <string.h> #include <algorithm> +#include <map> +#include <iostream> + +#include "EventRegistry.h" +#define LIC_ID_NOT_DEFINED "UNDEF" namespace license { using namespace std; +const map<EVENT_TYPE, int> PROGRESS_BY_EVENT_TYPE = { { LICENSE_SPECIFIED, 0 }, + { LICENSE_FOUND, 1 }, { PRODUCT_FOUND, 2 }, { SIGNATURE_VERIFIED, 3 }, { + LICENSE_OK, 4 } }; + EventRegistry::EventRegistry() { + current_validation_step = -1; } -EventRegistry& operator<<(EventRegistry& eventRegistry, - AuditEvent& securityEvent) { +EventRegistry& operator<<(EventRegistry &eventRegistry, + AuditEvent &securityEvent) { eventRegistry.logs.push_back(securityEvent); return eventRegistry; } -EventRegistry& operator<<(EventRegistry& eventRegistry1, - EventRegistry& otherRegistry) { +EventRegistry& operator<<(EventRegistry &eventRegistry1, + EventRegistry &otherRegistry) { eventRegistry1.append(otherRegistry); return eventRegistry1; } -void EventRegistry::append(const EventRegistry& eventRegistry) { +ostream& operator<<(std::ostream &out, const EventRegistry &er) { + out << string("EventReg[step:") << er.current_validation_step + << ",events:{"; + for (auto &it : er.logs) { + out << "[ev:" << it.event_type << ",sev:" << it.severity << "ref:" + << it.license_reference << "]"; + } + out << "]"; + return out; +} + +void EventRegistry::append(const EventRegistry &eventRegistry) { logs.insert(logs.end(), eventRegistry.logs.begin(), eventRegistry.logs.end()); } -void EventRegistry::turnLastEventIntoError() { - if (logs.size() > 0) { - logs.back().severity = SVRT_ERROR; +AuditEvent const* EventRegistry::getLastFailure() const { + const AuditEvent *result = nullptr; + if (logs.size() == 0) { + return result; + } + //try to find a failure between the licenses who progressed the most + if (mostAdvancedLogIdx_by_LicenseId.size() > 0) { + for (auto const &mostAdvLogIter : mostAdvancedLogIdx_by_LicenseId) { + const AuditEvent ¤tLog = logs[mostAdvLogIter.second]; + if (currentLog.severity == SVRT_ERROR) { + result = &(currentLog); + break; + } + } + } + if (result == nullptr) { + auto it = logs.end(); + do { + --it; + if (it->severity == SVRT_ERROR) { + result = &(*it); + break; + } + } while (it != logs.begin()); + } + return result; +} + +void EventRegistry::addEvent(EVENT_TYPE event, + const std::string &licenseLocationId) { + addEvent(event, licenseLocationId.c_str(), nullptr); +} + +void EventRegistry::addEvent(EVENT_TYPE event, const char *licenseLocationId, + const char *info) { + AuditEvent audit; + auto eventIterator = PROGRESS_BY_EVENT_TYPE.find(event); + bool successEvent = (eventIterator != PROGRESS_BY_EVENT_TYPE.end()); + audit.severity = successEvent ? SVRT_INFO : SVRT_WARN; + audit.event_type = event; + if (licenseLocationId == nullptr) { + strcpy(audit.license_reference, LIC_ID_NOT_DEFINED); + } else { + strncpy(audit.license_reference, licenseLocationId, MAX_PATH); + } + if (info == nullptr) { + audit.param2[0] = '\0'; + } else { + strncpy(audit.param2, info, 255); + } + logs.push_back(audit); +//udpate the status of the log + if (successEvent) { + int step = eventIterator->second; + if (step > current_validation_step) { + mostAdvancedLogIdx_by_LicenseId.clear(); + current_validation_step = step; + } + + if (step == current_validation_step) { + mostAdvancedLogIdx_by_LicenseId[audit.license_reference] = + logs.size() - 1; + } + } else if (mostAdvancedLogIdx_by_LicenseId.find(audit.license_reference) + != mostAdvancedLogIdx_by_LicenseId.end()) { + mostAdvancedLogIdx_by_LicenseId[audit.license_reference] = logs.size() + - 1; } } -bool EventRegistry::turnEventIntoError(EVENT_TYPE event) { +bool EventRegistry::turnWarningsIntoErrors() { bool eventFound = false; - for (auto it = logs.begin(); it != logs.end(); ++it) { - if (it->event_type == event) { - it->severity = SVRT_ERROR; - eventFound = true; + if (mostAdvancedLogIdx_by_LicenseId.size() > 0) { + for (auto const &mostAdvLogIter : mostAdvancedLogIdx_by_LicenseId) { + AuditEvent ¤tLog = logs[mostAdvLogIter.second]; + if (currentLog.severity == SVRT_WARN + || currentLog.severity == SVRT_ERROR) { + currentLog.severity = SVRT_ERROR; + eventFound = true; + } + } + } + if (!eventFound) { + for (auto it = logs.begin(); it != logs.end(); ++it) { + if (it->severity == SVRT_WARN) { + it->severity = SVRT_ERROR; + eventFound = true; + } } } return eventFound; } -AuditEvent const * EventRegistry::getLastFailure() const { - const AuditEvent* result = nullptr; - if (logs.size() == 0) { - return result; - } - auto it = logs.end(); - do { - --it; - if (it->severity == SVRT_ERROR) { - result = &(*it); - break; - } - } while (it != logs.begin()); - return result; - -} - -bool EventRegistry::isGood() const { - bool isGood = true; - for (auto it = logs.begin(); it != logs.end(); ++it) { - if (it->severity == SVRT_ERROR) { - isGood = false; - break; - } - } - return isGood; -} - -void EventRegistry::addError(EVENT_TYPE event) { - this->addEvent(event, SVRT_ERROR); -} - -void EventRegistry::addEvent(EVENT_TYPE event, SEVERITY severity) { - AuditEvent audit; - audit.severity = severity; - audit.event_type = event; - audit.param1[0] = '\0'; - audit.param2[0] = '\0'; - logs.push_back(audit); -} - -void EventRegistry::addEvent(EVENT_TYPE event, SEVERITY severity, - const string& eventParameter) { - AuditEvent audit; - audit.severity = severity; - audit.event_type = event; - strncpy(audit.param1, eventParameter.c_str(), 255); - audit.param2[0] = '\0'; - logs.push_back(audit); -} - -bool EventRegistry::turnErrosIntoWarnings() { +bool EventRegistry::turnErrorsIntoWarnings() { bool eventFound = false; for (auto it = logs.begin(); it != logs.end(); ++it) { if (it->severity == SVRT_ERROR) { @@ -112,9 +157,14 @@ return eventFound; } -void EventRegistry::exportLastEvents(AuditEvent* auditEvents, int nlogs) { +void EventRegistry::exportLastEvents(AuditEvent *auditEvents, int nlogs) { const int sizeToCopy = min(nlogs, (int) logs.size()); - std::copy(logs.begin(), logs.begin() + sizeToCopy, auditEvents); + std::copy(logs.end() - sizeToCopy, logs.end(), auditEvents); } + +bool EventRegistry::isGood() const { + return getLastFailure() == nullptr; +} + } -- Gitblit v1.9.1