summary refs log blame commit diff stats
path: root/src/internals.rs
blob: 8a881e0105ae5400033daff56ea30a7911f96fcc (plain) (tree)



































































































































































































                                                                                                                                                                                                         
/*
 * Hexchat Plugin API Bindings for Rust - Internals
 * Copyright (C) 2018 Soni L.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
//! Implementation details, mostly.
//!
//! This also includes the hexchat_plugin struct, from hexchat-plugin.h. Note that we use the
//! struct even on non-Windows platforms because it's a lot easier that way. Should be safe, tho.
use libc;

// apparently this is the right way to do these
#[repr(i8)]
pub enum HexchatList {
    __One,
    __Two,
}
#[repr(i8)]
pub enum HexchatHook {
    __One,
    __Two,
}
#[repr(i8)]
pub enum HexchatContext {
    __One,
    __Two,
}

// not in hexchat-plugin.h
#[repr(i8)]
pub enum PluginGuiHandle {
    __One,
    __Two,
}

#[repr(C)]
pub struct HexchatEventAttrs {
    server_time_utc: libc::time_t,
}

pub type HexchatPlugin = Ph;

#[repr(C)]
pub struct Ph {
    pub hexchat_hook_command: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int>,
            help_text: *const libc::c_char,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_hook_server: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int>,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_hook_print: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(word: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int>,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_hook_timer: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            timeout: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(user_data: *mut libc::c_void) -> libc::c_int>,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_hook_fd: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            fd: libc::c_int,
            flags: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(fd: libc::c_int, flags: libc::c_int, user_data: *mut libc::c_void) -> libc::c_int>,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_unhook: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            hook: *const HexchatHook) -> *const libc::c_void>,
    pub hexchat_print: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            text: *const libc::c_char)>,
    pub hexchat_printf: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            format: *const libc::c_char, ...)>,
    pub hexchat_command: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            command: *const libc::c_char)>,
    pub hexchat_commandf: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            format: *const libc::c_char, ...)>,
    pub hexchat_nickcmp: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            s1: *const libc::c_char,
            s2: *const libc::c_char) -> libc::c_int>,
    pub hexchat_set_context: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            ctx: *const HexchatContext) -> libc::c_int>,
    pub hexchat_find_context: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            servname: *const libc::c_char,
            channel: *const libc::c_char) -> *const HexchatContext>,
    pub hexchat_get_context: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin) -> *const HexchatContext>,
    pub hexchat_get_info: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            id: *const libc::c_char) -> *const libc::c_char>,
    pub hexchat_get_prefs: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char,
            string: *mut *const libc::c_char,
            integer: *mut libc::c_int) -> libc::c_int>,
    pub hexchat_list_get: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char) -> *const HexchatList>,
    pub hexchat_list_free: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            xlist: *const HexchatList)>,
    pub hexchat_list_fields: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char) -> *const *const libc::c_char>,
    pub hexchat_list_next: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            xlist: *const HexchatList) -> libc::c_int>,
    pub hexchat_list_str: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            xlist: *const HexchatList,
            name: *const libc::c_char) -> *const libc::c_char>,
    pub hexchat_list_int: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            xlist: *const HexchatList,
            name: *const libc::c_char) -> libc::c_int>,
    pub hexchat_plugingui_add: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            filename: *const libc::c_char,
            name: *const libc::c_char,
            desc: *const libc::c_char,
            version: *const libc::c_char,
            reserved: *mut char) -> *const PluginGuiHandle>,
    pub hexchat_plugingui_remove: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            handle: *const PluginGuiHandle)>,
    pub hexchat_emit_print: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            event_name: *const libc::c_char, ...) -> libc::c_int>,
    // this is VERY NAUGHTY.
    // TODO see if hexchat's gonna provide a proper userdata field at some point.
    // it appears this function isn't used anywhere by hexchat so we reuse its pointer.
    // on linux, it's a dummy anyway.
    // another option would've been to use one of the printf functions.
    // TODO test this on platforms hexchat doesn't build on, like AVR.
    pub userdata: *mut libc::c_void,
    /*pub hexchat_read_fd: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            src: *const libc::c_void,
            buf: *mut char,
            len: *mut libc::c_int) -> libc::c_int>,*/
    pub hexchat_list_time: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            xlist: *const HexchatList,
            name: *const libc::c_char) -> libc::time_t>,
    pub hexchat_gettext: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            msgid: *const libc::c_char) -> *const libc::c_char>,
    pub hexchat_send_modes: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            targets: *mut *const libc::c_char,
            ntargets: libc::c_int,
            modes_per_line: libc::c_int,
            sign: libc::c_char,
            mode: libc::c_char)>,
    pub hexchat_strip: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            string: *const libc::c_char,
            len: libc::c_int,
            flags: libc::c_int) -> *const libc::c_char>,
    pub hexchat_free: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            ptr: *const libc::c_void)>,
    pub hexchat_pluginpref_set_str: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            var: *const libc::c_char,
            value: *const libc::c_char) -> libc::c_int>,
    pub hexchat_pluginpref_get_str: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            var: *const libc::c_char,
            dest: *mut char) -> libc::c_int>,
    pub hexchat_pluginpref_set_int: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            var: *const libc::c_char,
            value: libc::c_int) -> libc::c_int>,
    pub hexchat_pluginpref_get_int: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            var: *const libc::c_char) -> libc::c_int>,
    pub hexchat_pluginpref_delete: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            var: *const libc::c_char) -> libc::c_int>,
    pub hexchat_pluginpref_list: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            dest: *mut char) -> libc::c_int>,
    pub hexchat_hook_server_attrs: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, attrs: *const HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int>,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_hook_print_attrs: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: Option<unsafe extern "C" fn(word: *const *const libc::c_char, attrs: *const HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int>,
            userdata: *mut libc::c_void) -> *const HexchatHook>,
    pub hexchat_emit_print_attrs: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin, attrs: *const HexchatEventAttrs,
            event_name: *const libc::c_char, ...) -> libc::c_int>,
    pub hexchat_event_attrs_create: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin) -> *mut HexchatEventAttrs>,
    pub hexchat_event_attrs_free: Option<unsafe extern "C" fn(ph: *mut HexchatPlugin,
            attrs: *const HexchatEventAttrs)>,
}