X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fupnp_cc.cpp;h=5d4463c4b25265644ff34a5999e445a38c1f4786;hb=df509ccf56baa3e79a885f017aa97d205f2feabc;hp=b624a498b8048e25128fc03e62846ec2e5f6926a;hpb=81c5ac29fa2e80426c1b1dfcc941a1aabe8bc808;p=vlc diff --git a/modules/services_discovery/upnp_cc.cpp b/modules/services_discovery/upnp_cc.cpp index b624a498b8..5d4463c4b2 100644 --- a/modules/services_discovery/upnp_cc.cpp +++ b/modules/services_discovery/upnp_cc.cpp @@ -6,7 +6,7 @@ * * Authors: Rémi Denis-Courmont * - * Based on original wxWindows patch for VLC, and dependant on CyberLink + * Based on original wxWindows patch for VLC, and dependent on CyberLink * UPnP library from : * Satoshi Konno * @@ -32,8 +32,14 @@ #include #undef PACKAGE_NAME -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include +#include /* FIXME: thread-safety ?? */ /* FIXME: playlist locking */ @@ -52,69 +58,20 @@ using namespace CyberLink; static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); -vlc_module_begin(); - set_shortname( "UPnP"); - set_description( _("Universal Plug'n'Play discovery") ); - set_category( CAT_PLAYLIST ); - set_subcategory( SUBCAT_PLAYLIST_SD ); - - set_capability( "services_discovery", 0 ); - set_callbacks( Open, Close ); - -vlc_module_end(); - - -/***************************************************************************** - * Local structures - *****************************************************************************/ - -struct services_discovery_sys_t -{ - playlist_item_t *p_node_one; - playlist_item_t *p_node_cat; -}; - -/***************************************************************************** - * Local prototypes - *****************************************************************************/ - -/* Main functions */ - static void Run ( services_discovery_t *p_sd ); +VLC_SD_PROBE_HELPER("upnp", N_("Universal Plug'n'Play discovery")) -/***************************************************************************** - * Open: initialize and create stuff - *****************************************************************************/ -static int Open( vlc_object_t *p_this ) -{ - services_discovery_t *p_sd = ( services_discovery_t* )p_this; - services_discovery_sys_t *p_sys = (services_discovery_sys_t *) - malloc( sizeof( services_discovery_sys_t ) ); +vlc_module_begin () + set_shortname( "UPnP") + set_description( N_("Universal Plug'n'Play discovery") ) + set_category( CAT_PLAYLIST ) + set_subcategory( SUBCAT_PLAYLIST_SD ) - p_sd->pf_run = Run; - p_sd->p_sys = p_sys; + set_capability( "services_discovery", 0 ) + set_callbacks( Open, Close ) - playlist_NodesPairCreate( pl_Get( p_sd ), _("Devices"), - &p_sys->p_node_cat, &p_sys->p_node_one, - VLC_TRUE ); - return VLC_SUCCESS; -} + VLC_SD_PROBE_SUBMODULE - -/***************************************************************************** - * Close: - *****************************************************************************/ -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_t *p_playlist = pl_Yield( p_sd ); - playlist_NodeDelete( p_playlist, p_sys->p_node_one, VLC_TRUE, - VLC_TRUE ); - playlist_NodeDelete( p_playlist, p_sys->p_node_cat, VLC_TRUE, - VLC_TRUE ); - pl_Release(); - free( p_sys ); -} +vlc_module_end () /***************************************************************************** * Run: main UPnP thread @@ -126,7 +83,6 @@ class UPnPHandler : public MediaPlayer, public DeviceChangeListener, { private: services_discovery_t *p_sd; - services_discovery_sys_t *p_sys; Device *GetDeviceFromUSN( const string& usn ) { @@ -135,7 +91,7 @@ class UPnPHandler : public MediaPlayer, public DeviceChangeListener, playlist_item_t *FindDeviceNode( Device *dev ) { - return playlist_ChildSearchName( p_sys->p_node, dev->getFriendlyName() ); + return playlist_ChildSearchName( p_sd->p_cat, dev->getFriendlyName() ); } playlist_item_t *FindDeviceNode( const string &usn ) @@ -159,30 +115,39 @@ class UPnPHandler : public MediaPlayer, public DeviceChangeListener, public: UPnPHandler( services_discovery_t *p_this ) - : p_sd( p_this ), p_sys( p_this->p_sys ) + : p_sd( p_this ) { addDeviceChangeListener( this ); addSearchResponseListener( this ); //addEventListener( this ); } - }; -static void Run( services_discovery_t *p_sd ) +/***************************************************************************** + * Open: initialize and create stuff + *****************************************************************************/ +static int Open( vlc_object_t *p_this ) { - UPnPHandler u( p_sd ); + services_discovery_t *p_sd = ( services_discovery_t* )p_this; - u.start(); + UPnPHandler *u = new UPnPHandler( p_sd ); + u->start( ); + msg_Dbg( p_sd, "upnp discovery started" ); + p_sd->p_private = u; - msg_Dbg( p_sd, "UPnP discovery started" ); - /* read SAP packets */ - while( !p_sd->b_die ) - { - msleep( 500 ); - } + return VLC_SUCCESS; +} + + +/***************************************************************************** + * Close: + *****************************************************************************/ +static void Close( vlc_object_t *p_this ) +{ + UPnPHandler *u = (UPnPHandler *)p_this->p_private; + u->stop( ); - u.stop(); - msg_Dbg( p_sd, "UPnP discovery stopped" ); + msg_Dbg( p_this, "upnp discovery started" ); } @@ -205,7 +170,7 @@ playlist_item_t *UPnPHandler::AddDevice( Device *dev ) */ char *str = strdup( dev->getFriendlyName( ) ); - p_item = playlist_NodeCreate( p_sys->p_playlist, str, p_sys->p_node_cat,0 ); + p_item = playlist_NodeCreate( p_playlist, str, p_sd->p_cat, 0, NULL ); p_item->i_flags &= ~PLAYLIST_SKIP_FLAG; msg_Dbg( p_sd, "device %s added", str ); free( str ); @@ -237,17 +202,19 @@ void UPnPHandler::AddContent( playlist_item_t *p_parent, ContentNode *node ) if ( node->isItemNode() ) { ItemNode *iNode = (ItemNode *)node; - input_item_t *p_input = input_ItemNew( p_sd, iNode->getResource(), title ); - playlist_BothAddInput( p_sys->p_playlist, p_input, p_parent, + input_item_t *p_input = input_item_New( p_sd, iNode->getResource(), title ); + /* FIXME: playlist_AddInput() can fail */ + playlist_BothAddInput( p_playlist, p_input, p_parent, PLAYLIST_APPEND, PLAYLIST_END, NULL, NULL, - VLC_FALSE ); + false ); + vlc_gc_decref( p_input ); } else if ( node->isContainerNode() ) { ContainerNode *conNode = (ContainerNode *)node; char* p_name = strdup(title); /* See other comment on strdup */ - playlist_item_t* p_node = playlist_NodeCreate( p_sys->p_playlist, - p_name, p_parent, 0 ); + playlist_item_t* p_node = playlist_NodeCreate( p_playlist, p_name, + p_parent, 0, NULL ); free(p_name); unsigned nContentNodes = conNode->getNContentNodes(); @@ -263,7 +230,7 @@ void UPnPHandler::RemoveDevice( Device *dev ) playlist_item_t *p_item = FindDeviceNode( dev ); if( p_item != NULL ) - playlist_NodeDelete( p_sys->p_playlist, p_item, VLC_TRUE, VLC_TRUE ); + playlist_NodeDelete( p_playlist, p_item, true, true ); }