chromium/chromeos/ash/components/data_migration/rts_receiver.cc

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromeos/ash/components/data_migration/rts_receiver.h"

#include <utility>

#include "base/check.h"
#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "chromeos/ash/components/data_migration/pending_file_transfer_queue.h"
#include "chromeos/ash/components/nearby/common/connections_manager/nearby_connection.h"

namespace data_migration {

RtsReceiver::RtsReceiver(NearbyConnection* nearby_connection,
                         PendingFileTransferQueue* pending_file_transfer_queue)
    : nearby_connection_(nearby_connection),
      pending_file_transfer_queue_(pending_file_transfer_queue) {
  CHECK(nearby_connection_);
  CHECK(pending_file_transfer_queue_);
  ReadNextRts();
}

RtsReceiver::~RtsReceiver() = default;

void RtsReceiver::ReadNextRts() {
  CHECK(nearby_connection_) << "Payload received after disconnection";
  nearby_connection_->Read(base::BindOnce(&RtsReceiver::OnRtsReceived,
                                          weak_ptr_factory_.GetWeakPtr()));
}

void RtsReceiver::OnRtsReceived(std::optional<std::vector<uint8_t>> bytes) {
  // If `bytes` is null, the remote endpoint is disconnected or has become
  // unreachable.
  if (!bytes) {
    VLOG(4)
        << "Connection to the remote device has been closed. Stopping reads";
    // Prevent dangling raw_ptr error. `nearby_connection_` will not get used
    // anyways for the rest of the class's lifetime and in reality is destroyed
    // immediately after this.
    nearby_connection_ = nullptr;
    return;
  }

  std::string payload_id_as_string(bytes->begin(), bytes->end());
  int64_t payload_id = 0;
  if (base::StringToInt64(payload_id_as_string, &payload_id)) {
    VLOG(1) << "Received RTS for file payload " << payload_id;
    pending_file_transfer_queue_->Push(payload_id);
  } else {
    LOG(ERROR) << "Received invalid RTS file payload id";
  }
  ReadNextRts();
}

}  // namespace data_migration