blob: 37abfbba81020575b160a7aeafd30e04698ab40b [file] [log] [blame]
// Copyright 2019 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.
#include "chrome/browser/sharing/sharing_handler_registry_impl.h"
#include "build/build_config.h"
#include "chrome/browser/sharing/ack_message_handler.h"
#include "chrome/browser/sharing/ping_message_handler.h"
#include "chrome/browser/sharing/sharing_device_registration.h"
#include "chrome/browser/sharing/sharing_message_handler.h"
#include "chrome/browser/sharing/sharing_message_sender.h"
#if defined(OS_ANDROID)
#include "base/feature_list.h"
#include "chrome/browser/sharing/click_to_call/click_to_call_message_handler_android.h"
#include "chrome/browser/sharing/click_to_call/feature.h"
#include "chrome/browser/sharing/shared_clipboard/shared_clipboard_message_handler_android.h"
#include "chrome/browser/sharing/sms/sms_fetch_request_handler.h"
#else
#include "chrome/browser/sharing/shared_clipboard/shared_clipboard_message_handler_desktop.h"
#include "chrome/browser/sharing/webrtc/sharing_service_host.h"
#include "chrome/browser/sharing/webrtc/webrtc_message_handler.h"
#endif // defined(OS_ANDROID)
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_CHROMEOS)
#include "chrome/browser/sharing/shared_clipboard/remote_copy_message_handler.h"
#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
// defined(OS_CHROMEOS)
SharingHandlerRegistryImpl::SharingHandlerRegistryImpl(
Profile* profile,
SharingDeviceRegistration* sharing_device_registration,
SharingMessageSender* message_sender,
SharingDeviceSource* device_source,
content::SmsFetcher* sms_fetcher,
SharingServiceHost* sharing_service_host) {
AddSharingHandler(std::make_unique<PingMessageHandler>(),
{chrome_browser_sharing::SharingMessage::kPingMessage});
AddSharingHandler(std::make_unique<AckMessageHandler>(message_sender),
{chrome_browser_sharing::SharingMessage::kAckMessage});
#if defined(OS_ANDROID)
// Note: IsClickToCallSupported() is not used as it requires JNI call.
if (base::FeatureList::IsEnabled(kClickToCallReceiver)) {
AddSharingHandler(
std::make_unique<ClickToCallMessageHandler>(),
{chrome_browser_sharing::SharingMessage::kClickToCallMessage});
}
if (sharing_device_registration->IsSmsFetcherSupported()) {
AddSharingHandler(
std::make_unique<SmsFetchRequestHandler>(sms_fetcher),
{chrome_browser_sharing::SharingMessage::kSmsFetchRequest});
}
#endif // defined(OS_ANDROID)
if (sharing_device_registration->IsSharedClipboardSupported()) {
std::unique_ptr<SharingMessageHandler> shared_clipboard_message_handler;
#if defined(OS_ANDROID)
shared_clipboard_message_handler =
std::make_unique<SharedClipboardMessageHandlerAndroid>(device_source);
#else
shared_clipboard_message_handler =
std::make_unique<SharedClipboardMessageHandlerDesktop>(device_source,
profile);
#endif // defined(OS_ANDROID)
AddSharingHandler(
std::move(shared_clipboard_message_handler),
{chrome_browser_sharing::SharingMessage::kSharedClipboardMessage});
}
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_CHROMEOS)
if (sharing_device_registration->IsRemoteCopySupported()) {
AddSharingHandler(
std::make_unique<RemoteCopyMessageHandler>(profile),
{chrome_browser_sharing::SharingMessage::kRemoteCopyMessage});
}
#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
// defined(OS_CHROMEOS)
#if !defined(OS_ANDROID)
if (sharing_device_registration->IsPeerConnectionSupported()) {
sharing_service_host->SetSharingHandlerRegistry(this);
AddSharingHandler(
std::make_unique<WebRtcMessageHandler>(sharing_service_host),
{chrome_browser_sharing::SharingMessage::kPeerConnectionOfferMessage,
chrome_browser_sharing::SharingMessage::
kPeerConnectionIceCandidatesMessage});
}
#endif // !defined(OS_ANDROID)
}
SharingHandlerRegistryImpl::~SharingHandlerRegistryImpl() = default;
SharingMessageHandler* SharingHandlerRegistryImpl::GetSharingHandler(
chrome_browser_sharing::SharingMessage::PayloadCase payload_case) {
auto it = handler_map_.find(payload_case);
if (it != handler_map_.end())
return it->second;
auto extra_it = extra_handler_map_.find(payload_case);
if (extra_it != extra_handler_map_.end())
return extra_it->second.get();
return nullptr;
}
void SharingHandlerRegistryImpl::AddSharingHandler(
std::unique_ptr<SharingMessageHandler> handler,
std::set<chrome_browser_sharing::SharingMessage::PayloadCase>
payload_cases) {
DCHECK(handler) << "Received request to add null handler";
for (const auto& payload_case : payload_cases) {
DCHECK(payload_case !=
chrome_browser_sharing::SharingMessage::PAYLOAD_NOT_SET)
<< "Incorrect payload type specified for handler";
DCHECK(!handler_map_.count(payload_case)) << "Handler already exists";
handler_map_[payload_case] = handler.get();
}
handlers_.push_back(std::move(handler));
}
void SharingHandlerRegistryImpl::RegisterSharingHandler(
std::unique_ptr<SharingMessageHandler> handler,
chrome_browser_sharing::SharingMessage::PayloadCase payload_case) {
DCHECK(handler) << "Received request to add null handler";
DCHECK(!GetSharingHandler(payload_case));
DCHECK(payload_case !=
chrome_browser_sharing::SharingMessage::PAYLOAD_NOT_SET)
<< "Incorrect payload type specified for handler";
extra_handler_map_[payload_case] = std::move(handler);
}
void SharingHandlerRegistryImpl::UnregisterSharingHandler(
chrome_browser_sharing::SharingMessage::PayloadCase payload_case) {
extra_handler_map_.erase(payload_case);
}