Avi Drissman | 4a8573c | 2022-09-09 19:35:54 | [diff] [blame^] | 1 | // Copyright 2019 The Chromium Authors |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 2 | // 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 Knoll | 367f223 | 2019-11-14 18:11:34 | [diff] [blame] | 9 | #include <memory> |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 10 | #include <string> |
| 11 | |
| 12 | #include "base/callback.h" |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 13 | #include "base/memory/raw_ptr.h" |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 14 | #include "base/memory/weak_ptr.h" |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 15 | #include "base/time/time.h" |
Anton Bikineev | 46bbb97 | 2021-05-15 17:53:53 | [diff] [blame] | 16 | #include "third_party/abseil-cpp/absl/types/optional.h" |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 17 | |
| 18 | namespace chrome_browser_sharing { |
| 19 | enum MessageType : int; |
| 20 | class ResponseMessage; |
| 21 | class SharingMessage; |
| 22 | } // namespace chrome_browser_sharing |
| 23 | |
| 24 | namespace syncer { |
Michael van Ouwerkerk | 01bcfbd | 2019-12-10 12:01:02 | [diff] [blame] | 25 | class DeviceInfo; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 26 | class LocalDeviceInfoProvider; |
| 27 | } // namespace syncer |
| 28 | |
Alex Chau | 5bfcccb | 2020-02-04 18:41:07 | [diff] [blame] | 29 | enum class SharingChannelType; |
Alex Chau | da2073d6 | 2020-01-29 11:26:08 | [diff] [blame] | 30 | class SharingFCMSender; |
Himanshu Jaju | 453c8bc | 2019-12-05 19:31:21 | [diff] [blame] | 31 | enum class SharingDevicePlatform; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 32 | enum class SharingSendMessageResult; |
| 33 | |
| 34 | class SharingMessageSender { |
| 35 | public: |
| 36 | using ResponseCallback = base::OnceCallback<void( |
| 37 | SharingSendMessageResult, |
| 38 | std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>; |
| 39 | |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 40 | // Delegate class used to swap the actual message sending implementation. |
| 41 | class SendMessageDelegate { |
| 42 | public: |
| 43 | using SendMessageCallback = |
Alex Chau | 5bfcccb | 2020-02-04 18:41:07 | [diff] [blame] | 44 | base::OnceCallback<void(SharingSendMessageResult result, |
Anton Bikineev | 46bbb97 | 2021-05-15 17:53:53 | [diff] [blame] | 45 | absl::optional<std::string> message_id, |
Alex Chau | 5bfcccb | 2020-02-04 18:41:07 | [diff] [blame] | 46 | SharingChannelType channel_type)>; |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 47 | 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 Knoll | 46f1ab02 | 2020-01-24 21:17:21 | [diff] [blame] | 59 | kWebRtc, |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 60 | }; |
| 61 | |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 62 | SharingMessageSender( |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 63 | syncer::LocalDeviceInfoProvider* local_device_info_provider); |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 64 | SharingMessageSender(const SharingMessageSender&) = delete; |
| 65 | SharingMessageSender& operator=(const SharingMessageSender&) = delete; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 66 | virtual ~SharingMessageSender(); |
| 67 | |
Yi Gu | 1211d82 | 2021-03-23 16:21:30 | [diff] [blame] | 68 | virtual base::OnceClosure SendMessageToDevice( |
Michael van Ouwerkerk | 01bcfbd | 2019-12-10 12:01:02 | [diff] [blame] | 69 | const syncer::DeviceInfo& device, |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 70 | base::TimeDelta response_timeout, |
| 71 | chrome_browser_sharing::SharingMessage message, |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 72 | DelegateType delegate_type, |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 73 | ResponseCallback callback); |
| 74 | |
| 75 | virtual void OnAckReceived( |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 76 | const std::string& message_id, |
| 77 | std::unique_ptr<chrome_browser_sharing::ResponseMessage> response); |
| 78 | |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 79 | // 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 Chau | da2073d6 | 2020-01-29 11:26:08 | [diff] [blame] | 84 | // Returns SharingFCMSender for testing. |
| 85 | SharingFCMSender* GetFCMSenderForTesting() const; |
| 86 | |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 87 | private: |
Richard Knoll | ae2f49f | 2020-01-15 18:18:53 | [diff] [blame] | 88 | struct SentMessageMetadata { |
| 89 | SentMessageMetadata(ResponseCallback callback, |
| 90 | base::TimeTicks timestamp, |
| 91 | chrome_browser_sharing::MessageType type, |
| 92 | SharingDevicePlatform receiver_device_platform, |
Alex Chau | 5bfcccb | 2020-02-04 18:41:07 | [diff] [blame] | 93 | int trace_id, |
Michael van Ouwerkerk | a7bd20d | 2020-02-05 18:53:37 | [diff] [blame] | 94 | SharingChannelType channel_type, |
| 95 | base::TimeDelta receiver_pulse_interval); |
Richard Knoll | ae2f49f | 2020-01-15 18:18:53 | [diff] [blame] | 96 | 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 Ouwerkerk | ce7d4ed | 2020-01-24 18:15:11 | [diff] [blame] | 104 | int trace_id; |
Alex Chau | 5bfcccb | 2020-02-04 18:41:07 | [diff] [blame] | 105 | SharingChannelType channel_type; |
Michael van Ouwerkerk | a7bd20d | 2020-02-05 18:53:37 | [diff] [blame] | 106 | base::TimeDelta receiver_pulse_interval; |
Richard Knoll | ae2f49f | 2020-01-15 18:18:53 | [diff] [blame] | 107 | }; |
| 108 | |
| 109 | void OnMessageSent(const std::string& message_guid, |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 110 | SharingSendMessageResult result, |
Anton Bikineev | 46bbb97 | 2021-05-15 17:53:53 | [diff] [blame] | 111 | absl::optional<std::string> message_id, |
Alex Chau | 5bfcccb | 2020-02-04 18:41:07 | [diff] [blame] | 112 | SharingChannelType channel_type); |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 113 | |
| 114 | void InvokeSendMessageCallback( |
| 115 | const std::string& message_guid, |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 116 | SharingSendMessageResult result, |
| 117 | std::unique_ptr<chrome_browser_sharing::ResponseMessage> response); |
| 118 | |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 119 | raw_ptr<syncer::LocalDeviceInfoProvider> local_device_info_provider_; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 120 | |
Richard Knoll | ae2f49f | 2020-01-15 18:18:53 | [diff] [blame] | 121 | // Map of random GUID to SentMessageMetadata. |
| 122 | std::map<std::string, SentMessageMetadata> message_metadata_; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 123 | // Map of FCM message_id to random GUID. |
| 124 | std::map<std::string, std::string> message_guids_; |
Richard Knoll | d3d2d1db | 2020-01-15 19:34:30 | [diff] [blame] | 125 | // 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 Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 129 | |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 130 | // Registered delegates to send messages. |
| 131 | std::map<DelegateType, std::unique_ptr<SendMessageDelegate>> send_delegates_; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 132 | |
Richard Knoll | d17e406 | 2020-01-14 21:23:14 | [diff] [blame] | 133 | base::WeakPtrFactory<SharingMessageSender> weak_ptr_factory_{this}; |
Himanshu Jaju | a69dbe5 | 2019-11-04 19:58:05 | [diff] [blame] | 134 | }; |
| 135 | |
| 136 | #endif // CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_ |