1
1
/*****************************************************************************
2
* Upnp_intell.cpp : UPnP discovery module (Intel SDK)
2
* Upnp_intel.cpp : UPnP discovery module (Intel SDK)
3
3
*****************************************************************************
4
* Copyright (C) 2004-2006 the VideoLAN team
5
* $Id: f04fae6902d830abdcb8b18d5b8fe4aa8a010181 $
4
* Copyright (C) 2004-2008 the VideoLAN team
5
* $Id: 0c3f3a59a797bf7ccc34b882bfdbd85789c908ae $
7
7
* Authors: Rémi Denis-Courmont <rem # videolan.org> (original plugin)
8
8
* Christian Henz <henz # c-lab.de>
252
256
static int Open( vlc_object_t* );
253
257
static void Close( vlc_object_t* );
254
258
static void Run( services_discovery_t *p_sd );
259
static playlist_t *pl_Get( services_discovery_t *p_sd )
261
return p_sd->p_sys->p_playlist;
256
264
// Module descriptor
258
266
vlc_module_begin();
259
267
set_shortname( "UPnP" );
260
set_description( _( "Universal Plug'n'Play discovery ( Intel SDK )" ) );
268
set_description( N_( "Universal Plug'n'Play discovery ( Intel SDK )" ) );
261
269
set_category( CAT_PLAYLIST );
262
270
set_subcategory( SUBCAT_PLAYLIST_SD );
263
271
set_capability( "services_discovery", 0 );
282
290
services_discovery_sys_t *p_sys = ( services_discovery_sys_t * )
283
291
malloc( sizeof( services_discovery_sys_t ) );
285
playlist_view_t *p_view;
288
293
p_sd->pf_run = Run;
289
294
p_sd->p_sys = p_sys;
295
p_sys->p_playlist = pl_Yield( p_sd );
291
297
/* Create our playlist node */
292
p_sys->p_playlist = ( playlist_t * )vlc_object_find( p_sd,
295
if( !p_sys->p_playlist )
297
msg_Warn( p_sd, "unable to find playlist, cancelling UPnP listening" );
301
p_view = playlist_ViewFind( p_sys->p_playlist, VIEW_CATEGORY );
302
p_sys->p_node = playlist_NodeCreate( p_sys->p_playlist, VIEW_CATEGORY,
303
"UPnP", p_view->p_root );
304
p_sys->p_node->i_flags |= PLAYLIST_RO_FLAG;
305
p_sys->p_node->i_flags &= ~PLAYLIST_SKIP_FLAG;
306
val.b_bool = VLC_TRUE;
307
var_Set( p_sys->p_playlist, "intf-change", val );
298
vlc_object_lock( p_sys->p_playlist );
299
playlist_NodesPairCreate( pl_Get( p_sd ), _("Devices"),
300
&p_sys->p_node_cat, &p_sys->p_node_one,
302
vlc_object_unlock( p_sys->p_playlist );
309
304
return VLC_SUCCESS;
314
309
services_discovery_t *p_sd = ( services_discovery_t* )p_this;
315
310
services_discovery_sys_t *p_sys = p_sd->p_sys;
317
if( p_sys->p_playlist )
319
playlist_NodeDelete( p_sys->p_playlist, p_sys->p_node, VLC_TRUE,
321
vlc_object_release( p_sys->p_playlist );
312
vlc_object_lock( p_sys->p_playlist );
313
playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_one, true,
315
playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_cat, true,
317
vlc_object_unlock( p_sys->p_playlist );
344
339
res = UpnpRegisterClient( Callback, &cookie, &cookie.clientHandle );
345
340
if( res != UPNP_E_SUCCESS )
347
msg_Err( p_sd, "%s", UpnpGetErrorMessage( res ) );
342
msg_Err( p_sd, "%s", UpnpGetErrorMessage( res ) );
351
346
res = UpnpSearchAsync( cookie.clientHandle, 5, MEDIA_SERVER_DEVICE_TYPE, &cookie );
352
347
if( res != UPNP_E_SUCCESS )
354
msg_Err( p_sd, "%s", UpnpGetErrorMessage( res ) );
349
msg_Err( p_sd, "%s", UpnpGetErrorMessage( res ) );
358
353
msg_Dbg( p_sd, "UPnP discovery started" );
359
while( !p_sd->b_die )
354
while( vlc_object_alive (p_sd) )
364
359
msg_Dbg( p_sd, "UPnP discovery stopped" );
478
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
479
msg_Warn( cookie->serviceDiscovery, "subscription complete" );
482
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
483
msg_Warn( cookie->serviceDiscovery, "search timeout" );
486
487
msg_Dbg( cookie->serviceDiscovery, "%s:%d: DEBUG: UNHANDLED EVENT ( TYPE=%d )", __FILE__, __LINE__, eventType );
633
playlist_NodeDelete( _cookie->serviceDiscovery->p_sys->p_playlist,
634
vlc_object_lock( _cookie->serviceDiscovery->p_sys->p_playlist );
635
playlist_NodeDelete( pl_Get( _cookie->serviceDiscovery ) ,
636
_playlistNode, true, true );
637
vlc_object_unlock( _cookie->serviceDiscovery->p_sys->p_playlist );
639
640
delete _contents;
766
767
void MediaServer::fetchContents()
768
769
Container* root = new Container( 0, "0", getFriendlyName() );
770
playlist_t * p_playlist = pl_Get( _cookie->serviceDiscovery );
769
771
_fetchContents( root );
773
vlc_mutex_lock( &_cookie->serviceDiscovery->p_sys->p_playlist->object_lock );
775
playlist_NodeEmpty( _cookie->serviceDiscovery->p_sys->p_playlist,
779
vlc_mutex_unlock( &_cookie->serviceDiscovery->p_sys->p_playlist->object_lock );
776
playlist_NodeEmpty( p_playlist, _playlistNode, true );
784
781
_contents = root;
865
862
void MediaServer::_buildPlaylist( Container* parent )
864
playlist_t *p_playlist = pl_Get( _cookie->serviceDiscovery );
867
865
for ( unsigned int i = 0; i < parent->getNumContainers(); i++ )
869
Container* container = parent->getContainer( i );
870
playlist_item_t* parentNode = parent->getPlaylistNode();
872
char* title = strdup( container->getTitle() );
873
playlist_item_t* node = playlist_NodeCreate( _cookie->serviceDiscovery->p_sys->p_playlist,
879
container->setPlaylistNode( node );
880
_buildPlaylist( container );
867
Container* container = parent->getContainer( i );
868
playlist_item_t* parentNode = parent->getPlaylistNode();
870
char* title = strdup( container->getTitle() );
871
playlist_item_t* node = playlist_NodeCreate( p_playlist, title, parentNode, 0, NULL );
874
container->setPlaylistNode( node );
875
_buildPlaylist( container );
883
878
for ( unsigned int i = 0; i < parent->getNumItems(); i++ )
885
Item* item = parent->getItem( i );
886
playlist_item_t* parentNode = parent->getPlaylistNode();
888
playlist_item_t* node = playlist_ItemNew( _cookie->serviceDiscovery,
892
playlist_NodeAddItem( _cookie->serviceDiscovery->p_sys->p_playlist,
895
parentNode, PLAYLIST_APPEND, PLAYLIST_END );
897
item->setPlaylistNode( node );
880
Item* item = parent->getItem( i );
881
playlist_item_t* parentNode = parent->getPlaylistNode();
883
input_item_t* p_input = input_item_New( _cookie->serviceDiscovery,
887
/* FIXME: playlist_AddInput() can fail */
888
playlist_BothAddInput( p_playlist, p_input, parentNode,
889
PLAYLIST_APPEND, PLAYLIST_END, &i_cat, NULL,
891
vlc_gc_decref( p_input );
892
/* TODO: do this better by storing ids */
893
playlist_item_t *p_node = playlist_ItemGetById( p_playlist, i_cat, false );
895
item->setPlaylistNode( p_node );
933
931
_list.push_back( s );
935
933
char* name = strdup( s->getFriendlyName() );
936
playlist_item_t* node = playlist_NodeCreate( _cookie->serviceDiscovery->p_sys->p_playlist,
939
_cookie->serviceDiscovery->p_sys->p_node );
934
vlc_object_lock( _cookie->serviceDiscovery->p_sys->p_playlist );
935
playlist_item_t* node = playlist_NodeCreate(
936
pl_Get( _cookie->serviceDiscovery ), name,
937
_cookie->serviceDiscovery->p_sys->p_node_cat,
939
vlc_object_unlock( _cookie->serviceDiscovery->p_sys->p_playlist );
941
941
s->setPlaylistNode( node );