package vicazh.hyperpool.stream.net.http;
import java.util.*;
import vicazh.hyperpool.Start;
import vicazh.hyperpool.stream.*;
import vicazh.hyperpool.stream.net.Stream;
import java.io.*;
import vicazh.hyperpool.stream.net.*;
class ReconnectConnection extends Connection implements Serializable {
ReconnectConnection() {
}
ReconnectConnection(Service service) {
super(service);
}
public boolean equals(Object obj) {
return hashCode() == obj.hashCode();
}
protected Session getSession() {
return new ReconnectSession(this);
}
synchronized boolean getAccept() {
if (getSessions().size() == 0)
return false;
ReconnectServerStream rss = (ReconnectServerStream) getSessions()
.get(0).getServer();
if (rss == null)
return false;
if (!rss.accept)
return false;
if (getSessions().size() == 1)
return true;
ClientStream cs = getSessions().get(1).getClient();
if (cs == null)
return true;
return cs.getMethod() == null;
}
int retryindex;
long index;
long length;
transient OutputStream clientout;
transient OutputStream serverout;
public void setClient(OutputStream outputstream) throws IOException {
super.setClient(outputstream);
clientout = outputstream;
}
String client;
public void setServer(OutputStream outputstream) throws IOException {
super.setServer(outputstream);
serverout = outputstream;
client = getHostName();
}
boolean check(Session session) throws IOException {
Socket socket = ((Stream) getServer()).getSocket();
while (getAccept()
&& (socket == null ? getClient().outputstream != null
: !socket.socket.isClosed())
&& retryindex++ < ((ReconnectService) element).getRetry()
&& index < length) {
Start.logger.fine("file:" + session.getClient().getFile());
try {
clientout.close();
} catch (Exception e) {
}
// new ServerStream for processing servers headers
session.setServer(new NullStream(serverout));
// new ClientStream, because after close() link to ServerStream will
// lose
setServer(new Stream(this, session.getServer()));
clientout = ((Element) ((Service) element).getElement())
.get(getServer());
((Stream) getClient().outputstream).outputstream = clientout;
session.getClient().getFields()
.put("range", "bytes=" + index + "-");
// new Connection for creating new sessions
Connection connection = new Connection(new Service());
connection.setServer((OutputStream) getServer());
connection.setClient(clientout);
ClientStream dst = (ClientStream) connection.getClient().outputstream;
try {
dst.head(session.getClient().getMethod(), session.getClient()
.getFile(), session.getClient().getVersion());
for (Map.Entry<String, String> e : session.getClient()
.getFields().entrySet())
dst.field(e.getKey(), e.getValue());
dst.header();
clientout.flush();
return false;
} catch (Exception e) {
try {
Thread
.sleep(((ReconnectService) element).getTimeout() * 1000);
} catch (InterruptedException ex) {
}
}
}
return true;
}
synchronized public void remove(Session session) {
retryindex = 0;
index = 0;
length = 0;
super.remove(session);
}
}