blob: e4cdae809001bb04620cb8d110c9667d70d81304 [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
Hira Mahmood0f3c35a82024-07-31 15:43:265#ifndef COMPONENTS_SHARING_MESSAGE_SHARING_MESSAGE_SENDER_H_
6#define COMPONENTS_SHARING_MESSAGE_SHARING_MESSAGE_SENDER_H_
Himanshu Jajua69dbe52019-11-04 19:58:057
8#include <map>
Richard Knoll367f2232019-11-14 18:11:349#include <memory>
Arthur Sonzognife132ee2024-01-15 11:01:0410#include <optional>
Himanshu Jajua69dbe52019-11-04 19:58:0511#include <string>
12
Avi Drissman9269d4ed2023-01-07 01:38:0613#include "base/functional/callback.h"
Keishi Hattori0e45c022021-11-27 09:25:5214#include "base/memory/raw_ptr.h"
Himanshu Jajua69dbe52019-11-04 19:58:0515#include "base/memory/weak_ptr.h"
Hira Mahmood0f3c35a82024-07-31 15:43:2616#include "base/task/single_thread_task_runner.h"
Himanshu Jajua69dbe52019-11-04 19:58:0517#include "base/time/time.h"
Hira Mahmood0f3c35a82024-07-31 15:43:2618#include "components/sharing_message/sharing_target_device_info.h"
Himanshu Jajua69dbe52019-11-04 19:58:0519
Hira Mahmoode16b75f02024-07-18 17:46:4320namespace components_sharing_message {
Himanshu Jajua69dbe52019-11-04 19:58:0521class ResponseMessage;
22class SharingMessage;
Hira Mahmoode16b75f02024-07-18 17:46:4323} // namespace components_sharing_message
Himanshu Jajua69dbe52019-11-04 19:58:0524
Hira Mahmood50818ce22024-08-08 19:39:5125namespace sharing_message {
26enum MessageType : int;
27} // namespace sharing_message
28
Himanshu Jajua69dbe52019-11-04 19:58:0529namespace syncer {
30class LocalDeviceInfoProvider;
31} // namespace syncer
32
Hira Mahmood50818ce22024-08-08 19:39:5133namespace sync_pb {
34class UnencryptedSharingMessage;
35} // namespace sync_pb
36
Alex Chau5bfcccb2020-02-04 18:41:0737enum class SharingChannelType;
Alex Chauda2073d62020-01-29 11:26:0838class SharingFCMSender;
Himanshu Jaju453c8bc2019-12-05 19:31:2139enum class SharingDevicePlatform;
Himanshu Jajua69dbe52019-11-04 19:58:0540enum class SharingSendMessageResult;
41
42class SharingMessageSender {
43 public:
44 using ResponseCallback = base::OnceCallback<void(
45 SharingSendMessageResult,
Hira Mahmoode16b75f02024-07-18 17:46:4346 std::unique_ptr<components_sharing_message::ResponseMessage>)>;
Himanshu Jajua69dbe52019-11-04 19:58:0547
Richard Knolld17e4062020-01-14 21:23:1448 // Delegate class used to swap the actual message sending implementation.
49 class SendMessageDelegate {
50 public:
51 using SendMessageCallback =
Alex Chau5bfcccb2020-02-04 18:41:0752 base::OnceCallback<void(SharingSendMessageResult result,
Arthur Sonzognife132ee2024-01-15 11:01:0453 std::optional<std::string> message_id,
Alex Chau5bfcccb2020-02-04 18:41:0754 SharingChannelType channel_type)>;
Richard Knolld17e4062020-01-14 21:23:1455 virtual ~SendMessageDelegate() = default;
56
57 virtual void DoSendMessageToDevice(
Mikel Astiz38096762024-01-05 16:23:1858 const SharingTargetDeviceInfo& device,
Richard Knolld17e4062020-01-14 21:23:1459 base::TimeDelta time_to_live,
Hira Mahmoode16b75f02024-07-18 17:46:4360 components_sharing_message::SharingMessage message,
Richard Knolld17e4062020-01-14 21:23:1461 SendMessageCallback callback) = 0;
Hira Mahmood50818ce22024-08-08 19:39:5162
63 virtual void DoSendUnencryptedMessageToDevice(
64 const SharingTargetDeviceInfo& device,
65 sync_pb::UnencryptedSharingMessage message,
66 SendMessageCallback callback) = 0;
Rushan Suleymanov3eae9f542024-12-10 21:18:3267
68 virtual void ClearPendingMessages() = 0;
Richard Knolld17e4062020-01-14 21:23:1469 };
70
71 // Delegate type used to send a message.
Hira Mahmood50818ce22024-08-08 19:39:5172 enum class DelegateType { kFCM, kWebRtc, kIOSPush };
Richard Knolld17e4062020-01-14 21:23:1473
Himanshu Jajua69dbe52019-11-04 19:58:0574 SharingMessageSender(
Hira Mahmood0f3c35a82024-07-31 15:43:2675 syncer::LocalDeviceInfoProvider* local_device_info_provider,
76 scoped_refptr<base::SingleThreadTaskRunner> task_runner);
Richard Knolld17e4062020-01-14 21:23:1477 SharingMessageSender(const SharingMessageSender&) = delete;
78 SharingMessageSender& operator=(const SharingMessageSender&) = delete;
Himanshu Jajua69dbe52019-11-04 19:58:0579 virtual ~SharingMessageSender();
80
Yi Gu1211d822021-03-23 16:21:3081 virtual base::OnceClosure SendMessageToDevice(
Mikel Astiz38096762024-01-05 16:23:1882 const SharingTargetDeviceInfo& device,
Himanshu Jajua69dbe52019-11-04 19:58:0583 base::TimeDelta response_timeout,
Hira Mahmoode16b75f02024-07-18 17:46:4384 components_sharing_message::SharingMessage message,
Richard Knolld17e4062020-01-14 21:23:1485 DelegateType delegate_type,
Himanshu Jajua69dbe52019-11-04 19:58:0586 ResponseCallback callback);
87
Hira Mahmood50818ce22024-08-08 19:39:5188 virtual base::OnceClosure SendUnencryptedMessageToDevice(
89 const SharingTargetDeviceInfo& device,
90 sync_pb::UnencryptedSharingMessage message,
91 DelegateType delegate_type,
92 ResponseCallback callback);
93
Himanshu Jajua69dbe52019-11-04 19:58:0594 virtual void OnAckReceived(
Himanshu Jajua69dbe52019-11-04 19:58:0595 const std::string& message_id,
Hira Mahmoode16b75f02024-07-18 17:46:4396 std::unique_ptr<components_sharing_message::ResponseMessage> response);
Himanshu Jajua69dbe52019-11-04 19:58:0597
Richard Knolld17e4062020-01-14 21:23:1498 // Registers the given |delegate| to send messages when SendMessageToDevice is
99 // called with |type|.
100 void RegisterSendDelegate(DelegateType type,
101 std::unique_ptr<SendMessageDelegate> delegate);
102
Rushan Suleymanov3eae9f542024-12-10 21:18:32103 // Clears all pending messages for all delegates.
104 void ClearPendingMessages();
105
Alex Chauda2073d62020-01-29 11:26:08106 // Returns SharingFCMSender for testing.
107 SharingFCMSender* GetFCMSenderForTesting() const;
108
Himanshu Jajua69dbe52019-11-04 19:58:05109 private:
Richard Knollae2f49f2020-01-15 18:18:53110 struct SentMessageMetadata {
111 SentMessageMetadata(ResponseCallback callback,
112 base::TimeTicks timestamp,
Hira Mahmood50818ce22024-08-08 19:39:51113 sharing_message::MessageType type,
Richard Knollae2f49f2020-01-15 18:18:53114 SharingDevicePlatform receiver_device_platform,
Alex Chau5bfcccb2020-02-04 18:41:07115 int trace_id,
Michael van Ouwerkerka7bd20d2020-02-05 18:53:37116 SharingChannelType channel_type,
117 base::TimeDelta receiver_pulse_interval);
Richard Knollae2f49f2020-01-15 18:18:53118 SentMessageMetadata(SentMessageMetadata&& other);
119 SentMessageMetadata& operator=(SentMessageMetadata&& other);
120 ~SentMessageMetadata();
121
122 ResponseCallback callback;
123 base::TimeTicks timestamp;
Hira Mahmood50818ce22024-08-08 19:39:51124 sharing_message::MessageType type;
Richard Knollae2f49f2020-01-15 18:18:53125 SharingDevicePlatform receiver_device_platform;
Michael van Ouwerkerkce7d4ed2020-01-24 18:15:11126 int trace_id;
Alex Chau5bfcccb2020-02-04 18:41:07127 SharingChannelType channel_type;
Michael van Ouwerkerka7bd20d2020-02-05 18:53:37128 base::TimeDelta receiver_pulse_interval;
Richard Knollae2f49f2020-01-15 18:18:53129 };
130
131 void OnMessageSent(const std::string& message_guid,
Hira Mahmood44a3d73f2024-09-16 15:33:08132 sharing_message::MessageType message_type,
Himanshu Jajua69dbe52019-11-04 19:58:05133 SharingSendMessageResult result,
Arthur Sonzognife132ee2024-01-15 11:01:04134 std::optional<std::string> message_id,
Alex Chau5bfcccb2020-02-04 18:41:07135 SharingChannelType channel_type);
Himanshu Jajua69dbe52019-11-04 19:58:05136
137 void InvokeSendMessageCallback(
138 const std::string& message_guid,
Himanshu Jajua69dbe52019-11-04 19:58:05139 SharingSendMessageResult result,
Hira Mahmoode16b75f02024-07-18 17:46:43140 std::unique_ptr<components_sharing_message::ResponseMessage> response);
Himanshu Jajua69dbe52019-11-04 19:58:05141
Hira Mahmood50818ce22024-08-08 19:39:51142 SendMessageDelegate* MaybeGetSendMessageDelegate(
143 const SharingTargetDeviceInfo& device,
144 sharing_message::MessageType message_type,
145 int trace_id,
146 const std::string& message_guid,
147 DelegateType delegate_type);
148
Keishi Hattori0e45c022021-11-27 09:25:52149 raw_ptr<syncer::LocalDeviceInfoProvider> local_device_info_provider_;
Himanshu Jajua69dbe52019-11-04 19:58:05150
Hira Mahmood0f3c35a82024-07-31 15:43:26151 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
152
Richard Knollae2f49f2020-01-15 18:18:53153 // Map of random GUID to SentMessageMetadata.
154 std::map<std::string, SentMessageMetadata> message_metadata_;
Himanshu Jajua69dbe52019-11-04 19:58:05155 // Map of FCM message_id to random GUID.
156 std::map<std::string, std::string> message_guids_;
Richard Knolld3d2d1db2020-01-15 19:34:30157 // Map of FCM message_id to received ACK response messages.
158 std::map<std::string,
Hira Mahmoode16b75f02024-07-18 17:46:43159 std::unique_ptr<components_sharing_message::ResponseMessage>>
Richard Knolld3d2d1db2020-01-15 19:34:30160 cached_ack_response_messages_;
Himanshu Jajua69dbe52019-11-04 19:58:05161
Richard Knolld17e4062020-01-14 21:23:14162 // Registered delegates to send messages.
163 std::map<DelegateType, std::unique_ptr<SendMessageDelegate>> send_delegates_;
Himanshu Jajua69dbe52019-11-04 19:58:05164
Richard Knolld17e4062020-01-14 21:23:14165 base::WeakPtrFactory<SharingMessageSender> weak_ptr_factory_{this};
Himanshu Jajua69dbe52019-11-04 19:58:05166};
167
Hira Mahmood0f3c35a82024-07-31 15:43:26168#endif // COMPONENTS_SHARING_MESSAGE_SHARING_MESSAGE_SENDER_H_