X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fservices_discovery%2Fupnp_intel.cpp;h=0c3f3a59a797bf7ccc34b882bfdbd85789c908ae;hb=d11fd0d1e5433a5299fbf0f0150178178ebd3f83;hp=2debe088fff9f60ffde4cf2886e2c414198d34d9;hpb=d3fe7f28797d4dba65ffcdd60bf932e758a48a9e;p=vlc diff --git a/modules/services_discovery/upnp_intel.cpp b/modules/services_discovery/upnp_intel.cpp index 2debe088ff..0c3f3a59a7 100644 --- a/modules/services_discovery/upnp_intel.cpp +++ b/modules/services_discovery/upnp_intel.cpp @@ -1,7 +1,7 @@ /***************************************************************************** - * Upnp_intell.cpp : UPnP discovery module (Intel SDK) + * Upnp_intel.cpp : UPnP discovery module (Intel SDK) ***************************************************************************** - * Copyright (C) 2004-2006 the VideoLAN team + * Copyright (C) 2004-2008 the VideoLAN team * $Id$ * * Authors: Rémi Denis-Courmont (original plugin) @@ -27,9 +27,9 @@ /* \TODO: Debug messages: "__FILE__, __LINE__" ok ???, Wrn/Err ??? \TODO: Change names to VLC standard ??? + \TODO: Rewrite this using the new service discovery API (see sap.c, shout.c). */ -#include #include #include @@ -38,15 +38,20 @@ #include #undef PACKAGE_NAME -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include -#include "vlc_strings.h" // VLC handle struct services_discovery_sys_t { + playlist_t *p_playlist; playlist_item_t *p_node_cat; playlist_item_t *p_node_one; }; @@ -83,7 +88,7 @@ public: Lockable( Cookie* c ) { - vlc_mutex_init( c->serviceDiscovery, &_mutex ); + vlc_mutex_init( &_mutex ); } ~Lockable() @@ -251,12 +256,16 @@ private: static int Open( vlc_object_t* ); static void Close( vlc_object_t* ); static void Run( services_discovery_t *p_sd ); +static playlist_t *pl_Get( services_discovery_t *p_sd ) +{ + return p_sd->p_sys->p_playlist; +} // Module descriptor vlc_module_begin(); set_shortname( "UPnP" ); -set_description( _( "Universal Plug'n'Play discovery ( Intel SDK )" ) ); +set_description( N_( "Universal Plug'n'Play discovery ( Intel SDK )" ) ); set_category( CAT_PLAYLIST ); set_subcategory( SUBCAT_PLAYLIST_SD ); set_capability( "services_discovery", 0 ); @@ -283,11 +292,14 @@ static int Open( vlc_object_t *p_this ) p_sd->pf_run = Run; p_sd->p_sys = p_sys; + p_sys->p_playlist = pl_Yield( p_sd ); /* Create our playlist node */ + vlc_object_lock( p_sys->p_playlist ); playlist_NodesPairCreate( pl_Get( p_sd ), _("Devices"), &p_sys->p_node_cat, &p_sys->p_node_one, - VLC_TRUE ); + true ); + vlc_object_unlock( p_sys->p_playlist ); return VLC_SUCCESS; } @@ -297,11 +309,13 @@ static void Close( vlc_object_t *p_this ) services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_sys_t *p_sys = p_sd->p_sys; - playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_one, VLC_TRUE, - VLC_TRUE ); - playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_cat, VLC_TRUE, - VLC_TRUE ); - + vlc_object_lock( p_sys->p_playlist ); + playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_one, true, + true ); + playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_cat, true, + true ); + vlc_object_unlock( p_sys->p_playlist ); + pl_Release( p_sd ); free( p_sys ); } @@ -337,7 +351,7 @@ static void Run( services_discovery_t* p_sd ) } msg_Dbg( p_sd, "UPnP discovery started" ); - while( !p_sd->b_die ) + while( vlc_object_alive (p_sd) ) { msleep( 500 ); } @@ -394,8 +408,6 @@ IXML_Document* parseBrowseResult( IXML_Document* doc ) const char* resultString = ixmlNode_getNodeValue( textNode ); char* resultXML = strdup( resultString ); - resolve_xml_special_chars( resultXML ); - IXML_Document* browseDoc = ixmlParseBuffer( resultXML ); free( resultXML ); @@ -466,11 +478,11 @@ static int Callback( Upnp_EventType eventType, void* event, void* pCookie ) case UPNP_EVENT_SUBSCRIBE_COMPLETE: msg_Warn( cookie->serviceDiscovery, "subscription complete" ); break; - + case UPNP_DISCOVERY_SEARCH_TIMEOUT: msg_Warn( cookie->serviceDiscovery, "search timeout" ); break; - + default: msg_Dbg( cookie->serviceDiscovery, "%s:%d: DEBUG: UNHANDLED EVENT ( TYPE=%d )", __FILE__, __LINE__, eventType ); break; @@ -619,8 +631,10 @@ MediaServer::~MediaServer() { if ( _contents ) { + vlc_object_lock( _cookie->serviceDiscovery->p_sys->p_playlist ); playlist_NodeDelete( pl_Get( _cookie->serviceDiscovery ) , - _playlistNode, VLC_TRUE, VLC_TRUE ); + _playlistNode, true, true ); + vlc_object_unlock( _cookie->serviceDiscovery->p_sys->p_playlist ); } delete _contents; @@ -759,7 +773,7 @@ void MediaServer::fetchContents() if ( _contents ) { PL_LOCK; - playlist_NodeEmpty( p_playlist, _playlistNode, VLC_TRUE ); + playlist_NodeEmpty( p_playlist, _playlistNode, true ); PL_UNLOCK; delete _contents; } @@ -854,7 +868,7 @@ void MediaServer::_buildPlaylist( Container* parent ) playlist_item_t* parentNode = parent->getPlaylistNode(); char* title = strdup( container->getTitle() ); - playlist_item_t* node = playlist_NodeCreate( p_playlist, title, parentNode ); + playlist_item_t* node = playlist_NodeCreate( p_playlist, title, parentNode, 0, NULL ); free( title ); container->setPlaylistNode( node ); @@ -866,14 +880,17 @@ void MediaServer::_buildPlaylist( Container* parent ) Item* item = parent->getItem( i ); playlist_item_t* parentNode = parent->getPlaylistNode(); - input_item_t* p_input = input_ItemNew( _cookie->serviceDiscovery, + input_item_t* p_input = input_item_New( _cookie->serviceDiscovery, item->getResource(), item->getTitle() ); int i_cat; + /* FIXME: playlist_AddInput() can fail */ playlist_BothAddInput( p_playlist, p_input, parentNode, - PLAYLIST_APPEND, PLAYLIST_END, &i_cat, NULL ); + PLAYLIST_APPEND, PLAYLIST_END, &i_cat, NULL, + pl_Unlocked ); + vlc_gc_decref( p_input ); /* TODO: do this better by storing ids */ - playlist_item_t *p_node = playlist_ItemGetById( p_playlist, i_cat, VLC_FALSE ); + playlist_item_t *p_node = playlist_ItemGetById( p_playlist, i_cat, false ); assert( p_node ); item->setPlaylistNode( p_node ); } @@ -914,9 +931,12 @@ bool MediaServerList::addServer( MediaServer* s ) _list.push_back( s ); char* name = strdup( s->getFriendlyName() ); - playlist_item_t* node = playlist_NodeCreate( pl_Get( _cookie->serviceDiscovery ), - name, - _cookie->serviceDiscovery->p_sys->p_node_cat ); + vlc_object_lock( _cookie->serviceDiscovery->p_sys->p_playlist ); + playlist_item_t* node = playlist_NodeCreate( + pl_Get( _cookie->serviceDiscovery ), name, + _cookie->serviceDiscovery->p_sys->p_node_cat, + 0, NULL ); + vlc_object_unlock( _cookie->serviceDiscovery->p_sys->p_playlist ); free( name ); s->setPlaylistNode( node );