/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.tools;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import freenet.clients.fcp.AddPeer;
import freenet.clients.fcp.FCPMessage;
import freenet.clients.fcp.FCPServer;
import freenet.clients.fcp.MessageInvalidException;
import freenet.clients.fcp.NodeHelloMessage;
import freenet.support.SimpleFieldSet;
import freenet.support.io.LineReadingInputStream;
public class AddRef {
/**
* Connects to a FCP server and adds a reference
* @param args
*/
public static void main(String[] args) {
if(args.length < 1){
System.err.println("Please provide a file name as the first argument.");
System.exit(-1);
}
final File reference = new File(args[0]);
if((reference == null) || !(reference.isFile()) || !(reference.canRead())){
System.err.println("Please provide a file name as the first argument.");
System.exit(-1);
}
new AddRef(reference);
}
AddRef(File reference){
Socket fcpSocket = null;
FCPMessage fcpm;
SimpleFieldSet sfs = new SimpleFieldSet(true);
try{
fcpSocket = new Socket("127.0.0.1", FCPServer.DEFAULT_FCP_PORT);
fcpSocket.setSoTimeout(2000);
InputStream is = fcpSocket.getInputStream();
LineReadingInputStream lis = new LineReadingInputStream(is);
OutputStream os = fcpSocket.getOutputStream();
try{
sfs.putSingle("Name", "AddRef");
sfs.putSingle("ExpectedVersion", "2.0");
fcpm = FCPMessage.create("ClientHello", sfs);
fcpm.send(os);
os.flush();
String messageName = lis.readLine(128, 128, true);
sfs = getMessage(lis);
fcpm = FCPMessage.create(messageName, sfs);
if((fcpm == null) || !(fcpm instanceof NodeHelloMessage)){
System.err.println("Not a valid FRED node!");
System.exit(1);
}
} catch(MessageInvalidException me){
me.printStackTrace();
}
try{
sfs = SimpleFieldSet.readFrom(reference, false, true);
fcpm = FCPMessage.create(AddPeer.NAME, sfs);
fcpm.send(os);
os.flush();
// TODO: We ought to do stricter checking!
// FIXME: some checks even
} catch(MessageInvalidException me){
System.err.println("Invalid reference file!"+me);
me.printStackTrace();
}
lis.close();
is.close();
os.close();
fcpSocket.close();
System.out.println("That reference has been added");
}catch (SocketException se){
System.err.println(se);
se.printStackTrace();
System.exit(1);
}catch (IOException ioe){
System.err.println(ioe);
ioe.printStackTrace();
System.exit(2);
}finally {
try{
Thread.sleep(3000);
}catch (InterruptedException e) {}
}
}
/**
*
* @param lis
* @return
*/
protected SimpleFieldSet getMessage(LineReadingInputStream lis){
SimpleFieldSet sfs = new SimpleFieldSet(true);
try {
while(lis.available()>0){
String line = lis.readLine(128, 128, true);
int index = line.indexOf('=');
if(index == -1 || line.startsWith("End")) return sfs;
sfs.putSingle(line.substring(0, index), line.substring(index+1));
}
}catch(IOException e){
return sfs;
}
return sfs;
}
}