/*
 * Copyright 2016 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.
 */

#ifndef CAMERA_HAL_ADAPTER_CAMERA3_DEVICE_OPS_DELEGATE_H_
#define CAMERA_HAL_ADAPTER_CAMERA3_DEVICE_OPS_DELEGATE_H_

#include <vector>

#include "common/utils/cros_camera_mojo_utils.h"
#include "mojo/camera3.mojom.h"

namespace cros {

class CameraDeviceAdapter;

class Camera3DeviceOpsDelegate final
    : public internal::MojoBinding<mojom::Camera3DeviceOps> {
 public:
  Camera3DeviceOpsDelegate(
      CameraDeviceAdapter* camera_device_adapter,
      scoped_refptr<base::SingleThreadTaskRunner> task_runner);

  ~Camera3DeviceOpsDelegate();

 private:
  void Initialize(mojom::Camera3CallbackOpsPtr callback_ops,
                  InitializeCallback callback) final;

  void ConfigureStreams(mojom::Camera3StreamConfigurationPtr config,
                        ConfigureStreamsCallback callback) final;

  void ConstructDefaultRequestSettings(
      mojom::Camera3RequestTemplate type,
      ConstructDefaultRequestSettingsCallback callback) final;

  void ProcessCaptureRequest(mojom::Camera3CaptureRequestPtr request,
                             ProcessCaptureRequestCallback callback) final;

  void Dump(mojo::ScopedHandle fd) final;

  void Flush(FlushCallback callback) final;

  void RegisterBuffer(uint64_t buffer_id,
                      mojom::Camera3DeviceOps::BufferType type,
                      std::vector<mojo::ScopedHandle> fds,
                      uint32_t drm_format,
                      mojom::HalPixelFormat hal_pixel_format,
                      uint32_t width,
                      uint32_t height,
                      const std::vector<uint32_t>& strides,
                      const std::vector<uint32_t>& offsets,
                      RegisterBufferCallback callback) final;

  void Close(CloseCallback callback) final;

  void ConfigureStreamsAndGetAllocatedBuffers(
      mojom::Camera3StreamConfigurationPtr config,
      ConfigureStreamsAndGetAllocatedBuffersCallback callback) final;

  CameraDeviceAdapter* camera_device_adapter_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(Camera3DeviceOpsDelegate);
};

}  // namespace cros

#endif  // CAMERA_HAL_ADAPTER_CAMERA3_DEVICE_OPS_DELEGATE_H_
