RemoteOperationResult result = null;
MkColMethod mkcol = null;
- boolean noInvalidChars = FileUtils.validateName(mRemotePath);
+ boolean noInvalidChars = FileUtils.validateName(mRemotePath, true);
if (noInvalidChars) {
try {
mkcol = new MkColMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath));
--- /dev/null
+package com.owncloud.android.oc_framework.operations.remote;
+
+import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
+
+import android.util.Log;
+
+import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
+import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
+import com.owncloud.android.oc_framework.operations.RemoteOperation;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.oc_framework.utils.FileUtils;
+
+
+/**
+ * Remote operation performing the rename of a remote file or folder in the ownCloud server.
+ *
+ * @author David A. Velasco
+ * @author masensio
+ */
+public class RenameRemoteFileOperation extends RemoteOperation {
+
+ private static final String TAG = RenameRemoteFileOperation.class.getSimpleName();
+
+ private static final int RENAME_READ_TIMEOUT = 10000;
+ private static final int RENAME_CONNECTION_TIMEOUT = 5000;
+
+ private String mOldName;
+ private String mOldRemotePath;
+ private String mNewName;
+ private String mNewRemotePath;
+ private boolean mIsFolder;
+
+
+ /**
+ * Constructor
+ *
+ * @param oldName Old name of the file.
+ * @param oldRemotePath Old remote path of the file.
+ * @param newName New name to set as the name of file.
+ * @param newRemotePath New remote path to move the file, for folders it starts and ends by "/"
+ */
+ public RenameRemoteFileOperation(String oldName, String oldRemotePath, String newName, String newRemotePath, boolean isFolder) {
+ mOldName = oldName;
+ mOldRemotePath = oldRemotePath;
+ mNewName = newName;
+ mNewRemotePath = newRemotePath;
+ mIsFolder = isFolder;
+ }
+
+ /**
+ * Performs the rename operation.
+ *
+ * @param client Client object to communicate with the remote ownCloud server.
+ */
+ @Override
+ protected RemoteOperationResult run(WebdavClient client) {
+ RemoteOperationResult result = null;
+
+ LocalMoveMethod move = null;
+
+ boolean noInvalidChars = true;
+
+ if (mIsFolder)
+ noInvalidChars = FileUtils.validateName(mNewRemotePath, mIsFolder);
+ else
+ noInvalidChars = FileUtils.validateName(mNewName, mIsFolder);
+
+ if (noInvalidChars) {
+ try {
+
+ if (mNewName.equals(mOldName)) {
+ return new RemoteOperationResult(ResultCode.OK);
+ }
+
+ move = new LocalMoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mOldRemotePath),
+ client.getBaseUri() + WebdavUtils.encodePath(mNewRemotePath));
+ int status = client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT);
+
+ move.getResponseBodyAsString(); // exhaust response, although not interesting
+ result = new RemoteOperationResult(move.succeeded(), status, move.getResponseHeaders());
+ Log.i(TAG, "Rename " + mOldRemotePath + " to " + mNewRemotePath + ": " + result.getLogMessage());
+
+ } catch (Exception e) {
+ result = new RemoteOperationResult(e);
+ Log.e(TAG, "Rename " + mOldRemotePath + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + result.getLogMessage(), e);
+
+ } finally {
+ if (move != null)
+ move.releaseConnection();
+ }
+ } else {
+ result = new RemoteOperationResult(ResultCode.INVALID_CHARACTER_IN_NAME);
+ }
+
+ return result;
+ }
+
+ /**
+ * Move operation
+ *
+ */
+ private class LocalMoveMethod extends DavMethodBase {
+
+ public LocalMoveMethod(String uri, String dest) {
+ super(uri);
+ addRequestHeader(new org.apache.commons.httpclient.Header("Destination", dest));
+ }
+
+ @Override
+ public String getName() {
+ return "MOVE";
+ }
+
+ @Override
+ protected boolean isSuccess(int status) {
+ return status == 201 || status == 204;
+ }
+
+ }
+
+}
* @param fileName
* @return
*/
- public static boolean validateName(String fileName) {
+ public static boolean validateName(String fileName, boolean isFolder) {
boolean result = true;
- Log.d("FileUtils", "fileName =======" + fileName);
+ Log.d("FileUtils", "fileName ======= " + fileName);
String name = fileName.substring(1);
- if ((fileName.indexOf("/") > 0 && name.indexOf("/") < (name.length() - 1 ) ) ||
- fileName.contains("\\") || fileName.contains("<") || fileName.contains(">") ||
- fileName.contains(":") || fileName.contains("\"") || fileName.contains("|") ||
- fileName.contains("?") || fileName.contains("*")) {
+ if (isFolder) {
+ name = name.substring(0, name.length() - 1);
+ }
+ if (name.contains("/") || fileName.contains("\\") || fileName.contains("<") ||
+ fileName.contains(">") || fileName.contains(":") || fileName.contains("\"") ||
+ fileName.contains("|") || fileName.contains("?") || fileName.contains("*")) {
result = false;
}
return result;
import android.app.AlertDialog;\r
import android.app.Dialog;\r
import android.app.ProgressDialog;\r
-import android.content.ContentResolver;\r
import android.content.DialogInterface;\r
import android.content.Intent;\r
import android.content.SharedPreferences;\r
import java.io.File;
import java.io.IOException;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
-
+import org.apache.commons.httpclient.HttpException;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
-import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
import com.owncloud.android.oc_framework.operations.RemoteOperation;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.oc_framework.operations.remote.RenameRemoteFileOperation;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.Log_OC;
-//import org.apache.jackrabbit.webdav.client.methods.MoveMethod;
import android.accounts.Account;
-
/**
* Remote operation performing the rename of a remote file (or folder?) in the ownCloud server.
*
public class RenameFileOperation extends RemoteOperation {
private static final String TAG = RenameFileOperation.class.getSimpleName();
-
- private static final int RENAME_READ_TIMEOUT = 10000;
- private static final int RENAME_CONNECTION_TIMEOUT = 5000;
private OCFile mFile;
protected RemoteOperationResult run(WebdavClient client) {
RemoteOperationResult result = null;
- LocalMoveMethod move = null;
- mNewRemotePath = null;
+ // check if the new name is valid in the local file system
try {
- if (mNewName.equals(mFile.getFileName())) {
- return new RemoteOperationResult(ResultCode.OK);
+ if (!isValidNewName()) {
+ return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME);
}
-
String parent = (new File(mFile.getRemotePath())).getParent();
parent = (parent.endsWith(OCFile.PATH_SEPARATOR)) ? parent : parent + OCFile.PATH_SEPARATOR;
mNewRemotePath = parent + mNewName;
if (mFile.isFolder()) {
mNewRemotePath += OCFile.PATH_SEPARATOR;
}
-
- // check if the new name is valid in the local file system
- if (!isValidNewName()) {
- return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME);
- }
-
+
// check if a file with the new name already exists
if (client.existsFile(mNewRemotePath) || // remote check could fail by network failure. by indeterminate behavior of HEAD for folders ...
mStorageManager.getFileByPath(mNewRemotePath) != null) { // ... so local check is convenient
return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
}
- move = new LocalMoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()),
- client.getBaseUri() + WebdavUtils.encodePath(mNewRemotePath));
- int status = client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT);
- if (move.succeeded()) {
+
+ RenameRemoteFileOperation operation = new RenameRemoteFileOperation(mFile.getFileName(), mFile.getRemotePath(), mNewName,
+ mNewRemotePath, mFile.isFolder());
+ result = operation.execute(client);
+
+ if (result.isSuccess()) {
+ if (mFile.isFolder()) {
+ saveLocalDirectory();
- if (mFile.isFolder()) {
- saveLocalDirectory();
-
- } else {
- saveLocalFile();
-
- }
-
- /*
- *} else if (mFile.isDirectory() && (status == 207 || status >= 500)) {
- * // TODO
- * // if server fails in the rename of a folder, some children files could have been moved to a folder with the new name while some others
- * // stayed in the old folder;
- * //
- * // easiest and heaviest solution is synchronizing the parent folder (or the full account);
- * //
- * // a better solution is synchronizing the folders with the old and new names;
- *}
- */
-
+ } else {
+ saveLocalFile();
}
-
- move.getResponseBodyAsString(); // exhaust response, although not interesting
- result = new RemoteOperationResult(move.succeeded(), status, move.getResponseHeaders());
- Log_OC.i(TAG, "Rename " + mFile.getRemotePath() + " to " + mNewRemotePath + ": " + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + result.getLogMessage(), e);
-
- } finally {
- if (move != null)
- move.releaseConnection();
}
+ } catch (HttpException e) {
+ Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " +
+ ((result!= null) ? result.getLogMessage() : ""), e);
+ e.printStackTrace();
+ } catch (IOException e) {
+ Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " +
+ ((result!= null) ? result.getLogMessage() : ""), e);
+ e.printStackTrace();
+ }
+
return result;
}
return result;
}
-
- // move operation
- private class LocalMoveMethod extends DavMethodBase {
-
- public LocalMoveMethod(String uri, String dest) {
- super(uri);
- addRequestHeader(new org.apache.commons.httpclient.Header("Destination", dest));
- }
-
- @Override
- public String getName() {
- return "MOVE";
- }
-
- @Override
- protected boolean isSuccess(int status) {
- return status == 201 || status == 204;
- }
-
- }
-
-
}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
<classpathentry combineaccessrules="false" kind="src" path="/owncloud-android"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>