// Copyright 2020 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 ARC_KEYMASTER_CERT_STORE_INSTANCE_H_
#define ARC_KEYMASTER_CERT_STORE_INSTANCE_H_

#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <mojo/cert_store.mojom.h>

namespace arc {
namespace keymaster {

// Provides access to key pairs accessible from Chrome.
class CertStoreInstance : public mojom::CertStoreInstance {
 public:
  CertStoreInstance() = default;
  CertStoreInstance(const CertStoreInstance&) = delete;
  CertStoreInstance& operator=(const CertStoreInstance&) = delete;

  ~CertStoreInstance() override = default;

  // mojom::CertStoreInstance overrides.
  void Init(mojom::CertStoreHostPtr host_ptr, InitCallback callback) override;

 private:
  // arc::mojom::CertStoreHost access methods.
  void RequestSecurityTokenOperation();

  void ResetSecurityTokenOperationProxy();
  void OnSecurityTokenOperationProxyReady();

  mojom::CertStoreHostPtr host_ptr_;
  // Use as proxy only when initialized:
  // |is_security_token_operation_proxy_ready_| is true.
  mojom::SecurityTokenOperationPtr security_token_operation_proxy_;
  bool is_security_token_operation_proxy_ready_ = false;

  base::WeakPtrFactory<CertStoreInstance> weak_ptr_factory_{this};
};

}  // namespace keymaster
}  // namespace arc

#endif  // ARC_KEYMASTER_CERT_STORE_INSTANCE_H_
