Chromium Code Reviews| Index: chrome/browser/notifications/notification_platform_bridge_linux.h |
| diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.h b/chrome/browser/notifications/notification_platform_bridge_linux.h |
| index 1b6380c769d270eabed7e47030326855b1a79d6f..36e1d4ac30296048e6f449841ef0f5a133f547d7 100644 |
| --- a/chrome/browser/notifications/notification_platform_bridge_linux.h |
| +++ b/chrome/browser/notifications/notification_platform_bridge_linux.h |
| @@ -7,8 +7,11 @@ |
| #include <gio/gio.h> |
| +#include <unordered_map> |
| + |
| #include "base/macros.h" |
| #include "chrome/browser/notifications/notification_platform_bridge.h" |
| +#include "ui/base/glib/scoped_gobject.h" |
| class NotificationPlatformBridgeLinux : public NotificationPlatformBridge { |
| public: |
| @@ -30,7 +33,72 @@ class NotificationPlatformBridgeLinux : public NotificationPlatformBridge { |
| const DisplayedNotificationsCallback& callback) const override; |
| private: |
| - GDBusProxy* const notification_proxy_; |
| + struct NotificationData { |
| + NotificationData(const std::string& notification_id, |
| + const std::string& profile_id, |
| + bool is_incognito, |
| + NotificationPlatformBridgeLinux* platform_bridge); |
| + |
| + ~NotificationData(); |
| + |
| + // The ID used by the notification server. Will be 0 until the |
| + // first "Notify" message completes. |
| + uint32_t dbus_id = 0; |
| + |
| + // Same parameters used by NotificationPlatformBridge::Display(). |
| + const std::string notification_id; |
| + const std::string profile_id; |
| + const bool is_incognito; |
| + |
| + NotificationPlatformBridgeLinux* platform_bridge; |
| + |
| + // Used to cancel the initial "Notify" message so we don't call |
| + // NotificationPlatformBridgeLinux::OnNotifyComplete() with a |
| + // destroyed Notification. |
| + ScopedGObject<GCancellable> cancellable; |
| + |
| + // If not null, the data to update the notification with once |
| + // |dbus_id| becomes available. |
| + std::unique_ptr<Notification> update_data; |
| + NotificationCommon::Type update_type; |
|
Peter Beverloo
2017/04/06 17:56:57
Maybe initialize this as NotificationCommon::TYPE_
Tom (Use chromium acct)
2017/04/06 18:25:38
Done.
|
| + |
| + // If true, indicates the notification should be closed once |
| + // |dbus_id| becomes available. |
| + bool should_close = false; |
| + }; |
|
Peter Beverloo
2017/04/06 17:56:57
(You could decide to only forward declare the stru
Tom (Use chromium acct)
2017/04/06 18:25:38
Done.
|
| + |
| + // Callback used by GLib when the "Notify" message completes for the |
| + // first time. |
| + friend void OnNotifyComplete(GObject* source_object, |
| + GAsyncResult* result, |
| + gpointer user_data); |
| + |
| + // Called from ::OnNotifyComplete(). |
| + void OnNotifyComplete(NotificationData* data, GVariant* value); |
| + |
| + ScopedGObject<GDBusProxy> notification_proxy_; |
| + |
| + // A std::set<std::unique_ptr<T>> doesn't work well because |
| + // eg. std::set::erase(T) would require a std::unique_ptr<T> |
| + // argument, so the data would get double-destructed. |
| + template <typename T> |
| + using UnorderedUniqueSet = std::unordered_map<T*, std::unique_ptr<T>>; |
| + |
| + UnorderedUniqueSet<NotificationData> notifications_; |
| + |
| + // Makes the "Notify" call to D-Bus. |
| + void NotifyNow(uint32_t dbus_id, |
| + NotificationCommon::Type notification_type, |
| + const Notification& notification, |
| + GCancellable* cancellable, |
| + GAsyncReadyCallback callback, |
| + gpointer user_data); |
| + |
| + // Makes the "CloseNotification" call to D-Bus. |
| + void CloseNow(uint32_t dbus_id); |
| + |
| + NotificationData* FindNotificationData(const std::string& notification_id, |
| + const std::string& profile_id); |
| DISALLOW_COPY_AND_ASSIGN(NotificationPlatformBridgeLinux); |
| }; |