+ // Check for ContentDirectory service...
+ IXML_NodeList* p_service_list =
+ ixmlElement_getElementsByTagName( p_device_element,
+ "service" );
+ if ( p_service_list )
+ {
+ for ( unsigned int j = 0;
+ j < ixmlNodeList_length( p_service_list ); j++ )
+ {
+ IXML_Element* p_service_element =
+ ( IXML_Element* ) ixmlNodeList_item( p_service_list, j );
+
+ const char* psz_service_type =
+ xml_getChildElementValue( p_service_element,
+ "serviceType" );
+ if ( !psz_service_type )
+ continue;
+
+ if ( strcmp( CONTENT_DIRECTORY_SERVICE_TYPE,
+ psz_service_type ) != 0 )
+ continue;
+
+ const char* psz_event_sub_url =
+ xml_getChildElementValue( p_service_element,
+ "eventSubURL" );
+ if ( !psz_event_sub_url )
+ continue;
+
+ const char* psz_control_url =
+ xml_getChildElementValue( p_service_element,
+ "controlURL" );
+ if ( !psz_control_url )
+ continue;
+
+ // Try to subscribe to ContentDirectory service
+
+ char* psz_url = ( char* ) malloc( strlen( psz_base_url ) +
+ strlen( psz_event_sub_url ) + 1 );
+ if ( psz_url )
+ {
+ char* psz_s1 = strdup( psz_base_url );
+ char* psz_s2 = strdup( psz_event_sub_url );
+
+ if ( UpnpResolveURL( psz_s1, psz_s2, psz_url ) ==
+ UPNP_E_SUCCESS )
+ {
+ p_server->setContentDirectoryEventURL( psz_url );
+ p_server->subscribeToContentDirectory();
+ }
+
+ free( psz_s1 );
+ free( psz_s2 );
+ free( psz_url );
+ }
+
+ // Try to browse content directory...
+
+ psz_url = ( char* ) malloc( strlen( psz_base_url ) +
+ strlen( psz_control_url ) + 1 );
+ if ( psz_url )
+ {
+ char* psz_s1 = strdup( psz_base_url );
+ char* psz_s2 = strdup( psz_control_url );
+
+ if ( UpnpResolveURL( psz_s1, psz_s2, psz_url ) ==
+ UPNP_E_SUCCESS )
+ {
+ p_server->setContentDirectoryControlURL( psz_url );
+ p_server->fetchContents();
+ }
+
+ free( psz_s1 );
+ free( psz_s2 );
+ free( psz_url );
+ }
+ }
+ ixmlNodeList_free( p_service_list );
+ }
+ }
+ ixmlNodeList_free( p_device_list );