#include <vlc_common.h>
#include <vlc_plugin.h>
-#include <vlc_playlist.h>
+#include <vlc_services_discovery.h>
// Constants
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";
-
// Classes
class MediaServer;
void subscribeToContentDirectory();
void fetchContents();
- void setPlaylistNode( playlist_item_t* node );
+ void setInputItem( input_item_t* p_input_item );
bool compareSID( const char* sid );
services_discovery_t* _p_sd;
Container* _contents;
- playlist_item_t* _playlistNode;
+ input_item_t* _inputItem;
std::string _UDN;
std::string _friendlyName;
const char* objectID,
const char* title,
const char* resource );
+ ~Item();
const char* getObjectID() const;
const char* getTitle() const;
const char* getResource() const;
- void setPlaylistNode( playlist_item_t* node );
- playlist_item_t* getPlaylistNode() const ;
+ void setInputItem( input_item_t* p_input_item );
+ input_item_t* getInputItem() const ;
private:
- playlist_item_t* _playlistNode;
+ input_item_t* _inputItem;
Container* _parent;
std::string _objectID;
Item* getItem( unsigned int i ) const;
Container* getContainer( unsigned int i ) const;
+ Container* getParent();
- void setPlaylistNode( playlist_item_t* node );
- playlist_item_t* getPlaylistNode() const;
+ void setInputItem( input_item_t* p_input_item );
+ input_item_t* getInputItem() const;
private:
- playlist_item_t* _playlistNode;
+ input_item_t* _inputItem;
Container* _parent;
std::vector<Container*> _containers;
};
-
// VLC callback prototypes
static int Open( vlc_object_t* );
_UDN = UDN;
_friendlyName = friendlyName;
- _contents = 0;
- _playlistNode = 0;
+ _contents = NULL;
+ _inputItem = NULL;
}
MediaServer::~MediaServer()
void MediaServer::fetchContents()
{
Container* root = new Container( 0, "0", getFriendlyName() );
- playlist_t * p_playlist = pl_Hold( _p_sd );
_fetchContents( root );
- if ( _contents )
- {
- PL_LOCK;
- playlist_NodeEmpty( p_playlist, _playlistNode, true );
- PL_UNLOCK;
- delete _contents;
- }
+ // if ( _contents )
+ // {
+ // PL_LOCK;
+ // playlist_NodeEmpty( p_playlist, _playlistNode, true );
+ // PL_UNLOCK;
+ // delete _contents;
+ // }
_contents = root;
- _contents->setPlaylistNode( _playlistNode );
+ _contents->setInputItem( _inputItem );
_buildPlaylist( _contents );
- pl_Release ( _p_sd );
}
bool MediaServer::_fetchContents( Container* parent )
void MediaServer::_buildPlaylist( Container* parent )
{
- playlist_t *p_playlist = pl_Hold( _p_sd );
for ( unsigned int i = 0; i < parent->getNumContainers(); i++ )
{
Container* container = parent->getContainer( i );
- playlist_item_t* parentNode = parent->getPlaylistNode();
- char* title = strdup( container->getTitle() );
- PL_LOCK;
- playlist_item_t* node = playlist_NodeCreate( p_playlist,
- title, parentNode, 0, NULL );
- PL_UNLOCK;
- free( title );
+ input_item_t* p_input_item = input_item_New( _p_sd, "vlc://nop", parent->getTitle() );
+ input_item_AddSubItem( parent->getInputItem(), p_input_item );
- container->setPlaylistNode( node );
+ container->setInputItem( p_input_item );
_buildPlaylist( container );
}
for ( unsigned int i = 0; i < parent->getNumItems(); 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->getTitle() );
- int i_cat;
- /* FIXME: playlist_AddInput() can fail */
- playlist_BothAddInput( p_playlist, p_input, parentNode,
- 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 );
+ assert( p_input_item );
+ input_item_AddSubItem( parent->getInputItem(), p_input_item );
+ item->setInputItem( p_input_item );
}
- 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 MediaServerList::addServer( MediaServer* s )
{
+ input_item_t* p_input_item = NULL;
if ( getServer( s->getUDN() ) != 0 ) return false;
msg_Dbg( _p_sd, "Adding server '%s'",
s->getFriendlyName() );
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++ )
- {
- 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;
- }
- }
+ p_input_item = input_item_New( p_sd, "vlc://nop", s->getFriendlyName() );
+ s->setInputItem( p_input_item );
- assert (p_node_cat);
- assert (p_node_one);
+ services_discovery_AddItem( p_sd, p_input_item, NULL );
_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;
}
_title = title;
_resource = resource;
- _playlistNode = 0;
+ _inputItem = NULL;
+}
+
+Item::~Item()
+{
+ if(_inputItem)
+ vlc_gc_decref( _inputItem );
}
const char* Item::getObjectID() const
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;
}
_objectID = objectID;
_title = title;
- _playlistNode = 0;
+ _inputItem = NULL;
}
Container::~Container()
{
delete _items[i];
}
+
+ if(_inputItem )
+ vlc_gc_decref( _inputItem );
}
void Container::addItem( Item* item )
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;
}