Commit 8ed92b22 authored by Mirsal Ennaime's avatar Mirsal Ennaime

UPnP services discovery: Switch to the services discovery API

parent 0e45933d
...@@ -45,14 +45,13 @@ ...@@ -45,14 +45,13 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_plugin.h> #include <vlc_plugin.h>
#include <vlc_playlist.h> #include <vlc_services_discovery.h>
// Constants // Constants
const char* MEDIA_SERVER_DEVICE_TYPE = "urn:schemas-upnp-org:device:MediaServer:1"; const char* MEDIA_SERVER_DEVICE_TYPE = "urn:schemas-upnp-org:device:MediaServer:1";
const char* CONTENT_DIRECTORY_SERVICE_TYPE = "urn:schemas-upnp-org:service:ContentDirectory:1"; const char* CONTENT_DIRECTORY_SERVICE_TYPE = "urn:schemas-upnp-org:service:ContentDirectory:1";
// Classes // Classes
class MediaServer; class MediaServer;
...@@ -138,7 +137,7 @@ public: ...@@ -138,7 +137,7 @@ public:
void subscribeToContentDirectory(); void subscribeToContentDirectory();
void fetchContents(); void fetchContents();
void setPlaylistNode( playlist_item_t* node ); void setInputItem( input_item_t* p_input_item );
bool compareSID( const char* sid ); bool compareSID( const char* sid );
...@@ -153,7 +152,7 @@ private: ...@@ -153,7 +152,7 @@ private:
services_discovery_t* _p_sd; services_discovery_t* _p_sd;
Container* _contents; Container* _contents;
playlist_item_t* _playlistNode; input_item_t* _inputItem;
std::string _UDN; std::string _UDN;
std::string _friendlyName; std::string _friendlyName;
...@@ -195,17 +194,18 @@ public: ...@@ -195,17 +194,18 @@ public:
const char* objectID, const char* objectID,
const char* title, const char* title,
const char* resource ); const char* resource );
~Item();
const char* getObjectID() const; const char* getObjectID() const;
const char* getTitle() const; const char* getTitle() const;
const char* getResource() const; const char* getResource() const;
void setPlaylistNode( playlist_item_t* node ); void setInputItem( input_item_t* p_input_item );
playlist_item_t* getPlaylistNode() const ; input_item_t* getInputItem() const ;
private: private:
playlist_item_t* _playlistNode; input_item_t* _inputItem;
Container* _parent; Container* _parent;
std::string _objectID; std::string _objectID;
...@@ -232,13 +232,14 @@ public: ...@@ -232,13 +232,14 @@ public:
Item* getItem( unsigned int i ) const; Item* getItem( unsigned int i ) const;
Container* getContainer( unsigned int i ) const; Container* getContainer( unsigned int i ) const;
Container* getParent();
void setPlaylistNode( playlist_item_t* node ); void setInputItem( input_item_t* p_input_item );
playlist_item_t* getPlaylistNode() const; input_item_t* getInputItem() const;
private: private:
playlist_item_t* _playlistNode; input_item_t* _inputItem;
Container* _parent; Container* _parent;
...@@ -248,7 +249,6 @@ private: ...@@ -248,7 +249,6 @@ private:
std::vector<Container*> _containers; std::vector<Container*> _containers;
}; };
// VLC callback prototypes // VLC callback prototypes
static int Open( vlc_object_t* ); static int Open( vlc_object_t* );
...@@ -670,8 +670,8 @@ MediaServer::MediaServer( const char* UDN, ...@@ -670,8 +670,8 @@ MediaServer::MediaServer( const char* UDN,
_UDN = UDN; _UDN = UDN;
_friendlyName = friendlyName; _friendlyName = friendlyName;
_contents = 0; _contents = NULL;
_playlistNode = 0; _inputItem = NULL;
} }
MediaServer::~MediaServer() MediaServer::~MediaServer()
...@@ -866,22 +866,20 @@ IXML_Document* MediaServer::_browseAction( const char* pObjectID, ...@@ -866,22 +866,20 @@ IXML_Document* MediaServer::_browseAction( const char* pObjectID,
void MediaServer::fetchContents() void MediaServer::fetchContents()
{ {
Container* root = new Container( 0, "0", getFriendlyName() ); Container* root = new Container( 0, "0", getFriendlyName() );
playlist_t * p_playlist = pl_Hold( _p_sd );
_fetchContents( root ); _fetchContents( root );
if ( _contents ) // if ( _contents )
{ // {
PL_LOCK; // PL_LOCK;
playlist_NodeEmpty( p_playlist, _playlistNode, true ); // playlist_NodeEmpty( p_playlist, _playlistNode, true );
PL_UNLOCK; // PL_UNLOCK;
delete _contents; // delete _contents;
} // }
_contents = root; _contents = root;
_contents->setPlaylistNode( _playlistNode ); _contents->setInputItem( _inputItem );
_buildPlaylist( _contents ); _buildPlaylist( _contents );
pl_Release ( _p_sd );
} }
bool MediaServer::_fetchContents( Container* parent ) bool MediaServer::_fetchContents( Container* parent )
...@@ -1004,49 +1002,40 @@ bool MediaServer::_fetchContents( Container* parent ) ...@@ -1004,49 +1002,40 @@ bool MediaServer::_fetchContents( Container* parent )
void MediaServer::_buildPlaylist( Container* parent ) void MediaServer::_buildPlaylist( Container* parent )
{ {
playlist_t *p_playlist = pl_Hold( _p_sd );
for ( unsigned int i = 0; i < parent->getNumContainers(); i++ ) for ( unsigned int i = 0; i < parent->getNumContainers(); i++ )
{ {
Container* container = parent->getContainer( i ); Container* container = parent->getContainer( i );
playlist_item_t* parentNode = parent->getPlaylistNode();
char* title = strdup( container->getTitle() ); input_item_t* p_input_item = input_item_New( _p_sd, "vlc://nop", parent->getTitle() );
PL_LOCK; input_item_AddSubItem( parent->getInputItem(), p_input_item );
playlist_item_t* node = playlist_NodeCreate( p_playlist,
title, parentNode, 0, NULL );
PL_UNLOCK;
free( title );
container->setPlaylistNode( node ); container->setInputItem( p_input_item );
_buildPlaylist( container ); _buildPlaylist( container );
} }
for ( unsigned int i = 0; i < parent->getNumItems(); i++ ) for ( unsigned int i = 0; i < parent->getNumItems(); i++ )
{ {
Item* item = parent->getItem( i ); Item* item = parent->getItem( i );
playlist_item_t* parentNode = parent->getPlaylistNode();
input_item_t* p_input = input_item_New( _p_sd, input_item_t* p_input_item = input_item_New( _p_sd,
item->getResource(), item->getResource(),
item->getTitle() ); item->getTitle() );
int i_cat; assert( p_input_item );
/* FIXME: playlist_AddInput() can fail */ input_item_AddSubItem( parent->getInputItem(), p_input_item );
playlist_BothAddInput( p_playlist, p_input, parentNode, item->setInputItem( p_input_item );
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, false );
assert( p_node );
item->setPlaylistNode( p_node );
} }
pl_Release( _p_sd );
} }
void MediaServer::setPlaylistNode( playlist_item_t* playlistNode ) void MediaServer::setInputItem( input_item_t* p_input_item )
{ {
_playlistNode = playlistNode; if(_inputItem == p_input_item)
return;
if(_inputItem)
vlc_gc_decref( _inputItem );
vlc_gc_incref( p_input_item );
_inputItem = p_input_item;
} }
bool MediaServer::compareSID( const char* sid ) bool MediaServer::compareSID( const char* sid )
...@@ -1072,41 +1061,21 @@ MediaServerList::~MediaServerList() ...@@ -1072,41 +1061,21 @@ MediaServerList::~MediaServerList()
bool MediaServerList::addServer( MediaServer* s ) bool MediaServerList::addServer( MediaServer* s )
{ {
input_item_t* p_input_item = NULL;
if ( getServer( s->getUDN() ) != 0 ) return false; if ( getServer( s->getUDN() ) != 0 ) return false;
msg_Dbg( _p_sd, "Adding server '%s'", msg_Dbg( _p_sd, "Adding server '%s'",
s->getFriendlyName() ); s->getFriendlyName() );
services_discovery_t* p_sd = _p_sd; services_discovery_t* p_sd = _p_sd;
services_discovery_sys_t* p_sys = p_sd->p_sys;
playlist_item_t *p_node_cat;
playlist_item_t *p_node_one;
playlist_t* p_playlist = pl_Hold( _p_sd );
for(int i = 0; i < p_playlist->i_sds; i++ ) p_input_item = input_item_New( p_sd, "vlc://nop", s->getFriendlyName() );
{ s->setInputItem( p_input_item );
if(p_playlist->pp_sds[i]->p_sd == p_sd )
{
p_node_cat = p_playlist->pp_sds[i]->p_cat;
p_node_one = p_playlist->pp_sds[i]->p_one;
break;
}
}
assert (p_node_cat); services_discovery_AddItem( p_sd, p_input_item, NULL );
assert (p_node_one);
_list.push_back( s ); _list.push_back( s );
char* name = strdup( s->getFriendlyName() );
PL_LOCK;
playlist_item_t* node =
playlist_NodeCreate( p_playlist, name, p_node_cat, 0, NULL );
PL_UNLOCK;
pl_Release( _p_sd );
free( name );
s->setPlaylistNode( node );
return true; return true;
} }
...@@ -1174,7 +1143,13 @@ Item::Item( Container* parent, const char* objectID, const char* title, const ch ...@@ -1174,7 +1143,13 @@ Item::Item( Container* parent, const char* objectID, const char* title, const ch
_title = title; _title = title;
_resource = resource; _resource = resource;
_playlistNode = 0; _inputItem = NULL;
}
Item::~Item()
{
if(_inputItem)
vlc_gc_decref( _inputItem );
} }
const char* Item::getObjectID() const const char* Item::getObjectID() const
...@@ -1192,14 +1167,21 @@ const char* Item::getResource() const ...@@ -1192,14 +1167,21 @@ const char* Item::getResource() const
return _resource.c_str(); return _resource.c_str();
} }
void Item::setPlaylistNode( playlist_item_t* node ) void Item::setInputItem( input_item_t* p_input_item )
{ {
_playlistNode = node; if(_inputItem == p_input_item)
return;
if(_inputItem)
vlc_gc_decref( _inputItem );
vlc_gc_incref( p_input_item );
_inputItem = p_input_item;
} }
playlist_item_t* Item::getPlaylistNode() const input_item_t* Item::getInputItem() const
{ {
return _playlistNode; return _inputItem;
} }
...@@ -1214,7 +1196,7 @@ Container::Container( Container* parent, ...@@ -1214,7 +1196,7 @@ Container::Container( Container* parent,
_objectID = objectID; _objectID = objectID;
_title = title; _title = title;
_playlistNode = 0; _inputItem = NULL;
} }
Container::~Container() Container::~Container()
...@@ -1228,6 +1210,9 @@ Container::~Container() ...@@ -1228,6 +1210,9 @@ Container::~Container()
{ {
delete _items[i]; delete _items[i];
} }
if(_inputItem )
vlc_gc_decref( _inputItem );
} }
void Container::addItem( Item* item ) void Container::addItem( Item* item )
...@@ -1272,12 +1257,24 @@ Container* Container::getContainer( unsigned int i ) const ...@@ -1272,12 +1257,24 @@ Container* Container::getContainer( unsigned int i ) const
return 0; return 0;
} }
void Container::setPlaylistNode( playlist_item_t* node ) Container* Container::getParent()
{
return _parent;
}
void Container::setInputItem( input_item_t* p_input_item )
{ {
_playlistNode = node; if(_inputItem == p_input_item)
return;
if(_inputItem)
vlc_gc_decref( _inputItem );
vlc_gc_incref( p_input_item );
_inputItem = p_input_item;
} }
playlist_item_t* Container::getPlaylistNode() const input_item_t* Container::getInputItem() const
{ {
return _playlistNode; return _inputItem;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment