#pragma once
#include <simpledbuslegacy/base/Connection.h>
#include <atomic>
#include <map>
#include <memory>
#include <mutex>
#include <string>
namespace SimpleDBusLegacy {
class Interface {
public:
Interface(std::shared_ptr<Connection> conn, const std::string& bus_name, const std::string& path,
const std::string& interface_name);
virtual ~Interface() = default;
void load(Holder options);
void unload();
bool is_loaded() const;
Message create_method_call(const std::string& method_name);
virtual void property_changed(std::string option_name);
Holder property_collect();
Holder property_collect_single(const std::string& property_name);
void property_modify(const std::string& property_name, const Holder& value);
Holder property_get_all();
Holder property_get(const std::string& property_name);
void property_set(const std::string& property_name, const Holder& value);
void property_refresh(const std::string& property_name);
void signal_property_changed(Holder changed_properties, Holder invalidated_properties);
virtual void message_handle(Message& msg);
protected:
std::atomic_bool _loaded{true};
std::string _path;
std::string _bus_name;
std::string _interface_name;
std::shared_ptr<Connection> _conn;
std::recursive_mutex _property_update_mutex;
std::map<std::string, bool> _property_valid_map;
std::map<std::string, Holder> _properties;
};
}