// This Source Code Form is subject to the terms of the Mozilla Public // License, version 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #pragma once #include #include #include #include #include #include #include #include #include namespace weechat { extern "C" { #include class config_option; //typedef struct t_config_option config_option; class config_section; //typedef struct t_config_section config_section; class config_file; //typedef struct t_config_file config_file; typedef struct t_gui_window gui_window; class gui_buffer; //typedef struct t_gui_buffer gui_buffer; typedef struct t_gui_bar gui_bar; class gui_bar_item; //typedef struct t_gui_bar_item gui_bar_item; typedef struct t_gui_bar_window gui_bar_window; typedef struct t_gui_completion gui_completion; typedef struct t_gui_nick gui_nick; typedef struct t_gui_nick_group gui_nick_group; typedef struct t_infolist infolist; typedef struct t_infolist_item infolist_item; typedef struct t_upgrade_file upgrade_file; typedef struct t_weelist weelist; typedef struct t_weelist_item weelist_item; typedef struct t_arraylist arraylist; typedef struct t_hashtable hashtable; typedef struct t_hdata hdata; class hook; //typedef struct t_hook hook; class plugin; //typedef struct t_weechat_plugin weechat_plugin; } enum errc : int { ok = WEECHAT_RC_OK, eat = WEECHAT_RC_OK_EAT, err = WEECHAT_RC_ERROR, }; class error : virtual public std::runtime_error { public: explicit inline error(const std::string_view subject) : std::runtime_error(std::string(subject)) { } virtual ~error() throw () {} }; class config_option : public std::reference_wrapper { public: typedef int (*check_fn)(const void *, void *, struct t_config_option *, const char *); typedef std::function check_callback; typedef void (*change_fn)(const void *, void *, struct t_config_option *); typedef std::function change_callback; typedef void (*delete_fn)(const void *, void *, struct t_config_option *); typedef std::function delete_callback; config_option( config_file& config_file, config_section& section, std::string name, std::string type, std::string description, std::string string_values, int min, int max, std::string default_value, std::string value, bool null_value_allowed, check_callback check_value_cb, change_callback change_cb, delete_callback delete_cb); explicit config_option(struct t_config_option* config_option); inline ~config_option() {} inline operator struct t_config_option* () const { return &this->get(); } operator int () const; operator bool () const; operator std::string () const; std::string string(std::string property) const; template T *pointer(std::string property) const; config_option& operator= (std::string_view value); inline config_option& operator= (struct t_config_option* config_option_ptr) { *this = config_option_ptr; return *this; } inline std::string name() const { return this->m_name; } private: check_callback m_check_cb; change_callback m_change_cb; delete_callback m_delete_cb; std::string m_name; }; class config_section : public std::reference_wrapper { public: typedef int (*read_fn)(const void *, void *, struct t_config_file *, struct t_config_section *, const char *, const char *); typedef std::function read_callback; typedef int (*write_fn)(const void *, void *, struct t_config_file *, const char *); typedef std::function write_callback; typedef int (*write_default_fn)(const void *, void *, struct t_config_file *, const char *); typedef std::function write_default_callback; typedef int (*create_option_fn)(const void *, void *, struct t_config_file *, struct t_config_section *, const char *, const char *); typedef std::function create_option_callback; typedef int (*delete_option_fn)(const void *, void *, struct t_config_file *, struct t_config_section *, struct t_config_option *); typedef std::function delete_option_callback; config_section( config_file& config_file, std::string name, bool user_can_add_options, bool user_can_delete_options, read_callback read_cb, write_callback write_cb, write_default_callback write_default_cb, create_option_callback create_option_cb, delete_option_callback delete_option_cb); explicit config_section(struct t_config_section* config_section); inline ~config_section() {} inline operator struct t_config_section* () const { return &this->get(); } inline config_section& operator= (struct t_config_section* config_section_ptr) { *this = config_section_ptr; return *this; } inline std::string name() const { return this->m_name; } private: std::string m_name; read_callback m_read_cb; write_callback m_write_cb; write_default_callback m_write_default_cb; create_option_callback m_create_option_cb; delete_option_callback m_delete_option_cb; }; class config_file : public std::reference_wrapper { public: typedef int (*reload_fn)(const void *, void *, struct t_config_file *); typedef std::function reload_callback; config_file(std::string name, reload_callback reload_cb); explicit config_file(struct t_config_file* config_file); inline ~config_file() {} inline operator struct t_config_file* () const { return &this->get(); } inline config_file& operator= (struct t_config_file* config_file_ptr) { *this = config_file_ptr; return *this; } inline std::string name() const { return this->m_name; } private: std::string m_name; reload_callback m_reload_cb; }; class gui_buffer : std::reference_wrapper { public: typedef int (*input_fn)(const void *, void *, struct t_gui_buffer *, const char *); typedef std::function input_callback; typedef int (*close_fn)(const void *, void *, struct t_gui_buffer *); typedef std::function close_callback; gui_buffer(std::string name, input_callback input_cb, close_callback close_cb); explicit gui_buffer(struct t_gui_buffer* gui_buffer); ~gui_buffer(); inline operator struct t_gui_buffer* () const { return &this->get(); } inline gui_buffer& operator= (struct t_gui_buffer* gui_buffer_ptr) { *this = gui_buffer_ptr; return *this; } std::string name; private: input_callback m_input_cb; close_callback m_close_cb; }; class gui_bar_item : public std::reference_wrapper { public: typedef char* (*build_fn)(const void *, void *, struct t_gui_bar_item *, struct t_gui_window *, struct t_gui_buffer *, struct t_hashtable *); typedef std::function build_callback; gui_bar_item(std::string_view name, build_callback callback); explicit gui_bar_item(struct t_gui_bar_item* item); ~gui_bar_item(); void update(std::string_view name); inline operator struct t_gui_bar_item* () const { return &this->get(); } inline gui_bar_item& operator= (struct t_gui_bar_item* item_ptr) { *this = item_ptr; return *this; } static gui_bar_item search(std::string_view name); private: build_callback m_cb; }; class hook : public std::reference_wrapper { public: typedef int (*timer_fn)(const void *, void *, int remaining_calls); typedef std::function timer_callback; hook(long interval, int align_second, int max_calls, timer_callback callback); explicit hook(struct t_hook* hook); ~hook(); inline operator struct t_hook* () const { return &this->get(); } inline hook& operator= (struct t_hook* hook_ptr) { *this = hook_ptr; return *this; } private: union { timer_callback m_timer_cb; }; }; }