// Copyright 2020 The Fuchsia 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 "src/storage/blobfs/blob-corruption-notifier.h"

#include <fuchsia/blobfs/c/fidl.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/status.h>

#include <digest/digest.h>
#include <digest/merkle-tree.h>
#include <safemath/checked_math.h>

namespace blobfs {

zx_status_t BlobCorruptionNotifier::Create(std::unique_ptr<BlobCorruptionNotifier>* out) {
  if (out == nullptr) {
    return ZX_ERR_INVALID_ARGS;
  }
  std::unique_ptr<BlobCorruptionNotifier> notifier(new BlobCorruptionNotifier());
  *out = std::move(notifier);
  return ZX_OK;
}

void BlobCorruptionNotifier::SetCorruptBlobHandler(zx::channel blobfs_handler) {
  corruption_handler_.reset();
  corruption_handler_ = std::move(blobfs_handler);
}

zx_status_t BlobCorruptionNotifier::NotifyCorruptBlob(const uint8_t* blob_root_hash,
                                                      size_t blob_root_len) const {
  if (blob_root_hash == nullptr || blob_root_len == 0) {
    return ZX_ERR_INVALID_ARGS;
  }

  if (corruption_handler_.get() == ZX_HANDLE_INVALID) {
    FX_LOGS(WARNING) << "Invalid corruption handler";
    // If the corruption handler has not been registered yet, we should not error out due to
    // unset corruption handler.
    return ZX_OK;
  }

  FX_LOGS(INFO) << "Notifying corruption handler service";
  return fuchsia_blobfs_CorruptBlobHandlerCorruptBlob(corruption_handler_.get(), blob_root_hash,
                                                      blob_root_len);
}

}  // namespace blobfs
