blob: 1a1fec1f28904e8802bf36db3335e375bc53758c [file] [log] [blame]
// 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_LOG_CONNECTOR_IMPL_H_
#define SRC_SYS_APPMGR_LOG_CONNECTOR_IMPL_H_
#include <fuchsia/sys/internal/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <fbl/ref_counted.h>
#include <fbl/ref_ptr.h>
#include "src/lib/fxl/macros.h"
#include "src/lib/fxl/memory/weak_ptr.h"
namespace component {
class LogConnectorImpl : public fuchsia::sys::internal::LogConnector,
public fbl::RefCounted<LogConnectorImpl> {
public:
using TakeLogConnectionListenerCallback =
fit::function<void(fidl::InterfaceRequest<fuchsia::sys::internal::LogConnectionListener>)>;
// Construct a new connector for the provided realm label. This connector has no parent.
LogConnectorImpl(std::string realm_label);
// Construct a new connector for a child realm.
fbl::RefPtr<LogConnectorImpl> NewChild(std::string child_realm_label);
void AddConnectorClient(fidl::InterfaceRequest<fuchsia::sys::internal::LogConnector> request);
// Adds a new LogSink connection from a running component. This LogSink connection is forwarded,
// with attribution, to the LogConnectionListener.
void AddLogConnection(std::string component_url, std::string instance_id,
fidl::InterfaceRequest<fuchsia::logger::LogSink> connection);
void OnReady(fit::function<void()> on_ready);
private:
// Construct a new connector for the provided realm label.
LogConnectorImpl(fxl::WeakPtr<LogConnectorImpl> parent, std::string realm_label);
// |fuchsia::sys::LogConnector|.
virtual void TakeLogConnectionListener(TakeLogConnectionListenerCallback cb) override;
fxl::WeakPtr<LogConnectorImpl> parent_;
std::string realm_label_;
fidl::BindingSet<fuchsia::sys::internal::LogConnector> bindings_;
fuchsia::sys::internal::LogConnectionListenerPtr consumer_;
fidl::InterfaceRequest<fuchsia::sys::internal::LogConnectionListener> consumer_request_;
// weak_factory_ must be the last member variable.
fxl::WeakPtrFactory<LogConnectorImpl> weak_factory_;
fit::optional<fit::function<void()>> on_ready_;
FXL_DISALLOW_COPY_AND_ASSIGN(LogConnectorImpl);
};
} // namespace component
#endif // SRC_SYS_APPMGR_LOG_CONNECTOR_IMPL_H_