Author: toad
Date: 2007-05-25 19:33:40 +0000 (Fri, 25 May 2007)
New Revision: 13375
Modified:
trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
trunk/freenet/src/freenet/client/InsertException.java
trunk/freenet/src/freenet/client/async/BinaryBlob.java
trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
trunk/freenet/src/freenet/client/async/ClientPutter.java
trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
trunk/freenet/src/freenet/node/NodeARKInserter.java
trunk/freenet/src/freenet/node/SimpleSendableInsert.java
trunk/freenet/src/freenet/node/fcp/ClientGet.java
trunk/freenet/src/freenet/node/fcp/ClientPut.java
trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
trunk/freenet/src/freenet/node/fcp/PersistentPut.java
Log:
FCP binary blob insert support. Not tested yet.
Modified: trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
===================================================================
--- trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
2007-05-25 18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
2007-05-25 19:33:40 UTC (rev 13375)
@@ -137,7 +137,8 @@
InsertContext context = getInsertContext(true);
PutWaiter pw = new PutWaiter();
ClientPutter put = new ClientPutter(pw, insert.getData(),
insert.desiredURI, insert.clientMetadata,
- context, core.requestStarters.chkPutScheduler,
core.requestStarters.sskPutScheduler, priorityClass, getCHKOnly, isMetadata,
this, null, filenameHint);
+ context, core.requestStarters.chkPutScheduler,
core.requestStarters.sskPutScheduler, priorityClass,
+ getCHKOnly, isMetadata, this, null,
filenameHint, false);
put.start(false);
return pw.waitForCompletion();
}
Modified: trunk/freenet/src/freenet/client/InsertException.java
===================================================================
--- trunk/freenet/src/freenet/client/InsertException.java 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/client/InsertException.java 2007-05-25
19:33:40 UTC (rev 13375)
@@ -94,6 +94,8 @@
public static final int CANCELLED = 10;
/** Meta string used in the key (most probably '/') */
public static final int META_STRINGS_NOT_SUPPORTED = 11;
+ /** Invalid binary blob data supplied so cannot insert it */
+ public static final int BINARY_BLOB_FORMAT_ERROR = 12;
public static String getMessage(int mode) {
String ret = L10n.getString("InsertException.longError."+mode);
@@ -123,6 +125,7 @@
case COLLISION:
case CANCELLED:
case META_STRINGS_NOT_SUPPORTED:
+ case BINARY_BLOB_FORMAT_ERROR:
return true;
case BUCKET_ERROR: // maybe
case INTERNAL_ERROR: // maybe
Modified: trunk/freenet/src/freenet/client/async/BinaryBlob.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BinaryBlob.java 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/client/async/BinaryBlob.java 2007-05-25
19:33:40 UTC (rev 13375)
@@ -36,6 +36,7 @@
static final short BLOB_BLOCK_VERSION = 0;
static final short BLOB_END = 2;
static final short BLOB_END_VERSION = 0;
+ public static final String MIME_TYPE =
"application/x-freenet-binary-blob";
static void writeBlobHeader(DataOutputStream binaryBlobStream, short
type, short version, int length) throws IOException {
binaryBlobStream.writeInt(length);
binaryBlobStream.writeShort(type);
Modified: trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
2007-05-25 18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
2007-05-25 19:33:40 UTC (rev 13375)
@@ -8,17 +8,18 @@
import com.onionnetworks.util.FileUtil;
import freenet.client.FailureCodeTracker;
+import freenet.client.InsertContext;
import freenet.client.InsertException;
+import freenet.keys.CHKBlock;
import freenet.keys.Key;
import freenet.keys.KeyBlock;
import freenet.keys.KeyVerifyException;
+import freenet.keys.SSKBlock;
import freenet.node.LowLevelPutException;
-import freenet.node.NodeClientCore;
import freenet.node.SimpleSendableInsert;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
import freenet.support.api.Bucket;
-import freenet.support.api.BucketFactory;
public class BinaryBlobInserter implements ClientPutState {
@@ -26,19 +27,18 @@
final Object clientContext;
final MySendableInsert[] inserters;
final FailureCodeTracker errors;
- final short maxRetries;
- final short consecutiveRNFsCountAsSuccess;
+ final int maxRetries;
+ final int consecutiveRNFsCountAsSuccess;
private boolean logMINOR;
private int completedBlocks;
private int succeededBlocks;
private boolean fatal;
- BinaryBlobInserter(Bucket blob, ClientPutter parent, BucketFactory bf,
Object clientContext, boolean tolerant, NodeClientCore core,
- short prioClass, short maxRetries, short
consecutiveRNFsCountAsSuccess)
+ BinaryBlobInserter(Bucket blob, ClientPutter parent, Object
clientContext, boolean tolerant, short prioClass, InsertContext ctx)
throws IOException, BinaryBlobFormatException {
logMINOR = Logger.shouldLog(Logger.MINOR, this);
- this.maxRetries = maxRetries;
- this.consecutiveRNFsCountAsSuccess =
consecutiveRNFsCountAsSuccess;
+ this.maxRetries = ctx.maxInsertRetries;
+ this.consecutiveRNFsCountAsSuccess =
ctx.consecutiveRNFsCountAsSuccess;
this.parent = parent;
this.clientContext = clientContext;
this.errors = new FailureCodeTracker(true);
@@ -96,7 +96,7 @@
}
MySendableInsert inserter =
- new MySendableInsert(i, core, block,
prioClass);
+ new MySendableInsert(i, block,
prioClass, getScheduler(block), clientContext);
myInserters.add(inserter);
@@ -113,6 +113,14 @@
parent.addMustSucceedBlocks(inserters.length);
}
+ private ClientRequestScheduler getScheduler(KeyBlock block) {
+ if(block instanceof CHKBlock)
+ return parent.chkScheduler;
+ else if(block instanceof SSKBlock)
+ return parent.sskScheduler;
+ else throw new IllegalArgumentException("Unknown block type
"+block.getClass()+" : "+block);
+ }
+
public void cancel() {
for(int i=0;i<inserters.length;i++) {
if(inserters[i] != null)
@@ -146,8 +154,8 @@
private int consecutiveRNFs;
private int retries;
- public MySendableInsert(int i, NodeClientCore core, KeyBlock
block, short prioClass) {
- super(core, block, prioClass);
+ public MySendableInsert(int i, KeyBlock block, short prioClass,
ClientRequestScheduler scheduler, Object client) {
+ super(block, prioClass, client, scheduler);
this.blockNum = i;
}
Modified: trunk/freenet/src/freenet/client/async/ClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientPutter.java 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/client/async/ClientPutter.java 2007-05-25
19:33:40 UTC (rev 13375)
@@ -3,6 +3,8 @@
* http://www.gnu.org/ for further details of the GPL. */
package freenet.client.async;
+import java.io.IOException;
+
import freenet.client.ClientMetadata;
import freenet.client.InsertBlock;
import freenet.client.InsertContext;
@@ -28,6 +30,7 @@
private final boolean getCHKOnly;
private final boolean isMetadata;
private boolean startedStarting;
+ private final boolean binaryBlob;
private FreenetURI uri;
/** SimpleFieldSet containing progress information from last startup.
* Will be progressively cleared during startup. */
@@ -50,7 +53,7 @@
*/
public ClientPutter(ClientCallback client, Bucket data, FreenetURI
targetURI, ClientMetadata cm, InsertContext ctx,
ClientRequestScheduler chkScheduler,
ClientRequestScheduler sskScheduler, short priorityClass, boolean getCHKOnly,
- boolean isMetadata, Object clientContext,
SimpleFieldSet stored, String targetFilename) {
+ boolean isMetadata, Object clientContext,
SimpleFieldSet stored, String targetFilename, boolean binaryBlob) {
super(priorityClass, chkScheduler, sskScheduler, clientContext);
this.cm = cm;
this.isMetadata = isMetadata;
@@ -63,6 +66,7 @@
this.cancelled = false;
this.oldProgress = stored;
this.targetFilename = targetFilename;
+ this.binaryBlob = binaryBlob;
}
public void start(boolean earlyEncode) throws InsertException {
@@ -89,8 +93,13 @@
if(currentState != null) return false;
cancel = this.cancelled;
if(!cancel) {
- currentState =
- new SingleFileInserter(this,
this, new InsertBlock(data, cm, targetURI), isMetadata, ctx, false, getCHKOnly,
false, null, false, false, targetFilename, earlyEncode);
+ if(!binaryBlob)
+ currentState =
+ new
SingleFileInserter(this, this, new InsertBlock(data, cm, targetURI),
isMetadata, ctx,
+ false,
getCHKOnly, false, null, false, false, targetFilename, earlyEncode);
+ else
+ currentState =
+ new
BinaryBlobInserter(data, this, null, false, priorityClass, ctx);
}
}
if(cancel) {
@@ -126,7 +135,29 @@
if (this.client!=null) {
this.client.onFailure(e, this);
}
- }
+ } catch (IOException e) {
+ Logger.error(this, "Failed to start insert: "+e, e);
+ synchronized(this) {
+ finished = true;
+ oldProgress = null;
+ currentState = null;
+ }
+ // notify the client that the insert could not even be
started
+ if (this.client!=null) {
+ this.client.onFailure(new
InsertException(InsertException.BUCKET_ERROR, e, null), this);
+ }
+ } catch (BinaryBlobFormatException e) {
+ Logger.error(this, "Failed to start insert: "+e, e);
+ synchronized(this) {
+ finished = true;
+ oldProgress = null;
+ currentState = null;
+ }
+ // notify the client that the insert could not even be
started
+ if (this.client!=null) {
+ this.client.onFailure(new
InsertException(InsertException.BINARY_BLOB_FORMAT_ERROR, e, null), this);
+ }
+ }
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Started "+this);
return true;
Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-05-25
19:33:40 UTC (rev 13375)
@@ -356,6 +356,7 @@
IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet was unable to
determine your external IP address (or the IP address of your NAT-device or
firewall). You can still exchange references with other people, however this
will only work if the other user is not behind a NAT-device or firewall. As
soon as you have connected to one other user in this way, Freenet will be able
to determine your external IP address. You can determine your current IP
address and tell your node with the 'Temporary IP address hint'
${link}configuration parameter${/link}. Also, it would be a good idea to
forward the port ${port} on your router for UDP to make it easy to connect to
your node.
InsertException.longError.10=Cancelled by user
InsertException.longError.11=Meta string (most likely a '/') used in the URI
+InsertException.longError.12=Binary blob format error
InsertException.longError.1=Caller supplied a URI we cannot use"
InsertException.longError.2=Internal bucket error: out of disk
space/permissions problem?
InsertException.longError.3=Internal error
@@ -367,6 +368,7 @@
InsertException.longError.9=Insert collided with different, pre-existing data
at the same key
InsertException.shortError.10=Cancelled
InsertException.shortError.11=Meta string used in the key
+InsertException.shortError.12=Binary blob format error
InsertException.shortError.1=Invalid URI
InsertException.shortError.2=Temp files error
InsertException.shortError.3=Internal error
Modified: trunk/freenet/src/freenet/node/NodeARKInserter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeARKInserter.java 2007-05-25 18:45:27 UTC
(rev 13374)
+++ trunk/freenet/src/freenet/node/NodeARKInserter.java 2007-05-25 19:33:40 UTC
(rev 13375)
@@ -140,7 +140,8 @@
inserter = new ClientPutter(this, b, uri,
new ClientMetadata("text/plain") /* it
won't quite fit in an SSK anyway */,
node.clientCore.makeClient((short)0,
true).getInsertContext(true),
-
node.clientCore.requestStarters.chkPutScheduler,
node.clientCore.requestStarters.sskPutScheduler,
RequestStarter.INTERACTIVE_PRIORITY_CLASS, false, false, this, null, null);
+
node.clientCore.requestStarters.chkPutScheduler,
node.clientCore.requestStarters.sskPutScheduler,
+
RequestStarter.INTERACTIVE_PRIORITY_CLASS, false, false, this, null, null,
false);
try {
Modified: trunk/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- trunk/freenet/src/freenet/node/SimpleSendableInsert.java 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/node/SimpleSendableInsert.java 2007-05-25
19:33:40 UTC (rev 13375)
@@ -3,7 +3,7 @@
* http://www.gnu.org/ for further details of the GPL. */
package freenet.node;
-import freenet.client.InsertException;
+import freenet.client.async.ClientRequestScheduler;
import freenet.client.async.ClientRequester;
import freenet.keys.CHKBlock;
import freenet.keys.KeyBlock;
@@ -18,17 +18,31 @@
*/
public class SimpleSendableInsert extends SendableInsert {
- public final NodeClientCore node;
public final KeyBlock block;
public final short prioClass;
private boolean finished;
+ public final Object client;
+ public final ClientRequestScheduler scheduler;
- public SimpleSendableInsert(NodeClientCore node, KeyBlock block, short
prioClass) {
- this.node = node;
+ public SimpleSendableInsert(NodeClientCore core, KeyBlock block, short
prioClass) {
this.block = block;
this.prioClass = prioClass;
+ this.client = core;
+ if(block instanceof CHKBlock)
+ scheduler = core.requestStarters.chkPutScheduler;
+ else if(block instanceof SSKBlock)
+ scheduler = core.requestStarters.sskPutScheduler;
+ else
+ throw new IllegalArgumentException("Don't know what to
do with "+block, new Exception());
}
+ public SimpleSendableInsert(KeyBlock block, short prioClass, Object
client, ClientRequestScheduler scheduler) {
+ this.block = block;
+ this.prioClass = prioClass;
+ this.client = client;
+ this.scheduler = scheduler;
+ }
+
public void onSuccess() {
// Yay!
if(Logger.shouldLog(Logger.MINOR, this))
@@ -67,7 +81,7 @@
}
public Object getClient() {
- return node;
+ return client;
}
public ClientRequester getClientRequest() {
@@ -84,12 +98,7 @@
public void schedule() {
finished = false; // can reschedule
- if(block instanceof CHKBlock)
- node.requestStarters.chkPutScheduler.register(this);
- else if(block instanceof SSKBlock)
- node.requestStarters.sskPutScheduler.register(this);
- else
- Logger.error(this, "Don't know what to do with "+block,
new Exception());
+ scheduler.register(this);
}
public void cancel() {
Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java 2007-05-25 18:45:27 UTC
(rev 13374)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java 2007-05-25 19:33:40 UTC
(rev 13375)
@@ -12,6 +12,7 @@
import freenet.client.FetchResult;
import freenet.client.InsertException;
import freenet.client.async.BaseClientPutter;
+import freenet.client.async.BinaryBlob;
import freenet.client.async.ClientCallback;
import freenet.client.async.ClientGetter;
import freenet.client.async.ClientRequester;
@@ -366,7 +367,7 @@
if(!binaryBlob)
this.foundDataMimeType = result.getMimeType();
else
- this.foundDataMimeType =
"application/x-freenet-binary-blob";
+ this.foundDataMimeType = BinaryBlob.MIME_TYPE;
this.succeeded = true;
finished = true;
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java 2007-05-25 18:45:27 UTC
(rev 13374)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java 2007-05-25 19:33:40 UTC
(rev 13375)
@@ -17,6 +17,7 @@
import freenet.client.InsertException;
import freenet.client.Metadata;
import freenet.client.MetadataUnresolvedException;
+import freenet.client.async.BinaryBlob;
import freenet.client.async.ClientGetter;
import freenet.client.async.ClientPutter;
import freenet.crypt.SHA256;
@@ -48,6 +49,8 @@
/** Filename if the file has one */
private final String targetFilename;
private boolean logMINOR;
+ /** If true, we are inserting a binary blob: No metadata, no URI is
generated. */
+ private final boolean binaryBlob;
/**
* Creates a new persistent insert.
@@ -105,6 +108,7 @@
}
logMINOR = Logger.shouldLog(Logger.MINOR, this);
+ binaryBlob = false;
this.targetFilename = targetFilename;
this.uploadFrom = uploadFromType;
this.origFilename = origFilename;
@@ -144,7 +148,7 @@
if(logMINOR) Logger.minor(this, "data = "+data+", uploadFrom =
"+ClientPutMessage.uploadFromString(uploadFrom));
putter = new ClientPutter(this, data, uri, cm,
ctx,
client.core.requestStarters.chkPutScheduler,
client.core.requestStarters.sskPutScheduler, priorityClass,
- getCHKOnly, isMetadata, client.lowLevelClient,
null, targetFilename);
+ getCHKOnly, isMetadata, client.lowLevelClient,
null, targetFilename, binaryBlob);
if(persistenceType != PERSIST_CONNECTION) {
FCPMessage msg = persistentTagMessage();
client.queueClientRequestMessage(msg, 0);
@@ -157,6 +161,7 @@
message.getCHKOnly, message.dontCompress,
message.maxRetries, message.earlyEncode);
String salt = null;
byte[] saltedHash = null;
+ binaryBlob = message.binaryBlob;
if(message.uploadFromType == ClientPutMessage.UPLOAD_FROM_DISK)
{
if(!handler.server.core.allowUploadFrom(message.origFilename))
@@ -179,6 +184,11 @@
this.origFilename = message.origFilename;
// Now go through the fields one at a time
String mimeType = message.contentType;
+ if(binaryBlob) {
+ if(mimeType != null &&
!mimeType.equals(BinaryBlob.MIME_TYPE)) {
+ throw new
MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "No MIME type
allowed when inserting a binary blob", identifier, global);
+ }
+ }
if(mimeType == null && origFilename != null) {
mimeType =
DefaultMIMETypes.guessMIMEType(origFilename.getName(), true);
}
@@ -240,7 +250,7 @@
if(logMINOR) Logger.minor(this, "data = "+data+", uploadFrom =
"+ClientPutMessage.uploadFromString(uploadFrom));
putter = new ClientPutter(this, data, uri, cm,
ctx,
client.core.requestStarters.chkPutScheduler,
client.core.requestStarters.sskPutScheduler, priorityClass,
- getCHKOnly, isMetadata, client.lowLevelClient,
null, targetFilename);
+ getCHKOnly, isMetadata, client.lowLevelClient,
null, targetFilename, binaryBlob);
if(persistenceType != PERSIST_CONNECTION) {
FCPMessage msg = persistentTagMessage();
client.queueClientRequestMessage(msg, 0);
@@ -277,6 +287,7 @@
boolean isMetadata = false;
+ binaryBlob = fs.getBoolean("BinaryBlob", false);
targetFilename = fs.get("TargetFilename");
if(uploadFrom == ClientPutMessage.UPLOAD_FROM_DISK) {
@@ -331,7 +342,8 @@
SimpleFieldSet oldProgress = fs.subset("progress");
if(finished) oldProgress = null; // Not useful any more
putter = new ClientPutter(this, data, uri, cm, ctx,
client.core.requestStarters.chkPutScheduler,
- client.core.requestStarters.sskPutScheduler,
priorityClass, getCHKOnly, isMetadata, client.lowLevelClient, oldProgress,
targetFilename);
+ client.core.requestStarters.sskPutScheduler,
priorityClass, getCHKOnly, isMetadata,
+ client.lowLevelClient, oldProgress,
targetFilename, binaryBlob);
if(persistenceType != PERSIST_CONNECTION) {
FCPMessage msg = persistentTagMessage();
client.queueClientRequestMessage(msg, 0);
@@ -396,6 +408,7 @@
if(targetFilename != null)
fs.putSingle("TargetFilename", targetFilename);
fs.putSingle("EarlyEncode", Boolean.toString(earlyEncode));
+ fs.put("BinaryBlob", binaryBlob);
return fs;
}
@@ -407,7 +420,7 @@
protected FCPMessage persistentTagMessage() {
return new PersistentPut(identifier, publicURI, verbosity,
priorityClass, uploadFrom, targetURI,
persistenceType, origFilename,
clientMetadata.getMIMEType(), client.isGlobalQueue,
- getDataSize(), clientToken, started,
ctx.maxInsertRetries, targetFilename);
+ getDataSize(), clientToken, started,
ctx.maxInsertRetries, targetFilename, binaryBlob);
}
protected String getTypeName() {
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java 2007-05-25
19:33:40 UTC (rev 13375)
@@ -64,6 +64,7 @@
/** Filename (hint for the final filename) */
final String targetFilename;
final boolean earlyEncode;
+ final boolean binaryBlob;
public static final short UPLOAD_FROM_DIRECT = 0;
public static final short UPLOAD_FROM_DISK = 1;
@@ -72,6 +73,7 @@
public ClientPutMessage(SimpleFieldSet fs) throws
MessageInvalidException {
String fnam = null;
identifier = fs.get("Identifier");
+ binaryBlob = fs.getBoolean("BinaryBlob", false);
global = Fields.stringToBool(fs.get("Global"), false);
if(identifier == null)
throw new
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "No Identifier",
null, global);
@@ -226,6 +228,7 @@
sfs.putSingle("PersistenceType",
ClientRequest.persistenceTypeString(persistenceType));
sfs.putSingle("DontCompress", Boolean.toString(dontCompress));
sfs.putSingle("Global", Boolean.toString(global));
+ sfs.put("BinaryBlob", binaryBlob);
return sfs;
}
Modified: trunk/freenet/src/freenet/node/fcp/PersistentPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPut.java 2007-05-25
18:45:27 UTC (rev 13374)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPut.java 2007-05-25
19:33:40 UTC (rev 13375)
@@ -28,11 +28,13 @@
final boolean started;
final int maxRetries;
final String targetFilename;
+ final boolean binaryBlob;
public PersistentPut(String identifier, FreenetURI uri, int verbosity,
short priorityClass, short uploadFrom, FreenetURI
targetURI,
short persistenceType, File origFilename, String
mimeType,
- boolean global, long size, String clientToken, boolean
started, int maxRetries, String targetFilename) {
+ boolean global, long size, String clientToken, boolean
started,
+ int maxRetries, String targetFilename, boolean
binaryBlob) {
this.identifier = identifier;
this.uri = uri;
this.verbosity = verbosity;
@@ -48,6 +50,7 @@
this.started = started;
this.maxRetries = maxRetries;
this.targetFilename = targetFilename;
+ this.binaryBlob = binaryBlob;
}
public SimpleFieldSet getFieldSet() {
@@ -73,6 +76,8 @@
fs.put("MaxRetries", maxRetries);
if(targetFilename != null)
fs.putSingle("TargetFilename", targetFilename);
+ if(binaryBlob)
+ fs.put("BinaryBlob", binaryBlob);
return fs;
}