/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "WardenPayloadMgr.h" #include "Errors.h" #include "Log.h" #include "StringFormat.h" WardenPayloadMgr::WardenPayloadMgr() { } uint16 WardenPayloadMgr::GetFreePayloadId() { uint16 payloadId = WardenPayloadOffsetMin; while (CachedChecks.find(payloadId) != CachedChecks.end()) { payloadId++; if (payloadId > WardenPayloadMgr::WardenPayloadOffsetMax) { LOG_ERROR("warden", "Max warden payload id of '{}' passed!", WardenPayloadMgr::WardenPayloadOffsetMax); return 0; } } return payloadId; } uint16 WardenPayloadMgr::RegisterPayload(const std::string& payload) { uint16 payloadId = GetFreePayloadId(); if (!payloadId || !RegisterPayload(payload, payloadId, false)) { LOG_ERROR("warden", "Failed to register payload."); return 0; } return payloadId; } bool WardenPayloadMgr::RegisterPayload(std::string const& payload, uint16 payloadId, bool replace) { //Payload id should be over or equal to the offset to prevent conflicts. if (payloadId < WardenPayloadMgr::WardenPayloadOffsetMin) { LOG_ERROR("warden", "Tried to register payloadId lower than '{}'.", WardenPayloadMgr::WardenPayloadOffsetMin); return false; } auto it = CachedChecks.find(payloadId); if (it != CachedChecks.end() && !replace) { LOG_ERROR("warden", "Payload Id '{}' already exists in CachedChecks.", payloadId); return false; } WardenCheck wCheck; wCheck.Type = WardenPayloadMgr::WardenPayloadCheckType; wCheck.Str = payload; wCheck.CheckId = payloadId; std::string idStr = Acore::StringFormat("{:04}", payloadId); ASSERT(idStr.size() == 4); std::copy(idStr.begin(), idStr.end(), wCheck.IdStr.begin()); if (replace) { CachedChecks.erase(payloadId); } CachedChecks.emplace(payloadId, wCheck); return true; } bool WardenPayloadMgr::UnregisterPayload(uint16 payloadId) { return CachedChecks.erase(payloadId); } WardenCheck* WardenPayloadMgr::GetPayloadById(uint16 payloadId) { auto it = CachedChecks.find(payloadId); if (it != CachedChecks.end()) { return &it->second; } return nullptr; } void WardenPayloadMgr::QueuePayload(uint16 payloadId, bool pushToFront) { auto it = CachedChecks.find(payloadId); //Do not queue a payload if there is no payload matching the payloadId. if (it == CachedChecks.end()) { LOG_ERROR("warden", "Failed to queue payload id '{}' as it does not exist in CachedChecks.", payloadId); return; } if (pushToFront) { QueuedPayloads.push_front(payloadId); } else { QueuedPayloads.push_back(payloadId); } } bool WardenPayloadMgr::DequeuePayload(uint16 payloadId) { std::size_t const queueSize = QueuedPayloads.size(); QueuedPayloads.remove(payloadId); return queueSize != QueuedPayloads.size(); } void WardenPayloadMgr::ClearQueuedPayloads() { QueuedPayloads.clear(); } uint32 WardenPayloadMgr::GetPayloadCountInQueue() { return QueuedPayloads.size(); } std::list* WardenPayloadMgr::GetPayloadsInQueue() { return &QueuedPayloads; }