import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.operations.remote.CreateRemoteFolderOperation;
+import com.owncloud.android.oc_framework.operations.remote.RenameRemoteFileOperation;
+ import android.os.AsyncTask;
import android.os.Bundle;
import android.accounts.Account;
import android.accounts.AccountManager;
/**
* Access to the library method to Create a Folder
- * @param folderName
* @param remotePath
* @param createFullPath
+ *
* @return
*/
- public RemoteOperationResult createFolder(String folderName, String remotePath, boolean createFullPath) {
+ public RemoteOperationResult createFolder(String remotePath, boolean createFullPath) {
- CreateRemoteFolderOperation createOperation = new CreateRemoteFolderOperation(folderName, remotePath, createFullPath);
+ CreateRemoteFolderOperation createOperation = new CreateRemoteFolderOperation(remotePath, createFullPath);
RemoteOperationResult result = createOperation.execute(mClient);
return result;
}
+ /**
+ * Access to the library method to Rename a File or Folder
+ * @param oldName Old name of the file.
+ * @param oldRemotePath Old remote path of the file. For folders it starts and ends by "/"
+ * @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 "/"
+ *
+ * @return
+ */
+
+ public RemoteOperationResult renameFile(String oldName, String oldRemotePath, String newName, String newRemotePath) {
+
+ RenameRemoteFileOperation renameOperation = new RenameRemoteFileOperation(oldName, oldRemotePath, newName, newRemotePath);
+ RemoteOperationResult result = renameOperation.execute(mClient);
+
+ return result;
+ }
++
+ private class AuthTask extends AsyncTask<Context, Void, WebdavClient> {
+
+ @Override
+ protected WebdavClient doInBackground(Context... params) {
+ WebdavClient client = null;
+ try {
+ client = OwnCloudClientFactory.createOwnCloudClient(mAccount, (Context) params[0] );
+ } catch (OperationCanceledException e) {
+ Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
+ e.printStackTrace();
+ } catch (AuthenticatorException e) {
+ Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
+ e.printStackTrace();
+ } catch (AccountNotFoundException e) {
+ Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
+ e.printStackTrace();
+ } catch (IOException e) {
+ Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
+ e.printStackTrace();
+ }
+ return client;
+ }
+
+ @Override
+ protected void onPostExecute(WebdavClient result) {
+ // TODO Auto-generated method stub
+ super.onPostExecute(result);
+ mClient = result;
+ }
+
+ }
}
--- /dev/null
- boolean noInvalidChars = FileUtils.validateName(mNewName);
+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;
+
+
+ /**
+ * Constructor
+ *
+ * @param oldName Old name of the file.
+ * @param oldRemotePath Old remote path of the file. For folders it starts and ends by "/"
+ * @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) {
+ mOldName = oldName;
+ mOldRemotePath = oldRemotePath;
+ mNewName = newName;
+ mNewRemotePath = newRemotePath;
+ }
+
+ /**
+ * 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 = FileUtils.isValidPath(mNewRemotePath);
+
+ if (noInvalidChars) {
+ try {
+
+ if (mNewName.equals(mOldName)) {
+ return new RemoteOperationResult(ResultCode.OK);
+ }
+
+ // check if a file with the new name already exists
+ if (client.existsFile(mNewRemotePath)) {
+ return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
+ }
+
+ 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;
+ }
+
+ }
+
+}
Toast msg = Toast.makeText(this, R.string.rename_local_fail_msg, Toast.LENGTH_LONG);
msg.show();
// TODO throw again the new rename dialog
- Toast msg = Toast.makeText(this, R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG);
+ } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
++ Toast msg = Toast.makeText(this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG);
+ msg.show();
} else {
Toast msg = Toast.makeText(this, R.string.rename_server_fail_msg, Toast.LENGTH_LONG);
msg.show();
Toast msg = Toast.makeText(getActivity(), R.string.rename_local_fail_msg, Toast.LENGTH_LONG);
msg.show();
// TODO throw again the new rename dialog
- Toast msg = Toast.makeText(getActivity(), R.string.create_dir_fail_msg_invalid_characters, Toast.LENGTH_LONG);
+ } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
++ Toast msg = Toast.makeText(getActivity(), R.string.filename_forbidden_characters, Toast.LENGTH_LONG);
+ msg.show();
} else {
Toast msg = Toast.makeText(getActivity(), R.string.rename_server_fail_msg, Toast.LENGTH_LONG);
msg.show();