/* 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.pluginmanager;
import freenet.clients.fcp.FCPConnectionInputHandler;
import freenet.clients.fcp.FCPPluginMessage;
import freenet.support.SimpleFieldSet;
import freenet.support.api.Bucket;
import freenet.support.io.ArrayBucket;
public abstract class PluginReplySender {
final String pluginname;
/**
* Identifier of the connection to the client. Randomly chosen for each connection.
*/
final String clientIdentifier;
/**
* Specified by the client through FCP via the "Identifier" field.
* As the client can specify this freely, it is not sufficient as an ID. Thats why there also is another {@link #clientIdentifier}.
*/
final String clientSideIdentifier;
/**
* @param clientIdentifier Identifier of the particular network connection to the client. Should be a random UUID chosen for each network connection.
* @param clientSideIdentifier Specified by the client through FCP via the "Identifier" field. As the client can specify this freely, it is not sufficient
* as an ID. Thats why there also is another parameter clientIdentifier.
*/
public PluginReplySender(String pluginname2, String clientIdentifier, String clientSideIdentifier) {
pluginname = pluginname2;
this.clientIdentifier = clientIdentifier;
this.clientSideIdentifier = clientSideIdentifier;
}
public String getPluginName() {
return pluginname;
}
/**
* @return An identifier of the connection specified by the client through FCP via the "Identifier" field.
* As the client can specify this freely, it is not sufficient as an ID. Thats why there also is {@link #getConnectionIdentifier()}.
*/
public String getIdentifier() {
return clientSideIdentifier;
}
public void send(SimpleFieldSet params) throws PluginNotFoundException {
send(params, (Bucket)null);
}
public void send(SimpleFieldSet params, byte[] data) throws PluginNotFoundException {
if (data == null)
send(params, (Bucket)null);
else
send(params, new ArrayBucket(data));
}
public abstract void send(SimpleFieldSet params, Bucket bucket) throws PluginNotFoundException;
/**
* <p>Gets an unique identifier of the connection to the client.</p>
* <p><b>Notice:</b> The client can cause one network connection to appear with different connection IDs by setting a different <i>Identifier</i> field in
* the contents of multiple FCP messages: The <i>Identifier</i> set by the client is part of the returned connection ID. See {@link #getIdentifier()}.</p>
*
* <p>This allows you to identify whether two PluginReplySender objects which you received through multiple callbacks of
* {@link FredPluginFCP#handle(PluginReplySender, SimpleFieldSet, Bucket, int)} belong to the same client connection:<br/>
* If the connection is the same, and the FCP field <i>Identifier</i> by the client is the same, the return value of this function is
* {@link String#equals(Object)}.<br/>
* If the return value is not equals(), then the PlugplinReplySenders belong to a different client, to a different connection of the same client, or
* to a different <i>Identifier</i> specified by the client.<br/></p>
*
* <p>This mechanism is necessary because the {@link FCPConnectionInputHandler} will create a fresh PluginReplySender for each message it receives from
* the same client. <br/>Therefore, object identity of the PluginReplySender is not sufficient for identifying connections.<br/>
* (Actually it creates a fresh {@link FCPPluginMessage} for every processes message, which in turn creates a fresh PluginReplySender).</p>
*/
public final String getConnectionIdentifier() {
return clientIdentifier + ":" + clientSideIdentifier;
}
}