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