mirror of
https://github.com/owncloud/android-library.git
synced 2025-06-08 00:16:09 +00:00
Merge pull request #146 from owncloud/improve_error_feedback
Keep HTTP phrase in RemoteOperationResult as fallback user message
This commit is contained in:
commit
bdcab895a5
@ -45,6 +45,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
|
|||||||
import org.apache.commons.httpclient.ConnectTimeoutException;
|
import org.apache.commons.httpclient.ConnectTimeoutException;
|
||||||
import org.apache.commons.httpclient.Header;
|
import org.apache.commons.httpclient.Header;
|
||||||
import org.apache.commons.httpclient.HttpException;
|
import org.apache.commons.httpclient.HttpException;
|
||||||
|
import org.apache.commons.httpclient.HttpMethod;
|
||||||
import org.apache.commons.httpclient.HttpStatus;
|
import org.apache.commons.httpclient.HttpStatus;
|
||||||
import org.apache.jackrabbit.webdav.DavException;
|
import org.apache.jackrabbit.webdav.DavException;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
@ -63,9 +64,8 @@ import javax.net.ssl.SSLException;
|
|||||||
public class RemoteOperationResult implements Serializable {
|
public class RemoteOperationResult implements Serializable {
|
||||||
|
|
||||||
/** Generated - should be refreshed every time the class changes!! */
|
/** Generated - should be refreshed every time the class changes!! */
|
||||||
;
|
private static final long serialVersionUID = 4968939884332372230L;
|
||||||
|
|
||||||
private static final long serialVersionUID = -1909603208238358633L;
|
|
||||||
private static final String TAG = RemoteOperationResult.class.getSimpleName();
|
private static final String TAG = RemoteOperationResult.class.getSimpleName();
|
||||||
|
|
||||||
public enum ResultCode {
|
public enum ResultCode {
|
||||||
@ -120,6 +120,7 @@ public class RemoteOperationResult implements Serializable {
|
|||||||
|
|
||||||
private boolean mSuccess = false;
|
private boolean mSuccess = false;
|
||||||
private int mHttpCode = -1;
|
private int mHttpCode = -1;
|
||||||
|
private String mHttpPhrase = null;
|
||||||
private Exception mException = null;
|
private Exception mException = null;
|
||||||
private ResultCode mCode = ResultCode.UNKNOWN_ERROR;
|
private ResultCode mCode = ResultCode.UNKNOWN_ERROR;
|
||||||
private String mRedirectedLocation;
|
private String mRedirectedLocation;
|
||||||
@ -128,6 +129,13 @@ public class RemoteOperationResult implements Serializable {
|
|||||||
|
|
||||||
private ArrayList<Object> mData;
|
private ArrayList<Object> mData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public constructor from result code.
|
||||||
|
*
|
||||||
|
* To be used when the caller takes the responsibility of interpreting the result of a {@link RemoteOperation}
|
||||||
|
*
|
||||||
|
* @param code {@link ResultCode} decided by the caller.
|
||||||
|
*/
|
||||||
public RemoteOperationResult(ResultCode code) {
|
public RemoteOperationResult(ResultCode code) {
|
||||||
mCode = code;
|
mCode = code;
|
||||||
mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL ||
|
mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL ||
|
||||||
@ -136,96 +144,15 @@ public class RemoteOperationResult implements Serializable {
|
|||||||
mData = null;
|
mData = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private RemoteOperationResult(boolean success, int httpCode) {
|
/**
|
||||||
mSuccess = success;
|
* Public constructor from exception.
|
||||||
mHttpCode = httpCode;
|
*
|
||||||
|
* To be used when an exception prevented the end of the {@link RemoteOperation}.
|
||||||
if (success) {
|
*
|
||||||
mCode = ResultCode.OK;
|
* Determines a {@link ResultCode} depending on the type of the exception.
|
||||||
|
*
|
||||||
} else if (httpCode > 0) {
|
* @param e Exception that interrupted the {@link RemoteOperation}
|
||||||
switch (httpCode) {
|
*/
|
||||||
case HttpStatus.SC_UNAUTHORIZED:
|
|
||||||
mCode = ResultCode.UNAUTHORIZED;
|
|
||||||
break;
|
|
||||||
case HttpStatus.SC_NOT_FOUND:
|
|
||||||
mCode = ResultCode.FILE_NOT_FOUND;
|
|
||||||
break;
|
|
||||||
case HttpStatus.SC_INTERNAL_SERVER_ERROR:
|
|
||||||
mCode = ResultCode.INSTANCE_NOT_CONFIGURED;
|
|
||||||
break;
|
|
||||||
case HttpStatus.SC_CONFLICT:
|
|
||||||
mCode = ResultCode.CONFLICT;
|
|
||||||
break;
|
|
||||||
case HttpStatus.SC_INSUFFICIENT_STORAGE:
|
|
||||||
mCode = ResultCode.QUOTA_EXCEEDED;
|
|
||||||
break;
|
|
||||||
case HttpStatus.SC_FORBIDDEN:
|
|
||||||
mCode = ResultCode.FORBIDDEN;
|
|
||||||
break;
|
|
||||||
case HttpStatus.SC_SERVICE_UNAVAILABLE:
|
|
||||||
mCode = ResultCode.MAINTENANCE_MODE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
|
||||||
Log_OC.d(TAG, "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " +
|
|
||||||
httpCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoteOperationResult(boolean success, int httpCode, Header[] headers) {
|
|
||||||
this(success, httpCode);
|
|
||||||
if (headers != null) {
|
|
||||||
Header current;
|
|
||||||
for (int i = 0; i < headers.length; i++) {
|
|
||||||
current = headers[i];
|
|
||||||
if ("location".equals(current.getName().toLowerCase())) {
|
|
||||||
mRedirectedLocation = current.getValue();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ("www-authenticate".equals(current.getName().toLowerCase())) {
|
|
||||||
mAuthenticate = current.getValue();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isIdPRedirection()) {
|
|
||||||
mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoteOperationResult(boolean success, String bodyResponse, int httpCode) {
|
|
||||||
mSuccess = success;
|
|
||||||
mHttpCode = httpCode;
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
mCode = ResultCode.OK;
|
|
||||||
|
|
||||||
} else if (httpCode > 0) {
|
|
||||||
switch (httpCode) {
|
|
||||||
case HttpStatus.SC_BAD_REQUEST:
|
|
||||||
|
|
||||||
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
|
|
||||||
InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser();
|
|
||||||
try {
|
|
||||||
if (xmlParser.parseXMLResponse(is))
|
|
||||||
mCode = ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER;
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
|
||||||
Log_OC.e(TAG, "Exception reading exception from server", e);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
|
||||||
Log_OC.d(TAG, "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " +
|
|
||||||
httpCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoteOperationResult(Exception e) {
|
public RemoteOperationResult(Exception e) {
|
||||||
mException = e;
|
mException = e;
|
||||||
|
|
||||||
@ -276,6 +203,133 @@ public class RemoteOperationResult implements Serializable {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public constructor from separate elements of an HTTP or DAV response.
|
||||||
|
*
|
||||||
|
* To be used when the result needs to be interpreted from the response of an HTTP/DAV method.
|
||||||
|
*
|
||||||
|
* Determines a {@link ResultCode} from the already executed method received as a parameter. Generally,
|
||||||
|
* will depend on the HTTP code and HTTP response headers received. In some cases will inspect also the
|
||||||
|
* response body.
|
||||||
|
*
|
||||||
|
* @param success The operation was considered successful or not.
|
||||||
|
* @param httpMethod HTTP/DAV method already executed which response will be examined to interpret the
|
||||||
|
* result.
|
||||||
|
*/
|
||||||
|
public RemoteOperationResult(boolean success, HttpMethod httpMethod) throws IOException {
|
||||||
|
this(
|
||||||
|
success,
|
||||||
|
httpMethod.getStatusCode(),
|
||||||
|
httpMethod.getStatusText(),
|
||||||
|
httpMethod.getResponseHeaders()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mHttpCode == HttpStatus.SC_BAD_REQUEST) { // 400
|
||||||
|
String bodyResponse = httpMethod.getResponseBodyAsString();
|
||||||
|
// do not get for other HTTP codes!; could not be available
|
||||||
|
|
||||||
|
if (bodyResponse != null && bodyResponse.length() > 0) {
|
||||||
|
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
|
||||||
|
InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser();
|
||||||
|
try {
|
||||||
|
if (xmlParser.parseXMLResponse(is)) {
|
||||||
|
mCode = ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage());
|
||||||
|
// mCode stays as set in this(success, httpCode, headers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public constructor from separate elements of an HTTP or DAV response.
|
||||||
|
*
|
||||||
|
* To be used when the result needs to be interpreted from HTTP response elements that could come from
|
||||||
|
* different requests (WARNING: black magic, try to avoid).
|
||||||
|
*
|
||||||
|
* If all the fields come from the same HTTP/DAV response, {@link #RemoteOperationResult(boolean, HttpMethod)}
|
||||||
|
* should be used instead.
|
||||||
|
*
|
||||||
|
* Determines a {@link ResultCode} depending on the HTTP code and HTTP response headers received.
|
||||||
|
*
|
||||||
|
* @param success The operation was considered successful or not.
|
||||||
|
* @param httpCode HTTP status code returned by an HTTP/DAV method.
|
||||||
|
* @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method
|
||||||
|
* @param httpHeaders HTTP response header returned by an HTTP/DAV method
|
||||||
|
*/
|
||||||
|
public RemoteOperationResult(boolean success, int httpCode, String httpPhrase, Header[] httpHeaders) {
|
||||||
|
this(success, httpCode, httpPhrase);
|
||||||
|
if (httpHeaders != null) {
|
||||||
|
Header current;
|
||||||
|
for (Header httpHeader : httpHeaders) {
|
||||||
|
current = httpHeader;
|
||||||
|
if ("location".equals(current.getName().toLowerCase())) {
|
||||||
|
mRedirectedLocation = current.getValue();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ("www-authenticate".equals(current.getName().toLowerCase())) {
|
||||||
|
mAuthenticate = current.getValue();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isIdPRedirection()) {
|
||||||
|
mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor for results built interpreting a HTTP or DAV response.
|
||||||
|
*
|
||||||
|
* Determines a {@link ResultCode} depending of the type of the exception.
|
||||||
|
*
|
||||||
|
* @param success Operation was successful or not.
|
||||||
|
* @param httpCode HTTP status code returned by the HTTP/DAV method.
|
||||||
|
* @param httpPhrase HTTP status line phrase returned by the HTTP/DAV method
|
||||||
|
*/
|
||||||
|
private RemoteOperationResult(boolean success, int httpCode, String httpPhrase) {
|
||||||
|
mSuccess = success;
|
||||||
|
mHttpCode = httpCode;
|
||||||
|
mHttpPhrase = httpPhrase;
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
mCode = ResultCode.OK;
|
||||||
|
|
||||||
|
} else if (httpCode > 0) {
|
||||||
|
switch (httpCode) {
|
||||||
|
case HttpStatus.SC_UNAUTHORIZED: // 401
|
||||||
|
mCode = ResultCode.UNAUTHORIZED;
|
||||||
|
break;
|
||||||
|
case HttpStatus.SC_FORBIDDEN: // 403
|
||||||
|
mCode = ResultCode.FORBIDDEN;
|
||||||
|
break;
|
||||||
|
case HttpStatus.SC_NOT_FOUND: // 404
|
||||||
|
mCode = ResultCode.FILE_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
case HttpStatus.SC_CONFLICT: // 409
|
||||||
|
mCode = ResultCode.CONFLICT;
|
||||||
|
break;
|
||||||
|
case HttpStatus.SC_INTERNAL_SERVER_ERROR: // 500
|
||||||
|
mCode = ResultCode.INSTANCE_NOT_CONFIGURED; // assuming too much...
|
||||||
|
break;
|
||||||
|
case HttpStatus.SC_SERVICE_UNAVAILABLE: // 503
|
||||||
|
mCode = ResultCode.MAINTENANCE_MODE;
|
||||||
|
break;
|
||||||
|
case HttpStatus.SC_INSUFFICIENT_STORAGE: // 507
|
||||||
|
mCode = ResultCode.QUOTA_EXCEEDED; // surprise!
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mCode = ResultCode.UNHANDLED_HTTP_CODE; // UNKNOWN ERROR
|
||||||
|
Log_OC.d(TAG,
|
||||||
|
"RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " +
|
||||||
|
mHttpCode + " " + mHttpPhrase
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void setData(ArrayList<Object> files) {
|
public void setData(ArrayList<Object> files) {
|
||||||
mData = files;
|
mData = files;
|
||||||
@ -297,6 +351,10 @@ public class RemoteOperationResult implements Serializable {
|
|||||||
return mHttpCode;
|
return mHttpCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getHttpPhrase() {
|
||||||
|
return mHttpPhrase;
|
||||||
|
}
|
||||||
|
|
||||||
public ResultCode getCode() {
|
public ResultCode getCode() {
|
||||||
return mCode;
|
return mCode;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ import com.owncloud.android.lib.common.network.ChunkFromFileChannelRequestEntity
|
|||||||
import com.owncloud.android.lib.common.network.ProgressiveDataTransferer;
|
import com.owncloud.android.lib.common.network.ProgressiveDataTransferer;
|
||||||
import com.owncloud.android.lib.common.network.WebdavUtils;
|
import com.owncloud.android.lib.common.network.WebdavUtils;
|
||||||
import com.owncloud.android.lib.common.operations.InvalidCharacterExceptionParser;
|
import com.owncloud.android.lib.common.operations.InvalidCharacterExceptionParser;
|
||||||
|
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
|
||||||
import com.owncloud.android.lib.common.utils.Log_OC;
|
import com.owncloud.android.lib.common.utils.Log_OC;
|
||||||
|
|
||||||
|
|
||||||
@ -53,20 +54,21 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
|||||||
private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName();
|
private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName();
|
||||||
|
|
||||||
public ChunkedUploadRemoteFileOperation(String storagePath, String remotePath, String mimeType,
|
public ChunkedUploadRemoteFileOperation(String storagePath, String remotePath, String mimeType,
|
||||||
String fileLastModifTimestamp){
|
String fileLastModifTimestamp) {
|
||||||
super(storagePath, remotePath, mimeType, fileLastModifTimestamp);
|
super(storagePath, remotePath, mimeType, fileLastModifTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChunkedUploadRemoteFileOperation(
|
public ChunkedUploadRemoteFileOperation(
|
||||||
String storagePath, String remotePath, String mimeType, String requiredEtag,
|
String storagePath, String remotePath, String mimeType, String requiredEtag,
|
||||||
String fileLastModifTimestamp
|
String fileLastModifTimestamp
|
||||||
){
|
) {
|
||||||
super(storagePath, remotePath, mimeType, requiredEtag, fileLastModifTimestamp);
|
super(storagePath, remotePath, mimeType, requiredEtag, fileLastModifTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int uploadFile(OwnCloudClient client) throws IOException {
|
protected RemoteOperationResult uploadFile(OwnCloudClient client) throws IOException {
|
||||||
int status = -1;
|
int status = -1;
|
||||||
|
RemoteOperationResult result = null;
|
||||||
|
|
||||||
FileChannel channel = null;
|
FileChannel channel = null;
|
||||||
RandomAccessFile raf = null;
|
RandomAccessFile raf = null;
|
||||||
@ -76,18 +78,18 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
|||||||
channel = raf.getChannel();
|
channel = raf.getChannel();
|
||||||
mEntity = new ChunkFromFileChannelRequestEntity(channel, mMimeType, CHUNK_SIZE, file);
|
mEntity = new ChunkFromFileChannelRequestEntity(channel, mMimeType, CHUNK_SIZE, file);
|
||||||
synchronized (mDataTransferListeners) {
|
synchronized (mDataTransferListeners) {
|
||||||
((ProgressiveDataTransferer)mEntity)
|
((ProgressiveDataTransferer) mEntity)
|
||||||
.addDatatransferProgressListeners(mDataTransferListeners);
|
.addDatatransferProgressListeners(mDataTransferListeners);
|
||||||
}
|
}
|
||||||
|
|
||||||
long offset = 0;
|
long offset = 0;
|
||||||
String uriPrefix = client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath) +
|
String uriPrefix = client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath) +
|
||||||
"-chunking-" + Math.abs((new Random()).nextInt(9000)+1000) + "-" ;
|
"-chunking-" + Math.abs((new Random()).nextInt(9000) + 1000) + "-";
|
||||||
long totalLength = file.length();
|
long totalLength = file.length();
|
||||||
long chunkCount = (long) Math.ceil((double)totalLength / CHUNK_SIZE);
|
long chunkCount = (long) Math.ceil((double) totalLength / CHUNK_SIZE);
|
||||||
String chunkSizeStr = String.valueOf(CHUNK_SIZE);
|
String chunkSizeStr = String.valueOf(CHUNK_SIZE);
|
||||||
String totalLengthStr = String.valueOf(file.length());
|
String totalLengthStr = String.valueOf(file.length());
|
||||||
for (int chunkIndex = 0; chunkIndex < chunkCount ; chunkIndex++, offset += CHUNK_SIZE) {
|
for (int chunkIndex = 0; chunkIndex < chunkCount; chunkIndex++, offset += CHUNK_SIZE) {
|
||||||
if (chunkIndex == chunkCount - 1) {
|
if (chunkIndex == chunkCount - 1) {
|
||||||
chunkSizeStr = String.valueOf(CHUNK_SIZE * chunkCount - totalLength);
|
chunkSizeStr = String.valueOf(CHUNK_SIZE * chunkCount - totalLength);
|
||||||
}
|
}
|
||||||
@ -121,19 +123,10 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
|||||||
|
|
||||||
status = client.executeMethod(mPutMethod);
|
status = client.executeMethod(mPutMethod);
|
||||||
|
|
||||||
if (status == 400) {
|
result = new RemoteOperationResult(
|
||||||
InvalidCharacterExceptionParser xmlParser =
|
isSuccess(status),
|
||||||
new InvalidCharacterExceptionParser();
|
mPutMethod
|
||||||
InputStream is = new ByteArrayInputStream(
|
);
|
||||||
mPutMethod.getResponseBodyAsString().getBytes());
|
|
||||||
try {
|
|
||||||
mForbiddenCharsInServer = xmlParser.parseXMLResponse(is);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
mForbiddenCharsInServer = false;
|
|
||||||
Log_OC.e(TAG, "Exception reading exception from server", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
|
client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
|
||||||
Log_OC.d(TAG, "Upload of " + mLocalPath + " to " + mRemotePath +
|
Log_OC.d(TAG, "Upload of " + mLocalPath + " to " + mRemotePath +
|
||||||
@ -152,7 +145,7 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
|||||||
if (mPutMethod != null)
|
if (mPutMethod != null)
|
||||||
mPutMethod.releaseConnection(); // let the connection available for other methods
|
mPutMethod.releaseConnection(); // let the connection available for other methods
|
||||||
}
|
}
|
||||||
return status;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -129,15 +129,8 @@ public class CopyRemoteFileOperation extends RemoteOperation {
|
|||||||
/// for other errors that could be explicitly handled, check first:
|
/// for other errors that could be explicitly handled, check first:
|
||||||
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
|
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
|
||||||
|
|
||||||
} else if (status == 400) {
|
|
||||||
result = new RemoteOperationResult(copyMethod.succeeded(),
|
|
||||||
copyMethod.getResponseBodyAsString(), status);
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(
|
result = new RemoteOperationResult(isSuccess(status), copyMethod);
|
||||||
isSuccess(status), // copy.succeeded()? trustful?
|
|
||||||
status,
|
|
||||||
copyMethod.getResponseHeaders()
|
|
||||||
);
|
|
||||||
client.exhaustResponse(copyMethod.getResponseBodyAsStream());
|
client.exhaustResponse(copyMethod.getResponseBodyAsStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,11 +189,7 @@ public class CopyRemoteFileOperation extends RemoteOperation {
|
|||||||
if (failFound) {
|
if (failFound) {
|
||||||
result = new RemoteOperationResult(ResultCode.PARTIAL_COPY_DONE);
|
result = new RemoteOperationResult(ResultCode.PARTIAL_COPY_DONE);
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(
|
result = new RemoteOperationResult(true, copyMethod);
|
||||||
true,
|
|
||||||
HttpStatus.SC_MULTI_STATUS,
|
|
||||||
copyMethod.getResponseHeaders()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -40,7 +40,6 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion;
|
|||||||
*
|
*
|
||||||
* @author David A. Velasco
|
* @author David A. Velasco
|
||||||
* @author masensio
|
* @author masensio
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class CreateRemoteFolderOperation extends RemoteOperation {
|
public class CreateRemoteFolderOperation extends RemoteOperation {
|
||||||
|
|
||||||
@ -100,17 +99,9 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
|
|||||||
MkColMethod mkcol = null;
|
MkColMethod mkcol = null;
|
||||||
try {
|
try {
|
||||||
mkcol = new MkColMethod(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath));
|
mkcol = new MkColMethod(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath));
|
||||||
int status = client.executeMethod(mkcol, READ_TIMEOUT, CONNECTION_TIMEOUT);
|
client.executeMethod(mkcol, READ_TIMEOUT, CONNECTION_TIMEOUT);
|
||||||
if ( status == 400 ) {
|
result = new RemoteOperationResult(mkcol.succeeded(), mkcol);
|
||||||
result = new RemoteOperationResult(mkcol.succeeded(),
|
|
||||||
mkcol.getResponseBodyAsString(), status);
|
|
||||||
Log_OC.d(TAG, mkcol.getResponseBodyAsString());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
result = new RemoteOperationResult(mkcol.succeeded(), status,
|
|
||||||
mkcol.getResponseHeaders());
|
|
||||||
Log_OC.d(TAG, "Create directory " + mRemotePath + ": " + result.getLogMessage());
|
Log_OC.d(TAG, "Create directory " + mRemotePath + ": " + result.getLogMessage());
|
||||||
}
|
|
||||||
client.exhaustResponse(mkcol.getResponseBodyAsStream());
|
client.exhaustResponse(mkcol.getResponseBodyAsStream());
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -131,5 +122,4 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -83,8 +83,7 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
|
|||||||
try {
|
try {
|
||||||
tmpFile.getParentFile().mkdirs();
|
tmpFile.getParentFile().mkdirs();
|
||||||
int status = downloadFile(client, tmpFile);
|
int status = downloadFile(client, tmpFile);
|
||||||
result = new RemoteOperationResult(isSuccess(status), status,
|
result = new RemoteOperationResult(isSuccess(status), mGet);
|
||||||
(mGet != null ? mGet.getResponseHeaders() : null));
|
|
||||||
Log_OC.i(TAG, "Download of " + mRemotePath + " to " + getTmpPath() + ": " +
|
Log_OC.i(TAG, "Download of " + mRemotePath + " to " + getTmpPath() + ": " +
|
||||||
result.getLogMessage());
|
result.getLogMessage());
|
||||||
|
|
||||||
@ -116,13 +115,13 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
Header contentLength = mGet.getResponseHeader("Content-Length");
|
Header contentLength = mGet.getResponseHeader("Content-Length");
|
||||||
long totalToTransfer = (contentLength != null &&
|
long totalToTransfer = (contentLength != null &&
|
||||||
contentLength.getValue().length() >0) ?
|
contentLength.getValue().length() > 0) ?
|
||||||
Long.parseLong(contentLength.getValue()) : 0;
|
Long.parseLong(contentLength.getValue()) : 0;
|
||||||
|
|
||||||
byte[] bytes = new byte[4096];
|
byte[] bytes = new byte[4096];
|
||||||
int readResult = 0;
|
int readResult = 0;
|
||||||
while ((readResult = bis.read(bytes)) != -1) {
|
while ((readResult = bis.read(bytes)) != -1) {
|
||||||
synchronized(mCancellationRequested) {
|
synchronized (mCancellationRequested) {
|
||||||
if (mCancellationRequested.get()) {
|
if (mCancellationRequested.get()) {
|
||||||
mGet.abort();
|
mGet.abort();
|
||||||
throw new OperationCancelledException();
|
throw new OperationCancelledException();
|
||||||
@ -183,7 +182,7 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
|
|||||||
return mLocalFolderPath + mRemotePath;
|
return mLocalFolderPath + mRemotePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDatatransferProgressListener (OnDatatransferProgressListener listener) {
|
public void addDatatransferProgressListener(OnDatatransferProgressListener listener) {
|
||||||
synchronized (mDataTransferListeners) {
|
synchronized (mDataTransferListeners) {
|
||||||
mDataTransferListeners.add(listener);
|
mDataTransferListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,12 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
|
|||||||
client.exhaustResponse(head.getResponseBodyAsStream());
|
client.exhaustResponse(head.getResponseBodyAsStream());
|
||||||
boolean success = (status == HttpStatus.SC_OK && !mSuccessIfAbsent) ||
|
boolean success = (status == HttpStatus.SC_OK && !mSuccessIfAbsent) ||
|
||||||
(status == HttpStatus.SC_NOT_FOUND && mSuccessIfAbsent);
|
(status == HttpStatus.SC_NOT_FOUND && mSuccessIfAbsent);
|
||||||
result = new RemoteOperationResult(success, status, head.getResponseHeaders());
|
result = new RemoteOperationResult(
|
||||||
|
success,
|
||||||
|
status,
|
||||||
|
head.getStatusText(),
|
||||||
|
head.getResponseHeaders()
|
||||||
|
);
|
||||||
Log_OC.d(TAG, "Existence check for " + client.getWebdavUri() +
|
Log_OC.d(TAG, "Existence check for " + client.getWebdavUri() +
|
||||||
WebdavUtils.encodePath(mPath) + " targeting for " +
|
WebdavUtils.encodePath(mPath) + " targeting for " +
|
||||||
(mSuccessIfAbsent ? " absence " : " existence ") +
|
(mSuccessIfAbsent ? " absence " : " existence ") +
|
||||||
|
@ -45,7 +45,7 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion;
|
|||||||
/**
|
/**
|
||||||
* Remote operation moving a remote file or folder in the ownCloud server to a different folder
|
* Remote operation moving a remote file or folder in the ownCloud server to a different folder
|
||||||
* in the same account.
|
* in the same account.
|
||||||
*
|
* <p>
|
||||||
* Allows renaming the moving file/folder at the same time.
|
* Allows renaming the moving file/folder at the same time.
|
||||||
*
|
*
|
||||||
* @author David A. Velasco
|
* @author David A. Velasco
|
||||||
@ -65,7 +65,7 @@ public class MoveRemoteFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
* <p>
|
||||||
* TODO Paths should finish in "/" in the case of folders. ?
|
* TODO Paths should finish in "/" in the case of folders. ?
|
||||||
*
|
*
|
||||||
* @param srcRemotePath Remote path of the file/folder to move.
|
* @param srcRemotePath Remote path of the file/folder to move.
|
||||||
@ -109,7 +109,6 @@ public class MoveRemoteFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
|
|
||||||
/// perform remote operation
|
/// perform remote operation
|
||||||
//LocalMoveMethod move = null;
|
|
||||||
MoveMethod move = null;
|
MoveMethod move = null;
|
||||||
RemoteOperationResult result = null;
|
RemoteOperationResult result = null;
|
||||||
try {
|
try {
|
||||||
@ -133,15 +132,8 @@ public class MoveRemoteFileOperation extends RemoteOperation {
|
|||||||
/// for other errors that could be explicitly handled, check first:
|
/// for other errors that could be explicitly handled, check first:
|
||||||
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
|
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
|
||||||
|
|
||||||
} else if (status == 400) {
|
|
||||||
result = new RemoteOperationResult(move.succeeded(),
|
|
||||||
move.getResponseBodyAsString(), status);
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(
|
result = new RemoteOperationResult(isSuccess(status), move);
|
||||||
isSuccess(status), // move.succeeded()? trustful?
|
|
||||||
status,
|
|
||||||
move.getResponseHeaders()
|
|
||||||
);
|
|
||||||
client.exhaustResponse(move.getResponseBodyAsStream());
|
client.exhaustResponse(move.getResponseBodyAsStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,20 +156,19 @@ public class MoveRemoteFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyzes a multistatus response from the OC server to generate an appropriate result.
|
* Analyzes a multistatus response from the OC server to generate an appropriate result.
|
||||||
*
|
* <p>
|
||||||
* In WebDAV, a MOVE request on collections (folders) can be PARTIALLY successful: some
|
* In WebDAV, a MOVE request on collections (folders) can be PARTIALLY successful: some
|
||||||
* children are moved, some other aren't.
|
* children are moved, some other aren't.
|
||||||
*
|
* <p>
|
||||||
* According to the WebDAV specification, a multistatus response SHOULD NOT include partial
|
* According to the WebDAV specification, a multistatus response SHOULD NOT include partial
|
||||||
* successes (201, 204) nor for descendants of already failed children (424) in the response
|
* successes (201, 204) nor for descendants of already failed children (424) in the response
|
||||||
* entity. But SHOULD NOT != MUST NOT, so take carefully.
|
* entity. But SHOULD NOT != MUST NOT, so take carefully.
|
||||||
*
|
*
|
||||||
* @param move Move operation just finished with a multistatus response
|
* @param move Move operation just finished with a multistatus response
|
||||||
* @return A result for the {@link MoveRemoteFileOperation} caller
|
|
||||||
*
|
|
||||||
* @throws IOException If the response body could not be parsed
|
* @throws IOException If the response body could not be parsed
|
||||||
* @throws DavException If the status code is other than MultiStatus or if obtaining
|
* @throws DavException If the status code is other than MultiStatus or if obtaining
|
||||||
* the response XML document fails
|
* the response XML document fails
|
||||||
|
* @return A result for the {@link MoveRemoteFileOperation} caller
|
||||||
*/
|
*/
|
||||||
private RemoteOperationResult processPartialError(MoveMethod move)
|
private RemoteOperationResult processPartialError(MoveMethod move)
|
||||||
throws IOException, DavException {
|
throws IOException, DavException {
|
||||||
@ -188,7 +179,7 @@ public class MoveRemoteFileOperation extends RemoteOperation {
|
|||||||
MultiStatusResponse[] responses = move.getResponseBodyAsMultiStatus().getResponses();
|
MultiStatusResponse[] responses = move.getResponseBodyAsMultiStatus().getResponses();
|
||||||
Status[] status = null;
|
Status[] status = null;
|
||||||
boolean failFound = false;
|
boolean failFound = false;
|
||||||
for (int i = 0; i < responses.length && !failFound; i++ ) {
|
for (int i = 0; i < responses.length && !failFound; i++) {
|
||||||
status = responses[i].getStatus();
|
status = responses[i].getStatus();
|
||||||
failFound = (
|
failFound = (
|
||||||
status != null &&
|
status != null &&
|
||||||
@ -201,11 +192,7 @@ public class MoveRemoteFileOperation extends RemoteOperation {
|
|||||||
if (failFound) {
|
if (failFound) {
|
||||||
result = new RemoteOperationResult(ResultCode.PARTIAL_MOVE_DONE);
|
result = new RemoteOperationResult(ResultCode.PARTIAL_MOVE_DONE);
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(
|
result = new RemoteOperationResult(true, move);
|
||||||
true,
|
|
||||||
HttpStatus.SC_MULTI_STATUS,
|
|
||||||
move.getResponseHeaders()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -96,12 +96,12 @@ public class ReadRemoteFileOperation extends RemoteOperation {
|
|||||||
files.add(remoteFile);
|
files.add(remoteFile);
|
||||||
|
|
||||||
// Result of the operation
|
// Result of the operation
|
||||||
result = new RemoteOperationResult(true, status, propfind.getResponseHeaders());
|
result = new RemoteOperationResult(true, propfind);
|
||||||
result.setData(files);
|
result.setData(files);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
result = new RemoteOperationResult(false, propfind);
|
||||||
client.exhaustResponse(propfind.getResponseBodyAsStream());
|
client.exhaustResponse(propfind.getResponseBodyAsStream());
|
||||||
result = new RemoteOperationResult(false, status, propfind.getResponseHeaders());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -89,7 +89,7 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
|
|||||||
readData(dataInServer, client);
|
readData(dataInServer, client);
|
||||||
|
|
||||||
// Result of the operation
|
// Result of the operation
|
||||||
result = new RemoteOperationResult(true, status, query.getResponseHeaders());
|
result = new RemoteOperationResult(true, query);
|
||||||
// Add data to the result
|
// Add data to the result
|
||||||
if (result.isSuccess()) {
|
if (result.isSuccess()) {
|
||||||
result.setData(mFolderAndFiles);
|
result.setData(mFolderAndFiles);
|
||||||
@ -97,7 +97,7 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
|
|||||||
} else {
|
} else {
|
||||||
// synchronization failed
|
// synchronization failed
|
||||||
client.exhaustResponse(query.getResponseBodyAsStream());
|
client.exhaustResponse(query.getResponseBodyAsStream());
|
||||||
result = new RemoteOperationResult(false, status, query.getResponseHeaders());
|
result = new RemoteOperationResult(false, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -129,7 +129,6 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
|
|||||||
/**
|
/**
|
||||||
* Read the data retrieved from the server about the contents of the target folder
|
* Read the data retrieved from the server about the contents of the target folder
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* @param remoteData Full response got from the server with the data of the target
|
* @param remoteData Full response got from the server with the data of the target
|
||||||
* folder and its direct children.
|
* folder and its direct children.
|
||||||
* @param client Client instance to the remote server where the data were
|
* @param client Client instance to the remote server where the data were
|
||||||
|
@ -71,8 +71,10 @@ public class RemoveRemoteFileOperation extends RemoteOperation {
|
|||||||
int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
|
int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
|
||||||
|
|
||||||
delete.getResponseBodyAsString(); // exhaust the response, although not interesting
|
delete.getResponseBodyAsString(); // exhaust the response, although not interesting
|
||||||
result = new RemoteOperationResult((delete.succeeded() ||
|
result = new RemoteOperationResult(
|
||||||
status == HttpStatus.SC_NOT_FOUND), status, delete.getResponseHeaders());
|
(delete.succeeded() || status == HttpStatus.SC_NOT_FOUND),
|
||||||
|
delete
|
||||||
|
);
|
||||||
Log_OC.i(TAG, "Remove " + mRemotePath + ": " + result.getLogMessage());
|
Log_OC.i(TAG, "Remove " + mRemotePath + ": " + result.getLogMessage());
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -106,28 +106,20 @@ public class RenameRemoteFileOperation extends RemoteOperation {
|
|||||||
return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
|
return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
move = new LocalMoveMethod( client.getWebdavUri() +
|
move = new LocalMoveMethod(client.getWebdavUri() +
|
||||||
WebdavUtils.encodePath(mOldRemotePath),
|
WebdavUtils.encodePath(mOldRemotePath),
|
||||||
client.getWebdavUri() + WebdavUtils.encodePath(mNewRemotePath));
|
client.getWebdavUri() + WebdavUtils.encodePath(mNewRemotePath));
|
||||||
int status = client.executeMethod(move, RENAME_READ_TIMEOUT,
|
client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT);
|
||||||
RENAME_CONNECTION_TIMEOUT);
|
result = new RemoteOperationResult(move.succeeded(), move);
|
||||||
|
|
||||||
if (status == 400) {
|
|
||||||
result = new RemoteOperationResult(move.succeeded(),
|
|
||||||
move.getResponseBodyAsString(), status);
|
|
||||||
Log_OC.d(TAG, move.getResponseBodyAsString());
|
|
||||||
} else {
|
|
||||||
client.exhaustResponse(move.getResponseBodyAsStream());//exhaust response,
|
|
||||||
// although not interesting
|
|
||||||
result = new RemoteOperationResult(move.succeeded(), status,
|
|
||||||
move.getResponseHeaders());
|
|
||||||
Log_OC.i(TAG, "Rename " + mOldRemotePath + " to " + mNewRemotePath + ": " +
|
Log_OC.i(TAG, "Rename " + mOldRemotePath + " to " + mNewRemotePath + ": " +
|
||||||
result.getLogMessage());
|
result.getLogMessage()
|
||||||
}
|
);
|
||||||
|
client.exhaustResponse(move.getResponseBodyAsStream());
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
result = new RemoteOperationResult(e);
|
result = new RemoteOperationResult(e);
|
||||||
Log_OC.e(TAG, "Rename " + mOldRemotePath + " to " +
|
Log_OC.e(TAG, "Rename " + mOldRemotePath + " to " +
|
||||||
((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " +
|
((mNewRemotePath == null) ? mNewName : mNewRemotePath) + ": " +
|
||||||
result.getLogMessage(), e);
|
result.getLogMessage(), e);
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
@ -144,7 +136,6 @@ public class RenameRemoteFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Move operation
|
* Move operation
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private class LocalMoveMethod extends DavMethodBase {
|
private class LocalMoveMethod extends DavMethodBase {
|
||||||
|
|
||||||
|
@ -69,7 +69,6 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
|||||||
protected String mMimeType;
|
protected String mMimeType;
|
||||||
protected String mFileLastModifTimestamp;
|
protected String mFileLastModifTimestamp;
|
||||||
protected PutMethod mPutMethod = null;
|
protected PutMethod mPutMethod = null;
|
||||||
protected boolean mForbiddenCharsInServer = false;
|
|
||||||
protected String mRequiredEtag = null;
|
protected String mRequiredEtag = null;
|
||||||
|
|
||||||
protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
|
protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
|
||||||
@ -112,14 +111,7 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// perform the upload
|
// perform the upload
|
||||||
int status = uploadFile(client);
|
result = uploadFile(client);
|
||||||
if (mForbiddenCharsInServer){
|
|
||||||
result = new RemoteOperationResult(
|
|
||||||
RemoteOperationResult.ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER);
|
|
||||||
} else {
|
|
||||||
result = new RemoteOperationResult(isSuccess(status), status,
|
|
||||||
(mPutMethod != null ? mPutMethod.getResponseHeaders() : null));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -144,8 +136,9 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
|||||||
status == HttpStatus.SC_NO_CONTENT));
|
status == HttpStatus.SC_NO_CONTENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int uploadFile(OwnCloudClient client) throws IOException {
|
protected RemoteOperationResult uploadFile(OwnCloudClient client) throws IOException {
|
||||||
int status = -1;
|
int status;
|
||||||
|
RemoteOperationResult result;
|
||||||
try {
|
try {
|
||||||
File f = new File(mLocalPath);
|
File f = new File(mLocalPath);
|
||||||
mEntity = new FileRequestEntity(f, mMimeType);
|
mEntity = new FileRequestEntity(f, mMimeType);
|
||||||
@ -163,25 +156,16 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
|||||||
mPutMethod.setRequestEntity(mEntity);
|
mPutMethod.setRequestEntity(mEntity);
|
||||||
status = client.executeMethod(mPutMethod);
|
status = client.executeMethod(mPutMethod);
|
||||||
|
|
||||||
if (status == 400) {
|
result = new RemoteOperationResult(
|
||||||
InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser();
|
isSuccess(status),
|
||||||
InputStream is = new ByteArrayInputStream(
|
mPutMethod
|
||||||
mPutMethod.getResponseBodyAsString().getBytes());
|
);
|
||||||
try {
|
|
||||||
mForbiddenCharsInServer = xmlParser.parseXMLResponse(is);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
mForbiddenCharsInServer = false;
|
|
||||||
Log_OC.e(TAG, "Exception reading exception from server", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
|
client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
mPutMethod.releaseConnection(); // let the connection available for other methods
|
mPutMethod.releaseConnection(); // let the connection available for other methods
|
||||||
}
|
}
|
||||||
return status;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<OnDatatransferProgressListener> getDataTransferListeners() {
|
public Set<OnDatatransferProgressListener> getDataTransferListeners() {
|
||||||
|
@ -58,6 +58,7 @@ public class CreateRemoteShareOperation extends RemoteOperation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
*
|
||||||
* @param remoteFilePath Full path of the file/folder being shared. Mandatory argument
|
* @param remoteFilePath Full path of the file/folder being shared. Mandatory argument
|
||||||
* @param shareType 0 = user, 1 = group, 3 = Public link. Mandatory argument
|
* @param shareType 0 = user, 1 = group, 3 = Public link. Mandatory argument
|
||||||
* @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType
|
* @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType
|
||||||
@ -93,7 +94,7 @@ public class CreateRemoteShareOperation extends RemoteOperation {
|
|||||||
mGetShareDetails = false; // defaults to false for backwards compatibility
|
mGetShareDetails = false; // defaults to false for backwards compatibility
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isGettingShareDetails () {
|
public boolean isGettingShareDetails() {
|
||||||
return mGetShareDetails;
|
return mGetShareDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +113,7 @@ public class CreateRemoteShareOperation extends RemoteOperation {
|
|||||||
// Post Method
|
// Post Method
|
||||||
post = new PostMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH);
|
post = new PostMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH);
|
||||||
|
|
||||||
post.setRequestHeader( "Content-Type",
|
post.setRequestHeader("Content-Type",
|
||||||
"application/x-www-form-urlencoded; charset=utf-8"); // necessary for special characters
|
"application/x-www-form-urlencoded; charset=utf-8"); // necessary for special characters
|
||||||
|
|
||||||
post.addParameter(PARAM_PATH, mRemoteFilePath);
|
post.addParameter(PARAM_PATH, mRemoteFilePath);
|
||||||
@ -132,7 +133,7 @@ public class CreateRemoteShareOperation extends RemoteOperation {
|
|||||||
|
|
||||||
status = client.executeMethod(post);
|
status = client.executeMethod(post);
|
||||||
|
|
||||||
if(isSuccess(status)) {
|
if (isSuccess(status)) {
|
||||||
String response = post.getResponseBodyAsString();
|
String response = post.getResponseBodyAsString();
|
||||||
|
|
||||||
ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser(
|
ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser(
|
||||||
@ -153,7 +154,7 @@ public class CreateRemoteShareOperation extends RemoteOperation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, post.getResponseHeaders());
|
result = new RemoteOperationResult(false, post);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -58,13 +58,13 @@ public class GetRemoteShareOperation extends RemoteOperation {
|
|||||||
GetMethod get = null;
|
GetMethod get = null;
|
||||||
|
|
||||||
// Get the response
|
// Get the response
|
||||||
try{
|
try {
|
||||||
get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH + "/" + Long.toString(mRemoteId));
|
get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH + "/" + Long.toString(mRemoteId));
|
||||||
get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
|
get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
|
||||||
|
|
||||||
status = client.executeMethod(get);
|
status = client.executeMethod(get);
|
||||||
|
|
||||||
if(isSuccess(status)) {
|
if (isSuccess(status)) {
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
|
|
||||||
// Parse xml response and obtain the list of shares
|
// Parse xml response and obtain the list of shares
|
||||||
@ -77,7 +77,7 @@ public class GetRemoteShareOperation extends RemoteOperation {
|
|||||||
result = parser.parse(response);
|
result = parser.parse(response);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -166,13 +166,13 @@ public class GetRemoteShareesOperation extends RemoteOperation{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
result = new RemoteOperationResult(true, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(true, get);
|
||||||
result.setData(data);
|
result.setData(data);
|
||||||
|
|
||||||
Log_OC.d(TAG, "*** Get Users or groups completed " );
|
Log_OC.d(TAG, "*** Get Users or groups completed " );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
Log_OC.e(TAG, "Failed response while getting users/groups from the server ");
|
Log_OC.e(TAG, "Failed response while getting users/groups from the server ");
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
|
@ -91,7 +91,7 @@ public class GetRemoteSharesForFileOperation extends RemoteOperation {
|
|||||||
|
|
||||||
status = client.executeMethod(get);
|
status = client.executeMethod(get);
|
||||||
|
|
||||||
if(isSuccess(status)) {
|
if (isSuccess(status)) {
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
|
|
||||||
// Parse xml response and obtain the list of shares
|
// Parse xml response and obtain the list of shares
|
||||||
@ -107,7 +107,7 @@ public class GetRemoteSharesForFileOperation extends RemoteOperation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -36,7 +36,6 @@ import com.owncloud.android.lib.common.utils.Log_OC;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the data from the server about ALL the known shares owned by the requester.
|
* Get the data from the server about ALL the known shares owned by the requester.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class GetRemoteSharesOperation extends RemoteOperation {
|
public class GetRemoteSharesOperation extends RemoteOperation {
|
||||||
@ -56,12 +55,12 @@ public class GetRemoteSharesOperation extends RemoteOperation {
|
|||||||
GetMethod get = null;
|
GetMethod get = null;
|
||||||
|
|
||||||
// Get the response
|
// Get the response
|
||||||
try{
|
try {
|
||||||
get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH);
|
get = new GetMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH);
|
||||||
get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
|
get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
|
||||||
status = client.executeMethod(get);
|
status = client.executeMethod(get);
|
||||||
|
|
||||||
if(isSuccess(status)) {
|
if (isSuccess(status)) {
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
|
|
||||||
// Parse xml response and obtain the list of shares
|
// Parse xml response and obtain the list of shares
|
||||||
@ -72,7 +71,7 @@ public class GetRemoteSharesOperation extends RemoteOperation {
|
|||||||
parser.setServerBaseUri(client.getBaseUri());
|
parser.setServerBaseUri(client.getBaseUri());
|
||||||
result = parser.parse(response);
|
result = parser.parse(response);
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -70,7 +70,7 @@ public class RemoveRemoteShareOperation extends RemoteOperation {
|
|||||||
|
|
||||||
status = client.executeMethod(delete);
|
status = client.executeMethod(delete);
|
||||||
|
|
||||||
if(isSuccess(status)) {
|
if (isSuccess(status)) {
|
||||||
String response = delete.getResponseBodyAsString();
|
String response = delete.getResponseBodyAsString();
|
||||||
|
|
||||||
// Parse xml response and obtain the list of shares
|
// Parse xml response and obtain the list of shares
|
||||||
@ -82,7 +82,7 @@ public class RemoveRemoteShareOperation extends RemoteOperation {
|
|||||||
Log_OC.d(TAG, "Unshare " + id + ": " + result.getLogMessage());
|
Log_OC.d(TAG, "Unshare " + id + ": " + result.getLogMessage());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, delete.getResponseHeaders());
|
result = new RemoteOperationResult(false, delete);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
result = new RemoteOperationResult(e);
|
result = new RemoteOperationResult(e);
|
||||||
|
@ -216,7 +216,7 @@ public class UpdateRemoteShareOperation extends RemoteOperation {
|
|||||||
result = parser.parse(response);
|
result = parser.parse(response);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, put.getResponseHeaders());
|
result = new RemoteOperationResult(false, put);
|
||||||
}
|
}
|
||||||
if (!result.isSuccess()) {
|
if (!result.isSuccess()) {
|
||||||
break;
|
break;
|
||||||
|
@ -242,18 +242,18 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation {
|
|||||||
}
|
}
|
||||||
// Result
|
// Result
|
||||||
data.add(capability);
|
data.add(capability);
|
||||||
result = new RemoteOperationResult(true, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(true, get);
|
||||||
result.setData(data);
|
result.setData(data);
|
||||||
|
|
||||||
Log_OC.d(TAG, "*** Get Capabilities completed ");
|
Log_OC.d(TAG, "*** Get Capabilities completed ");
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(statusProp, statuscode, null);
|
result = new RemoteOperationResult(statusProp, statuscode, null, null);
|
||||||
Log_OC.e(TAG, "Failed response while getting capabilities from the server ");
|
Log_OC.e(TAG, "Failed response while getting capabilities from the server ");
|
||||||
Log_OC.e(TAG, "*** status: " + statusProp + "; message: " + message);
|
Log_OC.e(TAG, "*** status: " + statusProp + "; message: " + message);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
Log_OC.e(TAG, "Failed response while getting capabilities from the server ");
|
Log_OC.e(TAG, "Failed response while getting capabilities from the server ");
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
|
@ -49,7 +49,6 @@ import com.owncloud.android.lib.common.utils.Log_OC;
|
|||||||
*
|
*
|
||||||
* @author David A. Velasco
|
* @author David A. Velasco
|
||||||
* @author masensio
|
* @author masensio
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class GetRemoteStatusOperation extends RemoteOperation {
|
public class GetRemoteStatusOperation extends RemoteOperation {
|
||||||
@ -87,11 +86,7 @@ public class GetRemoteStatusOperation extends RemoteOperation {
|
|||||||
client.setFollowRedirects(false);
|
client.setFollowRedirects(false);
|
||||||
boolean isRedirectToNonSecureConnection = false;
|
boolean isRedirectToNonSecureConnection = false;
|
||||||
int status = client.executeMethod(get, TRY_CONNECTION_TIMEOUT, TRY_CONNECTION_TIMEOUT);
|
int status = client.executeMethod(get, TRY_CONNECTION_TIMEOUT, TRY_CONNECTION_TIMEOUT);
|
||||||
mLatestResult = new RemoteOperationResult(
|
mLatestResult = new RemoteOperationResult((status == HttpStatus.SC_OK), get);
|
||||||
(status == HttpStatus.SC_OK),
|
|
||||||
status,
|
|
||||||
get.getResponseHeaders()
|
|
||||||
);
|
|
||||||
|
|
||||||
String redirectedLocation = mLatestResult.getRedirectedLocation();
|
String redirectedLocation = mLatestResult.getRedirectedLocation();
|
||||||
while (redirectedLocation != null && redirectedLocation.length() > 0
|
while (redirectedLocation != null && redirectedLocation.length() > 0
|
||||||
@ -106,8 +101,7 @@ public class GetRemoteStatusOperation extends RemoteOperation {
|
|||||||
status = client.executeMethod(get, TRY_CONNECTION_TIMEOUT, TRY_CONNECTION_TIMEOUT);
|
status = client.executeMethod(get, TRY_CONNECTION_TIMEOUT, TRY_CONNECTION_TIMEOUT);
|
||||||
mLatestResult = new RemoteOperationResult(
|
mLatestResult = new RemoteOperationResult(
|
||||||
(status == HttpStatus.SC_OK),
|
(status == HttpStatus.SC_OK),
|
||||||
status,
|
get
|
||||||
get.getResponseHeaders()
|
|
||||||
);
|
);
|
||||||
redirectedLocation = mLatestResult.getRedirectedLocation();
|
redirectedLocation = mLatestResult.getRedirectedLocation();
|
||||||
}
|
}
|
||||||
@ -148,7 +142,7 @@ public class GetRemoteStatusOperation extends RemoteOperation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
mLatestResult = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
mLatestResult = new RemoteOperationResult(false, get);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
|
@ -143,15 +143,15 @@ public class GetRemoteUserAvatarOperation extends RemoteOperation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
result = new RemoteOperationResult(true, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(true, get);
|
||||||
ResultData resultData = new ResultData(bos.toByteArray(), mimeType, etag);
|
ResultData resultData = new ResultData(bos.toByteArray(), mimeType, etag);
|
||||||
ArrayList<Object> data = new ArrayList<Object>();
|
ArrayList<Object> data = new ArrayList<Object>();
|
||||||
data.add(resultData);
|
data.add(resultData);
|
||||||
result.setData(data);
|
result.setData(data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
result = new RemoteOperationResult(false, get);
|
||||||
client.exhaustResponse(get.getResponseBodyAsStream());
|
client.exhaustResponse(get.getResponseBodyAsStream());
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -86,14 +86,14 @@ public class GetRemoteUserInfoOperation extends RemoteOperation {
|
|||||||
userInfo.mEmail = respData.getString(NODE_EMAIL);
|
userInfo.mEmail = respData.getString(NODE_EMAIL);
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
result = new RemoteOperationResult(true, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(true, get);
|
||||||
// Username in result.data
|
// Username in result.data
|
||||||
ArrayList<Object> data = new ArrayList<Object>();
|
ArrayList<Object> data = new ArrayList<Object>();
|
||||||
data.add(userInfo);
|
data.add(userInfo);
|
||||||
result.setData(data);
|
result.setData(data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
Log_OC.e(TAG, "Failed response while getting user information ");
|
Log_OC.e(TAG, "Failed response while getting user information ");
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
|
@ -107,14 +107,14 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation {
|
|||||||
|
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
result = new RemoteOperationResult(true, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(true, get);
|
||||||
//Quota data in data collection
|
//Quota data in data collection
|
||||||
ArrayList<Object> data = new ArrayList<Object>();
|
ArrayList<Object> data = new ArrayList<Object>();
|
||||||
data.add(new Quota(quotaFree, quotaUsed, quotaTotal, quotaRelative));
|
data.add(new Quota(quotaFree, quotaUsed, quotaTotal, quotaRelative));
|
||||||
result.setData(data);
|
result.setData(data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = new RemoteOperationResult(false, status, get.getResponseHeaders());
|
result = new RemoteOperationResult(false, get);
|
||||||
String response = get.getResponseBodyAsString();
|
String response = get.getResponseBodyAsString();
|
||||||
Log_OC.e(TAG, "Failed response while getting user quota information ");
|
Log_OC.e(TAG, "Failed response while getting user quota information ");
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user