blob: 2886a4d4c68540b94ffb0e6ced0473771b3af102 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_
#define CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_
#include <map>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/time/time.h"
namespace chrome_browser_sharing {
enum MessageType : int;
class ResponseMessage;
class SharingMessage;
} // namespace chrome_browser_sharing
namespace syncer {
class DeviceInfo;
class LocalDeviceInfoProvider;
} // namespace syncer
class SharingFCMSender;
class SharingSyncPreference;
enum class SharingDevicePlatform;
enum class SharingSendMessageResult;
class SharingMessageSender {
public:
using ResponseCallback = base::OnceCallback<void(
SharingSendMessageResult,
std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>;
SharingMessageSender(
std::unique_ptr<SharingFCMSender> sharing_fcm_sender,
SharingSyncPreference* sync_prefs,
syncer::LocalDeviceInfoProvider* local_device_info_provider);
virtual ~SharingMessageSender();
virtual void SendMessageToDevice(
const syncer::DeviceInfo& device,
base::TimeDelta response_timeout,
chrome_browser_sharing::SharingMessage message,
ResponseCallback callback);
virtual void OnAckReceived(
chrome_browser_sharing::MessageType message_type,
const std::string& message_id,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
private:
void OnMessageSent(base::TimeTicks start_time,
const std::string& message_guid,
chrome_browser_sharing::MessageType message_type,
SharingDevicePlatform receiver_device_platform,
SharingSendMessageResult result,
base::Optional<std::string> message_id);
void InvokeSendMessageCallback(
const std::string& message_guid,
chrome_browser_sharing::MessageType message_type,
SharingDevicePlatform receiver_device_platform,
SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
std::unique_ptr<SharingFCMSender> fcm_sender_;
SharingSyncPreference* sync_prefs_;
syncer::LocalDeviceInfoProvider* local_device_info_provider_;
// Map of random GUID to SendMessageCallback.
std::map<std::string, ResponseCallback> send_message_callbacks_;
// Map of FCM message_id to time at start of send message request to FCM.
std::map<std::string, base::TimeTicks> send_message_times_;
// Map of FCM message_id to random GUID.
std::map<std::string, std::string> message_guids_;
// Map of FCM message_id to platform of receiver device for metrics.
std::map<std::string, SharingDevicePlatform> receiver_device_platform_;
base::WeakPtrFactory<SharingMessageSender> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(SharingMessageSender);
};
#endif // CHROME_BROWSER_SHARING_SHARING_MESSAGE_SENDER_H_