/*
* Created on 06-Mar-2005
* Created by Paul Gardner
* Copyright (C) 2004, 2005, 2006 Aelitis, 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; either version 2
* of the License, or (at your option) any later version.
* 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.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.core3.util.protocol.azplug;
import java.util.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ipc.IPCException;
import org.gudy.azureus2.plugins.ipc.IPCInterface;
import com.aelitis.azureus.core.AzureusCoreFactory;
/**
* @author parg
*
*/
public class
AZPluginConnection
extends HttpURLConnection
{
private int response_code = HTTP_OK;
private String response_msg = "OK";
private InputStream input_stream;
private Map<String,List<String>> headers = new HashMap<String, List<String>>();
protected
AZPluginConnection(
URL _url )
{
super( _url );
}
public void
connect()
throws IOException
{
String url = getURL().toString();
int pos = url.indexOf( "?" );
if ( pos == -1 ){
throw( new IOException( "Malformed URL - ? missing" ));
}
url = url.substring( pos+1 );
String[] bits = url.split( "&" );
Map args = new HashMap();
for (int i=0;i<bits.length;i++ ){
String bit = bits[i];
String[] x = bit.split( "=" );
if ( x.length == 2 ){
String lhs = x[0];
String rhs = URLDecoder.decode(x[1], "UTF-8" );
args.put( lhs.toLowerCase(), rhs );
}
}
String plugin_id = (String)args.get( "id" );
if ( plugin_id == null ){
throw( new IOException( "Plugin id missing" ));
}
String plugin_name = (String)args.get( "name" );
String arg = (String)args.get( "arg" );
String plugin_str = plugin_id + (plugin_name==null?"":( " (" + plugin_name + ")" ));
// AZPluginConnection is called via reflection
// Let's just assume that the Core is avail..
PluginInterface pi = AzureusCoreFactory.getSingleton().getPluginManager().getPluginInterfaceByID( plugin_id );
if ( pi == null ){
throw( new IOException( "Plugin id " + plugin_str + " not installed" ));
}
IPCInterface ipc = pi.getIPC();
try{
if ( ipc.canInvoke( "handleURLProtocol", new Object[]{ this, arg })){
input_stream = (InputStream)ipc.invoke( "handleURLProtocol", new Object[]{ this, arg });
}else{
input_stream = (InputStream)ipc.invoke( "handleURLProtocol", new Object[]{ arg });
}
}catch( IPCException ipce ){
Throwable e = ipce;
if ( e.getCause() != null ){
e = e.getCause();
}
throw( new IOException( "Communication error with plugin '" + plugin_str + "': " + Debug.getNestedExceptionMessage(e)));
}
}
public Map<String,List<String>>
getHeaderFields()
{
return( headers );
}
public String
getHeaderField(
String name )
{
List<String> values = headers.get( name );
if ( values == null || values.size() == 0 ){
return( null );
}
return( values.get( values.size()-1 ));
}
public void
setHeaderField(
String name,
String value )
{
List<String> values = headers.get( name );
if ( values == null ){
values = new ArrayList<String>();
headers.put( name, values );
}
values.add( value );
}
public InputStream
getInputStream()
throws IOException
{
return( input_stream );
}
public void
setResponse(
int _code,
String _msg )
{
response_code = _code;
response_msg = _msg;
}
public int
getResponseCode()
{
return( response_code );
}
public String
getResponseMessage()
{
return( response_msg );
}
public boolean
usingProxy()
{
return( false );
}
public void
disconnect()
{
}
}