blob: 55cfa9d1e759402549f3a7e003bff4a949b527b9 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_BLUETOOTH_ADVERTISEMENT_CLIENT_H_
#define CONTENT_BROWSER_BLUETOOTH_ADVERTISEMENT_CLIENT_H_
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "content/browser/bluetooth/bluetooth_device_scanning_prompt_controller.h"
#include "content/browser/bluetooth/web_bluetooth_service_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h"
namespace content {
namespace {
using RequestCallback =
base::OnceCallback<void(blink::mojom::WebBluetoothResult)>;
}
class WebBluetoothServiceImpl::AdvertisementClient {
public:
virtual void SendEvent(
const blink::mojom::WebBluetoothAdvertisingEvent& event) = 0;
bool is_connected() { return client_remote_.is_connected(); }
void RunCallback(blink::mojom::WebBluetoothResult result) {
std::move(callback_).Run(result);
}
protected:
explicit AdvertisementClient(
WebBluetoothServiceImpl* service,
mojo::PendingAssociatedRemote<
blink::mojom::WebBluetoothAdvertisementClient> client_info,
RequestCallback callback);
virtual ~AdvertisementClient();
mojo::AssociatedRemote<blink::mojom::WebBluetoothAdvertisementClient>
client_remote_;
raw_ptr<WebContentsImpl> web_contents_;
raw_ptr<WebBluetoothServiceImpl> service_;
private:
RequestCallback callback_;
};
class WebBluetoothServiceImpl::WatchAdvertisementsClient
: public WebBluetoothServiceImpl::AdvertisementClient {
public:
WatchAdvertisementsClient(
WebBluetoothServiceImpl* service,
mojo::PendingAssociatedRemote<
blink::mojom::WebBluetoothAdvertisementClient> client_info,
blink::WebBluetoothDeviceId device_id,
RequestCallback callback);
~WatchAdvertisementsClient() override;
// AdvertisementClient implementation:
void SendEvent(
const blink::mojom::WebBluetoothAdvertisingEvent& event) override;
blink::WebBluetoothDeviceId device_id() const { return device_id_; }
private:
blink::WebBluetoothDeviceId device_id_;
};
class WebBluetoothServiceImpl::ScanningClient
: public WebBluetoothServiceImpl::AdvertisementClient {
public:
ScanningClient(WebBluetoothServiceImpl* service,
mojo::PendingAssociatedRemote<
blink::mojom::WebBluetoothAdvertisementClient> client_info,
blink::mojom::WebBluetoothRequestLEScanOptionsPtr options,
RequestCallback callback);
~ScanningClient() override;
void SetPromptController(
BluetoothDeviceScanningPromptController* prompt_controller) {
prompt_controller_ = prompt_controller;
}
// AdvertisingClient implementation:
void SendEvent(
const blink::mojom::WebBluetoothAdvertisingEvent& event) override;
void set_prompt_controller(
BluetoothDeviceScanningPromptController* prompt_controller) {
prompt_controller_ = prompt_controller;
}
BluetoothDeviceScanningPromptController* prompt_controller() {
return prompt_controller_;
}
void set_allow_send_event(bool allow_send_event) {
allow_send_event_ = allow_send_event;
}
const blink::mojom::WebBluetoothRequestLEScanOptions& scan_options() {
return *options_;
}
private:
void AddFilteredDeviceToPrompt(
const std::string& device_id,
const std::optional<std::string>& device_name) {
bool should_update_name = device_name.has_value();
std::u16string device_name_for_display =
base::UTF8ToUTF16(device_name.value_or(""));
prompt_controller_->AddFilteredDevice(device_id, should_update_name,
device_name_for_display);
}
bool allow_send_event_ = false;
blink::mojom::WebBluetoothRequestLEScanOptionsPtr options_;
raw_ptr<BluetoothDeviceScanningPromptController> prompt_controller_ = nullptr;
};
} // namespace content
#endif // CONTENT_BROWSER_BLUETOOTH_ADVERTISEMENT_CLIENT_H_