Author: tullyvey
Date: 2007-06-18 02:53:30 +0000 (Mon, 18 Jun 2007)
New Revision: 13643

Added:
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/package.html
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/package.html
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/package.html
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/DataHoldingMessage.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/package.html
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/package.html
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/package.html
Removed:
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/DataHoldingMessage.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessageBuilder.java
Modified:
   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/support/AbstractFcpEventSupport.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSource.java
   
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSupportRepository.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/AllData.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeHello.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessage.java
   trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/SSKKeypair.java
Log:
Fixed char/byte reading problem with the help of Toad's advice (next the 
writing...)
More comments and tidying

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java      
2007-06-18 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java      
2007-06-18 02:53:30 UTC (rev 13643)
@@ -4,9 +4,7 @@

 package org.freenet.contrib.fcp;

-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.net.Socket;
 import java.net.UnknownHostException;
@@ -14,11 +12,11 @@
 import java.util.concurrent.Executors;
 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.MessageBuilderException;
 import org.freenet.contrib.fcp.message.client.ClientHello;
 import org.freenet.contrib.fcp.message.client.ClientMessage;
 import org.freenet.contrib.fcp.message.node.NodeMessage;
-import org.freenet.contrib.fcp.message.node.NodeMessageBuilder;



@@ -35,7 +33,7 @@

     private Socket _socket;
     private PrintStream _out;
-    private BufferedReader _in;
+    private FcpMessageInputStream _mis;
     private NodeAddress _nodeAddress;
     private ExecutorService _messageSender;
     private boolean _socketOpen;
@@ -60,14 +58,16 @@
      * @throws java.io.IOException on IO error.
      */
     public void open() throws UnknownHostException, IOException{
+        if(_socketOpen)
+            return;
         logger.fine("opening socket to " + _nodeAddress.getHostName() + ":" + 
_nodeAddress.getPort());
         _socket = new Socket(_nodeAddress.getHostName(), 
_nodeAddress.getPort());
-        _in = new BufferedReader(new 
InputStreamReader(_socket.getInputStream()));
+        _mis = new FcpMessageInputStream(_socket.getInputStream());
         _out = new PrintStream(_socket.getOutputStream());
         _messageSender = Executors.newSingleThreadExecutor();
         _messageReaderThread = new MessageReaderThread();
-        _messageReaderThread.start();
         _socketOpen = true;
+        _messageReaderThread.start();
         sendMessage(new ClientHello(_fcpVersion, _clientName));
     }

@@ -89,13 +89,13 @@
             }
             _socket = null;
         }
-        if(_in != null){
+        if(_mis != null){
             try {
-                _in.close();
+                _mis.close();
             } catch (Exception ex) {
                 logger.warning("error closing input stream: " + 
ex.getMessage());
             }
-            _in = null;
+            _mis = null;
         }
         if(_out != null){
             try {
@@ -109,7 +109,7 @@
     }

     /**
-     * Sends a message to the node.  This method returns immediately, 
+     * Sends a message to the node.  This method returns immediately,
      * the message is put in a queue to be sent.
      * @param message The message to be sent.
      */
@@ -126,7 +126,8 @@
         }

         public void run() {
-//            logger.fine("sending message : " + _message.getHeaderString());
+            if(_out == null)
+                return;
             _message.writeMessage(_out);
             if(_out.checkError()){
                 logger.warning("error sending message:\n\n" + 
_message.getMessageString());
@@ -160,7 +161,7 @@
      * @param nodeAddress the new {@link NodeAddress NodeAddress}
      */
     public void setNodeAddress(NodeAddress nodeAddress) {
-        this._nodeAddress = nodeAddress;
+        _nodeAddress = nodeAddress;
     }


@@ -173,20 +174,18 @@
             try {

                 while(_socketOpen){
-                    NodeMessageBuilder builder = new NodeMessageBuilder();
                     try {
-                        builder.parse(_in);
-                        NodeMessage message = builder.build();
+                        NodeMessage message = _mis.readMessage();
                         message.fireEvents(_eventSupport);
                     } catch (MessageBuilderException ex) {
                         if(_socketOpen)
                             logger.warning("error building node message: " + 
ex.getMessage());
                     }
-                    
                 }

             } catch (IOException ex) {
-                logger.warning("error reading stream: " + ex.getMessage());
+                if(_socketOpen)
+                    logger.warning("error reading stream: " + ex.getMessage());
             }

             _running = false;

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java      
2007-06-18 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java      
2007-06-18 02:53:30 UTC (rev 13643)
@@ -54,7 +54,7 @@
     /**
      * Returns an object by which interested classes can register to listen 
      * for incoming message events.
-     * @return teh event source
+     * @return the event source
      */
     public FcpEventSource getEventSource(){
         return _eventSource;

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/package.html
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/package.html              
                (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/package.html      
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+  </head>
+  <body>
+      <h1>FCP event classes</h1>
+      <p>
+          The events that are generated upon receipt and transmission of 
messages
+          and such.
+      </p>
+  </body>
+</html>

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/AbstractFcpEventSupport.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/AbstractFcpEventSupport.java
      2007-06-18 00:26:54 UTC (rev 13642)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/AbstractFcpEventSupport.java
      2007-06-18 02:53:30 UTC (rev 13643)
@@ -9,8 +9,8 @@
 import java.util.Set;

 /**
- *
- * @author res
+ * Support class to allow event support to be achieved more tersely.
+ * @author Ralph Smithen
  */
 class AbstractFcpEventSupport<ListenerType> {
     Set<ListenerType> _listeners = Collections.synchronizedSet(new HashSet());

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSource.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSource.java   
    2007-06-18 00:26:54 UTC (rev 13642)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSource.java   
    2007-06-18 02:53:30 UTC (rev 13643)
@@ -7,10 +7,11 @@
 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;

 /**
- *
- * @author res
+ * Serves to hide the event-firing functionality.
+ * @author Ralph Smithen
  */
 public class FcpEventSource {
     private FcpEventSupportRepository _repository;
@@ -23,7 +24,7 @@
         _repository.getConnectionEventSupport().addListener(l);
     }

-    public void removeFcpConnectionListener(FcpConnectionListener l){
+    public void removeConnectionListener(FcpConnectionListener l){
         _repository.getConnectionEventSupport().removeListener(l);
     }

@@ -31,8 +32,24 @@
         _repository.getPeerListEventSupport().addListener(l);
     }

+    public void removePeerListListener(FcpPeerListListener l){
+        _repository.getPeerListEventSupport().removeListener(l);
+    }
+    
     public void addQueueListener(FcpQueueListener l){
         _repository.getQueueEventSupport().addListener(l);
     }
+    
+    public void removeQueueListener(FcpQueueListener l){
+        _repository.getQueueEventSupport().removeListener(l);
+    }
+    
+    public void addKeypairListener(FcpSSKKeypairListener l){
+        _repository.getSSKKeypairEventSupport().addListener(l);
+    }
+    
+    public void removeKeypairListener(FcpSSKKeypairListener l){
+        _repository.getSSKKeypairEventSupport().removeListener(l);
+    }

 }

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSupportRepository.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSupportRepository.java
    2007-06-18 00:26:54 UTC (rev 13642)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpEventSupportRepository.java
    2007-06-18 02:53:30 UTC (rev 13643)
@@ -5,14 +5,15 @@
 package org.freenet.contrib.fcp.event.support;

 /**
- *
- * @author res
+ * Holds references to all the client's event sources.
+ * @author Ralph Smithen
  */
 public class FcpEventSupportRepository {

    private FcpConnectionEventSupport _connectionEventSupport = new 
FcpConnectionEventSupport();
    private FcpPeerListEventSupport _peerListEventSupport = new 
FcpPeerListEventSupport();
    private FcpQueueEventSupport _queueEventSupport = new 
FcpQueueEventSupport();
+   private FcpSSKKeypairEventSupport _keypairEventSupport = new 
FcpSSKKeypairEventSupport();

     public FcpConnectionEventSupport getConnectionEventSupport() {
         return _connectionEventSupport;
@@ -25,5 +26,9 @@
     public FcpQueueEventSupport getQueueEventSupport() {
         return _queueEventSupport;
     }
+
+    public FcpSSKKeypairEventSupport getSSKKeypairEventSupport() {
+        return _keypairEventSupport;
+    }

 }

Added: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
                            (rev 0)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
    2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,30 @@
+/* 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.support;
+
+import java.util.logging.Logger;
+import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import 
org.freenet.contrib.fcp.event.support.AbstractFcpEventSupport.NotifyHelper;
+import org.freenet.contrib.fcp.listener.FcpSSKKeypairListener;
+import org.freenet.contrib.fcp.message.node.SSKKeypair;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public class FcpSSKKeypairEventSupport extends 
AbstractFcpEventSupport<FcpSSKKeypairListener>{
+    private static Logger logger = 
Logger.getLogger(FcpSSKKeypairEventSupport.class.getName());
+    
+    NotifyHelper _keypairReceivedNotifier = new 
NotifyHelper<SSKKeypairEvent>() {
+        void notifyListener(FcpSSKKeypairListener l, SSKKeypairEvent e) 
{l.keypairReceived(e);}
+    };   
+    
+    
+    
+    public void fireKeypairReceived(SSKKeypair kp){
+        _keypairReceivedNotifier.notifyListeners(new SSKKeypairEvent(kp));
+    }
+    
+}

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/package.html
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/package.html      
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/package.html      
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+  </head>
+  <body>
+      <h1>Event support</h1>
+      <p>
+          Provide support for events.
+      </p>
+  </body>
+</html>

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/package.html
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/package.html           
                (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/package.html   
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+  </head>
+  <body>
+      <h1>FCP event listener interfaces</h1>
+      <p>
+          Interfaces by which interested applications can register to listen 
for
+          FCP events.
+      </p>
+  </body>
+</html>

Copied: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/DataHoldingMessage.java 
(from rev 13635, 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/DataHoldingMessage.java)
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/DataHoldingMessage.java 
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/DataHoldingMessage.java 
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,16 @@
+/* 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;
+
+/**
+ *Interface for manipulating a message with a data payload.
+ *
+ * @author Ralph Smithen
+ */
+public interface DataHoldingMessage {
+    public byte[] getData();
+    public void setData(byte[] data);
+    public int getDataLength();
+}

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 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java 
2007-06-18 02:53:30 UTC (rev 13643)
@@ -12,33 +12,60 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
- *
- * @author res
+ * The superclass of all FCP messages.
+ * @author Ralph Smithen
  */
 public abstract class FcpMessage {
+    /**
+     * the name=value pairs of the message
+     */
     protected Map<String, String> _fields = new HashMap();
+    /**
+     * the name of the message
+     */
     protected String _headerString;

+    /**
+     * Creates new instance, assigns {@link #_headerString _headerString}.
+     */
     public FcpMessage(){
-//        String name = this.getClass().getName();
-//        _headerString = name.substring(name.lastIndexOf('.') + 1);
         _headerString = this.getClass().getSimpleName();
     }

+    /**
+     * Accessor for message's fields.
+     * @return the message fields
+     */
     public Map<String, String> getFields() {
         return _fields;
     }

+    /**
+     * Get the name of the message.
+     * @return the name
+     */
     public String getHeaderString(){
         return _headerString;
     }

+    /**
+     * Trigger the events upon receipt or transmission of a message.
+     * @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
+     */
     public String[] getMandatoryFields() {
         return new String[] {};
     }

+    /**
+     * Stream the message.
+     * @param out the stream to be written to
+     */
     public void writeMessage(PrintStream out){
         out.println(_headerString);
         for(Map.Entry entry : _fields.entrySet()){
@@ -48,6 +75,10 @@
     }


+    /**
+     * Get the text representation of the message.
+     * @return a <code>String</code> of the message's FCP representation
+     */
     public String getMessageString(){
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         writeMessage(new PrintStream(baos));

Added: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java  
                            (rev 0)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java  
    2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,120 @@
+/* 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.BufferedInputStream;
+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;
+
+/**
+ * Reads FCP node messages from a given stream.
+ * @author Ralph Smithen
+ */
+public class FcpMessageInputStream {
+    private static final String MESSAGE_PACKAGE = 
NodeMessage.class.getPackage().getName();
+    private DataInputStream _dis;
+    
+    /**
+     * Creates a new instance of FcpMessageStream, wraps a buffer around the 
<code>InputStream</code>.
+     * @param in the stream from which to read FCP data
+     */
+    public FcpMessageInputStream(InputStream in) {
+        _dis = new DataInputStream(new BufferedInputStream(in));
+    }
+    
+    String readLine() throws IOException{
+        StringBuffer sb = new StringBuffer();
+        byte b;
+        
+        while(true){
+            b = _dis.readByte();
+            
+            if(b == '\n'){
+                if(sb.length() == 0){ // blank line
+                    continue;
+                }else{ // end of line
+                    break;
+                }
+            }
+            sb.append((char) b);
+        }
+        String line = sb.toString();
+        return line.trim().length() == 0 ? readLine() : line;
+    }
+    
+    /**
+     * Reads and returns the next message.
+     * @return the next message
+     * @throws java.io.IOException if thrown on underlying stream
+     * @throws org.freenet.contrib.fcp.message.MessageBuilderException if the 
data seems garbled
+     */
+    public NodeMessage readMessage() throws IOException, 
MessageBuilderException{
+        NodeMessage m;
+        String line = readLine();
+        
+        try {
+            m = (NodeMessage) Class.forName(MESSAGE_PACKAGE + "." + 
line).newInstance();
+        } catch (Exception ex) {
+            throw new MessageBuilderException("unknown message header (" + 
line + ")");
+        }
+        while(readField(m))
+            ; // read all message fields
+        
+        String[] mandatoryFields = m.getMandatoryFields();
+        
+        for(String field : mandatoryFields){
+            
+            if(m.getFields().get(field) == null)
+                throw new MessageBuilderException(
+                        "mandatory field " + field + " not found in message " 
+ 
+                        m.getHeaderString());
+        }
+        
+        return m;
+    }
+    
+    boolean readField(NodeMessage m) throws IOException, 
MessageBuilderException{
+        String line = readLine();
+        
+        int pos = line.indexOf('=');
+        
+        if(pos > 0){ //set field value
+            m.getFields().put(line.substring(0, pos), line.substring(pos + 1));
+            return true;
+        }
+        
+        if(line.equals("EndMessage"))
+            return false;
+        
+        if(!line.equals("Data")){
+            throw new MessageBuilderException(
+                    "unknown tag (" + line + ") in message " + 
m.getHeaderString());
+        }
+        
+        DataHoldingMessage dhm = (DataHoldingMessage) m;
+        
+        byte[] data = new byte[dhm.getDataLength()];
+        _dis.read(data, 0, data.length);
+        
+        dhm.setData(data);
+        return false;
+    }
+
+    /**
+     * Closes the delegate stream.
+     * @throws java.io.IOException if thrown on underlying stream
+     */
+    public void close() throws IOException {
+        _dis.close();
+    }
+    
+}
+
+
+
+

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/package.html
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/package.html     
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/package.html     
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+  </head>
+  <body>
+      <h1>Client messages</h1>
+      <p>
+          Messages sent from the client to the node.
+      </p>
+  </body>
+</html>

Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/AllData.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/AllData.java       
2007-06-18 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/AllData.java       
2007-06-18 02:53:30 UTC (rev 13643)
@@ -7,17 +7,31 @@
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.DataHoldingMessage;

 /**
+ *For a ClientGet with ReturnType=direct, the data is returned directly to the 
client, 
+ * all at once, using the AllData message. Obviously in many situations this 
will not be desirable, 
+ * hence the other ReturnType options. Persistent direct requests will not 
send this 
+ * immediately on completion of the request; see GetRequestStatus.
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class AllData extends NodeMessage implements DataHoldingMessage{
     private String _uri;
-    /** Creates a new instance of DataFound */
+    private byte[] _data;
+    
+    /**
+     * Creates a new instance of AllData
+     */
     public AllData() {
     }

+
+    /**
+     * 
+     * @inheritDoc 
+     */
     public void fireEvents(FcpEventSupportRepository eventSupport) {
         eventSupport.getQueueEventSupport().fireAllData(this);
     }
@@ -38,12 +52,12 @@
         _fields.put("DataLength", String.valueOf(dataLength));
     }

-    public String getData() {
-        return _fields.get("Data");
+    public byte[] getData() {
+        return _data;
     }

-    public void setData(String data) {
-        _fields.put("Data", data);
+    public void setData(byte[] data) {
+        _data = data;
     }

     public String getUri() {

Deleted: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/DataHoldingMessage.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/DataHoldingMessage.java
    2007-06-18 00:26:54 UTC (rev 13642)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/DataHoldingMessage.java
    2007-06-18 02:53:30 UTC (rev 13643)
@@ -1,15 +0,0 @@
-/* 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;
-
-/**
- *
- * @author res
- */
-public interface DataHoldingMessage {
-    public String getData();
-    public void setData(String data);
-    public int getDataLength();
-}

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeHello.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeHello.java     
2007-06-18 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeHello.java     
2007-06-18 02:53:30 UTC (rev 13643)
@@ -7,16 +7,65 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
+ *Sent from the Freenet node in response to a 
+ * {@link org.freenet.contrib.fcp.message.client.ClientHello ClientHello} 
message. The node tells us 
+ * what version it is, what protocol version it's using, whether testnet mode 
is enabled, and how many 
+ * compression codecs are currently supported (this is important with the 
StartedCompression message).
  *
- * @author res
+ * @author Ralph Smithen
  */
 public class NodeHello extends NodeMessage{

+    /**
+     * 
+     * @inheritDoc 
+     */
     public void fireEvents(FcpEventSupportRepository eventSupport) {
         eventSupport.getConnectionEventSupport().fireFcpConnected(this);
     }

+    public int getCompressionCodecs(){
+        return Integer.parseInt(_fields.get("CompressionCodecs"));
+    }
+    
+    public boolean isTestNet(){
+        return Boolean.parseBoolean(_fields.get("TestNet"));
+    }
+    
+    public String getNodeLanguage(){
+        return _fields.get("NodeLanguage");
+    }
+    
+    public String getExtRevision(){
+        return _fields.get("ExtRevision");
+    }
+    
+    public String getNode(){
+        return _fields.get("Node");
+    }
+    
+    public String getBuild(){
+        return _fields.get("Build");
+    }
+    
+    public String getFCPVersion(){
+        return _fields.get("FCPVersion");
+    }
+    
     public String getConnectionIdentifier(){
         return _fields.get("ConnectionIdentifier");
     }
+    
+    public String getRevision(){
+        return _fields.get("Revision");
+    }
+    
+    public String getVersion(){
+        return _fields.get("Version");
+    }
+    
+    public String getExtBuild(){
+        return _fields.get("ExtBuild");
+    }
+    
 }

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessage.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessage.java   
2007-06-18 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessage.java   
2007-06-18 02:53:30 UTC (rev 13643)
@@ -8,11 +8,10 @@
 import org.freenet.contrib.fcp.message.FcpMessage;

 /**
+ *All node messages are a subclass of this.
  *
- * @author res
+ * @author Ralph Smithen
  */
 public abstract class NodeMessage extends FcpMessage{

-
-
 }

Deleted: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessageBuilder.java
===================================================================
--- 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessageBuilder.java
    2007-06-18 00:26:54 UTC (rev 13642)
+++ 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/NodeMessageBuilder.java
    2007-06-18 02:53:30 UTC (rev 13643)
@@ -1,90 +0,0 @@
-/* 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.BufferedReader;
-import java.io.IOException;
-import java.util.logging.Logger;
-import org.freenet.contrib.fcp.FcpConnection;
-import org.freenet.contrib.fcp.message.FcpMessage;
-import org.freenet.contrib.fcp.message.MessageBuilderException;
-
-/**
- *
- * @author res
- */
-public class NodeMessageBuilder {
-    private static Logger logger = 
Logger.getLogger(NodeMessageBuilder.class.getName());
-    // FcpMessage
-    private NodeMessage _message;
-    
-    public void parse(BufferedReader in) throws MessageBuilderException, 
IOException{
-        String line;
-        boolean firstLine = true;
-        
-        while((line = in.readLine()) != null){
-            
-            if(line.trim().equals(""))
-                continue; // blank lines allowed for debugging
-            
-            
-            if(firstLine){
-                try {
-                    _message = (NodeMessage) Class.forName(
-                            this.getClass().getPackage().getName() + "." + 
line).newInstance();
-                    firstLine = false;
-                } catch (Exception ex) {
-                    throw new MessageBuilderException("unknown message header 
(" + line + ")");
-                }
-                continue;
-            }
-            
-            if(line.equals("EndMessage"))
-                break;
-            
-            
-            int pos = line.indexOf('=');
-            if(pos < 0){
-                if(line.equals("Data") && _message instanceof 
DataHoldingMessage){
-                    
-                    DataHoldingMessage m = (DataHoldingMessage) _message;
-                    char[] data = new char[m.getDataLength()];
-                    StringBuffer sb = new StringBuffer();
-                    char[] b = new char[4096];
-                    int read = 0, toRead = m.getDataLength();
-                    while(toRead > 0 && 
-                            (read = in.read(b, 0, toRead > b.length ? b.length 
: toRead)) != -1){
-                        sb.append(b, 0, read);
-                        toRead -= read;
-                    }
-                    m.setData(sb.toString());
-                    break;
-                    
-                }else{
-                    throw new MessageBuilderException(
-                            "unknown tag (" + line + ") in message " + 
_message.getHeaderString());
-                }
-                
-            }else
-               _message.getFields().put(line.substring(0, pos), 
line.substring(pos + 1));
-        }
-        
-        
-    }
-    
-    
-    public NodeMessage build() throws MessageBuilderException{
-        String[] mandatoryFields = _message.getMandatoryFields();
-        
-        for(String field : mandatoryFields){
-            if(((FcpMessage) _message).getFields().get(field) == null)
-                throw new MessageBuilderException(
-                        "mandatory field " + field + " not found in message " 
+ ((FcpMessage) _message).getHeaderString()
-                        );
-        }
-        
-        return _message;
-    }
-}

Modified: 
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/SSKKeypair.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/SSKKeypair.java    
2007-06-18 00:26:54 UTC (rev 13642)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/SSKKeypair.java    
2007-06-18 02:53:30 UTC (rev 13643)
@@ -7,10 +7,10 @@
 import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;

 /**
- * This is a message of the Freenet Client Protocol 2.0 (FCP 2.0).
- * It is sent from the Freenet node to a client program in response to the 
client 
- * issuing a GenerateSSK command.
- * @author res
+ * This is sent from the Freenet node to a client program in response to the 
client 
+ * issuing a {@link org.freenet.contrib.fcp.message.client.GenerateSSK 
GenerateSSK} command.
+ *
+ * @author Ralph Smithen
  */
 public class SSKKeypair extends NodeMessage{

@@ -23,7 +23,7 @@
      * @inheritDoc 
      */
     public void fireEvents(FcpEventSupportRepository eventSupport) {
-        
+        eventSupport.getSSKKeypairEventSupport().fireKeypairReceived(this);
     }

     public String getId() {

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/package.html
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/package.html       
                        (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/package.html       
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+  </head>
+  <body>
+      <h1>Node messages</h1>
+      <p>
+          Messages sent from the node to the client.
+      </p>
+  </body>
+</html>

Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/package.html
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/package.html            
                (rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/package.html    
2007-06-18 02:53:30 UTC (rev 13643)
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+  </head>
+  <body>
+      <h1>Message utility classes</h1>
+      <p>
+          Core classes for handling FCP messages.
+      </p>
+  </body>
+</html>


Reply via email to