/*
* Created on Dec 19, 2012
* Created by Paul Gardner
*
* Copyright 2012 Vuze, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
package com.aelitis.net.upnpms.impl;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.xml.simpleparser.SimpleXMLParserDocumentFactory;
import org.gudy.azureus2.plugins.utils.resourcedownloader.ResourceDownloader;
import org.gudy.azureus2.plugins.utils.xml.simpleparser.*;
import org.gudy.azureus2.pluginsimpl.local.utils.resourcedownloader.*;
import com.aelitis.net.upnpms.*;
public class
UPNPMSBrowserImpl
implements UPNPMSBrowser
{
private List<URL> endpoints;
private String client_name;
private UPNPMSBrowserListener listener;
private UPNPMSContainerImpl root;
private URL preferred_endpoint;
public
UPNPMSBrowserImpl(
String _client_name,
List<URL> _urls,
UPNPMSBrowserListener _listener )
throws UPnPMSException
{
client_name = _client_name;
endpoints = _urls;
listener = _listener;
client_name = client_name.replaceAll( "\"", "'" );
client_name = client_name.replaceAll( ";", "," );
client_name = client_name.replaceAll( "=", "-" );
root = new UPNPMSContainerImpl( this, "0", "" );
}
public UPNPMSContainer
getRoot()
throws UPnPMSException
{
return( root );
}
private void
setPreferredEndpoint(
URL url )
{
if ( endpoints.size() > 1 ){
if ( url != preferred_endpoint ){
preferred_endpoint = url;
listener.setPreferredURL( preferred_endpoint );
endpoints.remove( preferred_endpoint );
endpoints.add( 0, preferred_endpoint );
}
}
}
protected List<SimpleXMLParserDocumentNode>
getContainerContents(
String id )
throws UPnPMSException
{
try{
List<SimpleXMLParserDocumentNode> results = new ArrayList<SimpleXMLParserDocumentNode>();
int starting_index = 0;
while( true ){
String NL = "\r\n";
String soap_action = "urn:schemas-upnp-org:service:ContentDirectory:1#Browse";
String request =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL +
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + NL +
"<s:Body>" + NL +
"<u:Browse xmlns:u=\"urn:schemas-upnp-org:service:ContentDirectory:1\">" + NL +
"<ObjectID>" + id + "</ObjectID>" + NL +
"<BrowseFlag>BrowseDirectChildren</BrowseFlag>" + NL +
"<Filter>dc:date,res@protocolInfo,res@size</Filter>" + NL +
"<StartingIndex>" + starting_index + "</StartingIndex>" + NL +
"<RequestedCount>256</RequestedCount>" + NL +
"<SortCriteria></SortCriteria>" + NL +
"</u:Browse>" + NL +
"</s:Body>" + NL +
"</s:Envelope>";
SimpleXMLParserDocument doc = null;
UPnPMSException last_error = null;
for ( URL endpoint: new ArrayList<URL>( endpoints )){
try{
doc = getXML( endpoint, soap_action, request );
setPreferredEndpoint( endpoint );
break;
}catch( UPnPMSException e ){
last_error = e;
}
}
if ( doc == null ){
throw( last_error );
}
SimpleXMLParserDocumentNode body = doc.getChild( "Body" );
SimpleXMLParserDocumentNode response = body.getChild( "BrowseResponse" );
SimpleXMLParserDocumentNode didl_result = response.getChild( "Result" );
String didl_str = didl_result.getValue();
SimpleXMLParserDocument didle_doc = SimpleXMLParserDocumentFactory.create( didl_str );
results.add( didle_doc );
int num_returned = Integer.parseInt( response.getChild( "NumberReturned" ).getValue());
if ( num_returned <= 0 ){
break;
}
starting_index += num_returned;
int total_matches = Integer.parseInt( response.getChild( "TotalMatches" ).getValue());
if ( starting_index >= total_matches ){
break;
}
}
return( results );
}catch( UPnPMSException e ){
throw( e );
}catch( Throwable e ){
throw( new UPnPMSException( "Failed to read container", e ));
}
}
private SimpleXMLParserDocument
getXML(
URL url,
String soap_action,
String post_data )
throws UPnPMSException
{
ResourceDownloader rd = new ResourceDownloaderFactoryImpl().create( url, post_data );
try{
rd.setProperty( "URL_Connection", "Keep-Alive" );
rd.setProperty( "URL_Read_Timeout", 10*60*1000 );
rd.setProperty( "URL_Connect_Timeout", 5*60*1000 );
rd.setProperty( "URL_SOAPAction", "\"" + soap_action + "\"");
rd.setProperty( "URL_X-AV-Client-Info", "av=1.0; cn=\"Azureus Software, Inc.\"; mn=\"" + client_name + "\"; mv=\""+ Constants.AZUREUS_VERSION + "\"" );
rd.setProperty( "URL_Content-Type", "text/xml; charset=\"utf-8\"" );
SimpleXMLParserDocument doc = SimpleXMLParserDocumentFactory.create( rd.download());
// doc.print();
return( doc );
}catch( Throwable e ){
throw( new UPnPMSException( "XML RPC failed", e ));
}
}
}