blob: 5e30bf576edbb4a2cafc866a8415f1e79f5e9a0a [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2019 The Chromium Authors
Himanshu Jajua69dbe52019-11-04 19:58:052// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_
6#define CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_
7
8#include <map>
Richard Knoll367f2232019-11-14 18:11:349#include <memory>
Himanshu Jajua69dbe52019-11-04 19:58:0510#include <string>
11
12#include "base/callback.h"
Keishi Hattori0e45c022021-11-27 09:25:5213#include "base/memory/raw_ptr.h"
Himanshu Jajua69dbe52019-11-04 19:58:0514#include "base/memory/weak_ptr.h"
Himanshu Jajua69dbe52019-11-04 19:58:0515#include "base/time/time.h"
Anton Bikineev46bbb972021-05-15 17:53:5316#include "third_party/abseil-cpp/absl/types/optional.h"
Himanshu Jajua69dbe52019-11-04 19:58:0517
18namespace chrome_browser_sharing {
19enum MessageType : int;
20class ResponseMessage;
21class SharingMessage;
22} // namespace chrome_browser_sharing
23
24namespace syncer {
Michael van Ouwerkerk01bcfbd2019-12-10 12:01:0225class DeviceInfo;
Himanshu Jajua69dbe52019-11-04 19:58:0526class LocalDeviceInfoProvider;
27} // namespace syncer
28
Alex Chau5bfcccb2020-02-04 18:41:0729enum class SharingChannelType;
Alex Chauda2073d62020-01-29 11:26:0830class SharingFCMSender;
Himanshu Jaju453c8bc2019-12-05 19:31:2131enum class SharingDevicePlatform;
Himanshu Jajua69dbe52019-11-04 19:58:0532enum class SharingSendMessageResult;
33
34class SharingMessageSender {
35 public:
36 using ResponseCallback = base::OnceCallback<void(
37 SharingSendMessageResult,
38 std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>;
39
Richard Knolld17e4062020-01-14 21:23:1440 // Delegate class used to swap the actual message sending implementation.
41 class SendMessageDelegate {
42 public:
43 using SendMessageCallback =
Alex Chau5bfcccb2020-02-04 18:41:0744 base::OnceCallback<void(SharingSendMessageResult result,
Anton Bikineev46bbb972021-05-15 17:53:5345 absl::optional<std::string> message_id,
Alex Chau5bfcccb2020-02-04 18:41:0746 SharingChannelType channel_type)>;
Richard Knolld17e4062020-01-14 21:23:1447 virtual ~SendMessageDelegate() = default;
48
49 virtual void DoSendMessageToDevice(
50 const syncer::DeviceInfo& device,
51 base::TimeDelta time_to_live,
52 chrome_browser_sharing::SharingMessage message,
53 SendMessageCallback callback) = 0;
54 };
55
56 // Delegate type used to send a message.
57 enum class DelegateType {
58 kFCM,
Richard Knoll46f1ab022020-01-24 21:17:2159 kWebRtc,
Richard Knolld17e4062020-01-14 21:23:1460 };
61
Himanshu Jajua69dbe52019-11-04 19:58:0562 SharingMessageSender(
Himanshu Jajua69dbe52019-11-04 19:58:0563 syncer::LocalDeviceInfoProvider* local_device_info_provider);
Richard Knolld17e4062020-01-14 21:23:1464 SharingMessageSender(const SharingMessageSender&) = delete;
65 SharingMessageSender& operator=(const SharingMessageSender&) = delete;
Himanshu Jajua69dbe52019-11-04 19:58:0566 virtual ~SharingMessageSender();
67
Yi Gu1211d822021-03-23 16:21:3068 virtual base::OnceClosure SendMessageToDevice(
Michael van Ouwerkerk01bcfbd2019-12-10 12:01:0269 const syncer::DeviceInfo& device,
Himanshu Jajua69dbe52019-11-04 19:58:0570 base::TimeDelta response_timeout,
71 chrome_browser_sharing::SharingMessage message,
Richard Knolld17e4062020-01-14 21:23:1472 DelegateType delegate_type,
Himanshu Jajua69dbe52019-11-04 19:58:0573 ResponseCallback callback);
74
75 virtual void OnAckReceived(
Himanshu Jajua69dbe52019-11-04 19:58:0576 const std::string& message_id,
77 std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
78
Richard Knolld17e4062020-01-14 21:23:1479 // Registers the given |delegate| to send messages when SendMessageToDevice is
80 // called with |type|.
81 void RegisterSendDelegate(DelegateType type,
82 std::unique_ptr<SendMessageDelegate> delegate);
83
Alex Chauda2073d62020-01-29 11:26:0884 // Returns SharingFCMSender for testing.
85 SharingFCMSender* GetFCMSenderForTesting() const;
86
Himanshu Jajua69dbe52019-11-04 19:58:0587 private:
Richard Knollae2f49f2020-01-15 18:18:5388 struct SentMessageMetadata {
89 SentMessageMetadata(ResponseCallback callback,
90 base::TimeTicks timestamp,
91 chrome_browser_sharing::MessageType type,
92 SharingDevicePlatform receiver_device_platform,
Alex Chau5bfcccb2020-02-04 18:41:0793 int trace_id,
Michael van Ouwerkerka7bd20d2020-02-05 18:53:3794 SharingChannelType channel_type,
95 base::TimeDelta receiver_pulse_interval);
Richard Knollae2f49f2020-01-15 18:18:5396 SentMessageMetadata(SentMessageMetadata&& other);
97 SentMessageMetadata& operator=(SentMessageMetadata&& other);
98 ~SentMessageMetadata();
99
100 ResponseCallback callback;
101 base::TimeTicks timestamp;
102 chrome_browser_sharing::MessageType type;
103 SharingDevicePlatform receiver_device_platform;
Michael van Ouwerkerkce7d4ed2020-01-24 18:15:11104 int trace_id;
Alex Chau5bfcccb2020-02-04 18:41:07105 SharingChannelType channel_type;
Michael van Ouwerkerka7bd20d2020-02-05 18:53:37106 base::TimeDelta receiver_pulse_interval;
Richard Knollae2f49f2020-01-15 18:18:53107 };
108
109 void OnMessageSent(const std::string& message_guid,
Himanshu Jajua69dbe52019-11-04 19:58:05110 SharingSendMessageResult result,
Anton Bikineev46bbb972021-05-15 17:53:53111 absl::optional<std::string> message_id,
Alex Chau5bfcccb2020-02-04 18:41:07112 SharingChannelType channel_type);
Himanshu Jajua69dbe52019-11-04 19:58:05113
114 void InvokeSendMessageCallback(
115 const std::string& message_guid,
Himanshu Jajua69dbe52019-11-04 19:58:05116 SharingSendMessageResult result,
117 std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
118
Keishi Hattori0e45c022021-11-27 09:25:52119 raw_ptr<syncer::LocalDeviceInfoProvider> local_device_info_provider_;
Himanshu Jajua69dbe52019-11-04 19:58:05120
Richard Knollae2f49f2020-01-15 18:18:53121 // Map of random GUID to SentMessageMetadata.
122 std::map<std::string, SentMessageMetadata> message_metadata_;
Himanshu Jajua69dbe52019-11-04 19:58:05123 // Map of FCM message_id to random GUID.
124 std::map<std::string, std::string> message_guids_;
Richard Knolld3d2d1db2020-01-15 19:34:30125 // Map of FCM message_id to received ACK response messages.
126 std::map<std::string,
127 std::unique_ptr<chrome_browser_sharing::ResponseMessage>>
128 cached_ack_response_messages_;
Himanshu Jajua69dbe52019-11-04 19:58:05129
Richard Knolld17e4062020-01-14 21:23:14130 // Registered delegates to send messages.
131 std::map<DelegateType, std::unique_ptr<SendMessageDelegate>> send_delegates_;
Himanshu Jajua69dbe52019-11-04 19:58:05132
Richard Knolld17e4062020-01-14 21:23:14133 base::WeakPtrFactory<SharingMessageSender> weak_ptr_factory_{this};
Himanshu Jajua69dbe52019-11-04 19:58:05134};
135
136#endif // CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_