4 changed files with 139 additions and 114 deletions
@ -0,0 +1,137 @@ |
|||
/*****************************************************************************
|
|||
* services_discovery.c : Manage playlist services_discovery modules |
|||
***************************************************************************** |
|||
* Copyright (C) 1999-2004 VLC authors and VideoLAN |
|||
* $Id$ |
|||
* |
|||
* Authors: Clément Stenac <zorglub@videolan.org> |
|||
* |
|||
* This program is free software; you can redistribute it and/or modify it |
|||
* under the terms of the GNU Lesser General Public License as published by |
|||
* the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser 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. |
|||
*****************************************************************************/ |
|||
#ifdef HAVE_CONFIG_H |
|||
# include "config.h" |
|||
#endif |
|||
#include <assert.h> |
|||
|
|||
#include <vlc_common.h> |
|||
#include <vlc_services_discovery.h> |
|||
#include <vlc_probe.h> |
|||
#include <vlc_modules.h> |
|||
#include "../libvlc.h" |
|||
|
|||
typedef struct |
|||
{ |
|||
char *name; |
|||
char *longname; |
|||
int category; |
|||
} vlc_sd_probe_t; |
|||
|
|||
int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name, |
|||
const char *longname, int category) |
|||
{ |
|||
vlc_sd_probe_t names = { strdup(name), strdup(longname), category }; |
|||
|
|||
if (unlikely (names.name == NULL || names.longname == NULL |
|||
|| vlc_probe_add (probe, &names, sizeof (names)))) |
|||
{ |
|||
free (names.name); |
|||
free (names.longname); |
|||
return VLC_ENOMEM; |
|||
} |
|||
return VLC_PROBE_CONTINUE; |
|||
} |
|||
|
|||
#undef vlc_sd_GetNames |
|||
|
|||
/**
|
|||
* Gets the list of available services discovery plugins. |
|||
*/ |
|||
char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames, int **pp_categories) |
|||
{ |
|||
size_t count; |
|||
vlc_sd_probe_t *tab = vlc_probe (obj, "services probe", &count); |
|||
|
|||
if (count == 0) |
|||
{ |
|||
free (tab); |
|||
return NULL; |
|||
} |
|||
|
|||
char **names = malloc (sizeof(char *) * (count + 1)); |
|||
char **longnames = malloc (sizeof(char *) * (count + 1)); |
|||
int *categories = malloc(sizeof(int) * (count + 1)); |
|||
|
|||
if (unlikely (names == NULL || longnames == NULL || categories == NULL)) |
|||
{ |
|||
free(names); |
|||
free(longnames); |
|||
free(categories); |
|||
free(tab); |
|||
return NULL; |
|||
} |
|||
for( size_t i = 0; i < count; i++ ) |
|||
{ |
|||
names[i] = tab[i].name; |
|||
longnames[i] = tab[i].longname; |
|||
categories[i] = tab[i].category; |
|||
} |
|||
free (tab); |
|||
names[count] = longnames[count] = NULL; |
|||
categories[count] = 0; |
|||
*pppsz_longnames = longnames; |
|||
if( pp_categories ) *pp_categories = categories; |
|||
else free( categories ); |
|||
return names; |
|||
} |
|||
|
|||
/*
|
|||
* Services discovery |
|||
* Basically you just listen to Service discovery event through the |
|||
* sd's event manager. |
|||
* That's how the playlist get's Service Discovery information |
|||
*/ |
|||
|
|||
services_discovery_t *vlc_sd_Create(vlc_object_t *parent, const char *cfg, |
|||
const struct services_discovery_owner_t *restrict owner) |
|||
{ |
|||
services_discovery_t *sd = vlc_custom_create(parent, sizeof (*sd), |
|||
"services discovery"); |
|||
if (unlikely(sd == NULL)) |
|||
return NULL; |
|||
|
|||
free(config_ChainCreate(&sd->psz_name, &sd->p_cfg, cfg)); |
|||
sd->description = NULL; |
|||
sd->owner = *owner; |
|||
|
|||
sd->p_module = module_need(sd, "services_discovery", |
|||
sd->psz_name, true); |
|||
if (sd->p_module == NULL) |
|||
{ |
|||
msg_Err(sd, "no suitable services discovery module"); |
|||
vlc_sd_Destroy(sd); |
|||
sd = NULL; |
|||
} |
|||
|
|||
return sd; |
|||
} |
|||
|
|||
void vlc_sd_Destroy(services_discovery_t *sd) |
|||
{ |
|||
if (sd->p_module != NULL) |
|||
module_unneed(sd, sd->p_module); |
|||
config_ChainDestroy(sd->p_cfg); |
|||
free(sd->psz_name); |
|||
vlc_object_release(sd); |
|||
} |
|||
Loading…
Reference in new issue