// This file is part of Hexchat Plugin API Bindings for Rust // Copyright (C) 2022 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 . // // Based on hexchat's plugin.c // /* X-Chat * Copyright (C) 2002 Peter Zelezny. * * 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 2 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ //! Internal mock test framework. //! //! This API is not stable. Do not rely on this API to be stable. use std::cell::Cell; use std::cell::RefCell; use std::ffi::CStr; use std::ffi::CString; use std::marker::PhantomData; use std::marker::PhantomPinned; use std::pin::Pin; use std::ptr; use std::rc::Rc; use libc::c_char; use ::ltptr::*; use ::selfref::{Holder, Opaque, SelfRef, opaque}; // MUST be repr(C) #[repr(C)] struct MockPlugin<'dangling, 'env> { // NOTE: MUST be first thing in the struct. methods: crate::internals::Ph, filename: *const c_char, plugin_name: Cell<*const c_char>, plugin_desc: Cell<*const c_char>, plugin_vers: Cell<*const c_char>, free_strings: bool, env: &'env PluginEnvironment<'dangling, 'env>, _pin: PhantomPinned, } enum MockCallback { HookCommand { help: Option>, f: 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, }, HookServer { f: 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, }, HookServerAttrs { f: unsafe extern "C" fn(word: *const *const libc::c_char, word_eol: *const *const libc::c_char, attrs: *const crate::internals::HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int, }, HookPrint { f: unsafe extern "C" fn(word: *const *const libc::c_char, user_data: *mut libc::c_void) -> libc::c_int, }, HookPrintAttrs { f: unsafe extern "C" fn(word: *const *const libc::c_char, attrs: *const crate::internals::HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int }, HookTimer { tag: libc::c_int, f: unsafe extern "C" fn(user_data: *mut libc::c_void) -> libc::c_int, }, HookFd { tag: libc::c_int, f: unsafe extern "C" fn(fd: libc::c_int, flags: libc::c_int, user_data: *mut libc::c_void) -> libc::c_int }, HookDeleted, } struct MockHook<'dangling, 'env> { //pl: Rc>>, pl: Rc>, cb: RefCell, name: Option>, pri_or_fd: libc::c_int, userdata: *mut libc::c_void, _pin: PhantomPinned, } pub struct PluginEnvironment<'dangling, 'env> { //plugins: RefCell>>>>>, plugins: RefCell>>>>, // priority-based hooks //hooks: RefCell>>>>>, hooks: RefCell>>>>, // fd/timer hooks //extra_hooks: RefCell>>>>>, extra_hooks: RefCell>>>>, depth: Cell, } impl<'dangling, 'env> SelfRef<'env> for PluginEnvironment<'dangling, 'env> {} pub struct PluginEnvironmentK<'dangling> { _p: PhantomData<&'dangling ()>, } opaque! { impl['dangling] Opaque for PluginEnvironmentK<'dangling> { type Kind<'env> = PluginEnvironment<'dangling, 'env>; } } pub type GlobalPluginEnvironment<'dangling> = Holder<'dangling, PluginEnvironmentK<'dangling>>; unsafe extern "C" fn hexchat_hook_command( ph: *mut crate::internals::HexchatPlugin, 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 crate::internals::HexchatHook { let ph = ph as *mut MockPlugin; todo!(); } unsafe extern "C" fn hexchat_hook_server(ph: *mut crate::internals::HexchatPlugin, 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 crate::internals::HexchatHook { todo!(); } unsafe extern "C" fn hexchat_hook_print(ph: *mut crate::internals::HexchatPlugin, 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 crate::internals::HexchatHook { todo!(); } unsafe extern "C" fn hexchat_hook_timer(ph: *mut crate::internals::HexchatPlugin, 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 crate::internals::HexchatHook { todo!(); } unsafe extern "C" fn hexchat_hook_fd(ph: *mut crate::internals::HexchatPlugin, 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 crate::internals::HexchatHook { todo!(); } unsafe extern "C" fn hexchat_unhook(ph: *mut crate::internals::HexchatPlugin, hook: *const crate::internals::HexchatHook) -> *const libc::c_void { todo!(); } unsafe extern "C" fn hexchat_print(ph: *mut crate::internals::HexchatPlugin, text: *const libc::c_char) { todo!(); } pub unsafe extern "C" fn hexchat_printf(ph: *mut crate::internals::HexchatPlugin, format: *const libc::c_char, ...) { unimplemented!(); } unsafe extern "C" fn hexchat_command(ph: *mut crate::internals::HexchatPlugin, command: *const libc::c_char) { todo!(); } unsafe extern "C" fn hexchat_commandf(ph: *mut crate::internals::HexchatPlugin, format: *const libc::c_char, ...) { unimplemented!(); } unsafe extern "C" fn hexchat_nickcmp(ph: *mut crate::internals::HexchatPlugin, s1: *const libc::c_char, s2: *const libc::c_char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_set_context(ph: *mut crate::internals::HexchatPlugin, ctx: *const crate::internals::HexchatContext) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_find_context(ph: *mut crate::internals::HexchatPlugin, servname: *const libc::c_char, channel: *const libc::c_char) -> *const crate::internals::HexchatContext { todo!(); } unsafe extern "C" fn hexchat_get_context(ph: *mut crate::internals::HexchatPlugin) -> *const crate::internals::HexchatContext { todo!(); } unsafe extern "C" fn hexchat_get_info(ph: *mut crate::internals::HexchatPlugin, id: *const libc::c_char) -> *const libc::c_char { todo!(); } unsafe extern "C" fn hexchat_get_prefs(ph: *mut crate::internals::HexchatPlugin, name: *const libc::c_char, string: *mut *const libc::c_char, integer: *mut libc::c_int) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_list_get(ph: *mut crate::internals::HexchatPlugin, name: *const libc::c_char) -> *mut crate::internals::HexchatList { todo!(); } unsafe extern "C" fn hexchat_list_free(ph: *mut crate::internals::HexchatPlugin, xlist: *const crate::internals::HexchatList) { todo!(); } unsafe extern "C" fn hexchat_list_fields(ph: *mut crate::internals::HexchatPlugin, name: *const libc::c_char) -> *const *const libc::c_char { todo!(); } unsafe extern "C" fn hexchat_list_next(ph: *mut crate::internals::HexchatPlugin, xlist: *const crate::internals::HexchatList) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_list_str(ph: *mut crate::internals::HexchatPlugin, xlist: *const crate::internals::HexchatList, name: *const libc::c_char) -> *const libc::c_char { todo!(); } unsafe extern "C" fn hexchat_list_int(ph: *mut crate::internals::HexchatPlugin, xlist: *const crate::internals::HexchatList, name: *const libc::c_char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_plugingui_add(ph: *mut crate::internals::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 crate::internals::PluginGuiHandle { todo!(); } unsafe extern "C" fn hexchat_plugingui_remove(ph: *mut crate::internals::HexchatPlugin, handle: *const crate::internals::PluginGuiHandle) { todo!(); } unsafe extern "C" fn hexchat_emit_print(ph: *mut crate::internals::HexchatPlugin, event_name: *const libc::c_char, ...) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_read_fd(ph: *mut crate::internals::HexchatPlugin, src: *const libc::c_void, buf: *mut char, len: *mut libc::c_int) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_list_time(ph: *mut crate::internals::HexchatPlugin, xlist: *const crate::internals::HexchatList, name: *const libc::c_char) -> libc::time_t { todo!(); } unsafe extern "C" fn hexchat_gettext(ph: *mut crate::internals::HexchatPlugin, msgid: *const libc::c_char) -> *const libc::c_char { todo!(); } unsafe extern "C" fn hexchat_send_modes(ph: *mut crate::internals::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) { todo!(); } unsafe extern "C" fn hexchat_strip(ph: *mut crate::internals::HexchatPlugin, string: *const libc::c_char, len: libc::c_int, flags: libc::c_int) -> *const libc::c_char { todo!(); } unsafe extern "C" fn hexchat_free(ph: *mut crate::internals::HexchatPlugin, ptr: *const libc::c_void) { todo!(); } unsafe extern "C" fn hexchat_pluginpref_set_str(ph: *mut crate::internals::HexchatPlugin, var: *const libc::c_char, value: *const libc::c_char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_pluginpref_get_str(ph: *mut crate::internals::HexchatPlugin, var: *const libc::c_char, dest: *mut char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_pluginpref_set_int(ph: *mut crate::internals::HexchatPlugin, var: *const libc::c_char, value: libc::c_int) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_pluginpref_get_int(ph: *mut crate::internals::HexchatPlugin, var: *const libc::c_char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_pluginpref_delete(ph: *mut crate::internals::HexchatPlugin, var: *const libc::c_char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_pluginpref_list(ph: *mut crate::internals::HexchatPlugin, dest: *mut char) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_hook_server_attrs(ph: *mut crate::internals::HexchatPlugin, 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 crate::internals::HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const crate::internals::HexchatHook { todo!(); } unsafe extern "C" fn hexchat_hook_print_attrs(ph: *mut crate::internals::HexchatPlugin, name: *const libc::c_char, pri: libc::c_int, /* CALLBACK */ callback: unsafe extern "C" fn(word: *const *const libc::c_char, attrs: *const crate::internals::HexchatEventAttrs, user_data: *mut libc::c_void) -> libc::c_int, userdata: *mut libc::c_void) -> *const crate::internals::HexchatHook { todo!(); } unsafe extern "C" fn hexchat_emit_print_attrs(ph: *mut crate::internals::HexchatPlugin, attrs: *const crate::internals::HexchatEventAttrs, event_name: *const libc::c_char, ...) -> libc::c_int { todo!(); } unsafe extern "C" fn hexchat_event_attrs_create(ph: *mut crate::internals::HexchatPlugin) -> *mut crate::internals::HexchatEventAttrs { todo!(); } unsafe extern "C" fn hexchat_event_attrs_free(ph: *mut crate::internals::HexchatPlugin, attrs: *mut crate::internals::HexchatEventAttrs) { todo!(); } impl<'dangling, 'env> PluginEnvironment<'dangling, 'env> { pub fn new() -> Self { Self { plugins: Default::default(), hooks: Default::default(), extra_hooks: Default::default(), depth: Default::default(), } } } // //impl MockPlugin { // pub fn new crate::Plugin<'ph> + Default>( // env: Pin<&PluginEnvironment>, // filename: CString, // arg: Option<&CStr>, // ) -> Option>> { // let filename = filename.into_raw(); // let mut plug = Box::pin(MockPlugin { // methods: crate::internals::Ph { // hexchat_hook_command, // hexchat_hook_server, // hexchat_hook_print, // hexchat_hook_timer, // hexchat_hook_fd, // hexchat_unhook, // hexchat_print, // userdata: hexchat_printf as *mut libc::c_void, // hexchat_command, // hexchat_commandf_do_not_use: hexchat_commandf, // hexchat_nickcmp, // hexchat_set_context, // hexchat_find_context, // hexchat_get_context, // hexchat_get_info, // hexchat_get_prefs, // hexchat_list_get, // hexchat_list_free, // hexchat_list_fields, // hexchat_list_next, // hexchat_list_str, // hexchat_list_int, // hexchat_plugingui_add, // hexchat_plugingui_remove, // hexchat_emit_print, // hexchat_read_fd, // hexchat_list_time, // hexchat_gettext, // hexchat_send_modes, // hexchat_strip, // hexchat_free, // hexchat_pluginpref_set_str, // hexchat_pluginpref_get_str, // hexchat_pluginpref_set_int, // hexchat_pluginpref_get_int, // hexchat_pluginpref_delete, // hexchat_pluginpref_list, // hexchat_hook_server_attrs, // hexchat_hook_print_attrs, // hexchat_emit_print_attrs, // hexchat_event_attrs_create, // hexchat_event_attrs_free, // }, // filename: filename, // plugin_name: filename, // plugin_desc: ptr::null(), // plugin_vers: ptr::null(), // free_strings: false, // env: &*env, // _pin: PhantomPinned, // }); // if unsafe { // let ptr: *mut MockPlugin = &mut *plug; // crate::hexchat_plugin_init::<'_, T>( // crate::LtPhPtr { // ph: ptr as *mut crate::internals::Ph, // _lt: PhantomData, // }, // ptr::addr_of_mut!((*ptr).plugin_name), // ptr::addr_of_mut!((*ptr).plugin_desc), // ptr::addr_of_mut!((*ptr).plugin_vers), // arg.map(|arg| arg.as_ptr()).unwrap_or(ptr::null()), // ) != 0 // } { // Some(plug) // } else { // None // } // } //}