blob: 5045d5b99c380647ff9ad3f8b12b1107980c8328 [file] [log] [blame]
Himanshu Jajua69dbe52019-11-04 19:58:051// Copyright 2019 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#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"
Himanshu Jajua69dbe52019-11-04 19:58:0513#include "base/memory/weak_ptr.h"
14#include "base/optional.h"
15#include "base/time/time.h"
16
17namespace chrome_browser_sharing {
18enum MessageType : int;
19class ResponseMessage;
20class SharingMessage;
21} // namespace chrome_browser_sharing
22
23namespace syncer {
Michael van Ouwerkerk01bcfbd2019-12-10 12:01:0224class DeviceInfo;
Himanshu Jajua69dbe52019-11-04 19:58:0525class LocalDeviceInfoProvider;
26} // namespace syncer
27
Himanshu Jajua69dbe52019-11-04 19:58:0528class SharingSyncPreference;
Himanshu Jaju453c8bc2019-12-05 19:31:2129enum class SharingDevicePlatform;
Himanshu Jajua69dbe52019-11-04 19:58:0530enum class SharingSendMessageResult;
31
32class SharingMessageSender {
33 public:
34 using ResponseCallback = base::OnceCallback<void(
35 SharingSendMessageResult,
36 std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>;
37
Richard Knolld17e4062020-01-14 21:23:1438 // Delegate class used to swap the actual message sending implementation.
39 class SendMessageDelegate {
40 public:
41 using SendMessageCallback =
42 base::OnceCallback<void(SharingSendMessageResult,
43 base::Optional<std::string>)>;
44 virtual ~SendMessageDelegate() = default;
45
46 virtual void DoSendMessageToDevice(
47 const syncer::DeviceInfo& device,
48 base::TimeDelta time_to_live,
49 chrome_browser_sharing::SharingMessage message,
50 SendMessageCallback callback) = 0;
51 };
52
53 // Delegate type used to send a message.
54 enum class DelegateType {
55 kFCM,
Richard Knoll46f1ab022020-01-24 21:17:2156 kWebRtc,
Richard Knolld17e4062020-01-14 21:23:1457 };
58
Himanshu Jajua69dbe52019-11-04 19:58:0559 SharingMessageSender(
Himanshu Jajua69dbe52019-11-04 19:58:0560 SharingSyncPreference* sync_prefs,
61 syncer::LocalDeviceInfoProvider* local_device_info_provider);
Richard Knolld17e4062020-01-14 21:23:1462 SharingMessageSender(const SharingMessageSender&) = delete;
63 SharingMessageSender& operator=(const SharingMessageSender&) = delete;
Himanshu Jajua69dbe52019-11-04 19:58:0564 virtual ~SharingMessageSender();
65
66 virtual void SendMessageToDevice(
Michael van Ouwerkerk01bcfbd2019-12-10 12:01:0267 const syncer::DeviceInfo& device,
Himanshu Jajua69dbe52019-11-04 19:58:0568 base::TimeDelta response_timeout,
69 chrome_browser_sharing::SharingMessage message,
Richard Knolld17e4062020-01-14 21:23:1470 DelegateType delegate_type,
Himanshu Jajua69dbe52019-11-04 19:58:0571 ResponseCallback callback);
72
73 virtual void OnAckReceived(
Himanshu Jajua69dbe52019-11-04 19:58:0574 const std::string& message_id,
75 std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
76
Richard Knolld17e4062020-01-14 21:23:1477 // Registers the given |delegate| to send messages when SendMessageToDevice is
78 // called with |type|.
79 void RegisterSendDelegate(DelegateType type,
80 std::unique_ptr<SendMessageDelegate> delegate);
81
Himanshu Jajua69dbe52019-11-04 19:58:0582 private:
Richard Knollae2f49f2020-01-15 18:18:5383 struct SentMessageMetadata {
84 SentMessageMetadata(ResponseCallback callback,
85 base::TimeTicks timestamp,
86 chrome_browser_sharing::MessageType type,
87 SharingDevicePlatform receiver_device_platform,
Michael van Ouwerkerkce7d4ed2020-01-24 18:15:1188 base::TimeDelta last_updated_age,
89 int trace_id);
Richard Knollae2f49f2020-01-15 18:18:5390 SentMessageMetadata(SentMessageMetadata&& other);
91 SentMessageMetadata& operator=(SentMessageMetadata&& other);
92 ~SentMessageMetadata();
93
94 ResponseCallback callback;
95 base::TimeTicks timestamp;
96 chrome_browser_sharing::MessageType type;
97 SharingDevicePlatform receiver_device_platform;
98 base::TimeDelta last_updated_age;
Michael van Ouwerkerkce7d4ed2020-01-24 18:15:1199 int trace_id;
Richard Knollae2f49f2020-01-15 18:18:53100 };
101
102 void OnMessageSent(const std::string& message_guid,
Himanshu Jajua69dbe52019-11-04 19:58:05103 SharingSendMessageResult result,
104 base::Optional<std::string> message_id);
105
106 void InvokeSendMessageCallback(
107 const std::string& message_guid,
Himanshu Jajua69dbe52019-11-04 19:58:05108 SharingSendMessageResult result,
109 std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
110
Himanshu Jajua69dbe52019-11-04 19:58:05111 SharingSyncPreference* sync_prefs_;
112 syncer::LocalDeviceInfoProvider* local_device_info_provider_;
113
Richard Knollae2f49f2020-01-15 18:18:53114 // Map of random GUID to SentMessageMetadata.
115 std::map<std::string, SentMessageMetadata> message_metadata_;
Himanshu Jajua69dbe52019-11-04 19:58:05116 // Map of FCM message_id to random GUID.
117 std::map<std::string, std::string> message_guids_;
Richard Knolld3d2d1db2020-01-15 19:34:30118 // Map of FCM message_id to received ACK response messages.
119 std::map<std::string,
120 std::unique_ptr<chrome_browser_sharing::ResponseMessage>>
121 cached_ack_response_messages_;
Himanshu Jajua69dbe52019-11-04 19:58:05122
Richard Knolld17e4062020-01-14 21:23:14123 // Registered delegates to send messages.
124 std::map<DelegateType, std::unique_ptr<SendMessageDelegate>> send_delegates_;
Himanshu Jajua69dbe52019-11-04 19:58:05125
Richard Knolld17e4062020-01-14 21:23:14126 base::WeakPtrFactory<SharingMessageSender> weak_ptr_factory_{this};
Himanshu Jajua69dbe52019-11-04 19:58:05127};
128
129#endif // CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_