19368eea42a1afb01dd44110582f997115b50e742François Gaffie/* 29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2015, Intel Corporation 39368eea42a1afb01dd44110582f997115b50e742François Gaffie * All rights reserved. 49368eea42a1afb01dd44110582f997115b50e742François Gaffie * 59368eea42a1afb01dd44110582f997115b50e742François Gaffie * Redistribution and use in source and binary forms, with or without modification, 69368eea42a1afb01dd44110582f997115b50e742François Gaffie * are permitted provided that the following conditions are met: 79368eea42a1afb01dd44110582f997115b50e742François Gaffie * 89368eea42a1afb01dd44110582f997115b50e742François Gaffie * 1. Redistributions of source code must retain the above copyright notice, this 99368eea42a1afb01dd44110582f997115b50e742François Gaffie * list of conditions and the following disclaimer. 109368eea42a1afb01dd44110582f997115b50e742François Gaffie * 119368eea42a1afb01dd44110582f997115b50e742François Gaffie * 2. Redistributions in binary form must reproduce the above copyright notice, 129368eea42a1afb01dd44110582f997115b50e742François Gaffie * this list of conditions and the following disclaimer in the documentation and/or 139368eea42a1afb01dd44110582f997115b50e742François Gaffie * other materials provided with the distribution. 149368eea42a1afb01dd44110582f997115b50e742François Gaffie * 159368eea42a1afb01dd44110582f997115b50e742François Gaffie * 3. Neither the name of the copyright holder nor the names of its contributors 169368eea42a1afb01dd44110582f997115b50e742François Gaffie * may be used to endorse or promote products derived from this software without 179368eea42a1afb01dd44110582f997115b50e742François Gaffie * specific prior written permission. 189368eea42a1afb01dd44110582f997115b50e742François Gaffie * 199368eea42a1afb01dd44110582f997115b50e742François Gaffie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 209368eea42a1afb01dd44110582f997115b50e742François Gaffie * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 219368eea42a1afb01dd44110582f997115b50e742François Gaffie * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 229368eea42a1afb01dd44110582f997115b50e742François Gaffie * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 239368eea42a1afb01dd44110582f997115b50e742François Gaffie * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 249368eea42a1afb01dd44110582f997115b50e742François Gaffie * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 259368eea42a1afb01dd44110582f997115b50e742François Gaffie * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 269368eea42a1afb01dd44110582f997115b50e742François Gaffie * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 279368eea42a1afb01dd44110582f997115b50e742François Gaffie * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 289368eea42a1afb01dd44110582f997115b50e742François Gaffie * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 299368eea42a1afb01dd44110582f997115b50e742François Gaffie */ 309368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <ParameterMgrFullConnector.h> 319368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <vector> 329368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <utility> 339368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <string> 349368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <algorithm> 359368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <sstream> 369368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <iterator> 379368eea42a1afb01dd44110582f997115b50e742François Gaffie 389368eea42a1afb01dd44110582f997115b50e742François Gaffienamespace parameterFramework 399368eea42a1afb01dd44110582f997115b50e742François Gaffie{ 409368eea42a1afb01dd44110582f997115b50e742François Gaffie 419368eea42a1afb01dd44110582f997115b50e742François Gaffie/** Logger that stores all fed log in order retrieve them asynchronously. 429368eea42a1afb01dd44110582f997115b50e742François Gaffie * Compatible with the ParameterFramework::Ilogger api. 439368eea42a1afb01dd44110582f997115b50e742François Gaffie * Usually used in tests to inspect what was logged by a PF instances 449368eea42a1afb01dd44110582f997115b50e742François Gaffie * (eg: test if a warring occurred). 459368eea42a1afb01dd44110582f997115b50e742François Gaffie */ 469368eea42a1afb01dd44110582f997115b50e742François Gaffieclass StoreLogger : public CParameterMgrFullConnector::ILogger 479368eea42a1afb01dd44110582f997115b50e742François Gaffie{ 489368eea42a1afb01dd44110582f997115b50e742François Gaffiepublic: 499368eea42a1afb01dd44110582f997115b50e742François Gaffie struct Log 509368eea42a1afb01dd44110582f997115b50e742François Gaffie { 519368eea42a1afb01dd44110582f997115b50e742François Gaffie enum class Level 529368eea42a1afb01dd44110582f997115b50e742François Gaffie { 539368eea42a1afb01dd44110582f997115b50e742François Gaffie info, 549368eea42a1afb01dd44110582f997115b50e742François Gaffie warning 559368eea42a1afb01dd44110582f997115b50e742François Gaffie }; 569368eea42a1afb01dd44110582f997115b50e742François Gaffie Level level; 579368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string msg; 589368eea42a1afb01dd44110582f997115b50e742François Gaffie bool operator==(const Log &other) const 599368eea42a1afb01dd44110582f997115b50e742François Gaffie { 609368eea42a1afb01dd44110582f997115b50e742François Gaffie return level == other.level and msg == other.msg; 619368eea42a1afb01dd44110582f997115b50e742François Gaffie } 629368eea42a1afb01dd44110582f997115b50e742François Gaffie }; 639368eea42a1afb01dd44110582f997115b50e742François Gaffie using Logs = std::vector<Log>; 649368eea42a1afb01dd44110582f997115b50e742François Gaffie 659368eea42a1afb01dd44110582f997115b50e742François Gaffie void warning(const std::string &strLog) override 669368eea42a1afb01dd44110582f997115b50e742François Gaffie { 679368eea42a1afb01dd44110582f997115b50e742François Gaffie logs.push_back({Log::Level::warning, strLog}); 689368eea42a1afb01dd44110582f997115b50e742François Gaffie } 699368eea42a1afb01dd44110582f997115b50e742François Gaffie void info(const std::string &strLog) override { logs.push_back({Log::Level::info, strLog}); } 709368eea42a1afb01dd44110582f997115b50e742François Gaffie 719368eea42a1afb01dd44110582f997115b50e742François Gaffie const Logs &getLogs() const { return logs; } 729368eea42a1afb01dd44110582f997115b50e742François Gaffie 739368eea42a1afb01dd44110582f997115b50e742François Gaffie const Logs filter(Log::Level level) const 749368eea42a1afb01dd44110582f997115b50e742François Gaffie { 759368eea42a1afb01dd44110582f997115b50e742François Gaffie return filter([&level](const Log &log) { return log.level == level; }); 769368eea42a1afb01dd44110582f997115b50e742François Gaffie }; 779368eea42a1afb01dd44110582f997115b50e742François Gaffie 789368eea42a1afb01dd44110582f997115b50e742François Gaffie Logs match(const std::string &pattern) const 799368eea42a1afb01dd44110582f997115b50e742François Gaffie { 809368eea42a1afb01dd44110582f997115b50e742François Gaffie return filter( 819368eea42a1afb01dd44110582f997115b50e742François Gaffie [&pattern](const Log &log) { return log.msg.find(pattern) == std::string::npos; }); 829368eea42a1afb01dd44110582f997115b50e742François Gaffie } 839368eea42a1afb01dd44110582f997115b50e742François Gaffie 849368eea42a1afb01dd44110582f997115b50e742François Gaffieprivate: 859368eea42a1afb01dd44110582f997115b50e742François Gaffie template <class Predicate> 869368eea42a1afb01dd44110582f997115b50e742François Gaffie Logs filter(Predicate predicate) const 879368eea42a1afb01dd44110582f997115b50e742François Gaffie { 889368eea42a1afb01dd44110582f997115b50e742François Gaffie Logs filtered; 899368eea42a1afb01dd44110582f997115b50e742François Gaffie std::copy_if(logs.begin(), logs.end(), std::back_inserter(filtered), predicate); 909368eea42a1afb01dd44110582f997115b50e742François Gaffie return filtered; 919368eea42a1afb01dd44110582f997115b50e742François Gaffie } 929368eea42a1afb01dd44110582f997115b50e742François Gaffie 939368eea42a1afb01dd44110582f997115b50e742François Gaffie Logs logs; 949368eea42a1afb01dd44110582f997115b50e742François Gaffie}; 959368eea42a1afb01dd44110582f997115b50e742François Gaffie 969368eea42a1afb01dd44110582f997115b50e742François Gaffie/** Overload input stream operator to pretty print a StoreLogger::Log::Level. */ 979368eea42a1afb01dd44110582f997115b50e742François Gaffiestd::ostream &operator<<(std::ostream &os, const StoreLogger::Log::Level &level) 989368eea42a1afb01dd44110582f997115b50e742François Gaffie{ 999368eea42a1afb01dd44110582f997115b50e742François Gaffie auto levelStr = "UNREACHABLE"; 1009368eea42a1afb01dd44110582f997115b50e742François Gaffie using L = StoreLogger::Log::Level; 1019368eea42a1afb01dd44110582f997115b50e742François Gaffie switch (level) { 1029368eea42a1afb01dd44110582f997115b50e742François Gaffie case L::info: 1039368eea42a1afb01dd44110582f997115b50e742François Gaffie levelStr = "Info"; 1049368eea42a1afb01dd44110582f997115b50e742François Gaffie break; 1059368eea42a1afb01dd44110582f997115b50e742François Gaffie case L::warning: 1069368eea42a1afb01dd44110582f997115b50e742François Gaffie levelStr = "Warn"; 1079368eea42a1afb01dd44110582f997115b50e742François Gaffie break; 1089368eea42a1afb01dd44110582f997115b50e742François Gaffie } 1099368eea42a1afb01dd44110582f997115b50e742François Gaffie return os << levelStr << ": "; 1109368eea42a1afb01dd44110582f997115b50e742François Gaffie} 1119368eea42a1afb01dd44110582f997115b50e742François Gaffie 1129368eea42a1afb01dd44110582f997115b50e742François Gaffie/** Overload input stream operator to pretty print a StoreLogger::Log. */ 1139368eea42a1afb01dd44110582f997115b50e742François Gaffiestd::ostream &operator<<(std::ostream &os, const StoreLogger::Log &log) 1149368eea42a1afb01dd44110582f997115b50e742François Gaffie{ 1159368eea42a1afb01dd44110582f997115b50e742François Gaffie return os << log.level << log.msg << std::endl; 1169368eea42a1afb01dd44110582f997115b50e742François Gaffie} 1179368eea42a1afb01dd44110582f997115b50e742François Gaffie 1189368eea42a1afb01dd44110582f997115b50e742François Gaffie} // parameterFramework 119