/*
 * 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"

namespace cros {

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

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

void VendorTagOpsDelegate::GetAllTags(const 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());
  callback.Run(tags);
}

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

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

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

}  // namespace cros
