1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/nearby_sharing/webrtc_signaling_messenger.h"
6 
7 #include "base/callback_helpers.h"
8 #include "base/token.h"
9 #include "chrome/browser/nearby_sharing/instantmessaging/proto/instantmessaging.pb.h"
10 #include "chrome/browser/nearby_sharing/webrtc_request_builder.h"
11 
WebRtcSignalingMessenger(signin::IdentityManager * identity_manager,scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)12 WebRtcSignalingMessenger::WebRtcSignalingMessenger(
13     signin::IdentityManager* identity_manager,
14     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
15     : token_fetcher_(identity_manager),
16       send_message_express_(&token_fetcher_, url_loader_factory),
17       receive_messages_express_(&token_fetcher_, url_loader_factory) {}
18 
19 WebRtcSignalingMessenger::~WebRtcSignalingMessenger() = default;
20 
SendMessage(const std::string & self_id,const std::string & peer_id,const std::string & message,SendMessageCallback callback)21 void WebRtcSignalingMessenger::SendMessage(const std::string& self_id,
22                                            const std::string& peer_id,
23                                            const std::string& message,
24                                            SendMessageCallback callback) {
25   chrome_browser_nearby_sharing_instantmessaging::SendMessageExpressRequest
26       request = BuildSendRequest(self_id, peer_id);
27 
28   chrome_browser_nearby_sharing_instantmessaging::InboxMessage* inbox_message =
29       request.mutable_message();
30   inbox_message->set_message_id(base::Token::CreateRandom().ToString());
31   inbox_message->set_message(message);
32   inbox_message->set_message_class(
33       chrome_browser_nearby_sharing_instantmessaging::InboxMessage::EPHEMERAL);
34   inbox_message->set_message_type(
35       chrome_browser_nearby_sharing_instantmessaging::InboxMessage::BASIC);
36 
37   send_message_express_.SendMessage(request, std::move(callback));
38 }
39 
StartReceivingMessages(const std::string & self_id,mojo::PendingRemote<sharing::mojom::IncomingMessagesListener> incoming_messages_listener,StartReceivingMessagesCallback callback)40 void WebRtcSignalingMessenger::StartReceivingMessages(
41     const std::string& self_id,
42     mojo::PendingRemote<sharing::mojom::IncomingMessagesListener>
43         incoming_messages_listener,
44     StartReceivingMessagesCallback callback) {
45   chrome_browser_nearby_sharing_instantmessaging::ReceiveMessagesExpressRequest
46       request = BuildReceiveRequest(self_id);
47 
48   incoming_messages_listener_.reset();
49   incoming_messages_listener_.Bind(std::move(incoming_messages_listener));
50 
51   // base::Unretained is safe since |this| owns |receive_messages_express_|.
52   receive_messages_express_.StartReceivingMessages(
53       request,
54       base::BindRepeating(&WebRtcSignalingMessenger::OnMessageReceived,
55                           base::Unretained(this)),
56       base::BindOnce(&WebRtcSignalingMessenger::OnStartedReceivingMessages,
57                      base::Unretained(this), std::move(callback)));
58 }
59 
StopReceivingMessages()60 void WebRtcSignalingMessenger::StopReceivingMessages() {
61   incoming_messages_listener_.reset();
62   receive_messages_express_.StopReceivingMessages();
63 }
64 
OnStartedReceivingMessages(StartReceivingMessagesCallback callback,bool success)65 void WebRtcSignalingMessenger::OnStartedReceivingMessages(
66     StartReceivingMessagesCallback callback,
67     bool success) {
68   if (!success)
69     incoming_messages_listener_.reset();
70 
71   std::move(callback).Run(success);
72 }
73 
OnMessageReceived(const std::string & message)74 void WebRtcSignalingMessenger::OnMessageReceived(const std::string& message) {
75   if (!incoming_messages_listener_)
76     return;
77 
78   incoming_messages_listener_->OnMessage(message);
79 }
80