Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27c89f2c authored by tobiasKaminsky's avatar tobiasKaminsky Committed by Andy Scherzinger
Browse files

resume chunked uploads

parent e6068f87
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -119,6 +119,10 @@ public class ChunkFromFileChannelRequestEntity implements RequestEntity, Progres
    }


    public void setmTransferred(long value) {
        mTransferred = value;
    }

    public void writeRequest(final OutputStream out) throws IOException {
        int readCount = 0;
        Iterator<OnDatatransferProgressListener> it = null;
+41 −12
Original line number Diff line number Diff line
@@ -24,13 +24,16 @@

package com.owncloud.android.lib.resources.files;

import android.content.Context;
import android.content.SharedPreferences;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.Random;
import java.util.LinkedHashSet;
import java.util.Set;

import org.apache.commons.httpclient.methods.PutMethod;

@@ -48,15 +51,13 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
    private static final String OC_CHUNKED_HEADER = "OC-Chunked";
    private static final String OC_CHUNK_SIZE_HEADER = "OC-Chunk-Size";
    private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName();

    public ChunkedUploadRemoteFileOperation(String storagePath, String remotePath, String mimeType){
        super(storagePath, remotePath, mimeType);
    }
    private Context mContext;

    public ChunkedUploadRemoteFileOperation(
            String storagePath, String remotePath, String mimeType, String requiredEtag
            String storagePath, String remotePath, String mimeType, String requiredEtag, Context context
    ){
		 super(storagePath, remotePath, mimeType, requiredEtag);
         mContext = context;
    }
    
    @Override
@@ -65,8 +66,13 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation

        FileChannel channel = null;
        RandomAccessFile raf = null;
        try {

        File file = new File(mLocalPath);
        SharedPreferences sharedPref = mContext.getApplicationContext().getSharedPreferences("com.nextcloud.PREFERENCE_upload", Context.MODE_PRIVATE);
        String chunkId = String.valueOf(Math.abs(file.getName().hashCode())).substring(0,8);
        Set<String> successfulChunks = sharedPref.getStringSet(chunkId, new LinkedHashSet<String>());

        try {
            raf = new RandomAccessFile(file, "r");
            channel = raf.getChannel();
            mEntity = new ChunkFromFileChannelRequestEntity(channel, mMimeType, CHUNK_SIZE, file);
@@ -77,12 +83,18 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation

            long offset = 0;
            String uriPrefix = client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath) +
                    "-chunking-" + Math.abs((new Random()).nextInt(9000)+1000) + "-" ;
                    "-chunking-" + chunkId + "-" ;
            long totalLength = file.length();
            long chunkCount = (long) Math.ceil((double)totalLength / CHUNK_SIZE);
            String chunkSizeStr = String.valueOf(CHUNK_SIZE);
            String totalLengthStr = String.valueOf(file.length());
            for (int chunkIndex = 0; chunkIndex < chunkCount ; chunkIndex++, offset += CHUNK_SIZE) {
                if (successfulChunks.contains(String.valueOf(chunkIndex))){
                    ((ChunkFromFileChannelRequestEntity) mEntity).setmTransferred(offset);
//                    ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset);
                    continue;
                }

                if (chunkIndex == chunkCount - 1) {
                    chunkSizeStr = String.valueOf(CHUNK_SIZE * chunkCount - totalLength);
                }
@@ -124,11 +136,28 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
                        ", chunk index " + chunkIndex + ", count " + chunkCount +
                        ", HTTP result status " + status);

                if (!isSuccess(status))
                if (isSuccess(status)){
                  successfulChunks.add(String.valueOf(chunkIndex));
                } else {
                    SharedPreferences.Editor editor = sharedPref.edit();
                    editor.putStringSet(chunkId, successfulChunks);
                    editor.commit();

                    break;
                }
            }

            if (isSuccess(status)){
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.remove(chunkId);
                editor.commit();
            }

        } finally {
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putStringSet(chunkId, successfulChunks);
            editor.commit();

            if (channel != null)
                channel.close();
            if (raf != null)