blob: 4dc5cc11207c7d5a361800a692607fee27e9cb16 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SHARING_MESSAGE_SHARING_FCM_HANDLER_H_
#define COMPONENTS_SHARING_MESSAGE_SHARING_FCM_HANDLER_H_
#include <map>
#include <memory>
#include <optional>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "components/gcm_driver/gcm_app_handler.h"
#include "components/sharing_message/proto/sharing_message.pb.h"
#include "components/sharing_message/sharing_send_message_result.h"
#include "components/sync_device_info/device_info.h"
namespace gcm {
class GCMDriver;
} // namespace gcm
namespace syncer {
class DeviceInfoTracker;
} // namespace syncer
namespace sharing_message {
enum MessageType : int;
} // namespace sharing_message
enum class SharingChannelType;
class SharingFCMSender;
class SharingHandlerRegistry;
enum class SharingDevicePlatform;
// SharingFCMHandler is responsible for receiving SharingMessage from GCMDriver
// and delegate it to the payload specific handler.
class SharingFCMHandler : public gcm::GCMAppHandler {
public:
SharingFCMHandler(gcm::GCMDriver* gcm_driver,
syncer::DeviceInfoTracker* device_info_tracker,
SharingFCMSender* sharing_fcm_sender,
SharingHandlerRegistry* handler_registry);
SharingFCMHandler(const SharingFCMHandler&) = delete;
SharingFCMHandler& operator=(const SharingFCMHandler&) = delete;
~SharingFCMHandler() override;
// Registers itself as app handler for sharing messages.
virtual void StartListening();
// Unregisters itself as app handler for sharing messages.
virtual void StopListening();
// GCMAppHandler overrides.
void ShutdownHandler() override;
void OnStoreReset() override;
// Responsible for delegating the message to the registered
// SharingMessageHandler. Also sends back an ack to original sender after
// delegating the message.
void OnMessage(const std::string& app_id,
const gcm::IncomingMessage& message) override;
void OnSendError(const std::string& app_id,
const gcm::GCMClient::SendErrorDetails& details) override;
void OnSendAcknowledged(const std::string& app_id,
const std::string& message_id) override;
void OnMessagesDeleted(const std::string& app_id) override;
private:
std::optional<components_sharing_message::FCMChannelConfiguration>
GetFCMChannel(
const components_sharing_message::SharingMessage& original_message);
std::optional<components_sharing_message::ServerChannelConfiguration>
GetServerChannel(
const components_sharing_message::SharingMessage& original_message);
SharingDevicePlatform GetSenderPlatform(
const components_sharing_message::SharingMessage& original_message);
// Ack message sent back to the original sender of message.
void SendAckMessage(
std::string original_message_id,
sharing_message::MessageType original_message_type,
std::optional<components_sharing_message::FCMChannelConfiguration>
fcm_channel,
std::optional<components_sharing_message::ServerChannelConfiguration>
server_channel,
SharingDevicePlatform sender_device_type,
std::unique_ptr<components_sharing_message::ResponseMessage> response);
void OnAckMessageSent(std::string original_message_id,
sharing_message::MessageType original_message_type,
SharingDevicePlatform sender_device_type,
int trace_id,
SharingSendMessageResult result,
std::optional<std::string> message_id,
SharingChannelType channel_type);
const raw_ptr<gcm::GCMDriver, AcrossTasksDanglingUntriaged> gcm_driver_;
raw_ptr<syncer::DeviceInfoTracker, DanglingUntriaged> device_info_tracker_;
raw_ptr<SharingFCMSender, DanglingUntriaged> sharing_fcm_sender_;
raw_ptr<SharingHandlerRegistry, DanglingUntriaged> handler_registry_;
bool is_listening_ = false;
base::WeakPtrFactory<SharingFCMHandler> weak_ptr_factory_{this};
};
#endif // COMPONENTS_SHARING_MESSAGE_SHARING_FCM_HANDLER_H_