+ // Check for ContentDirectory service...
+ IXML_NodeList* serviceList =
+ ixmlElement_getElementsByTagName( deviceElement,
+ "service" );
+ if ( serviceList )
+ {
+ for ( unsigned int j = 0;
+ j < ixmlNodeList_length( serviceList ); j++ )
+ {
+ IXML_Element* serviceElement =
+ ( IXML_Element* ) ixmlNodeList_item( serviceList, j );
+
+ const char* serviceType =
+ xml_getChildElementValue( serviceElement,
+ "serviceType" );
+ if ( !serviceType )
+ continue;
+
+ if ( strcmp( CONTENT_DIRECTORY_SERVICE_TYPE,
+ serviceType ) != 0 )
+ continue;
+
+ const char* eventSubURL =
+ xml_getChildElementValue( serviceElement,
+ "eventSubURL" );
+ if ( !eventSubURL )
+ continue;
+
+ const char* controlURL =
+ xml_getChildElementValue( serviceElement,
+ "controlURL" );
+ if ( !controlURL )
+ continue;
+
+ // Try to subscribe to ContentDirectory service
+
+ char* url = ( char* ) malloc( strlen( baseURL ) +
+ strlen( eventSubURL ) + 1 );
+ if ( url )
+ {
+ char* s1 = strdup( baseURL );
+ char* s2 = strdup( eventSubURL );
+
+ if ( UpnpResolveURL( s1, s2, url ) ==
+ UPNP_E_SUCCESS )
+ {
+ server->setContentDirectoryEventURL( url );
+ server->subscribeToContentDirectory();
+ }
+
+ free( s1 );
+ free( s2 );
+ free( url );
+ }
+
+ // Try to browse content directory...
+
+ url = ( char* ) malloc( strlen( baseURL ) +
+ strlen( controlURL ) + 1 );
+ if ( url )
+ {
+ char* s1 = strdup( baseURL );
+ char* s2 = strdup( controlURL );
+
+ if ( UpnpResolveURL( s1, s2, url ) ==
+ UPNP_E_SUCCESS )
+ {
+ server->setContentDirectoryControlURL( url );
+ server->fetchContents();
+ }
+
+ free( s1 );
+ free( s2 );
+ free( url );
+ }
+ }
+ ixmlNodeList_free( serviceList );
+ }
+ }
+ ixmlNodeList_free( deviceList );