Search in sources :

Example 1 with OCUpload

use of com.owncloud.android.db.OCUpload in project android by owncloud.

the class UploadsStorageManager method updateUploadInternal.

private int updateUploadInternal(Cursor c, UploadStatus status, UploadResult result, String remotePath, String localPath) {
    int r = 0;
    while (c.moveToNext()) {
        // read upload object and update
        OCUpload upload = createOCUploadFromCursor(c);
        String path = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_LOCAL_PATH));
        Log_OC.v(TAG, "Updating " + path + " with status:" + status + " and result:" + (result == null ? "null" : result.toString()) + " (old:" + upload.toFormattedString() + ")");
        upload.setUploadStatus(status);
        upload.setLastResult(result);
        upload.setRemotePath(remotePath);
        if (localPath != null) {
            upload.setLocalPath(localPath);
        }
        upload.setUploadEndTimestamp(Calendar.getInstance().getTimeInMillis());
        // store update upload object to db
        r = updateUpload(upload);
    }
    return r;
}
Also used : OCUpload(com.owncloud.android.db.OCUpload)

Example 2 with OCUpload

use of com.owncloud.android.db.OCUpload in project android by owncloud.

the class UploadsStorageManager method createOCUploadFromCursor.

private OCUpload createOCUploadFromCursor(Cursor c) {
    OCUpload upload = null;
    if (c != null) {
        String localPath = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_LOCAL_PATH));
        String remotePath = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_REMOTE_PATH));
        String accountName = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_ACCOUNT_NAME));
        upload = new OCUpload(localPath, remotePath, accountName);
        upload.setFileSize(c.getLong(c.getColumnIndex(ProviderTableMeta.UPLOADS_FILE_SIZE)));
        upload.setUploadId(c.getLong(c.getColumnIndex(ProviderTableMeta._ID)));
        upload.setUploadStatus(UploadStatus.fromValue(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_STATUS))));
        upload.setLocalAction(c.getInt(c.getColumnIndex((ProviderTableMeta.UPLOADS_LOCAL_BEHAVIOUR))));
        upload.setForceOverwrite(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_FORCE_OVERWRITE)) == 1);
        upload.setCreateRemoteFolder(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_IS_CREATE_REMOTE_FOLDER)) == 1);
        upload.setUploadEndTimestamp(c.getLong(c.getColumnIndex(ProviderTableMeta.UPLOADS_UPLOAD_END_TIMESTAMP)));
        upload.setLastResult(UploadResult.fromValue(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_LAST_RESULT))));
        upload.setCreatedBy(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_CREATED_BY)));
    }
    return upload;
}
Also used : OCUpload(com.owncloud.android.db.OCUpload)

Example 3 with OCUpload

use of com.owncloud.android.db.OCUpload in project android by nextcloud.

the class UploadsStorageManager method createOCUploadFromCursor.

private OCUpload createOCUploadFromCursor(Cursor c) {
    OCUpload upload = null;
    if (c != null) {
        String localPath = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_LOCAL_PATH));
        String remotePath = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_REMOTE_PATH));
        String accountName = c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_ACCOUNT_NAME));
        upload = new OCUpload(localPath, remotePath, accountName);
        upload.setFileSize(c.getLong(c.getColumnIndex(ProviderTableMeta.UPLOADS_FILE_SIZE)));
        upload.setUploadId(c.getLong(c.getColumnIndex(ProviderTableMeta._ID)));
        upload.setUploadStatus(UploadStatus.fromValue(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_STATUS))));
        upload.setLocalAction(c.getInt(c.getColumnIndex((ProviderTableMeta.UPLOADS_LOCAL_BEHAVIOUR))));
        upload.setForceOverwrite(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_FORCE_OVERWRITE)) == 1);
        upload.setCreateRemoteFolder(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_IS_CREATE_REMOTE_FOLDER)) == 1);
        upload.setUploadEndTimestamp(c.getLong(c.getColumnIndex(ProviderTableMeta.UPLOADS_UPLOAD_END_TIMESTAMP)));
        upload.setLastResult(UploadResult.fromValue(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_LAST_RESULT))));
        upload.setCreatedBy(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_CREATED_BY)));
        upload.setUseWifiOnly(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_IS_WIFI_ONLY)) == 1);
        upload.setWhileChargingOnly(c.getInt(c.getColumnIndex(ProviderTableMeta.UPLOADS_IS_WHILE_CHARGING_ONLY)) == 1);
        upload.setFolderUnlockToken(c.getString(c.getColumnIndex(ProviderTableMeta.UPLOADS_FOLDER_UNLOCK_TOKEN)));
    }
    return upload;
}
Also used : OCUpload(com.owncloud.android.db.OCUpload)

Example 4 with OCUpload

use of com.owncloud.android.db.OCUpload in project android by nextcloud.

the class FileUploader method onStartCommand.

/**
 * Entry point to add one or several files to the queue of uploads.
 *
 * New uploads are added calling to startService(), resulting in a call to
 * this method. This ensures the service will keep on working although the
 * caller activity goes away.
 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log_OC.d(TAG, "Starting command with id " + startId);
    startForeground(FOREGROUND_SERVICE_ID, mNotification);
    if (intent == null) {
        Log_OC.e(TAG, "Intent is null");
        return Service.START_NOT_STICKY;
    }
    boolean retry = intent.getBooleanExtra(KEY_RETRY, false);
    AbstractList<String> requestedUploads = new Vector<String>();
    if (!intent.hasExtra(KEY_ACCOUNT)) {
        Log_OC.e(TAG, "Not enough information provided in intent");
        return Service.START_NOT_STICKY;
    }
    Account account = intent.getParcelableExtra(KEY_ACCOUNT);
    if (!AccountUtils.exists(account, getApplicationContext())) {
        return Service.START_NOT_STICKY;
    }
    OwnCloudVersion ocv = AccountUtils.getServerVersion(account);
    boolean chunked = ocv.isChunkedUploadSupported();
    boolean onWifiOnly = intent.getBooleanExtra(KEY_WHILE_ON_WIFI_ONLY, false);
    boolean whileChargingOnly = intent.getBooleanExtra(KEY_WHILE_CHARGING_ONLY, false);
    if (!retry) {
        if (!(intent.hasExtra(KEY_LOCAL_FILE) || intent.hasExtra(KEY_FILE))) {
            Log_OC.e(TAG, "Not enough information provided in intent");
            return Service.START_NOT_STICKY;
        }
        String[] localPaths = null;
        String[] remotePaths = null;
        String[] mimeTypes = null;
        OCFile[] files = null;
        if (intent.hasExtra(KEY_FILE)) {
            Parcelable[] files_temp = intent.getParcelableArrayExtra(KEY_FILE);
            files = new OCFile[files_temp.length];
            System.arraycopy(files_temp, 0, files, 0, files_temp.length);
        } else {
            localPaths = intent.getStringArrayExtra(KEY_LOCAL_FILE);
            remotePaths = intent.getStringArrayExtra(KEY_REMOTE_FILE);
            mimeTypes = intent.getStringArrayExtra(KEY_MIME_TYPE);
        }
        boolean forceOverwrite = intent.getBooleanExtra(KEY_FORCE_OVERWRITE, false);
        int localAction = intent.getIntExtra(KEY_LOCAL_BEHAVIOUR, LOCAL_BEHAVIOUR_FORGET);
        boolean isCreateRemoteFolder = intent.getBooleanExtra(KEY_CREATE_REMOTE_FOLDER, false);
        int createdBy = intent.getIntExtra(KEY_CREATED_BY, UploadFileOperation.CREATED_BY_USER);
        if (intent.hasExtra(KEY_FILE) && files == null) {
            Log_OC.e(TAG, "Incorrect array for OCFiles provided in upload intent");
            return Service.START_NOT_STICKY;
        } else if (!intent.hasExtra(KEY_FILE)) {
            if (localPaths == null) {
                Log_OC.e(TAG, "Incorrect array for local paths provided in upload intent");
                return Service.START_NOT_STICKY;
            }
            if (remotePaths == null) {
                Log_OC.e(TAG, "Incorrect array for remote paths provided in upload intent");
                return Service.START_NOT_STICKY;
            }
            if (localPaths.length != remotePaths.length) {
                Log_OC.e(TAG, "Different number of remote paths and local paths!");
                return Service.START_NOT_STICKY;
            }
            files = new OCFile[localPaths.length];
            for (int i = 0; i < localPaths.length; i++) {
                files[i] = UploadFileOperation.obtainNewOCFileToUpload(remotePaths[i], localPaths[i], ((mimeTypes != null) ? mimeTypes[i] : null));
                if (files[i] == null) {
                    Log_OC.e(TAG, "obtainNewOCFileToUpload() returned null for remotePaths[i]:" + remotePaths[i] + " and localPaths[i]:" + localPaths[i]);
                    return Service.START_NOT_STICKY;
                }
            }
        }
        // at this point variable "OCFile[] files" is loaded correctly.
        String uploadKey = null;
        UploadFileOperation newUpload = null;
        try {
            for (int i = 0; i < files.length; i++) {
                OCUpload ocUpload = new OCUpload(files[i], account);
                ocUpload.setFileSize(files[i].getFileLength());
                ocUpload.setForceOverwrite(forceOverwrite);
                ocUpload.setCreateRemoteFolder(isCreateRemoteFolder);
                ocUpload.setCreatedBy(createdBy);
                ocUpload.setLocalAction(localAction);
                ocUpload.setUseWifiOnly(onWifiOnly);
                ocUpload.setWhileChargingOnly(whileChargingOnly);
                ocUpload.setUploadStatus(UploadStatus.UPLOAD_IN_PROGRESS);
                newUpload = new UploadFileOperation(account, files[i], ocUpload, chunked, forceOverwrite, localAction, this, onWifiOnly, whileChargingOnly);
                newUpload.setCreatedBy(createdBy);
                if (isCreateRemoteFolder) {
                    newUpload.setRemoteFolderToBeCreated();
                }
                newUpload.addDataTransferProgressListener(this);
                newUpload.addDataTransferProgressListener((FileUploaderBinder) mBinder);
                newUpload.addRenameUploadListener(this);
                Pair<String, String> putResult = mPendingUploads.putIfAbsent(account.name, files[i].getRemotePath(), newUpload);
                if (putResult != null) {
                    uploadKey = putResult.first;
                    requestedUploads.add(uploadKey);
                    // Save upload in database
                    long id = mUploadsStorageManager.storeUpload(ocUpload);
                    newUpload.setOCUploadId(id);
                }
            }
        } catch (IllegalArgumentException e) {
            Log_OC.e(TAG, "Not enough information provided in intent: " + e.getMessage());
            return START_NOT_STICKY;
        } catch (IllegalStateException e) {
            Log_OC.e(TAG, "Bad information provided in intent: " + e.getMessage());
            return START_NOT_STICKY;
        } catch (Exception e) {
            Log_OC.e(TAG, "Unexpected exception while processing upload intent", e);
            return START_NOT_STICKY;
        }
    // *** TODO REWRITE: block inserted to request A retry; too many code copied, no control exception ***/
    } else {
        if (!intent.hasExtra(KEY_ACCOUNT) || !intent.hasExtra(KEY_RETRY_UPLOAD)) {
            Log_OC.e(TAG, "Not enough information provided in intent: no KEY_RETRY_UPLOAD_KEY");
            return START_NOT_STICKY;
        }
        OCUpload upload = intent.getParcelableExtra(KEY_RETRY_UPLOAD);
        onWifiOnly = upload.isUseWifiOnly();
        whileChargingOnly = upload.isWhileChargingOnly();
        UploadFileOperation newUpload = new UploadFileOperation(account, null, upload, chunked, // TODO should be read from DB?
        upload.isForceOverwrite(), // TODO should be read from DB?
        upload.getLocalAction(), this, onWifiOnly, whileChargingOnly);
        newUpload.addDataTransferProgressListener(this);
        newUpload.addDataTransferProgressListener((FileUploaderBinder) mBinder);
        newUpload.addRenameUploadListener(this);
        Pair<String, String> putResult = mPendingUploads.putIfAbsent(account.name, upload.getRemotePath(), newUpload);
        if (putResult != null) {
            String uploadKey = putResult.first;
            requestedUploads.add(uploadKey);
            // Update upload in database
            upload.setUploadStatus(UploadStatus.UPLOAD_IN_PROGRESS);
            mUploadsStorageManager.updateUpload(upload);
        }
    }
    if (requestedUploads.size() > 0) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = requestedUploads;
        mServiceHandler.sendMessage(msg);
        sendBroadcastUploadsAdded();
    }
    return Service.START_NOT_STICKY;
}
Also used : Account(android.accounts.Account) OwnCloudAccount(com.owncloud.android.lib.common.OwnCloudAccount) Message(android.os.Message) Parcelable(android.os.Parcelable) UploadFileOperation(com.owncloud.android.operations.UploadFileOperation) OCFile(com.owncloud.android.datamodel.OCFile) OCUpload(com.owncloud.android.db.OCUpload) Vector(java.util.Vector) OwnCloudVersion(com.owncloud.android.lib.resources.status.OwnCloudVersion)

Example 5 with OCUpload

use of com.owncloud.android.db.OCUpload in project android by nextcloud.

the class UploadFileOperation method run.

@Override
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
protected RemoteOperationResult run(OwnCloudClient client) {
    mCancellationRequested.set(false);
    mUploadStarted.set(true);
    uploadsStorageManager = new UploadsStorageManager(mContext.getContentResolver(), mContext);
    for (OCUpload ocUpload : uploadsStorageManager.getAllStoredUploads()) {
        if (ocUpload.getUploadId() == getOCUploadId()) {
            ocUpload.setFileSize(0);
            uploadsStorageManager.updateUpload(ocUpload);
            break;
        }
    }
    String remoteParentPath = new File(getRemotePath()).getParent();
    remoteParentPath = remoteParentPath.endsWith(OCFile.PATH_SEPARATOR) ? remoteParentPath : remoteParentPath + OCFile.PATH_SEPARATOR;
    OCFile parent = getStorageManager().getFileByPath(remoteParentPath);
    // in case of a fresh upload with subfolder, where parent does not exist yet
    if (parent == null && mFolderUnlockToken.isEmpty()) {
        // try to create folder
        RemoteOperationResult result = grantFolderExistence(remoteParentPath, client);
        if (!result.isSuccess()) {
            return result;
        }
        parent = getStorageManager().getFileByPath(remoteParentPath);
        if (parent == null) {
            return new RemoteOperationResult(false, "Parent folder not found", HttpStatus.SC_NOT_FOUND);
        }
    }
    // parent file is not null anymore:
    // - it was created on fresh upload or
    // - resume of encrypted upload, then parent file exists already as unlock is only for direct parent
    mFile.setParentId(parent.getFileId());
    // the parent folder should exist as it is a resume of a broken upload
    if (!mFolderUnlockToken.isEmpty()) {
        UnlockFileOperation unlockFileOperation = new UnlockFileOperation(parent.getLocalId(), mFolderUnlockToken);
        RemoteOperationResult unlockFileOperationResult = unlockFileOperation.execute(client, true);
        if (!unlockFileOperationResult.isSuccess()) {
            return unlockFileOperationResult;
        }
    }
    // check if any parent is encrypted
    encryptedAncestor = FileStorageUtils.checkEncryptionStatus(parent, getStorageManager());
    mFile.setEncrypted(encryptedAncestor);
    if (encryptedAncestor) {
        Log_OC.d(TAG, "encrypted upload");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            return encryptedUpload(client, parent);
        } else {
            Log_OC.e(TAG, "Encrypted upload on old Android API");
            return new RemoteOperationResult(ResultCode.OLD_ANDROID_API);
        }
    } else {
        Log_OC.d(TAG, "normal upload");
        return normalUpload(client);
    }
}
Also used : OCFile(com.owncloud.android.datamodel.OCFile) OCUpload(com.owncloud.android.db.OCUpload) RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) UploadsStorageManager(com.owncloud.android.datamodel.UploadsStorageManager) RandomAccessFile(java.io.RandomAccessFile) OCFile(com.owncloud.android.datamodel.OCFile) RemoteFile(com.owncloud.android.lib.resources.files.RemoteFile) File(java.io.File) UnlockFileOperation(com.owncloud.android.lib.resources.files.UnlockFileOperation)

Aggregations

OCUpload (com.owncloud.android.db.OCUpload)11 OCFile (com.owncloud.android.datamodel.OCFile)5 File (java.io.File)4 Account (android.accounts.Account)3 UploadsStorageManager (com.owncloud.android.datamodel.UploadsStorageManager)3 RemoteOperationResult (com.owncloud.android.lib.common.operations.RemoteOperationResult)3 RemoteFile (com.owncloud.android.lib.resources.files.RemoteFile)3 RandomAccessFile (java.io.RandomAccessFile)3 FileUploader (com.owncloud.android.files.services.FileUploader)2 OnDatatransferProgressListener (com.owncloud.android.lib.common.network.OnDatatransferProgressListener)2 OperationCancelledException (com.owncloud.android.lib.common.operations.OperationCancelledException)2 SuppressLint (android.annotation.SuppressLint)1 ActivityNotFoundException (android.content.ActivityNotFoundException)1 Context (android.content.Context)1 Intent (android.content.Intent)1 Cursor (android.database.Cursor)1 Bitmap (android.graphics.Bitmap)1 Uri (android.net.Uri)1 Message (android.os.Message)1 Parcelable (android.os.Parcelable)1