// Copyright 2017 The Chromium 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 "components/cronet/native/generated/cronet.idl_impl_interface.h"

#include "base/logging.h"
#include "base/macros.h"
#include "base/no_destructor.h"
#include "base/numerics/safe_conversions.h"

namespace {

// Implementation of Cronet_BufferCallback that calls free() to malloc() buffer.
class Cronet_BufferCallbackFree : public Cronet_BufferCallback {
 public:
  Cronet_BufferCallbackFree() = default;
  ~Cronet_BufferCallbackFree() override = default;

  void OnDestroy(Cronet_BufferPtr buffer) override { free(buffer->GetData()); }

 private:
  DISALLOW_COPY_AND_ASSIGN(Cronet_BufferCallbackFree);
};

// Concrete implementation of abstract Cronet_Buffer interface.
class Cronet_BufferImpl : public Cronet_Buffer {
 public:
  Cronet_BufferImpl() = default;
  ~Cronet_BufferImpl() override;

  // Cronet_Buffer implementation
  void InitWithDataAndCallback(Cronet_RawDataPtr data,
                               uint64_t size,
                               Cronet_BufferCallbackPtr callback) override;
  void InitWithAlloc(uint64_t size) override;
  uint64_t GetSize() override;
  Cronet_RawDataPtr GetData() override;

 private:
  Cronet_RawDataPtr data_ = nullptr;
  uint64_t size_ = 0;
  Cronet_BufferCallbackPtr callback_ = nullptr;

  DISALLOW_COPY_AND_ASSIGN(Cronet_BufferImpl);
};

Cronet_BufferImpl::~Cronet_BufferImpl() {
  if (callback_)
    callback_->OnDestroy(this);
}

void Cronet_BufferImpl::InitWithDataAndCallback(
    Cronet_RawDataPtr data,
    uint64_t size,
    Cronet_BufferCallbackPtr callback) {
  data_ = data;
  size_ = size;
  callback_ = callback;
}

void Cronet_BufferImpl::InitWithAlloc(uint64_t size) {
  if (!base::IsValueInRangeForNumericType<size_t, uint64_t>(size))
    return;
  data_ = malloc(size);
  if (!data_)
    return;
  size_ = size;
  static base::NoDestructor<Cronet_BufferCallbackFree> static_callback;
  callback_ = static_callback.get();
}

uint64_t Cronet_BufferImpl::GetSize() {
  return size_;
}

Cronet_RawDataPtr Cronet_BufferImpl::GetData() {
  return data_;
}

}  // namespace

CRONET_EXPORT Cronet_BufferPtr Cronet_Buffer_Create() {
  return new Cronet_BufferImpl();
}
