| // Copyright 2023 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef BIOD_SESSION_H_ | |
| #define BIOD_SESSION_H_ | |
| #include <string> | |
| #include <utility> | |
| #include "base/memory/weak_ptr.h" | |
| namespace biod { | |
| // Invokes the function object F with a given BiometricsManager object when | |
| // this session (EnrollSession or AuthSession) object goes out of scope. It's | |
| // possible that this will do nothing in the case that the session has ended | |
| // due to failure/finishing or the BiometricsManager object is no longer | |
| // valid. | |
| class BiometricsManager; | |
| template <typename F> | |
| class Session { | |
| public: | |
| Session() = default; | |
| Session(Session<F>&& rhs) | |
| : biometrics_manager_(rhs.biometrics_manager_), | |
| error_(std::move(rhs.error_)) { | |
| rhs.biometrics_manager_.reset(); | |
| } | |
| explicit Session(const base::WeakPtr<BiometricsManager>& biometrics_manager) | |
| : biometrics_manager_(biometrics_manager) {} | |
| ~Session() { End(); } | |
| Session<F>& operator=(Session<F>&& rhs) { | |
| End(); | |
| biometrics_manager_ = rhs.biometrics_manager_; | |
| error_ = std::move(rhs.error_); | |
| rhs.biometrics_manager_.reset(); | |
| return *this; | |
| } | |
| explicit operator bool() const { return biometrics_manager_.get(); } | |
| // Has the same effect of letting this object go out of scope, but allows | |
| // one to reuse the storage of this object. | |
| void End() { | |
| if (biometrics_manager_) { | |
| F f; | |
| f(biometrics_manager_.get()); | |
| biometrics_manager_.reset(); | |
| } | |
| error_.clear(); | |
| } | |
| void set_error(const std::string& error) { error_ = error; } | |
| std::string error() const { return error_; } | |
| private: | |
| base::WeakPtr<BiometricsManager> biometrics_manager_; | |
| std::string error_; | |
| }; | |
| } // namespace biod | |
| #endif // BIOD_SESSION_H_ |