Author: tullyvey
Date: 2007-06-18 16:57:35 +0000 (Mon, 18 Jun 2007)
New Revision: 13650

Added:
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java
Removed:
   trunk/apps/jfcp/FreenetClient/
Modified:
   trunk/apps/jfcp/nbproject/
   trunk/apps/jfcp/nbproject/genfiles.properties
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java
   trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java
Log:
improved io, implemented simple put


Property changes on: trunk/apps/jfcp/nbproject
___________________________________________________________________
Name: svn:ignore
   + private


Modified: trunk/apps/jfcp/nbproject/genfiles.properties
===================================================================
--- trunk/apps/jfcp/nbproject/genfiles.properties       2007-06-18 16:07:26 UTC 
(rev 13649)
+++ trunk/apps/jfcp/nbproject/genfiles.properties       2007-06-18 16:57:35 UTC 
(rev 13650)
@@ -5,4 +5,4 @@
 # Do not edit this file. You may delete it but then the IDE will never 
regenerate such files for you.
 nbproject/build-impl.xml.data.CRC32=24c41492
 nbproject/build-impl.xml.script.CRC32=b040e50e
-nbproject/build-impl.xml.stylesheet.CRC32=20b9345e
+nbproject/build-impl.xml.stylesheet.CRC32=65d7ca21

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java      
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java      
2007-06-18 16:57:35 UTC (rev 13650)
@@ -13,6 +13,7 @@
 import java.util.logging.Logger;
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
 import org.freenet.contrib.fcp.message.FcpMessageInputStream;
+import org.freenet.contrib.fcp.message.FcpMessageOutputStream;
 import org.freenet.contrib.fcp.message.MessageBuilderException;
 import org.freenet.contrib.fcp.message.client.ClientHello;
 import org.freenet.contrib.fcp.message.client.ClientMessage;
@@ -31,14 +32,14 @@
     private String _fcpVersion = "2.0";
     private String _clientName = "FreenetClient";

-    private Socket _socket;
-    private PrintStream _out;
-    private FcpMessageInputStream _mis;
-    private NodeAddress _nodeAddress;
-    private ExecutorService _messageSender;
-    private boolean _socketOpen;
-    private MessageReaderThread _messageReaderThread;
-    private FcpEventSupportRepository _eventSupport;
+    private Socket                      _socket;
+    private FcpMessageOutputStream      _mos;
+    private FcpMessageInputStream       _mis;
+    private NodeAddress                 _nodeAddress;
+    private ExecutorService             _messageSender;
+    private MessageReaderThread         _messageReaderThread;
+    private FcpEventSupportRepository   _eventSupport;
+    private boolean                     _socketOpen;

     /** Creates a new instance of FcpConnection */
     FcpConnection(NodeAddress na, FcpEventSupportRepository eventSupport) {
@@ -63,7 +64,7 @@
         logger.fine("opening socket to " + _nodeAddress.getHostName() + ":" + 
_nodeAddress.getPort());
         _socket = new Socket(_nodeAddress.getHostName(), 
_nodeAddress.getPort());
         _mis = new FcpMessageInputStream(_socket.getInputStream());
-        _out = new PrintStream(_socket.getOutputStream());
+        _mos = new FcpMessageOutputStream(_socket.getOutputStream());
         _messageSender = Executors.newSingleThreadExecutor();
         _messageReaderThread = new MessageReaderThread();
         _socketOpen = true;
@@ -97,13 +98,13 @@
             }
             _mis = null;
         }
-        if(_out != null){
+        if(_mos != null){
             try {
-                _out.close();
+                _mos.close();
             } catch (Exception ex) {
                 logger.warning("error closing output stream: " + 
ex.getMessage());
             }
-            _out = null;
+            _mos = null;
         }
         _eventSupport.getConnectionEventSupport().fireFcpDisconnected();
     }
@@ -126,14 +127,17 @@
         }

         public void run() {
-            if(_out == null)
+            if(_mos == null)
                 return;
-            _message.writeMessage(_out);
-            if(_out.checkError()){
-                logger.warning("error sending message:\n\n" + 
_message.getMessageString());
-                close();
-            }else{
+            try {
+                _mos.writeMessage(_message);
+                _mos.flush();
                 _message.fireEvents(_eventSupport);
+            } catch (IOException ex) {
+                logger.warning("IO error sending message: " + 
_message.getHeaderString());
+                close();
+            } catch (MessageBuilderException ex) {
+                logger.warning("invalid message:\n\n" + 
_message.getMessageString() + "\n\n");
             }
         }
     }
@@ -165,38 +169,25 @@
     }


-    private class MessageReaderThread extends Thread{
-        private boolean _running;
-        
+    private class MessageReaderThread extends Thread{        
         public void run(){
-            _running = true;
-            String line;
             try {
-                
                 while(_socketOpen){
                     try {
                         NodeMessage message = _mis.readMessage();
                         message.fireEvents(_eventSupport);
                     } catch (MessageBuilderException ex) {
-                        if(_socketOpen)
                             logger.warning("error building node message: " + 
ex.getMessage());
                     }
                 }
-                
             } catch (IOException ex) {
                 if(_socketOpen)
                     logger.warning("error reading stream: " + ex.getMessage());
             }
-            
-            _running = false;
             if(_socketOpen)
                 close();
         }

-        public boolean isRunning() {
-            return _running;
-        }
-        
     }

 }

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java      
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java      
2007-06-18 16:57:35 UTC (rev 13650)
@@ -10,6 +10,7 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
 import org.freenet.contrib.fcp.message.client.ClientGet;
 import org.freenet.contrib.fcp.message.client.ClientMessage;
+import org.freenet.contrib.fcp.message.client.ClientPut;
 import org.freenet.contrib.fcp.message.client.GenerateSSK;
 import org.freenet.contrib.fcp.message.client.ListPeers;

@@ -82,13 +83,27 @@
      * @param id an identifier for use in your app
      */
     public void get(String uri, String id){
-        ClientGet message = new ClientGet(uri, id);
-        message.setVerbosity(1);
-        message.setPriority(2);
-        _conn.sendMessage(message);
+        ClientGet cg = new ClientGet(uri, id);
+        cg.setVerbosity(1);
+        cg.setPriority(2);
+        _conn.sendMessage(cg);
     }

+    
     /**
+     * Inserts data to node.
+     * @param uri 
+     * @param id 
+     * @param data 
+     */
+    public void put(String uri, String id, byte[] data){
+        ClientPut cp = new ClientPut(uri, id, data);
+        cp.setVerbosity(1);
+        cp.setPriority(2);
+        _conn.sendMessage(cp);
+    }
+    
+    /**
      * Will probably change
      * @param id an id for your convenience
      */

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java      
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java      
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,7 +8,7 @@

 /**
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class SSKKeypairEvent extends FcpEvent<SSKKeypair>{


Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java    
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java    
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,21 @@
+/* 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 org.freenet.contrib.fcp.event;
+
+import org.freenet.contrib.fcp.message.node.SSKKeypair;
+import org.freenet.contrib.fcp.message.node.URIGenerated;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public class URIGeneratedEvent extends FcpEvent<URIGenerated>{
+    
+    /** Creates a new instance of URIGeneratedEvent */
+    public URIGeneratedEvent(URIGenerated ug) {
+        super(ug);
+    }
+    
+}

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
    2007-06-18 16:07:26 UTC (rev 13649)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
    2007-06-18 16:57:35 UTC (rev 13650)
@@ -6,9 +6,11 @@

 import java.util.logging.Logger;
 import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import org.freenet.contrib.fcp.event.URIGeneratedEvent;
 import 
org.freenet.contrib.fcp.event.support.AbstractFcpEventSupport.NotifyHelper;
 import org.freenet.contrib.fcp.listener.FcpSSKKeypairListener;
 import org.freenet.contrib.fcp.message.node.SSKKeypair;
+import org.freenet.contrib.fcp.message.node.URIGenerated;

 /**
  *
@@ -19,12 +21,20 @@

     NotifyHelper _keypairReceivedNotifier = new 
NotifyHelper<SSKKeypairEvent>() {
         void notifyListener(FcpSSKKeypairListener l, SSKKeypairEvent e) 
{l.keypairReceived(e);}
-    };   
+    };  

+    NotifyHelper _uriGeneratedNotifier = new NotifyHelper<URIGeneratedEvent>() 
{
+        void notifyListener(FcpSSKKeypairListener l, URIGeneratedEvent e) 
{l.uriGenerated(e);}
+    };  


+    
     public void fireKeypairReceived(SSKKeypair kp){
         _keypairReceivedNotifier.notifyListeners(new SSKKeypairEvent(kp));
     }

+    public void fireURIGenerated(URIGenerated ug){
+        _uriGeneratedNotifier.notifyListeners(new URIGeneratedEvent(ug));
+    }
+    
 }

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java 
    2007-06-18 16:07:26 UTC (rev 13649)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java 
    2007-06-18 16:57:35 UTC (rev 13650)
@@ -5,6 +5,7 @@
 package org.freenet.contrib.fcp.listener;

 import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import org.freenet.contrib.fcp.event.URIGeneratedEvent;

 /**
  *
@@ -12,4 +13,5 @@
  */
 public interface FcpSSKKeypairListener {
     public void keypairReceived(SSKKeypairEvent kpe);
+    public void uriGenerated(URIGeneratedEvent uge);
 }

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java 
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -53,7 +53,7 @@
      * @param eventSupport the object to be notified of message events
      */
     public abstract void fireEvents(FcpEventSupportRepository eventSupport);
-      
+    
     /**
      * Get the fields that must be non-null in a valid message.
      * @return an array of <code>String</code>s, the names of the mandatory 
fields
@@ -63,6 +63,18 @@
     }

     /**
+     * Checks mandatory fields.
+     * @throws org.freenet.contrib.fcp.message.MessageBuilderException if 
required field absent
+     */
+    public void validate() throws MessageBuilderException{
+        
+        for(String field : getMandatoryFields()){
+            if(_fields.get(field) == null)
+                throw new MessageBuilderException("mandatory field " + field + 
" not found in message " + _headerString);
+        }
+    }
+    
+    /**
      * Stream the message.
      * @param out the stream to be written to
      */

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java  
    2007-06-18 16:07:26 UTC (rev 13649)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java  
    2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,7 +8,6 @@
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import org.freenet.contrib.fcp.message.DataHoldingMessage;
 import org.freenet.contrib.fcp.message.node.NodeMessage;

 /**
@@ -43,8 +42,8 @@
             }
             sb.append((char) b);
         }
-        String line = sb.toString();
-        return line.trim().length() == 0 ? readLine() : line;
+        String line = sb.toString(); 
+        return line.trim().length() == 0 ? readLine() : line; // blank lines 
allowed for debugging - if so, read on
     }

     /**
@@ -65,16 +64,8 @@
         while(readField(m))
             ; // read all message fields

-        String[] mandatoryFields = m.getMandatoryFields();
+        m.validate();

-        for(String field : mandatoryFields){
-            
-            if(m.getFields().get(field) == null)
-                throw new MessageBuilderException(
-                        "mandatory field " + field + " not found in message " 
+ 
-                        m.getHeaderString());
-        }
-        
         return m;
     }

@@ -99,12 +90,15 @@
         DataHoldingMessage dhm = (DataHoldingMessage) m;

         byte[] data = new byte[dhm.getDataLength()];
-        _dis.read(data, 0, data.length);
-        
+        int toRead = data.length, read;
+        while(toRead > 0){
+            read = _dis.read(data, data.length - toRead, toRead > 4096 ? 4096 
: toRead);
+            toRead -= read;
+        }
         dhm.setData(data);
         return false;
     }
-
+    
     /**
      * Closes the delegate stream.
      * @throws java.io.IOException if thrown on underlying stream

Added: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java 
                            (rev 0)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java 
    2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,64 @@
+/*
+ * FcpMessageOutputStream.java
+ *
+/* 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 org.freenet.contrib.fcp.message;
+
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+import org.freenet.contrib.fcp.message.client.ClientMessage;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public class FcpMessageOutputStream {
+    private DataOutputStream _dos;
+    /** Creates a new instance of FcpMessageOutputStream */
+    public FcpMessageOutputStream(OutputStream out) {
+        _dos = new DataOutputStream(new BufferedOutputStream(out));
+    }
+    
+    public void writeMessage(ClientMessage m) throws MessageBuilderException, 
IOException{
+        m.validate();
+        
+        writeLine(m.getHeaderString());
+        
+        for(Map.Entry<String, String> field : m.getFields().entrySet()){
+            writeField(field.getKey(), field.getValue());
+        }
+        if(m instanceof DataHoldingMessage){
+            writeLine("Data");
+            _dos.write(((DataHoldingMessage) m).getData());
+        }else{
+            writeLine("EndMessage");
+        }
+        
+    }
+    
+    void writeField(String name, String value) throws IOException{
+        _dos.writeBytes(name);
+        _dos.writeByte('=');
+        _dos.writeBytes(value);
+        _dos.writeByte('\n');
+    }
+    
+    void writeLine(String line) throws IOException{
+        _dos.writeBytes(line);
+        _dos.writeByte('\n');
+    }
+    
+    public void flush() throws IOException{
+        _dos.flush();
+    }
+    
+    public void close() throws IOException{
+        _dos.close();
+    }
+}

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java        
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java        
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,15 @@
+/* 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 org.freenet.contrib.fcp.message;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public enum Persistence{
+    connection,
+    reboot,
+    forever
+}

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java         
                (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,15 @@
+/* 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 org.freenet.contrib.fcp.message;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public enum ReturnType{
+    direct,
+    disk,
+    none
+}

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java         
                (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,15 @@
+/* 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 org.freenet.contrib.fcp.message;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public enum UploadFrom{
+    direct,
+    disk,
+    redirect
+}

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java   
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java   
2007-06-18 16:57:35 UTC (rev 13650)
@@ -4,28 +4,17 @@

 package org.freenet.contrib.fcp.message.client;

-import java.io.PrintStream;
-import java.net.FileNameMap;
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.Persistence;
+import org.freenet.contrib.fcp.message.ReturnType;

 /**
+ *This is sent from a client program to the Freenet node and is used to 
specify a file to download from Freenet.
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class ClientGet extends ClientMessage{
-    public enum ReturnType{
-        direct,
-        disk,
-        none
-    }

-    public enum Persistence{
-        connection,
-        reboot,
-        forever
-    }
-    
-    
     public ClientGet(String uri, String identifier){
         setUri(uri);
         setId(identifier);
@@ -136,6 +125,14 @@
         _fields.put("Global", String.valueOf(global));
     }

+    public boolean isBlob() {
+        return Boolean.parseBoolean(_fields.get("BinaryBlob"));
+    }
+    
+    public void setBlob(boolean blob) {
+        _fields.put("BinaryBlob", String.valueOf(blob));
+    }
+    
     public ReturnType getReturnType() {
         return ReturnType.valueOf(_fields.get("ReturnType"));
     }
@@ -144,6 +141,7 @@
         _fields.put("ReturnType", returnType.toString());
     }

+    // Only valid if ReturnType is disk

     public String getFileName() {
         return _fields.get("FileName");

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java 
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,8 +8,10 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
+ *This must be the first message from the client on any given connection. 
+ * The node will respond with a {@link 
org.freenet.contrib.fcp.message.node.NodeHello NodeHello} message.
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class ClientHello extends ClientMessage{


Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java   
    2007-06-18 16:07:26 UTC (rev 13649)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java   
    2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,9 @@
 import org.freenet.contrib.fcp.message.FcpMessage;

 /**
+ *All client messages inherit from this.
  *
- * @author res
+ * @author Ralph Smithen
  */
 public abstract class ClientMessage extends FcpMessage{


Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java   
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java   
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,267 @@
+/* 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 org.freenet.contrib.fcp.message.client;
+
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.DataHoldingMessage;
+import org.freenet.contrib.fcp.message.Persistence;
+import org.freenet.contrib.fcp.message.UploadFrom;
+
+/**
+ * <p>This is used to specify an insert into Freenet of a single file. 
+ * The insert may be provided by referring to a file on disk, including the 
data directly, 
+ * or redirecting to another key.</p>
+ * <p>A filename may be specified using the TargetFilename option. This is 
mostly useful 
+ * with CHKs. The effect is to create a single file manifest which contains 
only the filename 
+ * given, and points to the data just inserted. Thus the provided filename 
becomes the last 
+ * part of the URI, and must be provided when fetching the data.</p>
+ *
+ * @author Ralph Smithen
+ */
+public class ClientPut extends ClientMessage implements DataHoldingMessage{
+    private byte[] _data;
+    private static String[] _mandatoryFields;
+       
+    
+    /**
+     * Creates a ClientPut for direct data sending.
+     * @param uri 
+     * @param id 
+     * @param data 
+     */
+    public ClientPut(String uri, String id, byte[] data){
+        setUri(uri);
+        setId(id);
+        setData(data);
+        setUploadFrom(UploadFrom.direct);
+    }
+    
+    /**
+     * 
+     * @inheritDoc 
+     */
+    public String[] getMandatoryFields() {
+        return _mandatoryFields;
+    }
+
+    public void fireEvents(FcpEventSupportRepository eventSupport) {
+    }
+
+    
+    public String getUri() {
+        return _fields.get("URI");
+    }
+    
+    /**
+     * The type of key to insert. When inserting an SSK key, you explicitly 
specifiy the version 
+     * number. For a USK key, use a zero and it should automatically use the 
correct version number.
+     * @param uri 
+     */
+    public void setUri(String uri) {
+        _fields.put("URI", uri);
+    }
+    
+    public String getId() {
+        return _fields.get("Identifier");
+    }
+    
+    /**
+     * This is just for client to be able to identify files that have been 
inserted.
+     * @param id 
+     */
+    public void setId(String id) {
+        _fields.put("Identifier", id);
+    }
+    
+    public String getContentType() {
+        return _fields.get("Metadata.ContentType");
+    }
+    
+    /**
+     * The MIME type of the data being inserted. For text, if charset is not 
specified, node should 
+     * auto-detect it and force the auto-detected version
+     * @param contentType 
+     */
+    public void setContentType(String contentType) {
+        _fields.put("Metadata.ContentType", contentType);
+    }
+    
+    public int getVerbosity() {
+        return Integer.parseInt(_fields.get("Verbosity"));
+    }
+    
+    /**
+     * <pre>
+     *  0: report when complete, 
+     *  1: SimpleProgress messages,
+     * 512: send StartedCompression and FinishedCompression messages
+     * </pre>
+     * @param verbosity 
+     */
+    public void setVerbosity(int verbosity) {
+        _fields.put("Verbosity", String.valueOf(verbosity));
+    }
+    
+    public int getMaxRetries() {
+        return Integer.parseInt(_fields.get("MaxRetries"));
+    }
+    
+    /**
+     * Number of times to retry if the first time doesn't work. -1 means retry 
forever.
+     * @param maxRetries 
+     */
+    public void setMaxRetries(int maxRetries) {
+        _fields.put("MaxRetries", String.valueOf(maxRetries));
+    }
+    
+    public int getPriority() {
+        return Integer.parseInt(_fields.get("PriorityClass"));
+    }
+    
+    public void setPriority(int priority) {
+        _fields.put("PriorityClass", String.valueOf(priority));
+    }
+    
+    public boolean isCHKOnly() {
+        return Boolean.parseBoolean(_fields.get("GetCHKOnly"));
+    }
+    
+    /**
+     * <p>
+     *    If set to true, it won't actually insert the data, 
+     *    just return the key it would generate.
+     * </p>
+     * 
+     * <p>
+     *    If the key is USK, you may want to transform it into a SSK, to 
prevent the node 
+     *    spending time searching for an unused index.
+     * </p>
+     * @param chk 
+     */
+    public void setCHKOnly(boolean chk) {
+        _fields.put("GetCHKOnly", String.valueOf(chk));
+    }
+    
+    public Persistence getPersistence() {
+        return Persistence.valueOf(_fields.get("Persistence"));
+    }
+    
+    public void setPersistence(Persistence persistence) {
+        _fields.put("Persistence", persistence.toString());
+    }
+    
+    public String getClientToken() {
+        return _fields.get("ClientToken");
+    }
+    
+    /**
+     * Sent back to client on the PersistentPut if this is a persistent request
+     * @param clientToken 
+     */
+    public void setClientToken(String clientToken) {
+        _fields.put("ClientToken", clientToken);
+    }
+    
+    public boolean isGlobal() {
+        return Boolean.parseBoolean(_fields.get("Global"));
+    }
+    
+    /**
+     * Whether the insert is visible on the global queue or not.
+     * @param global 
+     */
+    public void setGlobal(boolean global) {
+        _fields.put("Global", String.valueOf(global));
+    }
+    
+    public boolean isDontCompress() {
+        return Boolean.parseBoolean(_fields.get("DontCompress"));
+    }
+    
+    /**
+     * Hint to node: don't try to compress the data, it's already compressed
+     * @param dontCompress 
+     */
+    public void setDontCompress(boolean dontCompress) {
+        _fields.put("DontCompress", String.valueOf(dontCompress));
+    }
+    
+    public boolean isBlob() {
+        return Boolean.parseBoolean(_fields.get("BinaryBlob"));
+    }
+    
+    public void setBlob(boolean blob) {
+        _fields.put("BinaryBlob", String.valueOf(blob));
+    }
+    
+    public boolean isEarlyEncode() {
+        return Boolean.parseBoolean(_fields.get("EarlyEncode"));
+    }
+    
+    public void setEarlyEncode(boolean earlyEncode) {
+        _fields.put("EarlyEncode", String.valueOf(earlyEncode));
+    }
+    
+    public UploadFrom getUploadFrom() {
+        return UploadFrom.valueOf(_fields.get("UploadFrom"));
+    }
+    
+    public void setUploadFrom(UploadFrom uploadFrom) {
+        _fields.put("UploadFrom", uploadFrom.toString());
+        switch(uploadFrom){
+            case direct:
+                _mandatoryFields = new String[] {"URI", "Identifier", 
"DataLength"};
+                break;
+                
+            case disk: 
+                _mandatoryFields = new String[] {"URI", "Identifier", 
"Filename"};
+                break;
+                
+            case redirect:
+                _mandatoryFields = new String[] {"URI", "Identifier", 
"TargetURI"};
+        }
+    }
+
+    public String getFileName() {
+        return _fields.get("FileName");
+    }
+    
+    public void setFileName(String fileName) {
+        _fields.put("FileName", fileName);
+    }
+    
+    public String getTargetFilename() {
+        return _fields.get("TargetFilename");
+    }
+    
+    public void setTargetFilename(String targetFilename) {
+        _fields.put("TargetFilename", targetFilename);
+    }
+    
+    public String getTargetURI() {
+        return _fields.get("TargetURI");
+    }
+    
+    public void setTargetURI(String targetURI) {
+        _fields.put("TargetURI", targetURI);
+    }
+
+    public byte[] getData() {
+        return _data;
+    }
+
+    public void setData(byte[] data) {
+        _data = data;
+        setDataLength(data.length);
+    }
+    
+    public int getDataLength() {
+        return Integer.parseInt(_fields.get("DataLength"));
+    }
+    
+    public void setDataLength(int dataLength) {
+        _fields.put("DataLength", String.valueOf(dataLength));
+    }
+}

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java 
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,10 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
+ * This asks the node to generate us an SSK keypair. 
+ * The response will come back in a {@link 
org.freenet.contrib.fcp.message.node.SSKKeypair SSKKeypair} message.
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class GenerateSSK extends ClientMessage{


Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java   
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java   
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,9 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
+ *This message asks the Freenet node for a list of other Freenet nodes 
connected directly to you (peers).
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class ListPeers extends ClientMessage{


Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java    
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java    
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,9 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
- *
- * @author res
+ * This command allows an client program to remotely shut down a Freenet node. 
+ * A confirmation message will be sent (ProtocolError code 18: Shutting down)
+ * @author Ralph Smithen
  */
 public class ShutDown extends ClientMessage{


Added: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java 
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,63 @@
+/* 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 org.freenet.contrib.fcp.message.node;
+
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.UploadFrom;
+
+/**
+ *This is the node replying to a {@link 
org.freenet.contrib.fcp.message.client.ClientPut ClientPut} 
+ * and confirming the details or the request 
+ * (possibly for clients other than the one that issued the ClientPut, if it 
is on the global queue)
+ *
+ * @author Ralph Smithen
+ */
+public class PersistentPut extends NodeMessage{
+    
+    public void fireEvents(FcpEventSupportRepository eventSupport) {
+        
+    }
+
+    public String getId() {
+        return _fields.get("Identifier");
+    }
+    
+    public String getUri() {
+        return _fields.get("URI");
+    }   
+    
+    public int getVerbosity() {
+        return Integer.parseInt(_fields.get("Verbosity"));
+    }
+    
+    public UploadFrom getUploadFrom() {
+        return UploadFrom.valueOf(_fields.get("UploadFrom"));
+    }
+
+    public String getFileName() {
+        return _fields.get("FileName");
+    }
+    
+    public String getTargetFilename() {
+        return _fields.get("TargetFilename");
+    }
+    
+    public String getContentType() {
+        return _fields.get("Metadata.ContentType");
+    }
+    
+    public boolean isGlobal() {
+        return Boolean.parseBoolean(_fields.get("Global"));
+    }
+    
+    public int getDataLength() {
+        return Integer.parseInt(_fields.get("DataLength"));
+    }
+    
+    public int getMaxRetries() {
+        return Integer.parseInt(_fields.get("MaxRetries"));
+    }
+    
+}

Added: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java  
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java  
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,51 @@
+/* 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 org.freenet.contrib.fcp.message.node;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+
+/**
+ *This indicates the final URI of the data inserted; this may not be the same 
as the original URI, 
+ * which could have been CHK@ ("insert this as a CHK and tell me what its CHK 
is"), 
+ * or an Signed Subspace Key (SSK) using a private key.
+ *
+ * @author Ralph Smithen
+ */
+public class URIGenerated extends NodeMessage{
+    private String _uri;
+    private byte[] _data;
+    
+    /**
+     * Creates a new instance of URIGenerated
+     */
+    public URIGenerated() {
+    }
+    
+    /**
+     * 
+     * @inheritDoc 
+     */
+    public void fireEvents(FcpEventSupportRepository eventSupport) {
+        eventSupport.getSSKKeypairEventSupport().fireURIGenerated(this);
+    }
+    
+    public String getId() {
+        return _fields.get("Identifier");
+    }
+    
+    public void setId(String id) {
+        _fields.put("Identifier", id);
+    }
+    
+    public String getUri() {
+        return _fields.get("URI");
+    }
+
+    public void setUri(String uri) {
+        _fields.put("URI", uri);
+    }
+ }

Modified: trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java
===================================================================
--- trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java 
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java 
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,7 +8,6 @@
 package org.freenet.contrib.fcp;

 import java.util.Map;
-import java.util.logging.Logger;
 import junit.framework.*;
 import org.freenet.contrib.fcp.event.AllDataEvent;
 import org.freenet.contrib.fcp.event.DataFoundEvent;
@@ -19,12 +18,21 @@
 import org.freenet.contrib.fcp.event.FcpSimpleProgressEvent;
 import org.freenet.contrib.fcp.event.GetFailedEvent;
 import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import org.freenet.contrib.fcp.event.URIGeneratedEvent;
 import org.freenet.contrib.fcp.event.support.FcpEventSource;
 import org.freenet.contrib.fcp.listener.FcpConnectionListener;
 import org.freenet.contrib.fcp.listener.FcpPeerListListener;
 import org.freenet.contrib.fcp.listener.FcpQueueListener;
 import org.freenet.contrib.fcp.listener.FcpSSKKeypairListener;
 import org.freenet.contrib.fcp.message.node.Peer;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.client.ClientGet;
+import org.freenet.contrib.fcp.message.client.ClientMessage;
+import org.freenet.contrib.fcp.message.client.ClientPut;
+import org.freenet.contrib.fcp.message.client.GenerateSSK;
+import org.freenet.contrib.fcp.message.client.ListPeers;

 /**
  *
@@ -118,6 +126,21 @@

     }

+    /**
+     * Test of put method, of class org.freenet.contrib.fcp.FreenetClient.
+     */
+    public void testPut() {
+        System.out.println("put");
+        
+        String uri = "CHK@";
+        String id = "mytestput";
+        byte[] data = "I'm but a wee snippet.".getBytes();
+
+        instance.put(uri, id, data);
+        
+        myWait();
+    }
+    
     public void peerListUpdated(FcpPeerListUpdatedEvent e) {
         System.out.println("peerListUpdated, peer list:");
         for(Map.Entry<String, Peer> entry : e.getPeers().entrySet()){
@@ -138,6 +161,7 @@

     public void simpleProgressUpdate(FcpSimpleProgressEvent e) {
         System.out.println("simpleProgressUpdate");
+        System.out.println("  id=" + e.getMessage().getId());
     }

     public void keyRequested(FcpKeyRequestedEvent e) {
@@ -150,7 +174,8 @@

     public void allData(AllDataEvent e) {
         System.out.println("allData");
-        System.out.println(new String(e.getMessage().getData()));
+        //System.out.println(new String(e.getMessage().getData()));
+        System.out.println("  bytes=" + e.getMessage().getDataLength());
         synchronized(this){
             notify();
         }
@@ -175,5 +200,16 @@
             notify();
         }
     }
+
+
+    public void uriGenerated(URIGeneratedEvent uge) {
+        System.out.println("uriGenerated");
+        System.out.println("  id=" + uge.getMessage().getId());
+        System.out.println("  uri=" + uge.getMessage().getUri());
+        
+        synchronized(this){
+            notify();
+        }
+    }

 }


Reply via email to