| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/nearby_sharing/webrtc_signaling_messenger.h" |
| |
| #include "base/functional/callback_helpers.h" |
| #include "base/token.h" |
| #include "chrome/browser/nearby_sharing/instantmessaging/proto/instantmessaging.pb.h" |
| #include "chrome/browser/nearby_sharing/webrtc_request_builder.h" |
| #include "components/cross_device/logging/logging.h" |
| |
| WebRtcSignalingMessenger::WebRtcSignalingMessenger( |
| signin::IdentityManager* identity_manager, |
| scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) |
| : identity_manager_(identity_manager), |
| url_loader_factory_(url_loader_factory) {} |
| |
| WebRtcSignalingMessenger::~WebRtcSignalingMessenger() = default; |
| |
| void WebRtcSignalingMessenger::SendMessage( |
| const std::string& self_id, |
| const std::string& peer_id, |
| ::sharing::mojom::LocationHintPtr location_hint, |
| const std::string& message, |
| SendMessageCallback callback) { |
| chrome_browser_nearby_sharing_instantmessaging::SendMessageExpressRequest |
| request = BuildSendRequest(self_id, peer_id, std::move(location_hint)); |
| |
| CD_LOG(VERBOSE, Feature::NEARBY_INFRA) |
| << __func__ << ": self_id=" << self_id << ", peer_id=" << peer_id |
| << ", request_id=" << request.header().request_id() |
| << ", message size=" << message.size(); |
| |
| chrome_browser_nearby_sharing_instantmessaging::InboxMessage* inbox_message = |
| request.mutable_message(); |
| inbox_message->set_message_id(base::Token::CreateRandom().ToString()); |
| inbox_message->set_message(message); |
| inbox_message->set_message_class( |
| chrome_browser_nearby_sharing_instantmessaging::InboxMessage::EPHEMERAL); |
| inbox_message->set_message_type( |
| chrome_browser_nearby_sharing_instantmessaging::InboxMessage::BASIC); |
| |
| // We tie the lifetime of the SendMessageExpress object to the lifetime of the |
| // mojo call. Once the call completes, we allow the unique_ptr to go out of |
| // scope in the lambda cleaning up all resources. |
| auto send_message_express = std::make_unique<SendMessageExpress>( |
| identity_manager_, url_loader_factory_); |
| // The call to SendMessage is done on the raw pointer so we can std::move the |
| // unique_ptr into the bind closure without 'use-after-move' warnings. |
| auto* send_message_express_ptr = send_message_express.get(); |
| send_message_express_ptr->SendMessage( |
| request, |
| base::BindOnce( |
| [](SendMessageCallback cb, |
| std::unique_ptr<SendMessageExpress> send_message, bool success) { |
| // Complete the original mojo call. |
| std::move(cb).Run(success); |
| // Intentionally let |send_message| go out of scope and delete the |
| // object. |
| }, |
| std::move(callback), std::move(send_message_express))); |
| } |
| |
| void WebRtcSignalingMessenger::StartReceivingMessages( |
| const std::string& self_id, |
| ::sharing::mojom::LocationHintPtr location_hint, |
| mojo::PendingRemote<::sharing::mojom::IncomingMessagesListener> |
| incoming_messages_listener, |
| StartReceivingMessagesCallback callback) { |
| // Starts a self owned mojo pipe for the receive session that can be stopped |
| // with the remote returned in the start callback. Resources will be cleaned |
| // up when the mojo pipe goes down. |
| ReceiveMessagesExpress::StartReceiveSession( |
| self_id, std::move(location_hint), std::move(incoming_messages_listener), |
| std::move(callback), identity_manager_, url_loader_factory_); |
| } |