package org.commcare.android.io; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.http.entity.mime.MultipartEntity; import org.commcare.android.tasks.DataSubmissionListener; import android.util.Log; /** * @author ctsims * */ public class DataSubmissionEntity extends MultipartEntity { private DataSubmissionListener listener; private int submissionId; private int attempt = 1; public DataSubmissionEntity(DataSubmissionListener listener, int submissionId) { super(); this.listener = listener; this.submissionId = submissionId; } /* * (non-Javadoc) * @see org.apache.http.entity.mime.MultipartEntity#isRepeatable() */ @Override public boolean isRepeatable() { return true; } /* (non-Javadoc) * @see org.apache.http.entity.mime.MultipartEntity#writeTo(java.io.OutputStream) */ @Override public void writeTo(OutputStream outstream) throws IOException { if(attempt != 1) { Log.i("commcare-transport", "Retrying submission, attempt #" + attempt); } super.writeTo(new CountingOutputStream(outstream, listener, submissionId)); attempt++; } private class CountingOutputStream extends FilterOutputStream { private final DataSubmissionListener listener; private long transferred; private int submissionId; public CountingOutputStream(final OutputStream out, final DataSubmissionListener listener, int submissionId) { super(out); this.listener = listener; this.transferred = 0; this.submissionId = submissionId; } public void write(byte[] b, int off, int len) throws IOException { out.write(b, off, len); this.transferred += len; if(listener != null) { this.listener.notifyProgress(submissionId, this.transferred); } } public void write(int b) throws IOException { out.write(b); this.transferred++; if(listener != null) { this.listener.notifyProgress(submissionId, this.transferred); } } } }