| // 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_SESSION_ARC_BRIDGE_HOST_IMPL_H_ |
| #define COMPONENTS_ARC_SESSION_ARC_BRIDGE_HOST_IMPL_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/threading/thread_checker.h" |
| #include "components/arc/mojom/arc_bridge.mojom.h" |
| #include "components/arc/session/arc_bridge_service.h" |
| #include "components/arc/session/connection_holder.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| #include "mojo/public/cpp/bindings/remote.h" |
| |
| namespace arc { |
| |
| class ArcBridgeService; |
| class MojoChannelBase; |
| |
| // Implementation of the ArcBridgeHost. |
| // The lifetime of ArcBridgeHost mojo channel is tied to this instance. |
| // Also, any ARC related Mojo channel will be closed if ArcBridgeHost Mojo |
| // channel 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: |
| ArcBridgeHostImpl( |
| ArcBridgeService* arc_bridge_service, |
| mojo::PendingReceiver<mojom::ArcBridgeHost> pending_receiver); |
| ~ArcBridgeHostImpl() override; |
| |
| // ArcBridgeHost overrides. |
| void OnAccessibilityHelperInstanceReady( |
| mojo::PendingRemote<mojom::AccessibilityHelperInstance> |
| accessibility_helper_remote) override; |
| void OnAdbdMonitorInstanceReady( |
| mojo::PendingRemote<mojom::AdbdMonitorInstance> adbd_monitor_remote) |
| override; |
| void OnAppInstanceReady( |
| mojo::PendingRemote<mojom::AppInstance> app_ptr) override; |
| void OnAppPermissionsInstanceReady( |
| mojo::PendingRemote<mojom::AppPermissionsInstance> app_permissions_remote) |
| override; |
| void OnAppfuseInstanceReady( |
| mojo::PendingRemote<mojom::AppfuseInstance> appfuse_remote) override; |
| void OnAudioInstanceReady( |
| mojo::PendingRemote<mojom::AudioInstance> audio_remote) override; |
| void OnAuthInstanceReady( |
| mojo::PendingRemote<mojom::AuthInstance> auth_remote) override; |
| void OnBackupSettingsInstanceReady( |
| mojo::PendingRemote<mojom::BackupSettingsInstance> backup_settings_remote) |
| override; |
| void OnBluetoothInstanceReady( |
| mojo::PendingRemote<mojom::BluetoothInstance> bluetooth_remote) override; |
| void OnBootPhaseMonitorInstanceReady( |
| mojo::PendingRemote<mojom::BootPhaseMonitorInstance> |
| boot_phase_monitor_remote) override; |
| void OnCameraInstanceReady( |
| mojo::PendingRemote<mojom::CameraInstance> camera_remote) override; |
| void OnCastReceiverInstanceReady( |
| mojo::PendingRemote<mojom::CastReceiverInstance> cast_receiver_remote) |
| override; |
| void OnCertStoreInstanceReady( |
| mojo::PendingRemote<mojom::CertStoreInstance> instance_remote) override; |
| void OnClipboardInstanceReady( |
| mojo::PendingRemote<mojom::ClipboardInstance> clipboard_remote) override; |
| void OnCompatibilityModeInstanceReady( |
| mojo::PendingRemote<mojom::CompatibilityModeInstance> |
| compatibility_mode_remote) override; |
| void OnCrashCollectorInstanceReady( |
| mojo::PendingRemote<mojom::CrashCollectorInstance> crash_collector_remote) |
| override; |
| void OnDarkThemeInstanceReady( |
| mojo::PendingRemote<mojom::DarkThemeInstance> dark_theme_remote) override; |
| void OnDigitalGoodsInstanceReady( |
| mojo::PendingRemote<mojom::DigitalGoodsInstance> digital_goods_remote) |
| override; |
| void OnDiskQuotaInstanceReady( |
| mojo::PendingRemote<mojom::DiskQuotaInstance> disk_quota_remote) override; |
| void OnEnterpriseReportingInstanceReady( |
| mojo::PendingRemote<mojom::EnterpriseReportingInstance> |
| enterprise_reporting_remote) override; |
| void OnFileSystemInstanceReady(mojo::PendingRemote<mojom::FileSystemInstance> |
| file_system_remote) override; |
| void OnIioSensorInstanceReady( |
| mojo::PendingRemote<mojom::IioSensorInstance> iio_sensor_remote) override; |
| void OnImeInstanceReady( |
| mojo::PendingRemote<mojom::ImeInstance> ime_remote) override; |
| void OnInputMethodManagerInstanceReady( |
| mojo::PendingRemote<mojom::InputMethodManagerInstance> |
| input_method_manager_remote) override; |
| void OnIntentHelperInstanceReady( |
| mojo::PendingRemote<mojom::IntentHelperInstance> intent_helper_remote) |
| override; |
| void OnKeyboardShortcutInstanceReady( |
| mojo::PendingRemote<mojom::KeyboardShortcutInstance> |
| keyboard_shortcut_remote) override; |
| void OnKeymasterInstanceReady( |
| mojo::PendingRemote<mojom::KeymasterInstance> keymaster_remote) override; |
| void OnKioskInstanceReady( |
| mojo::PendingRemote<mojom::KioskInstance> kiosk_remote) override; |
| void OnLockScreenInstanceReady(mojo::PendingRemote<mojom::LockScreenInstance> |
| lock_screen_remote) override; |
| void OnMediaSessionInstanceReady( |
| mojo::PendingRemote<mojom::MediaSessionInstance> media_session_remote) |
| override; |
| void OnMemoryInstanceReady( |
| mojo::PendingRemote<mojom::MemoryInstance> memory_remote) override; |
| void OnMetricsInstanceReady( |
| mojo::PendingRemote<mojom::MetricsInstance> metrics_remote) override; |
| void OnMidisInstanceReady( |
| mojo::PendingRemote<mojom::MidisInstance> midis_remote) override; |
| void OnNearbyShareInstanceReady( |
| mojo::PendingRemote<mojom::NearbyShareInstance> nearby_share_remote) |
| override; |
| void OnNetInstanceReady( |
| mojo::PendingRemote<mojom::NetInstance> net_remote) override; |
| void OnNotificationsInstanceReady( |
| mojo::PendingRemote<mojom::NotificationsInstance> notifications_remote) |
| override; |
| void OnObbMounterInstanceReady(mojo::PendingRemote<mojom::ObbMounterInstance> |
| obb_mounter_remote) override; |
| void OnOemCryptoInstanceReady( |
| mojo::PendingRemote<mojom::OemCryptoInstance> oemcrypto_remote) override; |
| void OnPaymentAppInstanceReady(mojo::PendingRemote<mojom::PaymentAppInstance> |
| payment_app_remote) override; |
| void OnPipInstanceReady( |
| mojo::PendingRemote<mojom::PipInstance> policy_remote) override; |
| void OnPolicyInstanceReady( |
| mojo::PendingRemote<mojom::PolicyInstance> policy_remote) override; |
| void OnPowerInstanceReady( |
| mojo::PendingRemote<mojom::PowerInstance> power_remote) override; |
| void OnPrintSpoolerInstanceReady( |
| mojo::PendingRemote<mojom::PrintSpoolerInstance> print_spooler_remote) |
| override; |
| void OnProcessInstanceReady( |
| mojo::PendingRemote<mojom::ProcessInstance> process_remote) override; |
| void OnPropertyInstanceReady( |
| mojo::PendingRemote<mojom::PropertyInstance> property_remote) override; |
| void OnRotationLockInstanceReady( |
| mojo::PendingRemote<mojom::RotationLockInstance> rotation_lock_remote) |
| override; |
| void OnScreenCaptureInstanceReady( |
| mojo::PendingRemote<mojom::ScreenCaptureInstance> screen_capture_remote) |
| override; |
| void OnSensorInstanceReady( |
| mojo::PendingRemote<mojom::SensorInstance> sensor_ptr) override; |
| void OnSharesheetInstanceReady(mojo::PendingRemote<mojom::SharesheetInstance> |
| sharesheet_remote) override; |
| void OnSmartCardManagerInstanceReady( |
| mojo::PendingRemote<mojom::SmartCardManagerInstance> |
| smart_card_manager_remote) override; |
| void OnStorageManagerInstanceReady( |
| mojo::PendingRemote<mojom::StorageManagerInstance> storage_manager_remote) |
| override; |
| void OnTimerInstanceReady( |
| mojo::PendingRemote<mojom::TimerInstance> timer_remote) override; |
| void OnTracingInstanceReady( |
| mojo::PendingRemote<mojom::TracingInstance> trace_remote) override; |
| void OnTtsInstanceReady( |
| mojo::PendingRemote<mojom::TtsInstance> tts_remote) override; |
| void OnUsbHostInstanceReady( |
| mojo::PendingRemote<mojom::UsbHostInstance> usb_host_remote) override; |
| void OnVideoInstanceReady( |
| mojo::PendingRemote<mojom::VideoInstance> video_remote) override; |
| void OnVolumeMounterInstanceReady( |
| mojo::PendingRemote<mojom::VolumeMounterInstance> volume_mounter_remote) |
| override; |
| void OnWakeLockInstanceReady( |
| mojo::PendingRemote<mojom::WakeLockInstance> wake_lock_remote) override; |
| void OnWallpaperInstanceReady( |
| mojo::PendingRemote<mojom::WallpaperInstance> wallpaper_remote) override; |
| void OnWebApkInstanceReady( |
| mojo::PendingRemote<mojom::WebApkInstance> webapk_remote) override; |
| |
| size_t GetNumMojoChannelsForTesting() const; |
| |
| 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 InstanceType, typename HostType> |
| void OnInstanceReady(ConnectionHolder<InstanceType, HostType>* holder, |
| mojo::PendingRemote<InstanceType> remote); |
| |
| // Called if one of the established channels is closed. |
| void OnChannelClosed(MojoChannelBase* channel); |
| |
| THREAD_CHECKER(thread_checker_); |
| |
| // Owned by ArcServiceManager. |
| ArcBridgeService* const arc_bridge_service_; |
| |
| mojo::Receiver<mojom::ArcBridgeHost> receiver_; |
| |
| // Put as a last member to ensure that any callback tied to the elements |
| // is not invoked. |
| std::vector<std::unique_ptr<MojoChannelBase>> mojo_channels_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ArcBridgeHostImpl); |
| }; |
| |
| } // namespace arc |
| |
| #endif // COMPONENTS_ARC_SESSION_ARC_BRIDGE_HOST_IMPL_H_ |