diff --git a/src/base/io/Env.cpp b/src/base/io/Env.cpp index ae1c27b52..de93c102f 100644 --- a/src/base/io/Env.cpp +++ b/src/base/io/Env.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -72,7 +66,7 @@ static void createVariables() } // namespace xmrig -xmrig::String xmrig::Env::expand(const char *in) +xmrig::String xmrig::Env::expand(const char *in, const std::map &extra) { # ifdef XMRIG_FEATURE_ENV if (in == nullptr) { @@ -96,7 +90,7 @@ xmrig::String xmrig::Env::expand(const char *in) continue; } - vars.insert({ var, get(m[1].str().c_str()) }); + vars.insert({ var, get(m[1].str().c_str(), extra) }); } for (const auto &kv : vars) { @@ -118,15 +112,23 @@ xmrig::String xmrig::Env::expand(const char *in) } -xmrig::String xmrig::Env::get(const String &name) +xmrig::String xmrig::Env::get(const String &name, const std::map &extra) { # ifdef XMRIG_FEATURE_ENV if (variables.empty()) { createVariables(); } - if (variables.count(name)) { - return variables.at(name); + const auto it = variables.find(name); + if (it != variables.end()) { + return it->second; + } + + if (!extra.empty()) { + const auto it = extra.find(name); + if (it != extra.end()) { + return it->second; + } } # endif diff --git a/src/base/io/Env.h b/src/base/io/Env.h index dd06297d0..ba7017da0 100644 --- a/src/base/io/Env.h +++ b/src/base/io/Env.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -29,14 +23,17 @@ #include "base/tools/String.h" +#include + + namespace xmrig { class Env { public: - static String expand(const char *in); - static String get(const String &name); + static String expand(const char *in, const std::map &extra = {}); + static String get(const String &name, const std::map &extra = {}); static String hostname(); }; diff --git a/src/base/kernel/Platform.cpp b/src/base/kernel/Platform.cpp index 67c729236..955a4eac6 100644 --- a/src/base/kernel/Platform.cpp +++ b/src/base/kernel/Platform.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/kernel/Platform.h b/src/base/kernel/Platform.h index b56c214d0..293cedc7f 100644 --- a/src/base/kernel/Platform.h +++ b/src/base/kernel/Platform.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -52,7 +46,7 @@ public: static void setProcessPriority(int priority); static void setThreadPriority(int priority); - static inline const char *userAgent() { return m_userAgent; } + static inline const String &userAgent() { return m_userAgent; } static bool isOnBatteryPower(); diff --git a/src/base/kernel/Platform_hwloc.cpp b/src/base/kernel/Platform_hwloc.cpp index ca5bfed2c..8ec069757 100644 --- a/src/base/kernel/Platform_hwloc.cpp +++ b/src/base/kernel/Platform_hwloc.cpp @@ -1,13 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018 Lee Clagett - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/kernel/Platform_mac.cpp b/src/base/kernel/Platform_mac.cpp index 8ffae1e14..27797ff7a 100644 --- a/src/base/kernel/Platform_mac.cpp +++ b/src/base/kernel/Platform_mac.cpp @@ -1,11 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/kernel/Platform_unix.cpp b/src/base/kernel/Platform_unix.cpp index f0b382c0c..bbded9f65 100644 --- a/src/base/kernel/Platform_unix.cpp +++ b/src/base/kernel/Platform_unix.cpp @@ -1,11 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/kernel/Platform_win.cpp b/src/base/kernel/Platform_win.cpp index 89f26a07a..a487e17b9 100644 --- a/src/base/kernel/Platform_win.cpp +++ b/src/base/kernel/Platform_win.cpp @@ -1,11 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/kernel/interfaces/IConsoleListener.h b/src/base/kernel/interfaces/IConsoleListener.h index 88972f058..694332108 100644 --- a/src/base/kernel/interfaces/IConsoleListener.h +++ b/src/base/kernel/interfaces/IConsoleListener.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -26,12 +20,18 @@ #define XMRIG_ICONSOLELISTENER_H +#include "base/tools/Object.h" + + namespace xmrig { class IConsoleListener { public: + XMRIG_DISABLE_COPY_MOVE(IConsoleListener) + + IConsoleListener() = default; virtual ~IConsoleListener() = default; virtual void onConsoleCommand(char command) = 0; diff --git a/src/base/kernel/interfaces/IDnsListener.h b/src/base/kernel/interfaces/IDnsListener.h index 4cbb3f7e4..7d0e14e36 100644 --- a/src/base/kernel/interfaces/IDnsListener.h +++ b/src/base/kernel/interfaces/IDnsListener.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -26,6 +20,9 @@ #define XMRIG_IDNSLISTENER_H +#include "base/tools/Object.h" + + namespace xmrig { @@ -35,6 +32,9 @@ class Dns; class IDnsListener { public: + XMRIG_DISABLE_COPY_MOVE(IDnsListener) + + IDnsListener() = default; virtual ~IDnsListener() = default; virtual void onResolved(const Dns &dns, int status) = 0; diff --git a/src/base/kernel/interfaces/IHttpListener.h b/src/base/kernel/interfaces/IHttpListener.h index 94fd1d185..931d1933b 100644 --- a/src/base/kernel/interfaces/IHttpListener.h +++ b/src/base/kernel/interfaces/IHttpListener.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -26,6 +20,9 @@ #define XMRIG_IHTTPLISTENER_H +#include "base/tools/Object.h" + + namespace xmrig { @@ -36,7 +33,10 @@ class HttpResponse; class IHttpListener { public: - virtual ~IHttpListener() = default; + XMRIG_DISABLE_COPY_MOVE(IHttpListener) + + IHttpListener() = default; + virtual ~IHttpListener() = default; virtual void onHttpData(const HttpData &data) = 0; }; diff --git a/src/base/kernel/interfaces/ISignalListener.h b/src/base/kernel/interfaces/ISignalListener.h index bbcd11f12..75f47cf06 100644 --- a/src/base/kernel/interfaces/ISignalListener.h +++ b/src/base/kernel/interfaces/ISignalListener.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -26,6 +20,9 @@ #define XMRIG_ISIGNALLISTENER_H +#include "base/tools/Object.h" + + namespace xmrig { @@ -35,7 +32,10 @@ class String; class ISignalListener { public: - virtual ~ISignalListener() = default; + XMRIG_DISABLE_COPY_MOVE(ISignalListener) + + ISignalListener() = default; + virtual ~ISignalListener() = default; virtual void onSignal(int signum) = 0; }; diff --git a/src/base/kernel/interfaces/ITimerListener.h b/src/base/kernel/interfaces/ITimerListener.h index 1b6337d63..d169b12eb 100644 --- a/src/base/kernel/interfaces/ITimerListener.h +++ b/src/base/kernel/interfaces/ITimerListener.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -26,6 +20,9 @@ #define XMRIG_ITIMERLISTENER_H +#include "base/tools/Object.h" + + namespace xmrig { @@ -35,7 +32,10 @@ class Timer; class ITimerListener { public: - virtual ~ITimerListener() = default; + XMRIG_DISABLE_COPY_MOVE(ITimerListener) + + ITimerListener() = default; + virtual ~ITimerListener() = default; virtual void onTimer(const Timer *timer) = 0; }; diff --git a/src/base/net/http/HttpClient.cpp b/src/base/net/http/HttpClient.cpp index ff82eab04..92ca6fac5 100644 --- a/src/base/net/http/HttpClient.cpp +++ b/src/base/net/http/HttpClient.cpp @@ -95,7 +95,7 @@ void xmrig::HttpClient::handshake() { headers.insert({ "Host", host() }); headers.insert({ "Connection", "close" }); - headers.insert({ "User-Agent", Platform::userAgent() }); + headers.insert({ "User-Agent", Platform::userAgent().data() }); if (!body.empty()) { headers.insert({ "Content-Length", std::to_string(body.size()) }); diff --git a/src/base/tools/Arguments.cpp b/src/base/tools/Arguments.cpp index eebe0e736..b6bcec8de 100644 --- a/src/base/tools/Arguments.cpp +++ b/src/base/tools/Arguments.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/tools/Arguments.h b/src/base/tools/Arguments.h index e7a105363..a65c44598 100644 --- a/src/base/tools/Arguments.h +++ b/src/base/tools/Arguments.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/tools/Baton.h b/src/base/tools/Baton.h index 646dc0b87..accaf51ce 100644 --- a/src/base/tools/Baton.h +++ b/src/base/tools/Baton.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/tools/Chrono.h b/src/base/tools/Chrono.h index e464f3613..99ad19cfd 100644 --- a/src/base/tools/Chrono.h +++ b/src/base/tools/Chrono.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/tools/Handle.h b/src/base/tools/Handle.h index 1a7d08f1c..a25381d8c 100644 --- a/src/base/tools/Handle.h +++ b/src/base/tools/Handle.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/tools/Object.h b/src/base/tools/Object.h index 7e460e444..412ae6ff5 100644 --- a/src/base/tools/Object.h +++ b/src/base/tools/Object.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 diff --git a/src/base/tools/String.cpp b/src/base/tools/String.cpp index 8187f467a..cfc8e0404 100644 --- a/src/base/tools/String.cpp +++ b/src/base/tools/String.cpp @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2019 SChernykh - * Copyright 2016-2019 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -30,6 +24,21 @@ #include +xmrig::String::String(const char *str, size_t size) : + m_size(size) +{ + if (str == nullptr) { + m_size = 0; + + return; + } + + m_data = new char[m_size + 1]; + memcpy(m_data, str, m_size); + m_data[m_size] = '\0'; +} + + xmrig::String::String(const char *str) : m_size(str == nullptr ? 0 : strlen(str)) { @@ -42,17 +51,18 @@ xmrig::String::String(const char *str) : } -xmrig::String::String(const char *str, size_t size) : - m_size(size) +xmrig::String::String(const rapidjson::Value &value) { - if (str == nullptr) { - m_size = 0; + if (!value.IsString()) { + return; + } + if ((m_size = value.GetStringLength()) == 0) { return; } m_data = new char[m_size + 1]; - memcpy(m_data, str, m_size); + memcpy(m_data, value.GetString(), m_size); m_data[m_size] = '\0'; } @@ -103,8 +113,10 @@ rapidjson::Value xmrig::String::toJSON(rapidjson::Document &doc) const std::vector xmrig::String::split(char sep) const { - std::vector out; + std::vector out; if (m_size == 0) { + out.emplace_back(*this); + return out; } diff --git a/src/base/tools/String.h b/src/base/tools/String.h index df6495768..4ba603cec 100644 --- a/src/base/tools/String.h +++ b/src/base/tools/String.h @@ -1,12 +1,6 @@ /* XMRig - * Copyright 2010 Jeff Garzik - * Copyright 2012-2014 pooler - * Copyright 2014 Lucas Jones - * Copyright 2014-2016 Wolf9466 - * Copyright 2016 Jay D Dee - * Copyright 2017-2018 XMR-Stak , - * Copyright 2018-2020 SChernykh - * Copyright 2016-2020 XMRig , + * Copyright (c) 2018-2020 SChernykh + * Copyright (c) 2016-2020 XMRig , * * 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 @@ -50,8 +44,9 @@ public: inline String(char *str) : m_data(str), m_size(str == nullptr ? 0 : strlen(str)) {} inline String(String &&other) noexcept : m_data(other.m_data), m_size(other.m_size) { other.m_data = nullptr; other.m_size = 0; } - String(const char *str); String(const char *str, size_t size); + String(const char *str); + String(const rapidjson::Value &value); String(const String &other); inline ~String() { delete [] m_data; } @@ -66,6 +61,7 @@ public: inline bool isEmpty() const { return size() == 0; } inline bool isNull() const { return m_data == nullptr; } + inline bool isValid() const { return m_data != nullptr; } inline char *data() { return m_data; } inline const char *data() const { return m_data; } inline size_t size() const { return m_size; } @@ -73,7 +69,7 @@ public: inline bool operator!=(const char *str) const { return !isEqual(str); } inline bool operator!=(const String &other) const { return !isEqual(other); } - inline bool operator<(const String &str) const { return strcmp(data(), str.data()) < 0; } + inline bool operator<(const String &str) const { return !isEmpty() && !str.isEmpty() && strcmp(data(), str.data()) < 0; } inline bool operator==(const char *str) const { return isEqual(str); } inline bool operator==(const String &other) const { return isEqual(other); } inline operator const char*() const { return m_data; } diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 8f38d59fb..67a934888 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -163,7 +163,7 @@ public: reply.AddMember("version", APP_VERSION, allocator); reply.AddMember("kind", APP_KIND, allocator); - reply.AddMember("ua", StringRef(Platform::userAgent()), allocator); + reply.AddMember("ua", Platform::userAgent().toJSON(), allocator); reply.AddMember("cpu", Cpu::toJSON(doc), allocator); reply.AddMember("donate_level", controller->config()->pools().donateLevel(), allocator); reply.AddMember("paused", !enabled, allocator);