Commit 2a2dd551 authored by Jakob Leben's avatar Jakob Leben

services_discovery: implement SD categories and use in Qt interface

parent d269c768
...@@ -54,15 +54,23 @@ struct services_discovery_t ...@@ -54,15 +54,23 @@ struct services_discovery_t
services_discovery_sys_t *p_sys; services_discovery_sys_t *p_sys;
}; };
enum services_discovery_category_e
{
SD_CAT_DEVICES = 1,
SD_CAT_LAN,
SD_CAT_INTERNET,
SD_CAT_MYCOMPUTER
};
/*********************************************************************** /***********************************************************************
* Service Discovery * Service Discovery
***********************************************************************/ ***********************************************************************/
/* Get the services discovery modules names to use in Create(), in a null /* Get the services discovery modules names to use in Create(), in a null
* terminated string array. Array and string must be freed after use. */ * terminated string array. Array and string must be freed after use. */
VLC_EXPORT( char **, vlc_sd_GetNames, ( vlc_object_t *, char *** ) ); VLC_EXPORT( char **, vlc_sd_GetNames, ( vlc_object_t *, char ***, int ** ) );
#define vlc_sd_GetNames(obj, pln) \ #define vlc_sd_GetNames(obj, pln, pcat ) \
vlc_sd_GetNames(VLC_OBJECT(obj), pln) vlc_sd_GetNames(VLC_OBJECT(obj), pln, pcat)
/* Creation of a service_discovery object */ /* Creation of a service_discovery object */
VLC_EXPORT( services_discovery_t *, vlc_sd_Create, ( vlc_object_t *, const char * ) ); VLC_EXPORT( services_discovery_t *, vlc_sd_Create, ( vlc_object_t *, const char * ) );
...@@ -91,18 +99,19 @@ VLC_EXPORT( void, services_discovery_RemoveItem, ( services_di ...@@ -91,18 +99,19 @@ VLC_EXPORT( void, services_discovery_RemoveItem, ( services_di
/* SD probing */ /* SD probing */
VLC_EXPORT(int, vlc_sd_probe_Add, (vlc_probe_t *, const char *, const char *)); VLC_EXPORT(int, vlc_sd_probe_Add, (vlc_probe_t *, const char *, const char *, int category));
#define VLC_SD_PROBE_SUBMODULE \ #define VLC_SD_PROBE_SUBMODULE \
add_submodule() \ add_submodule() \
set_capability( "services probe", 100 ) \ set_capability( "services probe", 100 ) \
set_callbacks( vlc_sd_probe_Open, NULL ) set_callbacks( vlc_sd_probe_Open, NULL )
#define VLC_SD_PROBE_HELPER(name, longname) \ #define VLC_SD_PROBE_HELPER(name, longname, cat) \
static int vlc_sd_probe_Open (vlc_object_t *obj) \ static int vlc_sd_probe_Open (vlc_object_t *obj) \
{ \ { \
return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, \ return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, \
name "{longname=\"" # longname "\"}", longname); \ name "{longname=\"" # longname "\"}", \
longname, cat); \
} }
/** @} */ /** @} */
......
...@@ -413,7 +413,7 @@ ...@@ -413,7 +413,7 @@
o_tc_sortColumn = nil; o_tc_sortColumn = nil;
char ** ppsz_name; char ** ppsz_name;
char ** ppsz_services = vlc_sd_GetNames( VLCIntf, &ppsz_name ); char ** ppsz_services = vlc_sd_GetNames( VLCIntf, &ppsz_name, NULL );
if( !ppsz_services ) if( !ppsz_services )
return; return;
......
...@@ -249,46 +249,53 @@ void PLSelector::createItems() ...@@ -249,46 +249,53 @@ void PLSelector::createItems()
THEPL->p_media_library ); THEPL->p_media_library );
ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) ); ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) );
QTreeWidgetItem *mfldrs = NULL; QTreeWidgetItem *mycomp = addItem( CATEGORY_TYPE, qtr( "My Computer" ),
false )->treeItem();
QTreeWidgetItem *shouts = NULL; QTreeWidgetItem *devices = addItem( CATEGORY_TYPE, qtr( "Devices" ),
false )->treeItem();
QTreeWidgetItem *lan = addItem( CATEGORY_TYPE, qtr( "Local Network" ),
false )->treeItem();
QTreeWidgetItem *internet = addItem( CATEGORY_TYPE, qtr( "Internet" ),
false )->treeItem();;
char **ppsz_longnames; char **ppsz_longnames;
char **ppsz_names = vlc_sd_GetNames( THEPL, &ppsz_longnames ); int *p_categories;
char **ppsz_names = vlc_sd_GetNames( THEPL, &ppsz_longnames, &p_categories );
if( !ppsz_names ) if( !ppsz_names )
return; return;
char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames; char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames;
for( ; *ppsz_name; ppsz_name++, ppsz_longname++ ) int *p_category = p_categories;
for( ; *ppsz_name; ppsz_name++, ppsz_longname++, p_category++ )
{ {
//msg_Dbg( p_intf, "Adding a SD item: %s", *ppsz_longname ); //msg_Dbg( p_intf, "Adding a SD item: %s", *ppsz_longname );
#define SD_IS( name ) ( !strcmp( *ppsz_name, name ) )
if( SD_IS("shoutcast") || SD_IS("shoutcasttv") || if( *p_category == SD_CAT_INTERNET )
SD_IS("frenchtv") || SD_IS("freebox") )
{ {
if( !shouts ) shouts = addItem( CATEGORY_TYPE, qtr( "Shoutcast" ), PLSelItem *selItem = addItem( SD_TYPE, *ppsz_longname, false, internet );
false )->treeItem(); putSDData( selItem, *ppsz_name, *ppsz_longname );
putSDData( addItem( SD_TYPE, *ppsz_longname, false, shouts ), if( !strncmp( *ppsz_name, "podcast", 7 ) )
{
selItem->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PODCAST ) );
selItem->addAction( ADD_ACTION, qtr( "Subscribe to a podcast" ) );
CONNECT( selItem, action( PLSelItem* ), this, podcastAdd( PLSelItem* ) );
podcastsParent = selItem->treeItem();
}
}
else if( *p_category == SD_CAT_DEVICES )
{
putSDData( addItem( SD_TYPE, *ppsz_longname, false, devices ),
*ppsz_name, *ppsz_longname ); *ppsz_name, *ppsz_longname );
} }
else if( SD_IS("video_dir") || SD_IS("audio_dir") || SD_IS("picture_dir") ) else if( *p_category == SD_CAT_LAN )
{ {
if( !mfldrs ) mfldrs = addItem( CATEGORY_TYPE, qtr( "Media Folders" ), putSDData( addItem( SD_TYPE, *ppsz_longname, false, lan ),
false )->treeItem();
putSDData( addItem( SD_TYPE, *ppsz_longname, false, mfldrs ),
*ppsz_name, *ppsz_longname ); *ppsz_name, *ppsz_longname );
} }
else if( !strncmp( *ppsz_name, "podcast", 7 ) ) else if( *p_category == SD_CAT_MYCOMPUTER )
{ {
putSDData( addItem( SD_TYPE, *ppsz_longname, false, mycomp ),
PLSelItem *podItem = addItem( SD_TYPE, qtr( "Podcasts" ), false ); *ppsz_name, *ppsz_longname );
putSDData( podItem, *ppsz_name, *ppsz_longname );
podItem->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PODCAST ) );
podItem->addAction( ADD_ACTION, qtr( "Subscribe to a podcast" ) );
CONNECT( podItem, action( PLSelItem* ), this, podcastAdd( PLSelItem* ) );
podcastsParent = podItem->treeItem();
} }
else else
{ {
...@@ -296,13 +303,17 @@ void PLSelector::createItems() ...@@ -296,13 +303,17 @@ void PLSelector::createItems()
*ppsz_name, *ppsz_longname ); *ppsz_name, *ppsz_longname );
} }
#undef SD_IS
free( *ppsz_name ); free( *ppsz_name );
free( *ppsz_longname ); free( *ppsz_longname );
} }
free( ppsz_names ); free( ppsz_names );
free( ppsz_longnames ); free( ppsz_longnames );
free( p_categories );
if( mycomp->childCount() == 0 ) delete mycomp;
if( devices->childCount() == 0 ) delete devices;
if( lan->childCount() == 0 ) delete lan;
if( internet->childCount() == 0 ) delete internet;
} }
QStringList PLSelector::mimeTypes() const QStringList PLSelector::mimeTypes() const
......
...@@ -708,7 +708,7 @@ QMenu *QVLCMenu::SDMenu( intf_thread_t *p_intf, QWidget *parent ) ...@@ -708,7 +708,7 @@ QMenu *QVLCMenu::SDMenu( intf_thread_t *p_intf, QWidget *parent )
menu->setTitle( qtr( I_PL_SD ) ); menu->setTitle( qtr( I_PL_SD ) );
char **ppsz_longnames; char **ppsz_longnames;
char **ppsz_names = vlc_sd_GetNames( p_intf, &ppsz_longnames ); char **ppsz_names = vlc_sd_GetNames( p_intf, &ppsz_longnames, NULL );
if( !ppsz_names ) if( !ppsz_names )
return menu; return menu;
......
...@@ -62,7 +62,7 @@ static int vlclua_sd_get_services_names( lua_State *L ) ...@@ -62,7 +62,7 @@ static int vlclua_sd_get_services_names( lua_State *L )
{ {
playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_t *p_playlist = vlclua_get_playlist_internal( L );
char **ppsz_longnames; char **ppsz_longnames;
char **ppsz_names = vlc_sd_GetNames( p_playlist, &ppsz_longnames ); char **ppsz_names = vlc_sd_GetNames( p_playlist, &ppsz_longnames, NULL );
if( !ppsz_names ) if( !ppsz_names )
return 0; return 0;
......
...@@ -632,7 +632,7 @@ static int vlc_sd_probe_Open( vlc_object_t *obj ) ...@@ -632,7 +632,7 @@ static int vlc_sd_probe_Open( vlc_object_t *obj )
free( psz_longname ); free( psz_longname );
goto error; goto error;
} }
vlc_sd_probe_Add( probe, psz_name, psz_longname ); vlc_sd_probe_Add( probe, psz_name, psz_longname, SD_CAT_INTERNET );
free( psz_name ); free( psz_name );
free( psz_longname ); free( psz_longname );
} }
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close( vlc_object_t * ); static void Close( vlc_object_t * );
VLC_SD_PROBE_HELPER("bonjour", N_("Bonjour services")) VLC_SD_PROBE_HELPER("bonjour", N_("Bonjour services"), SD_CAT_LAN)
vlc_module_begin () vlc_module_begin ()
set_shortname( "Bonjour" ) set_shortname( "Bonjour" )
......
...@@ -356,10 +356,10 @@ static int vlc_sd_probe_Open( vlc_object_t *obj ) ...@@ -356,10 +356,10 @@ static int vlc_sd_probe_Open( vlc_object_t *obj )
vlc_probe_t *probe = (vlc_probe_t *)obj; vlc_probe_t *probe = (vlc_probe_t *)obj;
vlc_sd_probe_Add( probe, "video_dir{longname=\"My Videos\"}", vlc_sd_probe_Add( probe, "video_dir{longname=\"My Videos\"}",
N_("My Videos") ); N_("My Videos"), SD_CAT_MYCOMPUTER );
vlc_sd_probe_Add( probe, "audio_dir{longname=\"My Music\"}", vlc_sd_probe_Add( probe, "audio_dir{longname=\"My Music\"}",
N_("My Music") ); N_("My Music"), SD_CAT_MYCOMPUTER );
vlc_sd_probe_Add( probe, "picture_dir{longname=\"My Pictures\"}", vlc_sd_probe_Add( probe, "picture_dir{longname=\"My Pictures\"}",
N_("My Pictures") ); N_("My Pictures"), SD_CAT_MYCOMPUTER );
return VLC_PROBE_CONTINUE; return VLC_PROBE_CONTINUE;
} }
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
static int Open( vlc_object_t * ); static int Open( vlc_object_t * );
static void Close( vlc_object_t * ); static void Close( vlc_object_t * );
VLC_SD_PROBE_HELPER("mtp", N_("MTP devices")) VLC_SD_PROBE_HELPER("mtp", N_("MTP devices"), SD_CAT_DEVICES)
vlc_module_begin() vlc_module_begin()
set_shortname( "MTP" ) set_shortname( "MTP" )
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close( vlc_object_t * ); static void Close( vlc_object_t * );
VLC_SD_PROBE_HELPER("podcast", N_("Podcasts")) VLC_SD_PROBE_HELPER("podcast", N_("Podcasts"), SD_CAT_INTERNET)
#define URLS_TEXT N_("Podcast URLs list") #define URLS_TEXT N_("Podcast URLs list")
#define URLS_LONGTEXT N_("Enter the list of podcasts to retrieve, " \ #define URLS_LONGTEXT N_("Enter the list of podcasts to retrieve, " \
......
...@@ -114,7 +114,7 @@ ...@@ -114,7 +114,7 @@
static int OpenDemux ( vlc_object_t * ); static int OpenDemux ( vlc_object_t * );
static void CloseDemux ( vlc_object_t * ); static void CloseDemux ( vlc_object_t * );
VLC_SD_PROBE_HELPER("sap", N_("Network streams (SAP)")) VLC_SD_PROBE_HELPER("sap", N_("Network streams (SAP)"), SD_CAT_LAN)
vlc_module_begin () vlc_module_begin ()
set_shortname( N_("SAP")) set_shortname( N_("SAP"))
......
...@@ -283,10 +283,10 @@ static int vlc_sd_probe_Open( vlc_object_t *obj ) ...@@ -283,10 +283,10 @@ static int vlc_sd_probe_Open( vlc_object_t *obj )
vlc_probe_t *probe = (vlc_probe_t *)obj; vlc_probe_t *probe = (vlc_probe_t *)obj;
vlc_sd_probe_Add( probe, "shoutcast{longname=\"Shoutcast Radio\"}", vlc_sd_probe_Add( probe, "shoutcast{longname=\"Shoutcast Radio\"}",
N_("Shoutcast Radio") ); N_("Shoutcast Radio"), SD_CAT_INTERNET );
vlc_sd_probe_Add( probe, "shoutcasttv{longname=\"Shoutcast TV\"}", vlc_sd_probe_Add( probe, "shoutcasttv{longname=\"Shoutcast TV\"}",
N_("Shoutcast TV") ); N_("Shoutcast TV"), SD_CAT_INTERNET );
vlc_sd_probe_Add( probe, "frenchtv{longname=\"French TV\"}", vlc_sd_probe_Add( probe, "frenchtv{longname=\"French TV\"}",
N_("French TV") ); N_("French TV"), SD_CAT_INTERNET );
return VLC_PROBE_CONTINUE; return VLC_PROBE_CONTINUE;
} }
...@@ -74,8 +74,8 @@ static int vlc_sd_probe_Open (vlc_object_t *obj) ...@@ -74,8 +74,8 @@ static int vlc_sd_probe_Open (vlc_object_t *obj)
if (mon != NULL) if (mon != NULL)
{ {
vlc_sd_probe_Add (probe, "v4l{longname=\"Video capture\"}", vlc_sd_probe_Add (probe, "v4l{longname=\"Video capture\"}",
N_("Video capture")); N_("Video capture"), SD_CAT_DEVICES);
vlc_sd_probe_Add (probe, "disc{longname=\"Discs\"}", N_("Discs")); vlc_sd_probe_Add (probe, "disc{longname=\"Discs\"}", N_("Discs"), SD_CAT_MYCOMPUTER);
udev_monitor_unref (mon); udev_monitor_unref (mon);
} }
udev_unref (udev); udev_unref (udev);
......
...@@ -58,7 +58,7 @@ using namespace CyberLink; ...@@ -58,7 +58,7 @@ using namespace CyberLink;
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close( vlc_object_t * ); static void Close( vlc_object_t * );
VLC_SD_PROBE_HELPER("upnp", N_("Universal Plug'n'Play")) VLC_SD_PROBE_HELPER("upnp", N_("Universal Plug'n'Play"), SD_CAT_LAN)
vlc_module_begin () vlc_module_begin ()
set_shortname( "UPnP") set_shortname( "UPnP")
......
...@@ -55,7 +55,7 @@ struct services_discovery_sys_t ...@@ -55,7 +55,7 @@ struct services_discovery_sys_t
// VLC callback prototypes // VLC callback prototypes
static int Open( vlc_object_t* ); static int Open( vlc_object_t* );
static void Close( vlc_object_t* ); static void Close( vlc_object_t* );
VLC_SD_PROBE_HELPER("upnp", N_("Universal Plug'n'Play")) VLC_SD_PROBE_HELPER("upnp", N_("Universal Plug'n'Play"), SD_CAT_LAN)
// Module descriptor // Module descriptor
......
...@@ -80,7 +80,7 @@ static int vlc_sd_probe_Open (vlc_object_t *obj) ...@@ -80,7 +80,7 @@ static int vlc_sd_probe_Open (vlc_object_t *obj)
return VLC_PROBE_CONTINUE; return VLC_PROBE_CONTINUE;
xcb_disconnect (conn); xcb_disconnect (conn);
return vlc_sd_probe_Add (probe, "xcb_apps{longname=\"Screen capture\"}", return vlc_sd_probe_Add (probe, "xcb_apps{longname=\"Screen capture\"}",
N_("Screen capture")); N_("Screen capture"), SD_CAT_MYCOMPUTER);
} }
/** /**
......
...@@ -37,12 +37,13 @@ typedef struct ...@@ -37,12 +37,13 @@ typedef struct
{ {
char *name; char *name;
char *longname; char *longname;
int category;
} vlc_sd_probe_t; } vlc_sd_probe_t;
int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name, int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name,
const char *longname) const char *longname, int category)
{ {
vlc_sd_probe_t names = { strdup(name), strdup(longname) }; vlc_sd_probe_t names = { strdup(name), strdup(longname), category };
if (unlikely (names.name == NULL || names.longname == NULL if (unlikely (names.name == NULL || names.longname == NULL
|| vlc_probe_add (probe, &names, sizeof (names)))) || vlc_probe_add (probe, &names, sizeof (names))))
...@@ -59,7 +60,7 @@ int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name, ...@@ -59,7 +60,7 @@ int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name,
/** /**
* Gets the list of available services discovery plugins. * Gets the list of available services discovery plugins.
*/ */
char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames) char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames, int **pp_categories)
{ {
size_t count; size_t count;
vlc_sd_probe_t *tab = vlc_probe (obj, "services probe", &count); vlc_sd_probe_t *tab = vlc_probe (obj, "services probe", &count);
...@@ -72,17 +73,22 @@ char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames) ...@@ -72,17 +73,22 @@ char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames)
char **names = malloc (sizeof(char *) * (count + 1)); char **names = malloc (sizeof(char *) * (count + 1));
char **longnames = 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)) if (unlikely (names == NULL || longnames == NULL || categories == NULL))
abort(); abort();
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
{ {
names[i] = tab[i].name; names[i] = tab[i].name;
longnames[i] = tab[i].longname; longnames[i] = tab[i].longname;
categories[i] = tab[i].category;
} }
free (tab); free (tab);
names[count] = longnames[count] = NULL; names[count] = longnames[count] = NULL;
categories[count] = 0;
*pppsz_longnames = longnames; *pppsz_longnames = longnames;
if( pp_categories ) *pp_categories = categories;
else free( categories );
return names; return names;
} }
......
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