1 /*****************************************************************************
2 * services_discovery.c : Manage playlist services_discovery modules
3 *****************************************************************************
4 * Copyright (C) 1999-2004 VLC authors and VideoLAN
7 * Authors: Clément Stenac <zorglub@videolan.org>
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation; either version 2.1 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this program; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
28 #include <vlc_common.h>
29 #include <vlc_services_discovery.h>
30 #include <vlc_probe.h>
31 #include <vlc_modules.h>
32 #include "../libvlc.h"
41 int vlc_sd_probe_Add (vlc_probe_t
*probe
, const char *name
,
42 const char *longname
, int category
)
44 vlc_sd_probe_t names
= { strdup(name
), strdup(longname
), category
};
46 if (unlikely (names
.name
== NULL
|| names
.longname
== NULL
47 || vlc_probe_add (probe
, &names
, sizeof (names
))))
50 free (names
.longname
);
53 return VLC_PROBE_CONTINUE
;
56 #undef vlc_sd_GetNames
59 * Gets the list of available services discovery plugins.
61 char **vlc_sd_GetNames (vlc_object_t
*obj
, char ***pppsz_longnames
, int **pp_categories
)
64 vlc_sd_probe_t
*tab
= vlc_probe (obj
, "services probe", &count
);
72 char **names
= malloc (sizeof(char *) * (count
+ 1));
73 char **longnames
= malloc (sizeof(char *) * (count
+ 1));
74 int *categories
= malloc(sizeof(int) * (count
+ 1));
76 if (unlikely (names
== NULL
|| longnames
== NULL
|| categories
== NULL
))
84 for( size_t i
= 0; i
< count
; i
++ )
86 names
[i
] = tab
[i
].name
;
87 longnames
[i
] = tab
[i
].longname
;
88 categories
[i
] = tab
[i
].category
;
91 names
[count
] = longnames
[count
] = NULL
;
92 categories
[count
] = 0;
93 *pppsz_longnames
= longnames
;
94 if( pp_categories
) *pp_categories
= categories
;
95 else free( categories
);
101 * Basically you just listen to Service discovery event through the
102 * sd's event manager.
103 * 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
);