void PLSelector::createItems() { PLSelItem *pl = putPLData( addItem( PL_ITEM_TYPE, "Playlist", true ), THEPL->p_playing ); pl->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PL ) ); PLSelItem *ml = putPLData( addItem( PL_ITEM_TYPE, "Media Library", true ), THEPL->p_media_library ); ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) ); QTreeWidgetItem *mycomp = addItem( CATEGORY_TYPE, "My Computer", false )->treeItem(); QTreeWidgetItem *devices = addItem( CATEGORY_TYPE, "Devices", false )->treeItem(); QTreeWidgetItem *lan = addItem( CATEGORY_TYPE, "Local Network", false )->treeItem(); QTreeWidgetItem *internet = addItem( CATEGORY_TYPE, "Internet", false )->treeItem();; char **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; 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 ); 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(); } }
mvar_t *mvar_ServicesSetNew( intf_thread_t *p_intf, char *psz_name ) { mvar_t *s = mvar_New( psz_name, "set" ); char **longnames; char **names = vlc_sd_GetNames( p_intf, &longnames, NULL ); if( names == NULL ) goto out; for( size_t i = 0; names[i]; i++ ) { mvar_t *sd = mvar_New( "sd", names[i] ); mvar_AppendNewVar( sd, "name", longnames[i] ); mvar_AppendVar( s, sd ); free( names[i] ); free( longnames[i] ); } free( longnames ); free( names ); out: return s; }
void PLSelector::createItems() { QTreeWidgetItem *pl = new QTreeWidgetItem( this ); pl->setText( 0, qtr( "Playlist" ) ); pl->setData( 0, TYPE_ROLE, PL_TYPE ); pl->setData( 0, PPL_ITEM_ROLE, QVariant::fromValue( THEPL->p_local_category ) ); /* QTreeWidgetItem *empty = new QTreeWidgetItem( view ); empty->setFlags(Qt::NoItemFlags); */ QTreeWidgetItem *lib = new QTreeWidgetItem( this ); lib->setText( 0, qtr( "Library" ) ); lib->setData( 0, TYPE_ROLE, ML_TYPE ); lib->setData( 0, PPL_ITEM_ROLE, QVariant::fromValue( THEPL->p_ml_category ) ); /* QTreeWidgetItem *empty2 = new QTreeWidgetItem( view ); empty2->setFlags(Qt::NoItemFlags);*/ QTreeWidgetItem *sds = new QTreeWidgetItem( this ); sds->setExpanded( true ); sds->setText( 0, qtr( "Libraries" ) ); sds->setFlags( sds->flags() & ~Qt::ItemIsDropEnabled ); char **ppsz_longnames; char **ppsz_names = vlc_sd_GetNames( &ppsz_longnames ); if( !ppsz_names ) return; char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames; QTreeWidgetItem *sd_item; for( ; *ppsz_name; ppsz_name++, ppsz_longname++ ) { sd_item = new QTreeWidgetItem( QStringList( *ppsz_longname ) ); sd_item->setData( 0, TYPE_ROLE, SD_TYPE ); sd_item->setData( 0, NAME_ROLE, qfu( *ppsz_name ) ); sd_item->setFlags( sd_item->flags() & ~Qt::ItemIsDropEnabled ); sds->addChild( sd_item ); } }
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, NULL ); if( !ppsz_names ) return 0; char **ppsz_longname = ppsz_longnames; char **ppsz_name = ppsz_names; lua_settop( L, 0 ); lua_newtable( L ); for( ; *ppsz_name; ppsz_name++,ppsz_longname++ ) { lua_pushstring( L, *ppsz_longname ); lua_setfield( L, -2, *ppsz_name ); free( *ppsz_name ); free( *ppsz_longname ); } free( ppsz_names ); free( ppsz_longnames ); return 1; }
/** * Service Discovery SubMenu **/ QMenu *QVLCMenu::SDMenu( intf_thread_t *p_intf, QWidget *parent ) { QMenu *menu = new QMenu( parent ); menu->setTitle( qtr( I_PL_SD ) ); char **ppsz_longnames; char **ppsz_names = vlc_sd_GetNames( &ppsz_longnames ); if( !ppsz_names ) return menu; char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames; for( ; *ppsz_name; ppsz_name++, ppsz_longname++ ) { QAction *a = new QAction( qfu( *ppsz_longname ), menu ); a->setCheckable( true ); if( playlist_IsServicesDiscoveryLoaded( THEPL, *ppsz_name ) ) a->setChecked( true ); CONNECT( a, triggered(), THEDP->SDMapper, map() ); THEDP->SDMapper->setMapping( a, QString( *ppsz_name ) ); menu->addAction( a ); /* Special case for podcast */ if( !strcmp( *ppsz_name, "podcast" ) ) { QAction *b = new QAction( qtr( "Configure podcasts..." ), menu ); //b->setEnabled( a->isChecked() ); menu->addAction( b ); CONNECT( b, triggered(), THEDP, podcastConfigureDialog() ); } free( *ppsz_name ); free( *ppsz_longname ); } free( ppsz_names ); free( ppsz_longnames ); return menu; }
void PLSelector::createItems() { /* PL */ playlistItem = putPLData( addItem( PL_ITEM_TYPE, N_("Playlist"), true ), THEPL->p_playing ); playlistItem->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PL ) ); playlistItem->treeItem()->setData( 0, Qt::DecorationRole, QIcon( ":/sidebar/playlist" ) ); setCurrentItem( playlistItem->treeItem() ); /* ML */ PLSelItem *ml = putPLData( addItem( PL_ITEM_TYPE, N_("Media Library"), true ), THEPL->p_media_library ); ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) ); ml->treeItem()->setData( 0, Qt::DecorationRole, QIcon( ":/sidebar/library" ) ); #ifdef MEDIA_LIBRARY /* SQL ML */ ml = addItem( SQL_ML_TYPE, "SQL Media Library" )->treeItem(); ml->treeItem()->setData( 0, Qt::DecorationRole, QIcon( ":/sidebar/library" ) ); #endif /* SD nodes */ QTreeWidgetItem *mycomp = addItem( CATEGORY_TYPE, N_("My Computer"), false, true )->treeItem(); QTreeWidgetItem *devices = addItem( CATEGORY_TYPE, N_("Devices"), false, true )->treeItem(); QTreeWidgetItem *lan = addItem( CATEGORY_TYPE, N_("Local Network"), false, true )->treeItem(); QTreeWidgetItem *internet = addItem( CATEGORY_TYPE, N_("Internet"), false, true )->treeItem(); #define NOT_SELECTABLE(w) w->setFlags( w->flags() ^ Qt::ItemIsSelectable ); NOT_SELECTABLE( mycomp ); NOT_SELECTABLE( devices ); NOT_SELECTABLE( lan ); NOT_SELECTABLE( internet ); #undef NOT_SELECTABLE /* SD subnodes */ char **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; 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 ); PLSelItem *selItem; QIcon icon; QString name( *ppsz_name ); switch( *p_category ) { case SD_CAT_INTERNET: { selItem = addItem( SD_TYPE, *ppsz_longname, false, false, internet ); if( name.startsWith( "podcast" ) ) { 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(); icon = QIcon( ":/sidebar/podcast" ); } else if ( name.startsWith( "lua{" ) ) { int i_head = name.indexOf( "sd='" ) + 4; int i_tail = name.indexOf( '\'', i_head ); QString iconname = QString( ":/sidebar/sd/%1" ).arg( name.mid( i_head, i_tail - i_head ) ); QResource resource( iconname ); if ( !resource.isValid() ) icon = QIcon( ":/sidebar/network" ); else icon = QIcon( iconname ); } } break; case SD_CAT_DEVICES: name = name.mid( 0, name.indexOf( '{' ) ); selItem = addItem( SD_TYPE, *ppsz_longname, false, false, devices ); if ( name == "xcb_apps" ) icon = QIcon( ":/sidebar/screen" ); else if ( name == "mtp" ) icon = QIcon( ":/sidebar/mtp" ); else if ( name == "disc" ) icon = QIcon( ":/sidebar/disc" ); else icon = QIcon( ":/sidebar/capture" ); break; case SD_CAT_LAN: selItem = addItem( SD_TYPE, *ppsz_longname, false, false, lan ); icon = QIcon( ":/sidebar/lan" ); break; case SD_CAT_MYCOMPUTER: name = name.mid( 0, name.indexOf( '{' ) ); selItem = addItem( SD_TYPE, *ppsz_longname, false, false, mycomp ); if ( name == "video_dir" ) icon = QIcon( ":/sidebar/movie" ); else if ( name == "audio_dir" ) icon = QIcon( ":/sidebar/music" ); else if ( name == "picture_dir" ) icon = QIcon( ":/sidebar/pictures" ); else icon = QIcon( ":/sidebar/movie" ); break; default: selItem = addItem( SD_TYPE, *ppsz_longname ); }
void PLSelector::createItems() { /* PL */ PLSelItem *pl = putPLData( addItem( PL_ITEM_TYPE, N_("Playlist"), true ), THEPL->p_playing ); pl->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PL ) ); /* ML */ PLSelItem *ml = putPLData( addItem( PL_ITEM_TYPE, N_("Media Library"), true ), THEPL->p_media_library ); ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) ); /* SD nodes */ QTreeWidgetItem *mycomp = addItem( CATEGORY_TYPE, N_("My Computer") )->treeItem(); QTreeWidgetItem *devices = addItem( CATEGORY_TYPE, N_("Devices") )->treeItem(); QTreeWidgetItem *lan = addItem( CATEGORY_TYPE, N_("Local Network") )->treeItem(); QTreeWidgetItem *internet = addItem( CATEGORY_TYPE, N_("Internet") )->treeItem(); /* SD subnodes */ char **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; 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 ); PLSelItem *selItem; switch( *p_category ) { case SD_CAT_INTERNET: { selItem = addItem( SD_TYPE, *ppsz_longname, false, internet ); 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(); } } break; case SD_CAT_DEVICES: selItem = addItem( SD_TYPE, *ppsz_longname, false, devices ); break; case SD_CAT_LAN: selItem = addItem( SD_TYPE, *ppsz_longname, false, lan ); break; case SD_CAT_MYCOMPUTER: selItem = addItem( SD_TYPE, *ppsz_longname, false, mycomp ); break; default: selItem = addItem( SD_TYPE, *ppsz_longname ); } putSDData( selItem, *ppsz_name, *ppsz_longname ); free( *ppsz_name ); free( *ppsz_longname ); }
size_t libvlc_media_discoverer_list_get( libvlc_instance_t *p_inst, libvlc_media_discoverer_category_t i_cat, libvlc_media_discoverer_description_t ***ppp_services ) { assert( p_inst != NULL && ppp_services != NULL ); int i_core_cat; switch( i_cat ) { case libvlc_media_discoverer_devices: i_core_cat = SD_CAT_DEVICES; break; case libvlc_media_discoverer_lan: i_core_cat = SD_CAT_LAN; break; case libvlc_media_discoverer_podcasts: i_core_cat = SD_CAT_INTERNET; break; case libvlc_media_discoverer_localdirs: i_core_cat = SD_CAT_MYCOMPUTER; break; default: vlc_assert_unreachable(); *ppp_services = NULL; return 0; } /* Fetch all sd names, longnames and categories */ char **ppsz_names, **ppsz_longnames; int *p_categories; ppsz_names = vlc_sd_GetNames( p_inst->p_libvlc_int, &ppsz_longnames, &p_categories ); if( ppsz_names == NULL ) { *ppp_services = NULL; return 0; } /* Count the number of sd matching our category (i_cat/i_core_cat) */ size_t i_nb_services = 0; char **ppsz_name = ppsz_names; int *p_category = p_categories; for( ; *ppsz_name != NULL; ppsz_name++, p_category++ ) { if( *p_category == i_core_cat ) i_nb_services++; } libvlc_media_discoverer_description_t **pp_services = NULL, *p_services = NULL; if( i_nb_services > 0 ) { /* Double alloc here, so that the caller iterates through pointers of * struct instead of structs. This allows us to modify the struct * without breaking the API. */ pp_services = malloc( i_nb_services * sizeof(libvlc_media_discoverer_description_t *) ); p_services = malloc( i_nb_services * sizeof(libvlc_media_discoverer_description_t) ); if( pp_services == NULL || p_services == NULL ) { free( pp_services ); free( p_services ); pp_services = NULL; p_services = NULL; i_nb_services = 0; /* Even if alloc fails, the next loop must be run in order to free * names returned by vlc_sd_GetNames */ } } /* Fill output pp_services or free unused name, longname */ char **ppsz_longname = ppsz_longnames; ppsz_name = ppsz_names; p_category = p_categories; unsigned int i_service_idx = 0; libvlc_media_discoverer_description_t *p_service = p_services; for( ; *ppsz_name != NULL; ppsz_name++, ppsz_longname++, p_category++ ) { if( pp_services != NULL && *p_category == i_core_cat ) { p_service->psz_name = *ppsz_name; p_service->psz_longname = *ppsz_longname; p_service->i_cat = i_cat; pp_services[i_service_idx++] = p_service++; } else { free( *ppsz_name ); free( *ppsz_longname ); } } free( ppsz_names ); free( ppsz_longnames ); free( p_categories ); *ppp_services = pp_services; return i_nb_services; }