1 package eu
.alefzero
.webdav
; 
   4 import java
.io
.IOException
; 
   5 import java
.io
.OutputStream
; 
   6 import java
.io
.RandomAccessFile
; 
   7 import java
.nio
.ByteBuffer
; 
   8 import java
.nio
.channels
.FileChannel
; 
   9 import java
.nio
.channels
.FileLock
; 
  10 import java
.util
.Collection
; 
  11 import java
.util
.HashSet
; 
  12 import java
.util
.Iterator
; 
  15 import org
.apache
.commons
.httpclient
.methods
.RequestEntity
; 
  17 import eu
.alefzero
.webdav
.OnDatatransferProgressListener
; 
  19 import android
.util
.Log
; 
  23  * A RequestEntity that represents a File. 
  26 public class FileRequestEntity 
implements RequestEntity 
{ 
  29     final String mContentType
; 
  30     Set
<OnDatatransferProgressListener
> mDataTransferListeners 
= new HashSet
<OnDatatransferProgressListener
>(); 
  32     public FileRequestEntity(final File file
, final String contentType
) { 
  35         this.mContentType 
= contentType
; 
  37             throw new IllegalArgumentException("File may not be null"); 
  42     public long getContentLength() { 
  43         return mFile
.length(); 
  47     public String 
getContentType() { 
  52     public boolean isRepeatable() { 
  56     public void addOnDatatransferProgressListener(OnDatatransferProgressListener listener
) { 
  57         mDataTransferListeners
.add(listener
); 
  60     public void addOnDatatransferProgressListeners(Collection
<OnDatatransferProgressListener
> listeners
) { 
  61         mDataTransferListeners
.addAll(listeners
); 
  64     public void removeOnDatatransferProgressListener(OnDatatransferProgressListener listener
) { 
  65         mDataTransferListeners
.remove(listener
); 
  70     public void writeRequest(final OutputStream out
) throws IOException 
{ 
  71         //byte[] tmp = new byte[4096]; 
  72         ByteBuffer tmp 
= ByteBuffer
.allocate(4096); 
  75         // TODO(bprzybylski): each mem allocation can throw OutOfMemoryError we need to handle it 
  76         //                    globally in some fashionable manner 
  77         RandomAccessFile raf 
= new RandomAccessFile(mFile
, "rw"); 
  78         FileChannel channel 
= raf
.getChannel(); 
  79         FileLock lock 
= channel
.tryLock(); 
  80         Iterator
<OnDatatransferProgressListener
> it 
= null
; 
  82         long size 
= mFile
.length(); 
  83         if (size 
== 0) size 
= -1; 
  85             while ((readResult 
= channel
.read(tmp
)) >= 0) { 
  86                 out
.write(tmp
.array(), 0, readResult
); 
  88                 transferred 
+= readResult
; 
  89                 it 
= mDataTransferListeners
.iterator(); 
  90                 while (it
.hasNext()) { 
  91                     it
.next().onTransferProgress(readResult
, transferred
, size
, mFile
.getName()); 
  95         } catch (IOException io
) { 
  96             Log
.e("FileRequestException", io
.getMessage()); 
  97             throw new RuntimeException("Ugly solution to workaround the default policy of retries when the server falls while uploading ; temporal fix; really", io
);