| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_ASH_CROSAPI_CERT_PROVISIONING_ASH_H_ |
| #define CHROME_BROWSER_ASH_CROSAPI_CERT_PROVISIONING_ASH_H_ |
| |
| #include "base/callback_list.h" |
| #include "chromeos/crosapi/mojom/cert_provisioning.mojom.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/receiver_set.h" |
| #include "mojo/public/cpp/bindings/remote_set.h" |
| |
| namespace ash::cert_provisioning { |
| class CertProvisioningScheduler; |
| } |
| |
| namespace crosapi { |
| |
| class CertProvisioningAsh : public mojom::CertProvisioning { |
| public: |
| CertProvisioningAsh(); |
| CertProvisioningAsh(const CertProvisioningAsh&) = delete; |
| CertProvisioningAsh& operator=(const CertProvisioningAsh&) = delete; |
| ~CertProvisioningAsh() override; |
| |
| void BindReceiver(mojo::PendingReceiver<mojom::CertProvisioning> receiver); |
| |
| // mojom::CertProvisioning |
| void AddObserver( |
| mojo::PendingRemote<mojom::CertProvisioningObserver> observer) override; |
| void GetStatus(GetStatusCallback callback) override; |
| void UpdateOneProcess(const std::string& cert_profile_id) override; |
| void ResetOneProcess(const std::string& cert_profile_id) override; |
| |
| // Inject schedulers for testing. Passing nullptr simulates that a scheduler |
| // is not found / available. |
| void InjectForTesting( |
| ash::cert_provisioning::CertProvisioningScheduler* user_scheduler, |
| ash::cert_provisioning::CertProvisioningScheduler* device_scheduler); |
| |
| private: |
| // CertProvisioningAsh can survive across sign-in/sign-out, different users |
| // have access to different schedulers, so they should not be cached. |
| ash::cert_provisioning::CertProvisioningScheduler* GetUserScheduler(); |
| ash::cert_provisioning::CertProvisioningScheduler* GetDeviceScheduler(); |
| |
| void AppendWorkerStatuses( |
| ash::cert_provisioning::CertProvisioningScheduler* scheduler, |
| bool is_device_wide, |
| std::vector<mojom::CertProvisioningProcessStatusPtr>& result); |
| |
| // Called when one of the schedulers notifies about new changes. |
| void OnSchedulersChanged(); |
| |
| // Called when one of the observers added by AddObserver has disconnected. |
| void OnObserverDisconnected(mojo::RemoteSetElementId); |
| |
| // Start/stop observing cert provisioning schedulers. This class only observes |
| // them when it itself has active observers. Lacros cannot survive across |
| // sign-in/sign-out (unlike this class), so the observing of the user |
| // scheduler will be reset automatically. |
| void ObserveSchedulers(); |
| void StopObservingSchedulers(); |
| |
| // The observers that will receive notifications about cert changes in Ash. |
| mojo::RemoteSet<mojom::CertProvisioningObserver> observers_; |
| |
| std::optional<ash::cert_provisioning::CertProvisioningScheduler*> |
| user_scheduler_for_testing_; |
| std::optional<ash::cert_provisioning::CertProvisioningScheduler*> |
| device_scheduler_for_testing_; |
| |
| // This class supports any number of connections. This allows the client to |
| // have multiple, potentially thread-affine, remotes. |
| mojo::ReceiverSet<mojom::CertProvisioning> receivers_; |
| |
| // As long as these subscriptions are alive and initialized, this class can |
| // receive notifications from the schedulers about changes. Should be |
| // destroyed before any members that are needed to process notifications. |
| base::CallbackListSubscription user_subscription_; |
| base::CallbackListSubscription device_subscription_; |
| }; |
| |
| } // namespace crosapi |
| |
| #endif // CHROME_BROWSER_ASH_CROSAPI_CERT_PROVISIONING_ASH_H_ |