/*
 * Copyright 2018 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 "hal_adapter/vendor_tag_ops_delegate.h"

#include <string>
#include <utility>
#include <vector>

#include "cros-camera/common.h"

#include <base/check.h>
#include <base/check_op.h>

namespace cros {

VendorTagOpsDelegate::VendorTagOpsDelegate(
    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
    vendor_tag_ops_t* ops)
    : internal::MojoReceiver<VendorTagOps>(task_runner), vendor_tag_ops_(ops) {}

void VendorTagOpsDelegate::GetTagCount(GetTagCountCallback callback) {
  VLOGF_ENTER();
  DCHECK_NE(vendor_tag_ops_, nullptr);
  DCHECK(task_runner_->BelongsToCurrentThread());
  std::move(callback).Run(vendor_tag_ops_->get_tag_count(vendor_tag_ops_));
}

void VendorTagOpsDelegate::GetAllTags(GetAllTagsCallback callback) {
  VLOGF_ENTER();
  DCHECK_NE(vendor_tag_ops_, nullptr);
  DCHECK(task_runner_->BelongsToCurrentThread());
  std::vector<uint32_t> tags(vendor_tag_ops_->get_tag_count(vendor_tag_ops_));
  vendor_tag_ops_->get_all_tags(vendor_tag_ops_, tags.data());
  std::move(callback).Run(tags);
}

void VendorTagOpsDelegate::GetSectionName(uint32_t tag,
                                          GetSectionNameCallback callback) {
  VLOGF_ENTER();
  DCHECK_NE(vendor_tag_ops_, nullptr);
  DCHECK(task_runner_->BelongsToCurrentThread());
  std::move(callback).Run(
      std::string(vendor_tag_ops_->get_section_name(vendor_tag_ops_, tag)));
}

void VendorTagOpsDelegate::GetTagName(uint32_t tag,
                                      GetTagNameCallback callback) {
  VLOGF_ENTER();
  DCHECK_NE(vendor_tag_ops_, nullptr);
  DCHECK(task_runner_->BelongsToCurrentThread());
  std::move(callback).Run(
      std::string(vendor_tag_ops_->get_tag_name(vendor_tag_ops_, tag)));
}

void VendorTagOpsDelegate::GetTagType(uint32_t tag,
                                      GetTagTypeCallback callback) {
  VLOGF_ENTER();
  DCHECK_NE(vendor_tag_ops_, nullptr);
  DCHECK(task_runner_->BelongsToCurrentThread());
  std::move(callback).Run(vendor_tag_ops_->get_tag_type(vendor_tag_ops_, tag));
}

}  // namespace cros
