| // Copyright 2019 The Fuchsia 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 SRC_SYS_APPMGR_COMPONENT_EVENT_PROVIDER_IMPL_H_ |
| |
| #define SRC_SYS_APPMGR_COMPONENT_EVENT_PROVIDER_IMPL_H_ |
| |
| #include <fuchsia/sys/internal/cpp/fidl.h> |
| #include <lib/async/cpp/executor.h> |
| |
| #include <queue> |
| |
| #include "lib/fidl/cpp/binding.h" |
| #include "src/lib/fxl/memory/weak_ptr.h" |
| #include "src/sys/appmgr/component_controller_impl.h" |
| #include "src/sys/appmgr/realm.h" |
| |
| namespace component { |
| |
| class ComponentEventProviderImpl : public fuchsia::sys::internal::ComponentEventProvider { |
| public: |
| // Does not take ownership of realm or dispatcher. |
| ComponentEventProviderImpl(fxl::WeakPtr<Realm> realm, async_dispatcher_t* dispatcher); |
| ~ComponentEventProviderImpl() override; |
| |
| bool listener_bound() { return listener_.is_bound(); } |
| |
| // |fuchsia::sys::internal::ComponentEventProvider| |
| void SetListener( |
| fidl::InterfaceHandle<fuchsia::sys::internal::ComponentEventListener> listener) override; |
| |
| // Requests to bind the incoming |ComponentEventProvider| connection. |
| zx_status_t Connect( |
| fidl::InterfaceRequest<fuchsia::sys::internal::ComponentEventProvider> request); |
| |
| // Requests to notify the listener that a component started. |
| void NotifyComponentStarted(fuchsia::sys::internal::SourceIdentity component); |
| |
| // Requests to notify the listener that a component stopped. |
| void NotifyComponentStopped(fuchsia::sys::internal::SourceIdentity component); |
| |
| // Requests to notify the listener that a component out/diagnostics directory is ready. |
| void NotifyComponentDirReady(fuchsia::sys::internal::SourceIdentity component, |
| fidl::InterfaceHandle<fuchsia::io::Directory> directory); |
| |
| private: |
| // Send Start and Diagnostics directory ready events for all components in this realm and children |
| // realms. |
| void NotifyOfExistingComponents(); |
| |
| // Send Start and Diagnostics directory for the given component. |
| void NotifyAboutExistingComponent(std::vector<std::string> relative_realm_path, |
| std::shared_ptr<ComponentControllerBase> application); |
| |
| // Not owned. |
| async::Executor executor_; |
| fidl::Binding<fuchsia::sys::internal::ComponentEventProvider> binding_; |
| fuchsia::sys::internal::ComponentEventListenerPtr listener_; |
| |
| // The realm to which this ComponentEventProvider belongs. The provider will only notify about |
| // events of components in this realm and sub-realms, except for realms that have a provider. |
| // Not owned. |
| fxl::WeakPtr<Realm> const realm_; |
| |
| fxl::WeakPtrFactory<ComponentEventProviderImpl> weak_ptr_factory_; |
| |
| // Returns the relative realm path from the queries |leaf_realm| up to this provider |realm_|. |
| std::vector<std::string> RelativeRealmPath(const fxl::WeakPtr<Realm>& leaf_realm); |
| }; |
| |
| } // namespace component |
| |
| #endif // SRC_SYS_APPMGR_COMPONENT_EVENT_PROVIDER_IMPL_H_ |