From: Rémi Denis-Courmont Date: Sat, 14 Apr 2007 16:15:37 +0000 (+0000) Subject: Initial work on hiding module_t layout from plugins X-Git-Tag: 0.9.0-test0~7750 X-Git-Url: https://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;p=vlc.git;a=commitdiff_plain;h=b89c14d5b4bd4e0011cca5112b54f6785df7dee2 Initial work on hiding module_t layout from plugins --- diff --git a/include/vlc_modules.h b/include/vlc_modules.h index bdcf345e9d..633fdd29e8 100644 --- a/include/vlc_modules.h +++ b/include/vlc_modules.h @@ -110,3 +110,24 @@ VLC_EXPORT( module_t *, __module_Need, ( vlc_object_t *, const char *, const cha VLC_EXPORT( void, __module_Unneed, ( vlc_object_t *, module_t * ) ); #define module_Exists(a,b) __module_Exists(VLC_OBJECT(a),b) VLC_EXPORT( vlc_bool_t, __module_Exists, ( vlc_object_t *, const char * ) ); + +VLC_EXPORT( module_t *, vlc_submodule_create, ( module_t * ) ); +VLC_EXPORT( int, vlc_module_set, (module_t *module, int propid, void *value) ); + +enum +{ + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_MODULE_CPU_REQUIREMENT, + VLC_MODULE_SHORTCUT, + VLC_MODULE_SHORTNAME, + VLC_MODULE_DESCRIPTION, + VLC_MODULE_HELP, + VLC_MODULE_CAPABILITY, + VLC_MODULE_SCORE, + VLC_MODULE_PROGRAM, + VLC_MODULE_CB_OPEN, + VLC_MODULE_CB_CLOSE, + VLC_MODULE_UNLOADABLE +} vlc_module_property_t; + diff --git a/include/vlc_modules_macros.h b/include/vlc_modules_macros.h index 39fdd2640b..c8f476e212 100644 --- a/include/vlc_modules_macros.h +++ b/include/vlc_modules_macros.h @@ -121,6 +121,8 @@ E_(vlc_entry) ( module_t *p_module ); p_module->psz_longname = MODULE_STRING; \ p_module->psz_help = NULL; \ p_module->pp_shortcuts[ 0 ] = MODULE_STRING; \ + for( unsigned i = 1; i < MODULE_SHORTCUT_MAX; i++ ) \ + p_module->pp_shortcuts[i] = NULL; \ p_module->i_cpu = 0; \ p_module->psz_program = NULL; \ p_module->psz_capability = ""; \ @@ -151,55 +153,36 @@ E_(vlc_entry) ( module_t *p_module ); struct _u_n_u_s_e_d_ /* the ; gets added */ -#define add_submodule( ) \ - p_submodule->pp_shortcuts[ i_shortcut ] = NULL; \ - p_submodule = \ - (module_t *)vlc_object_create( p_module, VLC_OBJECT_MODULE ); \ - vlc_object_attach( p_submodule, p_module ); \ - p_submodule->b_submodule = VLC_TRUE; \ - /* Nuahahaha! Heritage! Polymorphism! Ugliness!! */ \ - for( i_shortcut = 0; p_module->pp_shortcuts[ i_shortcut ]; i_shortcut++ ) \ - { \ - p_submodule->pp_shortcuts[ i_shortcut ] = \ - p_module->pp_shortcuts[ i_shortcut ]; \ - } \ - p_submodule->psz_object_name = p_module->psz_object_name; \ - p_submodule->psz_shortname = p_module->psz_shortname; \ - p_submodule->psz_longname = p_module->psz_longname; \ - p_submodule->psz_program = p_module->psz_program; \ - p_submodule->psz_capability = p_module->psz_capability; \ - p_submodule->i_score = p_module->i_score; \ - p_submodule->i_cpu = p_module->i_cpu; \ - p_submodule->pf_activate = NULL; \ - p_submodule->pf_deactivate = NULL +#define add_submodule( ) \ + p_submodule = vlc_submodule_create( p_module ) -#define add_requirement( cap ) \ - p_module->i_cpu |= CPU_CAPABILITY_##cap +#define add_requirement( cap ) \ + vlc_module_set (p_module, VLC_MODULE_CPU_REQUIREMENT, \ + (void *)(CPU_CAPABILITY_##cap)) -#define add_shortcut( shortcut ) \ - p_submodule->pp_shortcuts[ i_shortcut ] = shortcut; \ - i_shortcut++ +#define add_shortcut( shortcut ) \ + vlc_module_set (p_submodule, VLC_MODULE_SHORTCUT, (void*)(shortcut)) -#define set_shortname( desc ) \ - p_submodule->psz_shortname = desc +#define set_shortname( shortname ) \ + vlc_module_set (p_submodule, VLC_MODULE_SHORTNAME, (void*)(shortname)) -#define set_description( desc ) \ - p_submodule->psz_longname = desc +#define set_description( desc ) \ + vlc_module_set (p_submodule, VLC_MODULE_DESCRIPTION, (void*)(desc)) -#define set_help( help ) \ - p_submodule->psz_help = help +#define set_help( help ) \ + vlc_module_set (p_submodule, VLC_MODULE_HELP, (void*)(help)) -#define set_capability( cap, score ) \ - p_submodule->psz_capability = cap; \ - p_submodule->i_score = score +#define set_capability( cap, score ) \ + vlc_module_set (p_submodule, VLC_MODULE_CAPABILITY, (void *)(cap)); \ + vlc_module_set (p_submodule, VLC_MODULE_SCORE, (void *)(score)) -#define set_program( program ) \ - p_submodule->psz_program = program +#define set_program( program ) \ + vlc_module_set (p_submodule, VLC_MODULE_PROGRAM, (void *)(program)) -#define set_callbacks( activate, deactivate ) \ - p_submodule->pf_activate = activate; \ - p_submodule->pf_deactivate = deactivate +#define set_callbacks( activate, deactivate ) \ + vlc_module_set (p_submodule, VLC_MODULE_CB_OPEN, (void *)(activate)); \ + vlc_module_set (p_submodule, VLC_MODULE_CB_CLOSE, (void *)(deactivate)) -#define linked_with_a_crap_library_which_uses_atexit( ) \ - p_module->b_unloadable = VLC_FALSE +#define linked_with_a_crap_library_which_uses_atexit( ) \ + vlc_module_set (p_submodule, VLC_MODULE_UNLOADABLE, NULL) diff --git a/src/Makefile.am b/src/Makefile.am index 1974c680a0..b09c46b871 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -288,6 +288,7 @@ SOURCES_libvlc_common = \ misc/block.c \ modules/modules.h \ modules/modules.c \ + modules/entry.c \ misc/threads.c \ misc/stats.c \ misc/cpu.c \ diff --git a/src/modules/entry.c b/src/modules/entry.c new file mode 100644 index 0000000000..76ca57d31e --- /dev/null +++ b/src/modules/entry.c @@ -0,0 +1,116 @@ +/***************************************************************************** + * entry.c : Callbacks for module entry point + ***************************************************************************** + * Copyright (C) 2001-2007 the VideoLAN team + * + * 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 Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#include +#include + + +module_t *vlc_submodule_create (module_t *module) +{ + assert (module != NULL); + assert (!module->b_submodule); // subsubmodules are not supported + + module_t *submodule = + (module_t *)vlc_object_create (module, VLC_OBJECT_MODULE); + if (submodule == NULL) + return NULL; + + vlc_object_attach (submodule, module); + submodule->b_submodule = VLC_TRUE; + + /* Muahahaha! Heritage! Polymorphism! Ugliness!! */ + memcpy (submodule->pp_shortcuts, module->pp_shortcuts, + sizeof (submodule->pp_shortcuts)); + + submodule->psz_object_name = module->psz_object_name; + submodule->psz_shortname = module->psz_shortname; + submodule->psz_longname = module->psz_longname; + submodule->psz_program = module->psz_program; + submodule->psz_capability = module->psz_capability; + submodule->i_score = module->i_score; + submodule->i_cpu = module->i_cpu; + submodule->pf_activate = NULL; + submodule->pf_deactivate = NULL; + return submodule; +} + +int vlc_module_set (module_t *module, int propid, void *value) +{ + switch (propid) + { + case VLC_MODULE_CPU_REQUIREMENT: + assert (!module->b_submodule); + module->i_cpu |= (int)value; + break; + + case VLC_MODULE_SHORTCUT: + { + unsigned i; + for (i = 0; module->pp_shortcuts[i] != NULL; i++); + if (i >= MODULE_SHORTCUT_MAX) + return VLC_ENOMEM; + + module->pp_shortcuts[i] = (char *)value; + break; + } + + case VLC_MODULE_SHORTNAME: + module->psz_shortname = (char *)value; + break; + + case VLC_MODULE_DESCRIPTION: + module->psz_longname = (char *)value; + break; + + case VLC_MODULE_HELP: + module->psz_help = (char *)value; + break; + + case VLC_MODULE_CAPABILITY: + module->psz_capability = (char *)value; + break; + + case VLC_MODULE_SCORE: + module->i_score = (int)value; + break; + + case VLC_MODULE_PROGRAM: + module->psz_program = (char *)value; + break; + + case VLC_MODULE_CB_OPEN: + module->pf_activate = (int (*) (vlc_object_t *))value; + break; + + case VLC_MODULE_CB_CLOSE: + module->pf_deactivate = (void (*) (vlc_object_t *))value; + break; + + case VLC_MODULE_UNLOADABLE: + module->b_unloadable = (value != NULL); + break; + + default: + msg_Err (module, "unknown module property %d", propid); + msg_Err (module, "LibVLC might be too old to use this module."); + return VLC_EGENERIC; + } + return 0; +}