blob: 8ca78c6bd512bfaacf646b2486b0151863e67470 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "missive/client/report_queue.h"
#include <memory>
#include <string>
#include <utility>
#include <base/bind.h>
#include <base/callback.h>
#include <base/json/json_writer.h>
#include <base/memory/ptr_util.h>
#include <base/sequence_checker.h>
#include <base/strings/strcat.h>
#include <base/time/time.h>
#include <base/values.h>
#include "missive/proto/record.pb.h"
#include "missive/proto/record_constants.pb.h"
#include "missive/util/status.h"
#include "missive/util/status_macros.h"
#include "missive/util/statusor.h"
namespace reporting {
namespace {
StatusOr<std::string> ValueToJson(const base::Value& record) {
std::string json_record;
if (!base::JSONWriter::Write(record, &json_record)) {
return Status(error::INVALID_ARGUMENT,
"Provided record was not convertable to a std::string");
}
return json_record;
}
StatusOr<std::string> ProtoToString(
const google::protobuf::MessageLite* record) {
std::string protobuf_record;
if (!record->SerializeToString(&protobuf_record)) {
return Status(error::INVALID_ARGUMENT,
"Unabled to serialize record to string. Most likely due to "
"unset required fields.");
}
return protobuf_record;
}
} // namespace
ReportQueue::~ReportQueue() = default;
void ReportQueue::Enqueue(base::StringPiece record,
Priority priority,
ReportQueue::EnqueueCallback callback) const {
AddRecord(record, priority, std::move(callback));
}
void ReportQueue::Enqueue(const base::Value& record,
Priority priority,
ReportQueue::EnqueueCallback callback) const {
ASSIGN_OR_ONCE_CALLBACK_AND_RETURN(std::string json_record, callback,
ValueToJson(record));
AddRecord(json_record, priority, std::move(callback));
}
void ReportQueue::Enqueue(const google::protobuf::MessageLite* record,
Priority priority,
ReportQueue::EnqueueCallback callback) const {
ASSIGN_OR_ONCE_CALLBACK_AND_RETURN(std::string protobuf_record, callback,
ProtoToString(record));
AddRecord(protobuf_record, priority, std::move(callback));
}
} // namespace reporting