Commit 21e31e34 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Copy strings from plugin descriptor, remove (D|Und)upModules()

parent 6e70470e
......@@ -34,6 +34,11 @@
#include "config/configuration.h"
#include "libvlc.h"
static char *strdup_null (const char *str)
{
return (str != NULL) ? strdup (str) : NULL;
}
module_t *vlc_module_create (void)
{
module_t *module = malloc (sizeof (*module));
......@@ -69,7 +74,13 @@ module_t *vlc_module_create (void)
void vlc_module_destroy (module_t *module)
{
for (unsigned i = 0; i < module->i_shortcuts; i++)
free (module->pp_shortcuts[i]);
free (module->pp_shortcuts);
free (module->psz_capability);
free (module->psz_help);
free (module->psz_longname);
free (module->psz_shortname);
free (module);
}
......@@ -89,14 +100,13 @@ module_t *vlc_submodule_create (module_t *module)
submodule->submodule = NULL;
submodule->submodule_count = 0;
submodule->pp_shortcuts = xmalloc (sizeof (char **));
submodule->pp_shortcuts[0] = module->pp_shortcuts[0]; /* object name */
submodule->i_shortcuts = 1;
submodule->pp_shortcuts = NULL;
submodule->i_shortcuts = 0;
submodule->psz_shortname = module->psz_shortname;
submodule->psz_longname = module->psz_longname;
submodule->psz_shortname = NULL;
submodule->psz_longname = NULL;
submodule->psz_help = NULL;
submodule->psz_capability = module->psz_capability;
submodule->psz_capability = NULL;
submodule->i_score = module->i_score;
submodule->b_builtin = false;
submodule->b_loaded = false;
......@@ -158,9 +168,23 @@ int vlc_plugin_set (module_t *module, module_config_t *item, int propid, ...)
case VLC_SUBMODULE_CREATE:
{
module_t **pp = va_arg (ap, module_t **);
*pp = vlc_submodule_create (module);
if (*pp == NULL)
module_t *submodule = vlc_submodule_create (module);
if (unlikely(submodule == NULL))
{
ret = -1;
break;
}
/* Inheritance. Ugly!! */
submodule->pp_shortcuts = xmalloc (sizeof (char **));
submodule->pp_shortcuts[0] = strdup_null (module->pp_shortcuts[0]);
submodule->i_shortcuts = 1; /* object name */
submodule->psz_shortname = strdup_null (module->psz_shortname);
submodule->psz_longname = strdup_null (module->psz_longname);
submodule->psz_capability = strdup_null (module->psz_capability);
*pp = submodule;
break;
}
......@@ -191,12 +215,15 @@ int vlc_plugin_set (module_t *module, module_config_t *item, int propid, ...)
}
module->pp_shortcuts = pp;
module->i_shortcuts = index + i_shortcuts;
memcpy (pp + index, tab, sizeof (pp[0]) * i_shortcuts);
pp += index;
for (unsigned i = 0; i < i_shortcuts; i++)
pp[i] = strdup (tab[i]);
break;
}
case VLC_MODULE_CAPABILITY:
module->psz_capability = va_arg (ap, char *);
free (module->psz_capability);
module->psz_capability = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_SCORE:
......@@ -222,30 +249,36 @@ int vlc_plugin_set (module_t *module, module_config_t *item, int propid, ...)
assert (module->i_shortcuts == 0);
module->pp_shortcuts = malloc( sizeof( char ** ) );
module->pp_shortcuts[0] = (char*)value; /* dooh! */
module->pp_shortcuts[0] = strdup (value);
module->i_shortcuts = 1;
if (module->psz_longname == NULL)
module->psz_longname = (char*)value; /* dooh! */
assert (module->psz_longname == NULL);
module->psz_longname = strdup (value);
break;
}
case VLC_MODULE_SHORTNAME:
module->psz_shortname = va_arg (ap, char *);
assert (module->psz_shortname == NULL || module->parent != NULL);
free (module->psz_shortname);
module->psz_shortname = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_DESCRIPTION:
module->psz_longname = va_arg (ap, char *);
// TODO: do not set this in VLC_MODULE_NAME
free (module->psz_longname);
module->psz_longname = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_HELP:
assert (module->parent == NULL);
assert (module->psz_help == NULL);
module->psz_help = va_arg (ap, char *);
module->psz_help = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_TEXTDOMAIN:
module->domain = va_arg (ap, char *);
assert (module->parent == NULL);
assert (module->domain == NULL);
module->domain = strdup (va_arg (ap, char *));
break;
case VLC_CONFIG_NAME:
......
......@@ -84,10 +84,6 @@ static module_t * AllocatePlugin( vlc_object_t *, const char *, bool );
#endif
static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) );
static void DeleteModule (module_t **, module_t *);
#ifdef HAVE_DYNAMIC_PLUGINS
static void DupModule ( module_t * );
static void UndupModule ( module_t * );
#endif
#undef module_InitBank
/**
......@@ -1017,7 +1013,6 @@ static module_t *AllocatePlugin( vlc_object_t * p_this, const char *psz_file,
goto error;
}
DupModule( p_module );
assert( !p_module->b_builtin );
return p_module;
error:
......@@ -1026,56 +1021,6 @@ error:
module_Unload( handle );
return NULL;
}
/*****************************************************************************
* DupModule: make a plugin module standalone.
*****************************************************************************
* This function duplicates all strings in the module, so that the dynamic
* object can be unloaded. It acts recursively on submodules.
*****************************************************************************/
static void DupModule( module_t *p_module )
{
char **pp_shortcuts = p_module->pp_shortcuts;
for( unsigned i = 0; i < p_module->i_shortcuts; i++ )
pp_shortcuts[i] = strdup( p_module->pp_shortcuts[i] );
/* We strdup() these entries so that they are still valid when the
* module is unloaded. */
p_module->psz_capability =
p_module->psz_capability ? strdup( p_module->psz_capability ) : NULL;
p_module->psz_shortname = p_module->psz_shortname ?
strdup( p_module->psz_shortname ) : NULL;
p_module->psz_longname = strdup( p_module->psz_longname );
p_module->psz_help = p_module->psz_help ? strdup( p_module->psz_help )
: NULL;
p_module->domain = p_module->domain ? strdup( p_module->domain ) : NULL;
for (module_t *subm = p_module->submodule; subm; subm = subm->next)
DupModule (subm);
}
/*****************************************************************************
* UndupModule: free a duplicated module.
*****************************************************************************
* This function frees the allocations done in DupModule().
*****************************************************************************/
static void UndupModule( module_t *p_module )
{
char **pp_shortcuts = p_module->pp_shortcuts;
for (module_t *subm = p_module->submodule; subm; subm = subm->next)
UndupModule (subm);
for( unsigned i = 0; i < p_module->i_shortcuts; i++ )
free( pp_shortcuts[i] );
free( p_module->psz_capability );
FREENULL( p_module->psz_shortname );
free( p_module->psz_longname );
FREENULL( p_module->psz_help );
free( p_module->domain );
}
#endif /* HAVE_DYNAMIC_PLUGINS */
/*****************************************************************************
......@@ -1140,7 +1085,6 @@ static void DeleteModule (module_t **head, module_t *p_module)
{
module_Unload( p_module->handle );
}
UndupModule( p_module );
free( p_module->psz_filename );
}
#endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment