1 /*****************************************************************************
2 * services_discovery.c : Manage playlist services_discovery modules
3 *****************************************************************************
4 * Copyright (C) 1999-2004 VLC authors and VideoLAN
6 * Authors: Clément Stenac <zorglub@videolan.org>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
27 #include <vlc_common.h>
28 #include <vlc_services_discovery.h>
29 #include <vlc_probe.h>
30 #include <vlc_modules.h>
31 #include "../libvlc.h"
40 int vlc_sd_probe_Add (vlc_probe_t
*probe
, const char *name
,
41 const char *longname
, int category
)
43 vlc_sd_probe_t names
= { strdup(name
), strdup(longname
), category
};
45 if (unlikely (names
.name
== NULL
|| names
.longname
== NULL
46 || vlc_probe_add (probe
, &names
, sizeof (names
))))
49 free (names
.longname
);
52 return VLC_PROBE_CONTINUE
;
55 #undef vlc_sd_GetNames
58 * Gets the list of available services discovery plugins.
60 char **vlc_sd_GetNames (vlc_object_t
*obj
, char ***pppsz_longnames
, int **pp_categories
)
63 vlc_sd_probe_t
*tab
= vlc_probe (obj
, "services probe", &count
);
71 char **names
= vlc_alloc (count
+ 1, sizeof(char *));
72 char **longnames
= vlc_alloc (count
+ 1, sizeof(char *));
73 int *categories
= vlc_alloc (count
+ 1, sizeof(int));
75 if (unlikely (names
== NULL
|| longnames
== NULL
|| categories
== NULL
))
83 for( size_t i
= 0; i
< count
; i
++ )
85 names
[i
] = tab
[i
].name
;
86 longnames
[i
] = tab
[i
].longname
;
87 categories
[i
] = tab
[i
].category
;
90 names
[count
] = longnames
[count
] = NULL
;
91 categories
[count
] = 0;
92 *pppsz_longnames
= longnames
;
93 if( pp_categories
) *pp_categories
= categories
;
94 else free( categories
);
100 * Basically you just listen to Service discovery event through the
101 * sd's event manager.
102 * That's how the playlist get's Service Discovery information
106 services_discovery_t
*vlc_sd_Create(vlc_object_t
*parent
, const char *cfg
,
107 const struct services_discovery_owner_t
*restrict owner
)
109 services_discovery_t
*sd
= vlc_custom_create(parent
, sizeof (*sd
),
110 "services discovery");
111 if (unlikely(sd
== NULL
))
114 free(config_ChainCreate(&sd
->psz_name
, &sd
->p_cfg
, cfg
));
115 sd
->description
= NULL
;
118 sd
->p_module
= module_need(sd
, "services_discovery",
120 if (sd
->p_module
== NULL
)
122 msg_Err(sd
, "no suitable services discovery module");
130 void vlc_sd_Destroy(services_discovery_t
*sd
)
132 if (sd
->p_module
!= NULL
)
133 module_unneed(sd
, sd
->p_module
);
134 config_ChainDestroy(sd
->p_cfg
);
136 vlc_object_release(sd
);