]> git.sesse.net Git - vlc/commitdiff
services_discovery: implement SD categories and use in Qt interface
authorJakob Leben <jleben@videolan.org>
Wed, 10 Feb 2010 01:12:36 +0000 (02:12 +0100)
committerJakob Leben <jleben@videolan.org>
Wed, 10 Feb 2010 01:12:36 +0000 (02:12 +0100)
17 files changed:
include/vlc_services_discovery.h
modules/gui/macosx/playlist.m
modules/gui/qt4/components/playlist/selector.cpp
modules/gui/qt4/menus.cpp
modules/misc/lua/libs/sd.c
modules/misc/lua/vlc.c
modules/services_discovery/bonjour.c
modules/services_discovery/mediadirs.c
modules/services_discovery/mtp.c
modules/services_discovery/podcast.c
modules/services_discovery/sap.c
modules/services_discovery/shout.c
modules/services_discovery/udev.c
modules/services_discovery/upnp_cc.cpp
modules/services_discovery/upnp_intel.cpp
modules/services_discovery/xcb_apps.c
src/playlist/services_discovery.c

index 06026c7bc2c29abadf2fd33ac9e72719956296bc..a974a534937d8162b56531e3dee98743999ffd05 100644 (file)
@@ -54,15 +54,23 @@ struct services_discovery_t
     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
  ***********************************************************************/
 
 /* Get the services discovery modules names to use in Create(), in a null
  * terminated string array. Array and string must be freed after use. */
-VLC_EXPORT( char **, vlc_sd_GetNames, ( vlc_object_t *, char *** ) );
-#define vlc_sd_GetNames(obj, pln) \
-        vlc_sd_GetNames(VLC_OBJECT(obj), pln)
+VLC_EXPORT( char **, vlc_sd_GetNames, ( vlc_object_t *, char ***, int ** ) );
+#define vlc_sd_GetNames(obj, pln, pcat ) \
+        vlc_sd_GetNames(VLC_OBJECT(obj), pln, pcat)
 
 /* Creation of a service_discovery object */
 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
 
 /* 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 \
     add_submodule() \
         set_capability( "services probe", 100 ) \
         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) \
 { \
     return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, \
-                             name "{longname=\"" # longname "\"}", longname); \
+                             name "{longname=\"" # longname "\"}", \
+                             longname, cat); \
 }
 
 /** @} */
index 7abe6e6b5d92add8550631610f11e76d162f3936..ba929645f33025bbca4b9edeebc42d7f899c9c2b 100644 (file)
     o_tc_sortColumn = nil;
 
     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 )
         return;
     
index 43143f44ecb7ba99600d3a4ff84b5eb9bc5a9b61..7af9b34b1b9a7da771aa28f449c69199731dd7ad 100644 (file)
@@ -249,46 +249,53 @@ void PLSelector::createItems()
                               THEPL->p_media_library );
     ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) );
 
-    QTreeWidgetItem *mfldrs = NULL;
-
-    QTreeWidgetItem *shouts = NULL;
+    QTreeWidgetItem *mycomp = addItem( CATEGORY_TYPE, qtr( "My Computer" ),
+                                        false )->treeItem();
+    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_names = vlc_sd_GetNames( THEPL, &ppsz_longnames );
+    int *p_categories;
+    char **ppsz_names = vlc_sd_GetNames( THEPL, &ppsz_longnames, &p_categories );
     if( !ppsz_names )
         return;
 
     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 );
-#define SD_IS( name ) ( !strcmp( *ppsz_name, name ) )
 
-        if( SD_IS("shoutcast") || SD_IS("shoutcasttv") ||
-            SD_IS("frenchtv") || SD_IS("freebox") )
+        if( *p_category == SD_CAT_INTERNET )
+        {
+            PLSelItem *selItem = addItem( SD_TYPE, *ppsz_longname, false, internet );
+            putSDData( selItem, *ppsz_name, *ppsz_longname );
+            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 )
         {
-            if( !shouts ) shouts = addItem( CATEGORY_TYPE, qtr( "Shoutcast" ),
-                                            false )->treeItem();
-            putSDData( addItem( SD_TYPE, *ppsz_longname, false, shouts ),
+            putSDData( addItem( SD_TYPE, *ppsz_longname, false, devices ),
                        *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" ),
-                                            false )->treeItem();
-            putSDData( addItem( SD_TYPE, *ppsz_longname, false, mfldrs ),
+            putSDData( addItem( SD_TYPE, *ppsz_longname, false, lan ),
                        *ppsz_name, *ppsz_longname );
         }
-        else if( !strncmp( *ppsz_name, "podcast", 7 ) )
+        else if( *p_category == SD_CAT_MYCOMPUTER )
         {
-
-            PLSelItem *podItem = addItem( SD_TYPE, qtr( "Podcasts" ), false );
-            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();
+            putSDData( addItem( SD_TYPE, *ppsz_longname, false, mycomp ),
+                       *ppsz_name, *ppsz_longname );
         }
         else
         {
@@ -296,13 +303,17 @@ void PLSelector::createItems()
                        *ppsz_name, *ppsz_longname );
         }
 
-#undef SD_IS
-
         free( *ppsz_name );
         free( *ppsz_longname );
     }
     free( ppsz_names );
     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
index 28be14dafca37eebbcbb08fb169824ecf392dfe4..b40351b764f0ba6a2a15596211cdf868d4c0f3df 100644 (file)
@@ -708,7 +708,7 @@ QMenu *QVLCMenu::SDMenu( intf_thread_t *p_intf, QWidget *parent )
     menu->setTitle( qtr( I_PL_SD ) );
 
     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 )
         return menu;
 
index 51cacf9a71d2e3384d938d8ba4195455ec1cd610..5515cd014b7c0cb43a628f63cdfeee392f9d75a8 100644 (file)
@@ -62,7 +62,7 @@ static int vlclua_sd_get_services_names( lua_State *L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     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 )
         return 0;
 
index 8aec82c7fa15d6253992d9dcb2bfdffce5048e68..6b400d5dd5b3e2d009a2436df38989d1927be529 100644 (file)
@@ -632,7 +632,7 @@ static int vlc_sd_probe_Open( vlc_object_t *obj )
                         free( psz_longname );
                         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_longname );
                 }
index 3c7166d3e5182ac7f1981bd14e4cd2a7add8d04c..dadb88bb2c944ac7d93d788e36b44cd73e8ab7e7 100644 (file)
@@ -48,7 +48,7 @@
     static int  Open ( 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 ()
     set_shortname( "Bonjour" )
index 946a17ef18982e626de3b2fc56e286293854d29c..c4b06cf58c2783e64d92190b6ff63702729fb4c8 100644 (file)
@@ -356,10 +356,10 @@ static int vlc_sd_probe_Open( vlc_object_t *obj )
     vlc_probe_t *probe = (vlc_probe_t *)obj;
 
     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\"}",
-                      N_("My Music") );
+                      N_("My Music"), SD_CAT_MYCOMPUTER );
     vlc_sd_probe_Add( probe, "picture_dir{longname=\"My Pictures\"}",
-                      N_("My Pictures") );
+                      N_("My Pictures"), SD_CAT_MYCOMPUTER );
     return VLC_PROBE_CONTINUE;
 }
index 55d0004d2420061017b601a018433be7939d079c..ddb8e0b681e7c8027ba8ae1a31ec249a0faa21c9 100644 (file)
@@ -38,7 +38,7 @@
 static int Open( 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()
     set_shortname( "MTP" )
index 07afe5bc2ca0bdca4cf170f6c3b87d57af64872c..0b91ea1c7fb25c985c488f2db49f8048b13d6905 100644 (file)
@@ -53,7 +53,7 @@
 static int  Open ( 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_LONGTEXT N_("Enter the list of podcasts to retrieve, " \
index 03fe88732839a45897bf0552981dba7eb97d1953..73fa69717a8f61b5cd8a1af74471cfe06950f0b0 100644 (file)
     static int  OpenDemux ( 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 ()
     set_shortname( N_("SAP"))
index 276e9b2d060676e6d6b5ddab9c533fca25dcb57b..378c2351c98591f3e116ac9ed6c31982b9d91bc3 100644 (file)
@@ -283,10 +283,10 @@ static int vlc_sd_probe_Open( vlc_object_t *obj )
     vlc_probe_t *probe = (vlc_probe_t *)obj;
 
     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\"}",
-                      N_("Shoutcast TV") );
+                      N_("Shoutcast TV"), SD_CAT_INTERNET );
     vlc_sd_probe_Add( probe, "frenchtv{longname=\"French TV\"}",
-                      N_("French TV") );
+                      N_("French TV"), SD_CAT_INTERNET );
     return VLC_PROBE_CONTINUE;
 }
index 8ed89c3e9f99148b88b0b5e371b85c6afc704445..1e4901b217fc475c2fabde3c139ed9d7fb382e74 100644 (file)
@@ -74,8 +74,8 @@ static int vlc_sd_probe_Open (vlc_object_t *obj)
     if (mon != NULL)
     {
         vlc_sd_probe_Add (probe, "v4l{longname=\"Video capture\"}",
-                          N_("Video capture"));
-        vlc_sd_probe_Add (probe, "disc{longname=\"Discs\"}", N_("Discs"));
+                          N_("Video capture"), SD_CAT_DEVICES);
+        vlc_sd_probe_Add (probe, "disc{longname=\"Discs\"}", N_("Discs"), SD_CAT_MYCOMPUTER);
         udev_monitor_unref (mon);
     }
     udev_unref (udev);
index 7b72db632e3042299893578a31b781a7ed4e23eb..f71852576e623541df9544cccc033b53154a1bf1 100644 (file)
@@ -58,7 +58,7 @@ using namespace CyberLink;
     static int  Open ( 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 ()
     set_shortname( "UPnP")
index 427c27ec438e049c94877070449ee25552164fbf..a936de2ee93e6a84c29810470d62f53e7597e178 100644 (file)
@@ -55,7 +55,7 @@ struct services_discovery_sys_t
 // VLC callback prototypes
 static int Open( 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
 
index 19ba85a8c95732c008ca21add84f77ddf8fe9641..488b3142b1418b3b8ad55811d3b7eefc3029ce49 100644 (file)
@@ -80,7 +80,7 @@ static int vlc_sd_probe_Open (vlc_object_t *obj)
         return VLC_PROBE_CONTINUE;
     xcb_disconnect (conn);
     return vlc_sd_probe_Add (probe, "xcb_apps{longname=\"Screen capture\"}",
-                             N_("Screen capture"));
+                             N_("Screen capture"), SD_CAT_MYCOMPUTER);
 }
 
 /**
index 96b79aff26b7acf2d4d32ff8944d6a48a4eafb9d..88c03611ff0847187a9381ebf0e9636cc3e61b9b 100644 (file)
@@ -37,12 +37,13 @@ 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)
+                      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
                || vlc_probe_add (probe, &names, sizeof (names))))
@@ -59,7 +60,7 @@ int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name,
 /**
  * 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;
     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)
 
     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))
+    if (unlikely (names == NULL || longnames == NULL || categories == NULL))
         abort();
     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;
 }