text: // Copyright 2016 The Chromium 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 COMPONENTS_ARC_ARC_BRIDGE_HOST_IMPL_H_
  #define COMPONENTS_ARC_ARC_BRIDGE_HOST_IMPL_H_
  
  #include <memory>
  #include <vector>
  
  #include "base/macros.h"
  #include "base/threading/thread_checker.h"
  #include "components/arc/common/arc_bridge.mojom.h"
  #include "components/arc/instance_holder.h"
  #include "mojo/public/cpp/bindings/binding.h"
  #include "mojo/public/cpp/bindings/interface_ptr.h"
  
  namespace arc {
  
  class ArcBridgeService;
  
  // Implementation of the ArcBridgeHost.
  // The lifetime of ArcBridgeHost and ArcBridgeInstance mojo channels are tied
  // to this instance. Also, any ARC related Mojo channel will be closed if
  // either ArcBridgeHost or ArcBridgeInstance Mojo channels is closed on error.
  // When ARC Instance (not Host) Mojo channel gets ready (= passed via
  // OnFooInstanceReady(), and the QueryVersion() gets completed), then this sets
  // the raw pointer to the ArcBridgeService so that other services can access
  // to the pointer, and resets it on channel closing.
  // Note that ArcBridgeService must be alive while ArcBridgeHostImpl is alive.
  class ArcBridgeHostImpl : public mojom::ArcBridgeHost {
   public:
    // Interface to keep the Mojo channel InterfacePtr.
    class MojoChannel;
  
    ArcBridgeHostImpl(ArcBridgeService* arc_bridge_service,
                      mojom::ArcBridgeInstancePtr instance);
    ~ArcBridgeHostImpl() override;
  
    // ArcBridgeHost overrides.
    void OnAccessibilityHelperInstanceReady(
        mojom::AccessibilityHelperInstancePtr accessibility_helper_ptr) override;
    void OnAppInstanceReady(mojom::AppInstancePtr app_ptr) override;
    void OnAudioInstanceReady(mojom::AudioInstancePtr audio_ptr) override;
    void OnAuthInstanceReady(mojom::AuthInstancePtr auth_ptr) override;
    void OnBluetoothInstanceReady(
        mojom::BluetoothInstancePtr bluetooth_ptr) override;
    void OnBootPhaseMonitorInstanceReady(
        mojom::BootPhaseMonitorInstancePtr boot_phase_monitor_ptr) override;
    void OnClipboardInstanceReady(
        mojom::ClipboardInstancePtr clipboard_ptr) override;
    void OnCrashCollectorInstanceReady(
        mojom::CrashCollectorInstancePtr crash_collector_ptr) override;
    void OnEnterpriseReportingInstanceReady(
        mojom::EnterpriseReportingInstancePtr enterprise_reporting_ptr) override;
    void OnFileSystemInstanceReady(
        mojom::FileSystemInstancePtr file_system_ptr) override;
    void OnImeInstanceReady(mojom::ImeInstancePtr ime_ptr) override;
    void OnIntentHelperInstanceReady(
        mojom::IntentHelperInstancePtr intent_helper_ptr) override;
    void OnKioskInstanceReady(mojom::KioskInstancePtr kiosk_ptr) override;
    void OnLockScreenInstanceReady(
        mojom::LockScreenInstancePtr lock_screen_ptr) override;
    void OnMetricsInstanceReady(mojom::MetricsInstancePtr metrics_ptr) override;
    void OnNetInstanceReady(mojom::NetInstancePtr net_ptr) override;
    void OnNotificationsInstanceReady(
        mojom::NotificationsInstancePtr notifications_ptr) override;
    void OnObbMounterInstanceReady(
        mojom::ObbMounterInstancePtr obb_mounter_ptr) override;
    void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override;
    void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override;
    void OnPrintInstanceReady(mojom::PrintInstancePtr print_ptr) override;
    void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override;
    void OnStorageManagerInstanceReady(
        mojom::StorageManagerInstancePtr storage_manager_ptr) override;
    void OnTracingInstanceReady(mojom::TracingInstancePtr trace_ptr) override;
    void OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) override;
    void OnVideoInstanceReady(mojom::VideoInstancePtr video_ptr) override;
    void OnVoiceInteractionArcHomeInstanceReady(
        mojom::VoiceInteractionArcHomeInstancePtr home_ptr) override;
    void OnVoiceInteractionFrameworkInstanceReady(
        mojom::VoiceInteractionFrameworkInstancePtr framework_ptr) override;
    void OnVolumeMounterInstanceReady(
        mojom::VolumeMounterInstancePtr volume_mounter_ptr) override;
    void OnWallpaperInstanceReady(
        mojom::WallpaperInstancePtr wallpaper_ptr) override;
  
   private:
    // Called when the bridge channel is closed. This typically only happens when
    // the ARC instance crashes.
    void OnClosed();
  
    // The common implementation to handle ArcBridgeHost overrides.
    // |T| is a ARC Mojo Instance type.
    template <typename T>
    void OnInstanceReady(InstanceHolder<T>* holder, mojo::InterfacePtr<T> ptr);
  
    // Called if one of the established channels is closed.
    void OnChannelClosed(MojoChannel* channel);
  
    THREAD_CHECKER(thread_checker_);
  
    // Owned by ArcServiceManager.
    ArcBridgeService* const arc_bridge_service_;
  
    mojo::Binding<mojom::ArcBridgeHost> binding_;
    mojom::ArcBridgeInstancePtr instance_;
  
    // Put as a last member to ensure that any callback tied to the elements
    // is not invoked.
    std::vector<std::unique_ptr<MojoChannel>> mojo_channels_;
  
    DISALLOW_COPY_AND_ASSIGN(ArcBridgeHostImpl);
  };
  
  }  // namespace arc
  
  #endif  // COMPONENTS_ARC_ARC_BRIDGE_HOST_IMPL_H_
  