| 288 | } |
| 289 | |
| 290 | void C2Agent::serializeMetrics(C2Payload &metric_payload, const std::string &name, const std::vector<state::response::SerializedResponseNode> &metrics, bool is_container, bool is_collapsible) { |
| 291 | const auto payloads = std::count_if(begin(metrics), end(metrics), [](const state::response::SerializedResponseNode& metric) { return !metric.children.empty(); }); |
| 292 | metric_payload.reservePayloads(metric_payload.getNestedPayloads().size() + payloads); |
| 293 | for (const auto &metric : metrics) { |
| 294 | if (metric.children.size() > 0) { |
| 295 | C2Payload child_metric_payload(metric_payload.getOperation()); |
| 296 | if (metric.array) { |
| 297 | child_metric_payload.setContainer(true); |
| 298 | } |
| 299 | auto collapsible = !metric.collapsible ? metric.collapsible : is_collapsible; |
| 300 | child_metric_payload.setCollapsible(collapsible); |
| 301 | child_metric_payload.setLabel(metric.name); |
| 302 | serializeMetrics(child_metric_payload, metric.name, metric.children, is_container, collapsible); |
| 303 | metric_payload.addPayload(std::move(child_metric_payload)); |
| 304 | } else { |
| 305 | C2ContentResponse response(metric_payload.getOperation()); |
| 306 | response.name = name; |
| 307 | response.operation_arguments[metric.name] = metric.value; |
| 308 | metric_payload.addContent(std::move(response), is_collapsible); |
| 309 | } |
| 310 | } |
| 311 | } |
| 312 | |
| 313 | void C2Agent::extractPayload(const C2Payload &resp) { |
| 314 | if (resp.getStatus().getState() == state::UpdateState::NESTED) { |
nothing calls this directly
no test coverage detected