summary refs log blame commit diff stats
path: root/src/internals.rs
blob: ec962997d7880811d0f0e7a64769a309227aef40 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12




                                                                       
                                                          





                                                                     
                                               
  
                                                                    





                                                                                                 
 


                               

         







                                                   
 




                                                  
 




                                                  


                          




                                                  



                              
                                      

 
          

                                                                                     


                                      
                                                                                                                                                                
                                           
                                                               
                                                                                    


                                      
                                                                                                                                                                
                                                               
                                                                                   


                                      
                                                                                                                          
                                                               
                                                                                   

                                 
                                                                                        
                                                               
                                                                                


                               
                                                                                                                             
                                                               
                                                                               
                                                             
                                                                              
                                       
                            
                                                                             
                                                                                 
                                                                      

                                                                                            
                                                
                                                                                
                                          
                                                                                            
                                              
                                                                                
                                    
                                                    
                                                                                    
                                                       
                                                                                     
                                          
                                                                   

                                                                                                              
                                                            
                                                                                  

                                             
                                                      
                                                                                 
                                                           
                                                                                  
                                       
                                                                                    
                                                                     
                                                                                  
                                                      
                                                                                 
                                      
                                                              
                                                                                 
                                      
                                                      
                                                                                      



                                          
                                                           
                                                                                         
                                            
                                                                                   
                                                                 
                                                                                

                                     
                                                  
                                                                                  
                                      
                                                       
                                                                                
                                                               
                                                                                   



                                              
                                
                                                                              

                                        
                                                       
                                                                             
                                      
                                                                                           
                                     
                                                       
                                                                                           
                                     
                                            
                                                                                           
                                     
                                               
                                                                                           
                                                     
                                                                                          
                                                     
                                                                                        
                                            
                                                                                          


                                      
                                                                                                                                                                                                 
                                                               
                                                                                         


                                      
                                                                                                                                                           
                                                               
                                                                                                                          
                                                                 

                                                                                                                      
                                           
 
/*
 * 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 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 General Public License for more details.
 *
 * You should have received a copy of the GNU 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 std::marker::PhantomData;
use std::marker::PhantomPinned;

use libc;

use ltptr::*;

// apparently this is the new right way to do these
#[repr(C)]
pub struct HexchatList {
    _data: libc::c_void,
    // remove Send/Sync/etc
    _marker: PhantomData<(*mut u8, PhantomPinned)>
}
#[repr(C)]
pub struct HexchatHook {
    _data: libc::c_void,
    // remove Send/Sync/etc
    _marker: PhantomData<(*mut u8, PhantomPinned)>
}
#[repr(C)]
pub struct HexchatContext {
    _data: libc::c_void,
    // remove Send/Sync/etc
    _marker: PhantomData<(*mut u8, PhantomPinned)>
}

// not in hexchat-plugin.h
#[repr(C)]
pub struct PluginGuiHandle {
    _data: libc::c_void,
    // remove Send/Sync/etc
    _marker: PhantomData<(*mut u8, PhantomPinned)>
}

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

#[repr(C)]
pub struct Ph<'ph> {
    pub(crate) hexchat_hook_command: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: 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(crate) hexchat_hook_server: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: 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(crate) hexchat_hook_print: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: 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(crate) hexchat_hook_timer: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            timeout: libc::c_int,
            /* CALLBACK */
            callback: unsafe extern "C" fn(user_data: *mut libc::c_void) -> libc::c_int,
            userdata: *mut libc::c_void) -> *const HexchatHook,
    pub(crate) hexchat_hook_fd: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            fd: libc::c_int,
            flags: libc::c_int,
            /* CALLBACK */
            callback: 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(crate) hexchat_unhook: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            hook: *const HexchatHook) -> *const libc::c_void,
    pub(crate) hexchat_print: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            text: *const libc::c_char),
    // this is VERY NAUGHTY.
    // NOTE this is an *owned* pointer, so {Const,Mut}LtPtr don't apply here.
    // TODO see if hexchat's gonna provide a proper userdata field at some point.
    // TODO test this on platforms hexchat doesn't build on, like AVR.
    pub(crate) userdata: *mut crate::PhUserdata<'ph>,
    /*pub(crate) hexchat_printf_do_not_use: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            format: *const libc::c_char, ...),*/
    pub(crate) hexchat_command: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            command: *const libc::c_char),
    pub(crate) hexchat_commandf_do_not_use: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            format: *const libc::c_char, ...),
    pub(crate) hexchat_nickcmp: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            s1: *const libc::c_char,
            s2: *const libc::c_char) -> libc::c_int,
    pub(crate) hexchat_set_context: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            ctx: *const HexchatContext) -> libc::c_int,
    pub(crate) hexchat_find_context: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            servname: *const libc::c_char,
            channel: *const libc::c_char) -> *const HexchatContext,
    pub(crate) hexchat_get_context: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>) -> *const HexchatContext,
    pub(crate) hexchat_get_info: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            id: *const libc::c_char) -> *const libc::c_char,
    pub(crate) hexchat_get_prefs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char,
            string: *mut *const libc::c_char,
            integer: *mut libc::c_int) -> libc::c_int,
    pub(crate) hexchat_list_get: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char) -> *mut HexchatList,
    pub(crate) hexchat_list_free: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            xlist: *const HexchatList),
    pub(crate) hexchat_list_fields: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char) -> *const *const libc::c_char,
    pub(crate) hexchat_list_next: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            xlist: *const HexchatList) -> libc::c_int,
    pub(crate) hexchat_list_str: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            xlist: *const HexchatList,
            name: *const libc::c_char) -> *const libc::c_char,
    pub(crate) hexchat_list_int: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            xlist: *const HexchatList,
            name: *const libc::c_char) -> libc::c_int,
    pub(crate) hexchat_plugingui_add: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            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(crate) hexchat_plugingui_remove: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            handle: *const PluginGuiHandle),
    pub(crate) hexchat_emit_print: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            event_name: *const libc::c_char, ...) -> libc::c_int,
    pub(crate) hexchat_read_fd: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            src: *const libc::c_void,
            buf: *mut char,
            len: *mut libc::c_int) -> libc::c_int,
    pub(crate) hexchat_list_time: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            xlist: *const HexchatList,
            name: *const libc::c_char) -> libc::time_t,
    pub(crate) hexchat_gettext: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            msgid: *const libc::c_char) -> *const libc::c_char,
    pub(crate) hexchat_send_modes: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            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(crate) hexchat_strip: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            string: *const libc::c_char,
            len: libc::c_int,
            flags: libc::c_int) -> *const libc::c_char,
    pub(crate) hexchat_free: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            ptr: *const libc::c_void),
    pub(crate) hexchat_pluginpref_set_str: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            var: *const libc::c_char,
            value: *const libc::c_char) -> libc::c_int,
    pub(crate) hexchat_pluginpref_get_str: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            var: *const libc::c_char,
            dest: *mut char) -> libc::c_int,
    pub(crate) hexchat_pluginpref_set_int: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            var: *const libc::c_char,
            value: libc::c_int) -> libc::c_int,
    pub(crate) hexchat_pluginpref_get_int: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            var: *const libc::c_char) -> libc::c_int,
    pub(crate) hexchat_pluginpref_delete: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            var: *const libc::c_char) -> libc::c_int,
    pub(crate) hexchat_pluginpref_list: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            dest: *mut char) -> libc::c_int,
    pub(crate) hexchat_hook_server_attrs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: 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(crate) hexchat_hook_print_attrs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            name: *const libc::c_char,
            pri: libc::c_int,
            /* CALLBACK */
            callback: 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(crate) hexchat_emit_print_attrs: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>, attrs: *const HexchatEventAttrs,
            event_name: *const libc::c_char, ...) -> libc::c_int,
    pub(crate) hexchat_event_attrs_create: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>) -> *mut HexchatEventAttrs,
    pub(crate) hexchat_event_attrs_free: unsafe extern "C" fn(ph: MutLtPtr<'ph, Ph<'ph>>,
            attrs: *mut HexchatEventAttrs),
}