package mediaGate.generalFrontend.streamConnection;
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URI;
public class MediaGateURLConnection {
//hält die URL, mit der man sich verbinden möchte
private URI localURL = null;
//hält die Socketverbindung
private Socket socket = null;
//ConnectionTimout
private int defaultConnectTimeout = -1;
private HTTPSocketTunnel sTunnel = null;
/**Übergeben einer URL*/
public MediaGateURLConnection(String url){
this(url,"",-1);
}
/**Übergeben einer URL und eines Proxy*/
public MediaGateURLConnection(String url,String host, int port){
this(url,host,port,0);
}
/**Übergeben einer URL und eines Proxy und einer connection-timeout
* Der Proxy kann auch "" und der Port -1 sein, wenn man eine timeout mitgeben will */
public MediaGateURLConnection(String url,String host,int port,int timeout){
try{
//ConnectionProperties einlesen
//Die Java-Defaulteinstellungen werden ausgelesen
readConnectionProperties();
if(port>-1){
//Implementierung mit PROXY
sTunnel = new HTTPSocketTunnel(host,port,timeout);
sTunnel.connectURL(url);
} else {
//Implementierung ohne PROXY
//Ab hier wird die Verbindung selber erstellt.
localURL = new URI(url);
//Socket erstellen
socket = createSocket(localURL.getHost(), localURL.getPort(), timeout);
//Sollte ein Unterpfad in der URL vorhanden sein, dann in
//diesen Pfad wechseln.
if(!localURL.getPath().equals("")){
//Unteren Pfad abfragen
changeServerPath(new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))),localURL.getPath());
}
}
}catch(Exception error){
error.printStackTrace();
}
}
/** gibt den InputStream als BufferedInputStream der Socket zurück oder NULL bei einem Fehler
* BufferedInputstream deswegen, da für den Shoutcast-Stream ein Stream benötigt wird, der das Flag
* markSupported auf TRUE hat. */
public BufferedInputStream getInputStream(){
try{
if(sTunnel != null){
return new BufferedInputStream(sTunnel.getInputStream());
}
if(socket != null){
return new BufferedInputStream(socket.getInputStream());
}
}catch(Exception error){}
return null;
}
/**Beendet die vorhandene Verbindung*/
public void closeConnection(){
try{
if(sTunnel != null){
sTunnel.closeServer();
} else {
socket.close();
}
}catch(Exception error){
error.printStackTrace();
}
}
/**Die benötigten Javastandards auslesen*/
private void readConnectionProperties(){
int vals[] = {0, 0};
String encs[] = { null };
vals[0] = Integer.getInteger("sun.net.client.defaultReadTimeout", 0).intValue();
vals[1] = Integer.getInteger("sun.net.client.defaultConnectTimeout", 0).intValue();
encs[0] = System.getProperty("file.encoding", "ISO8859_1");
defaultConnectTimeout = vals[1] == 0?-1:vals[1];
}
private class HTTPSocketTunnel {
//hält die Serversocket
private Socket sSocket = null;
//hält den outputStream um darüber die URL via HTTP-Proxy anzufordern
private PrintWriter outputStream = null;
private HTTPSocketTunnel(String host,int port,int timeout){
try{
sSocket = createSocket(host,port,timeout);
sSocket.setSoTimeout(0);
outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sSocket.getOutputStream())));
}catch(Exception error){}
}
/**Diese Funktion wechselt im Server zur entsprechenden URL*/
private void connectURL(String url){
changeServerPath(outputStream,url);
}
/**gibt den InputStream zur URL zurück*/
private InputStream getInputStream(){
try{
return sSocket.getInputStream();
}catch(Exception error){}
return null;
}
/**Der Server wird geschlossen*/
private void closeServer(){
try{
sSocket.close();
outputStream = null;
}catch(Exception error){}
}
}
//#####################################################################################
//## Hilfefunktion wie Socket erstellen unter Berücksichtigung der Timeout
//##
//## Serverpfad wechseln
//#####################################################################################
private Socket createSocket(String url,int port, int timeout){
try{
Socket socket = new Socket();
if (timeout >= 0) {
socket.connect(new InetSocketAddress(url, port), timeout);
} else {
if (defaultConnectTimeout > 0) {
socket.connect(new InetSocketAddress(url, port), defaultConnectTimeout);
} else {
socket.connect(new InetSocketAddress(url, port));
}
}
return socket;
}catch(Exception error){
error.printStackTrace();
}
return null;
}
private void changeServerPath(PrintWriter out,String urlPath){
out.println("GET "+urlPath+" HTTP/1.0");
out.println();
out.flush();
}
//#####################################################################################
//## Ende der Hilfefunktionen
//#####################################################################################
}