1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
// Copyright 2023 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_PUSH_NOTIFICATION_PUSH_NOTIFICATION_CLIENT_MANAGER_H_
#define COMPONENTS_PUSH_NOTIFICATION_PUSH_NOTIFICATION_CLIENT_MANAGER_H_
#include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/memory/raw_ptr.h"
#include "components/push_notification/push_notification_client.h"
namespace push_notification {
// `PushNotificationClientManager` is responsible for delegating notifications
// to the corresponding features who have a registered `PushNotificationClient`.
// Messages received before the corresponding `PushNotificationClient` are
// delivered to that client once registered via the client calling
// `CheckPendingMessageStore()`.
class PushNotificationClientManager {
public:
PushNotificationClientManager();
~PushNotificationClientManager();
struct PushNotificationMessage {
PushNotificationMessage();
PushNotificationMessage(const PushNotificationMessage& other);
PushNotificationMessage(PushNotificationMessage&& other);
~PushNotificationMessage();
PushNotificationMessage& operator=(PushNotificationMessage&& other);
// Key Value map to contain all relevant information intended for the
// `PushNotificationClient`.
base::flat_map<std::string, std::string> data;
std::string collapse_key;
std::string sender_id;
std::string message_id;
std::string raw_data;
// Whether the contents of the message have been decrypted, and are
// available in |raw_data|.
bool decrypted = false;
};
void AddPushNotificationClient(PushNotificationClient* client);
void RemovePushNotificationClient(ClientId client_id);
std::vector<const PushNotificationClient*> GetPushNotificationClients();
void NotifyPushNotificationClientOfMessage(PushNotificationMessage message);
private:
void FlushPendingMessageStore(ClientId client_id);
base::flat_map<ClientId, raw_ptr<PushNotificationClient, CtnExperimental>>
client_id_to_client_map_;
// Messages for clients that have not registered with the service yet. After a
// client registers, `FlushPendingMessageStore()` iterates through this vector
// and checks if there are any pending messages which should immediately be
// directed to the new client.
std::vector<PushNotificationMessage> pending_message_store_;
};
} // namespace push_notification
#endif // COMPONENTS_PUSH_NOTIFICATION_PUSH_NOTIFICATION_CLIENT_MANAGER_H_
|