1 #pragma once
2 
3 #include <dbus-status-notifier-watcher.h>
4 #include <giomm.h>
5 #include <glibmm/refptr.h>
6 #include <json/json.h>
7 #include <tuple>
8 #include "bar.hpp"
9 #include "modules/sni/item.hpp"
10 
11 namespace waybar::modules::SNI {
12 
13 class Host {
14  public:
15   Host(const std::size_t id, const Json::Value&, const Bar&,
16        const std::function<void(std::unique_ptr<Item>&)>&,
17        const std::function<void(std::unique_ptr<Item>&)>&);
18   ~Host();
19 
20  private:
21   void        busAcquired(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
22   void        nameAppeared(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring,
23                            const Glib::ustring&);
24   void        nameVanished(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
25   static void proxyReady(GObject*, GAsyncResult*, gpointer);
26   static void registerHost(GObject*, GAsyncResult*, gpointer);
27   static void itemRegistered(SnWatcher*, const gchar*, gpointer);
28   static void itemUnregistered(SnWatcher*, const gchar*, gpointer);
29 
30   std::tuple<std::string, std::string> getBusNameAndObjectPath(const std::string);
31   void                                 addRegisteredItem(std::string service);
32 
33   std::vector<std::unique_ptr<Item>>                items_;
34   const std::string                                 bus_name_;
35   const std::string                                 object_path_;
36   std::size_t                                       bus_name_id_;
37   std::size_t                                       watcher_id_;
38   GCancellable*                                     cancellable_ = nullptr;
39   SnWatcher*                                        watcher_ = nullptr;
40   const Json::Value&                                config_;
41   const Bar&                                        bar_;
42   const std::function<void(std::unique_ptr<Item>&)> on_add_;
43   const std::function<void(std::unique_ptr<Item>&)> on_remove_;
44 };
45 
46 }  // namespace waybar::modules::SNI
47