From 974e55a2b95c652b794111254078b806f11fcf31 Mon Sep 17 00:00:00 2001 From: masensio Date: Thu, 30 Jan 2014 17:42:51 +0100 Subject: [PATCH 01/14] OC-2675: CreateShareRemoteOperation in Library --- .../remote/CreateShareRemoteOperation.java | 146 ++++++++++++++++++ .../remote/GetRemoteSharesOperation.java | 8 +- .../android/lib/utils/ShareUtils.java | 39 +++++ 3 files changed, 188 insertions(+), 5 deletions(-) create mode 100644 src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java create mode 100644 src/com/owncloud/android/lib/utils/ShareUtils.java diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java new file mode 100644 index 00000000..ee618a2a --- /dev/null +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -0,0 +1,146 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2014 ownCloud (http://www.owncloud.org/) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.operations.remote; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.http.HttpStatus; + +import android.util.Log; + +import com.owncloud.android.lib.network.OwnCloudClient; +import com.owncloud.android.lib.operations.common.OCShare; +import com.owncloud.android.lib.operations.common.RemoteOperation; +import com.owncloud.android.lib.operations.common.RemoteOperationResult; +import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode; +import com.owncloud.android.lib.operations.common.ShareType; +import com.owncloud.android.lib.utils.ShareUtils; +import com.owncloud.android.lib.utils.ShareXMLParser; + +/** + * Creates a new share. This allows sharing with a user or group or as a link. + * + * @author masensio + * + */ +public class CreateShareRemoteOperation extends RemoteOperation { + + private static final String TAG = CreateShareRemoteOperation.class.getSimpleName(); + + private static final String PARAM_PATH = "path"; + private static final String PARAM_SHARE_TYPE = "shareType"; + private static final String PARAM_SHARE_WITH = "shareWith"; + private static final String PARAM_PUBLIC_UPLOAD = "publicUpload"; + private static final String PARAM_PASSWORD = "password"; + private static final String PARAM_PERMISSIONS = "permissions"; + + private OCShare mShare; + private String mPath; + private ShareType mShareType; + private String mShareWith; + private boolean mPublicUpload; + private String mPassword; + private int mPermissions; + + /** + * Constructor + * @param path Full path of the file/folder being shared. 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 of 0 or 1 + * @param publicUpload If ‘false’ (default) public cannot upload to a public shared folder. + * If ‘true’ public can upload to a shared folder. Only available for public link shares + * @param password Password to protect a public link share. Only available for public link shares + * @param permissions 1 - Read only – Default for “public” shares + * 2 - Update + * 4 - Create + * 8 - Delete + * 16- Re-share + * 31- All above – Default for “private” shares + * For user or group shares. + * To obtain combinations, add the desired values together. + * For instance, for “Re-Share”, “delete”, “read”, “update”, add 16+8+2+1 = 27. + */ + public CreateShareRemoteOperation(String path, ShareType shareType, String shareWith, boolean publicUpload, + String password, int permissions) { + + mPath = path; + mShareType = shareType; + mShareWith = shareWith; + mPublicUpload = publicUpload; + mPassword = password; + mPermissions = permissions; + } + + @Override + protected RemoteOperationResult run(OwnCloudClient client) { + RemoteOperationResult result = null; + int status = -1; + + // Post Method + PostMethod post = new PostMethod(client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + Log.d(TAG, "URL ------> " + client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + + post.addParameter(PARAM_PATH, mPath); + post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); + post.addParameter(PARAM_SHARE_WITH, mShareWith); + post.addParameter(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload)); + post.addParameter(PARAM_PASSWORD, mPassword); + post.addParameter(PARAM_PERMISSIONS, Integer.toString(mPermissions)); + + try { + status = client.executeMethod(post); + + if(isSuccess(status)) { + String response = post.getResponseBodyAsString(); + Log.d(TAG, "Successful response: " + response); + + result = new RemoteOperationResult(ResultCode.OK); + + // TODO + // Parse xml response --> obtain the response in ShareFiles ArrayList + // convert String into InputStream + InputStream is = new ByteArrayInputStream(response.getBytes()); + ShareXMLParser xmlParser = new ShareXMLParser(); + + } + } catch (Exception e) { + result = new RemoteOperationResult(e); + Log.e(TAG, "Exception while Creating New Share", e); + } finally { + post.releaseConnection(); + } + + + + return result; + } + + private boolean isSuccess(int status) { + return (status == HttpStatus.SC_OK); + } + +} diff --git a/src/com/owncloud/android/lib/operations/remote/GetRemoteSharesOperation.java b/src/com/owncloud/android/lib/operations/remote/GetRemoteSharesOperation.java index 3149a045..b327c82e 100644 --- a/src/com/owncloud/android/lib/operations/remote/GetRemoteSharesOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/GetRemoteSharesOperation.java @@ -39,6 +39,7 @@ import com.owncloud.android.lib.operations.common.RemoteOperation; import com.owncloud.android.lib.operations.common.RemoteOperationResult; import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.operations.common.OCShare; +import com.owncloud.android.lib.utils.ShareUtils; import com.owncloud.android.lib.utils.ShareXMLParser; import android.util.Log; @@ -55,9 +56,6 @@ public class GetRemoteSharesOperation extends RemoteOperation { private static final String TAG = GetRemoteSharesOperation.class.getSimpleName(); - // OCS Route - private static final String SHAREAPI_ROUTE ="/ocs/v1.php/apps/files_sharing/api/v1/shares"; - private ArrayList mShares; // List of shares for result @@ -70,8 +68,8 @@ public class GetRemoteSharesOperation extends RemoteOperation { int status = -1; // Get Method - GetMethod get = new GetMethod(client.getBaseUri() + SHAREAPI_ROUTE); - Log.d(TAG, "URL ------> " + client.getBaseUri() + SHAREAPI_ROUTE); + GetMethod get = new GetMethod(client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + Log.d(TAG, "URL ------> " + client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); // Get the response try{ diff --git a/src/com/owncloud/android/lib/utils/ShareUtils.java b/src/com/owncloud/android/lib/utils/ShareUtils.java new file mode 100644 index 00000000..e134ffac --- /dev/null +++ b/src/com/owncloud/android/lib/utils/ShareUtils.java @@ -0,0 +1,39 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2014 ownCloud (http://www.owncloud.org/) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.utils; + +/** + * Contains Constants for Share Operation + * + * @author masensio + * + */ + +public class ShareUtils { + + // OCS Route + public static final String SHAREAPI_ROUTE ="/ocs/v1.php/apps/files_sharing/api/v1/shares"; + +} From f3453f138fd2450c9368989762300baa459c8857 Mon Sep 17 00:00:00 2001 From: masensio Date: Fri, 31 Jan 2014 10:12:53 +0100 Subject: [PATCH 02/14] OC-2678: Parse XML Response from Create New Share --- .../lib/operations/common/OCShare.java | 16 ++++++- .../remote/CreateShareRemoteOperation.java | 17 ++++++-- .../android/lib/utils/ShareXMLParser.java | 43 ++++++++++++++++++- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/common/OCShare.java b/src/com/owncloud/android/lib/operations/common/OCShare.java index 06d2b919..d7f051f4 100644 --- a/src/com/owncloud/android/lib/operations/common/OCShare.java +++ b/src/com/owncloud/android/lib/operations/common/OCShare.java @@ -55,6 +55,7 @@ public class OCShare implements Parcelable{ private boolean mIsDirectory; private long mUserId; private long mIdRemoteShared; + private String mShareLink; public OCShare() { super(); @@ -87,7 +88,8 @@ public class OCShare implements Parcelable{ mSharedWithDisplayName = null; mIsDirectory = false; mUserId = -1; - mIdRemoteShared = -1; + mIdRemoteShared = -1; + mShareLink = null; } /// Getters and Setters @@ -203,7 +205,15 @@ public class OCShare implements Parcelable{ public void setIdRemoteShared(long idRemoteShared) { this.mIdRemoteShared = idRemoteShared; } - + + public String getShareLink() { + return this.mShareLink; + } + + public void setShareLink(String shareLink) { + this.mShareLink = shareLink; + } + /** * Parcelable Methods */ @@ -248,6 +258,7 @@ public class OCShare implements Parcelable{ mIsDirectory = source.readInt() == 0; mUserId = source.readLong(); mIdRemoteShared = source.readLong(); + mShareLink = source.readString(); } @@ -273,6 +284,7 @@ public class OCShare implements Parcelable{ dest.writeInt(mIsDirectory ? 1 : 0); dest.writeLong(mUserId); dest.writeLong(mIdRemoteShared); + dest.writeString(mShareLink); } } diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index ee618a2a..8e3e3bc0 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -26,6 +26,7 @@ package com.owncloud.android.lib.operations.remote; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.util.ArrayList; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.http.HttpStatus; @@ -58,7 +59,8 @@ public class CreateShareRemoteOperation extends RemoteOperation { private static final String PARAM_PASSWORD = "password"; private static final String PARAM_PERMISSIONS = "permissions"; - private OCShare mShare; + private ArrayList mShares; // List of shares for result, one share in this case + private String mPath; private ShareType mShareType; private String mShareWith; @@ -125,6 +127,16 @@ public class CreateShareRemoteOperation extends RemoteOperation { // convert String into InputStream InputStream is = new ByteArrayInputStream(response.getBytes()); ShareXMLParser xmlParser = new ShareXMLParser(); + mShares = xmlParser.parseXMLResponse(is); + if (mShares != null) { + Log.d(TAG, "Shares: " + mShares.size()); + result = new RemoteOperationResult(ResultCode.OK); + ArrayList sharesObjects = new ArrayList(); + for (OCShare share: mShares) { + sharesObjects.add(share); + } + result.setData(sharesObjects); + } } } catch (Exception e) { @@ -133,9 +145,6 @@ public class CreateShareRemoteOperation extends RemoteOperation { } finally { post.releaseConnection(); } - - - return result; } diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index c764dd83..14250dcf 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -76,9 +76,12 @@ public class ShareXMLParser { private static final String NODE_STORAGE = "storage"; private static final String NODE_MAIL_SEND = "mail_send"; private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_display_name"; + + private static final String NODE_URL = "url"; private static final String TYPE_FOLDER = "folder"; + private String mStatus; private int mStatusCode; @@ -206,8 +209,12 @@ public class ShareXMLParser { String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { shares.add(readElement(parser)); - } else { - skip(parser); + } else { + //skip(parser); + OCShare share = tryReadCreateXMLResponse(parser); + if (share.getIdRemoteShared() > -1) { + shares.add(share); + } } } @@ -215,6 +222,38 @@ public class ShareXMLParser { } + /** + * Parse Create XML Response + * @param parser + * @return + */ + private OCShare tryReadCreateXMLResponse(XmlPullParser parser) throws XmlPullParserException, IOException { + OCShare share = new OCShare(); + + Log.d(TAG, "---- Create Share Response ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + + String name = parser.getName(); + + if (name.equalsIgnoreCase(NODE_ID)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); + + } else if (name.equalsIgnoreCase(NODE_URL)) { + share.setShareLink(readNode(parser, NODE_URL)); + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); + } else { + skip(parser); + } + } + + return share; + } + /** * Parse Element node * @param parser From 7e9efcfb351179bbb188f8537bdef306dc859361 Mon Sep 17 00:00:00 2001 From: masensio Date: Fri, 31 Jan 2014 11:26:53 +0100 Subject: [PATCH 03/14] OC-2678: Parse XMl Response, fix some problems in parsing method --- .../android/lib/utils/ShareXMLParser.java | 59 +++++++------------ 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 14250dcf..1e481c36 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -199,6 +199,7 @@ public class ShareXMLParser { */ private ArrayList readData(XmlPullParser parser) throws XmlPullParserException, IOException { ArrayList shares = new ArrayList(); + OCShare share = null; parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); Log.d(TAG, "---- NODE DATA ---"); @@ -209,50 +210,34 @@ public class ShareXMLParser { String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { shares.add(readElement(parser)); - } else { - //skip(parser); - OCShare share = tryReadCreateXMLResponse(parser); - if (share.getIdRemoteShared() > -1) { - shares.add(share); - } + } else { // Parse Create XML Response + share = new OCShare(); + + if (name.equalsIgnoreCase(NODE_ID)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); + + } else if (name.equalsIgnoreCase(NODE_URL)) { + share.setShareLink(readNode(parser, NODE_URL)); + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); + + } else { + skip(parser); + } + } } + + if (share != null) { + shares.add(share); + } + return shares; } - /** - * Parse Create XML Response - * @param parser - * @return - */ - private OCShare tryReadCreateXMLResponse(XmlPullParser parser) throws XmlPullParserException, IOException { - OCShare share = new OCShare(); - - Log.d(TAG, "---- Create Share Response ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - - String name = parser.getName(); - - if (name.equalsIgnoreCase(NODE_ID)) { - share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); - - } else if (name.equalsIgnoreCase(NODE_URL)) { - share.setShareLink(readNode(parser, NODE_URL)); - - } else if (name.equalsIgnoreCase(NODE_TOKEN)) { - share.setToken(readNode(parser, NODE_TOKEN)); - } else { - skip(parser); - } - } - - return share; - } /** * Parse Element node From 81acfb95719956a4ede9e0046fa154b42cbdf23b Mon Sep 17 00:00:00 2001 From: masensio Date: Fri, 31 Jan 2014 12:25:39 +0100 Subject: [PATCH 04/14] OC-2678: Consider CreateShareRemoteOperation returns result!=null in exceptions --- .../remote/CreateShareRemoteOperation.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index 8e3e3bc0..8e3a4d20 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -102,18 +102,20 @@ public class CreateShareRemoteOperation extends RemoteOperation { RemoteOperationResult result = null; int status = -1; - // Post Method - PostMethod post = new PostMethod(client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); - Log.d(TAG, "URL ------> " + client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); - - post.addParameter(PARAM_PATH, mPath); - post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); - post.addParameter(PARAM_SHARE_WITH, mShareWith); - post.addParameter(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload)); - post.addParameter(PARAM_PASSWORD, mPassword); - post.addParameter(PARAM_PERMISSIONS, Integer.toString(mPermissions)); + PostMethod post = null; try { + // Post Method + post = new PostMethod(client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + Log.d(TAG, "URL ------> " + client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + + post.addParameter(PARAM_PATH, mPath); + post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); + post.addParameter(PARAM_SHARE_WITH, mShareWith); + post.addParameter(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload)); + post.addParameter(PARAM_PASSWORD, mPassword); + post.addParameter(PARAM_PERMISSIONS, Integer.toString(mPermissions)); + status = client.executeMethod(post); if(isSuccess(status)) { @@ -138,12 +140,18 @@ public class CreateShareRemoteOperation extends RemoteOperation { result.setData(sharesObjects); } + } else { + result = new RemoteOperationResult(false, status, post.getResponseHeaders()); } + } catch (Exception e) { result = new RemoteOperationResult(e); Log.e(TAG, "Exception while Creating New Share", e); + } finally { - post.releaseConnection(); + if (post != null) { + post.releaseConnection(); + } } return result; } From 280701ea8d864f553609f6cdce32e686b74087c6 Mon Sep 17 00:00:00 2001 From: masensio Date: Fri, 31 Jan 2014 13:48:15 +0100 Subject: [PATCH 05/14] OC-2678: Changes in ShareXMLParser --- .../android/lib/utils/ShareXMLParser.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 1e481c36..665c55d6 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -210,21 +210,21 @@ public class ShareXMLParser { String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { shares.add(readElement(parser)); - } else { // Parse Create XML Response + } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response share = new OCShare(); - - if (name.equalsIgnoreCase(NODE_ID)) { - share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); - - } else if (name.equalsIgnoreCase(NODE_URL)) { - share.setShareLink(readNode(parser, NODE_URL)); + String value = readNode(parser, NODE_ID); + share.setIdRemoteShared(Integer.parseInt(value)); - } else if (name.equalsIgnoreCase(NODE_TOKEN)) { - share.setToken(readNode(parser, NODE_TOKEN)); - - } else { - skip(parser); - } + } else if (name.equalsIgnoreCase(NODE_URL)) { + share.setShareType(ShareType.PUBLIC_LINK); + String value = readNode(parser, NODE_URL); + share.setShareLink(value); + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); + + } else { + skip(parser); } } From cc71eeaa21e9217947dfce213049e16d02629b0b Mon Sep 17 00:00:00 2001 From: masensio Date: Fri, 31 Jan 2014 15:19:31 +0100 Subject: [PATCH 06/14] OC-2677: Create GetSharesForFileRemoteOperation in library --- .../remote/CreateShareRemoteOperation.java | 1 - .../GetSharesForFileRemoteOperation.java | 150 ++++++++++++++++++ 2 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index 8e3a4d20..b8052864 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -124,7 +124,6 @@ public class CreateShareRemoteOperation extends RemoteOperation { result = new RemoteOperationResult(ResultCode.OK); - // TODO // Parse xml response --> obtain the response in ShareFiles ArrayList // convert String into InputStream InputStream is = new ByteArrayInputStream(response.getBytes()); diff --git a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java new file mode 100644 index 00000000..89423a48 --- /dev/null +++ b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java @@ -0,0 +1,150 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2014 ownCloud (http://www.owncloud.org/) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.operations.remote; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; + +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.http.HttpStatus; + +import android.util.Log; + +import com.owncloud.android.lib.network.OwnCloudClient; +import com.owncloud.android.lib.operations.common.OCShare; +import com.owncloud.android.lib.operations.common.RemoteOperation; +import com.owncloud.android.lib.operations.common.RemoteOperationResult; +import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode; +import com.owncloud.android.lib.utils.ShareUtils; +import com.owncloud.android.lib.utils.ShareXMLParser; + +/** + * Provide a list shares for a specific file. + * The input is the full path of the desired file. + * The output is a list of everyone who has the file shared with them. + * + * @author masensio + * + */ + +public class GetSharesForFileRemoteOperation extends RemoteOperation { + + private static final String TAG = GetSharesForFileRemoteOperation.class.getSimpleName(); + + private static final String PARAM_PATH = "path"; + private static final String PARAM_RESHARES = "reshares"; + private static final String PARAM_SUBFILES = "subfiles"; + + private ArrayList mShares; // List of shares for result, one share in this case + + private String mPath; + private boolean mReshares; + private boolean mSubfiles; + + /** + * Constructor + * + * @param path Path to file or folder + * @param reshares If set to ‘false’ (default), only shares from the current user are returned + * If set to ‘true’, all shares from the given file are returned + * @param subfiles If set to ‘false’ (default), lists only the folder being shared + * If set to ‘true’, all shared files within the folder are returned. + */ + public GetSharesForFileRemoteOperation(String path, boolean reshares, boolean subfiles) { + mPath = path; + mReshares = reshares; + mSubfiles = subfiles; + } + + @Override + protected RemoteOperationResult run(OwnCloudClient client) { + RemoteOperationResult result = null; + int status = -1; + + GetMethod get = null; + + try { + // Get Method + get = new GetMethod(client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + Log.d(TAG, "URL ------> " + client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + + // Add Parameters to Get Method + get.setQueryString(new NameValuePair[] { + new NameValuePair(PARAM_PATH, mPath) + }); + get.setQueryString(new NameValuePair[] { + new NameValuePair(PARAM_RESHARES, String.valueOf(mReshares)) + }); + get.setQueryString(new NameValuePair[] { + new NameValuePair(PARAM_SUBFILES, String.valueOf(mSubfiles)) + }); + + status = client.executeMethod(get); + + if(isSuccess(status)) { + String response = get.getResponseBodyAsString(); + Log.d(TAG, "Successful response: " + response); + + result = new RemoteOperationResult(ResultCode.OK); + + // Parse xml response --> obtain the response in ShareFiles ArrayList + // convert String into InputStream + InputStream is = new ByteArrayInputStream(response.getBytes()); + ShareXMLParser xmlParser = new ShareXMLParser(); + mShares = xmlParser.parseXMLResponse(is); + if (mShares != null) { + Log.d(TAG, "Shares: " + mShares.size()); + result = new RemoteOperationResult(ResultCode.OK); + ArrayList sharesObjects = new ArrayList(); + for (OCShare share: mShares) { + sharesObjects.add(share); + } + result.setData(sharesObjects); + } + + } else { + result = new RemoteOperationResult(false, status, get.getResponseHeaders()); + } + + } catch (Exception e) { + result = new RemoteOperationResult(e); + Log.e(TAG, "Exception while Creating New Share", e); + + } finally { + if (get != null) { + get.releaseConnection(); + } + } + return result; + } + + private boolean isSuccess(int status) { + return (status == HttpStatus.SC_OK); + } + +} From 781e738347a87c2b24144e03f7fe8fe32603f2f3 Mon Sep 17 00:00:00 2001 From: masensio Date: Sat, 1 Feb 2014 14:32:20 +0100 Subject: [PATCH 07/14] OC-2677: Add GetSharesForFilesRemoteOperation. Add XMLParser --- .../GetSharesForFileRemoteOperation.java | 1 - .../lib/utils/GetSharesForFileXMLParser.java | 353 ++++++++++++++++++ 2 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java diff --git a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java index 89423a48..07c2fea9 100644 --- a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java @@ -30,7 +30,6 @@ import java.util.ArrayList; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; import org.apache.http.HttpStatus; import android.util.Log; diff --git a/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java b/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java new file mode 100644 index 00000000..3ad8b1b5 --- /dev/null +++ b/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java @@ -0,0 +1,353 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2014 ownCloud (http://www.owncloud.org/) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import android.util.Log; +import android.util.Xml; + +import com.owncloud.android.lib.operations.common.OCShare; +import com.owncloud.android.lib.operations.common.ShareType; + +/** + * Parser for Share API Response: GetSharesForFile Operation + * @author masensio + * + */ +public class GetSharesForFileXMLParser { + + private static final String TAG = GetSharesForFileXMLParser.class.getSimpleName(); + + // No namespaces + private static final String ns = null; + + // NODES for XML Parser + private static final String NODE_OCS = "ocs"; + + private static final String NODE_META = "meta"; + private static final String NODE_STATUS = "status"; + private static final String NODE_STATUS_CODE = "statuscode"; + //private static final String NODE_MESSAGE = "message"; + + private static final String NODE_DATA = "data"; + private static final String NODE_ELEMENT = "element"; + private static final String NODE_ID = "id"; + private static final String NODE_ITEM_TYPE = "item_type"; + private static final String NODE_ITEM_SOURCE = "item_source"; + private static final String NODE_PARENT = "parent"; + private static final String NODE_SHARE_TYPE = "share_type"; + private static final String NODE_SHARE_WITH = "share_with"; + private static final String NODE_FILE_SOURCE = "file_source"; + private static final String NODE_PATH = "path"; + private static final String NODE_PERMISSIONS = "permissions"; + private static final String NODE_STIME = "stime"; + private static final String NODE_EXPIRATION = "expiration"; + private static final String NODE_TOKEN = "token"; + private static final String NODE_STORAGE = "storage"; + private static final String NODE_MAIL_SEND = "mail_send"; + private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_display_name"; + + + private static final String TYPE_FOLDER = "folder"; + + + private String mStatus; + private int mStatusCode; + + // Getters and Setters + public String getStatus() { + return mStatus; + } + + public void setStatus(String status) { + this.mStatus = status; + } + + public int getStatusCode() { + return mStatusCode; + } + + public void setStatusCode(int statusCode) { + this.mStatusCode = statusCode; + } + + // Constructor + public GetSharesForFileXMLParser() { + // TODO Auto-generated constructor stub + } + + /** + * Parse is as response of Share API + * @param is + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + public ArrayList parseXMLResponse(InputStream is) throws XmlPullParserException, IOException { + + try { + // XMLPullParser + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, null); + parser.nextTag(); + return readOCS(parser); + + } finally { + is.close(); + } + } + + /** + * Parse OCS node + * @param parser + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + private ArrayList readOCS (XmlPullParser parser) throws XmlPullParserException, IOException { + ArrayList shares = new ArrayList(); + parser.require(XmlPullParser.START_TAG, ns , NODE_OCS); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // read NODE_META and NODE_DATA + if (name.equalsIgnoreCase(NODE_META)) { + readMeta(parser); + } else if (name.equalsIgnoreCase(NODE_DATA)) { + shares = readData(parser); + } else { + skip(parser); + } + + } + return shares; + + } + + /** + * Parse Meta node + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_META); + Log.d(TAG, "---- NODE META ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + + if (name.equalsIgnoreCase(NODE_STATUS)) { + setStatus(readNode(parser, NODE_STATUS)); + + } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) { + setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); + + } else { + skip(parser); + } + + } + } + + /** + * Parse Data node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private ArrayList readData(XmlPullParser parser) throws XmlPullParserException, IOException { + ArrayList shares = new ArrayList(); + + parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); + Log.d(TAG, "---- NODE DATA ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + shares.add(readElement(parser)); + } else { + skip(parser); + + } + } + + return shares; + + } + + + /** + * Parse Element node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private OCShare readElement(XmlPullParser parser) throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); + + OCShare share = new OCShare(); + + Log.d(TAG, "---- NODE ELEMENT ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + + String name = parser.getName(); + + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + share = readElement(parser); + + } else if (name.equalsIgnoreCase(NODE_ID)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); + + } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { + share.setIsDirectory(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + + } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { + share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); + + } else if (name.equalsIgnoreCase(NODE_PARENT)) { + readNode(parser, NODE_PARENT); + + } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) { + int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)); + share.setShareType(ShareType.fromValue(value)); + + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { + share.setShareWith(readNode(parser, NODE_SHARE_WITH)); + + } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { + share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); + + } else if (name.equalsIgnoreCase(NODE_PATH)) { + share.setPath(readNode(parser, NODE_PATH)); + + } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { + share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); + + } else if (name.equalsIgnoreCase(NODE_STIME)) { + share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); + + } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { + String value = readNode(parser, NODE_EXPIRATION); + if (!value.isEmpty()) { + share.setExpirationDate(Long.parseLong(readNode(parser, NODE_EXPIRATION))); // check if expiration is in long format or date format + } + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); + + } else if (name.equalsIgnoreCase(NODE_STORAGE)) { + readNode(parser, NODE_STORAGE); + } else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) { + readNode(parser, NODE_MAIL_SEND); + + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) { + share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); + + } else { + skip(parser); + } + } + + return share; + } + + /** + * Parse a node, to obtain its text. Needs readText method + * @param parser + * @param node + * @return Text of the node + * @throws XmlPullParserException + * @throws IOException + */ + private String readNode (XmlPullParser parser, String node) throws XmlPullParserException, IOException{ + parser.require(XmlPullParser.START_TAG, ns, node); + String value = readText(parser); + Log.d(TAG, "node= " + node + ", value= " + value); + parser.require(XmlPullParser.END_TAG, ns, node); + return value; + } + + /** + * Read the text from a node + * @param parser + * @return Text of the node + * @throws IOException + * @throws XmlPullParserException + */ + private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { + String result = ""; + if (parser.next() == XmlPullParser.TEXT) { + result = parser.getText(); + parser.nextTag(); + } + return result; + } + + /** + * Skip tags in parser procedure + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } +} From 09b1c3c15aa2644635796c93ee918f8b0a20ff7c Mon Sep 17 00:00:00 2001 From: masensio Date: Mon, 3 Feb 2014 09:25:48 +0100 Subject: [PATCH 08/14] OC-2772: Detect FILE_NOT_FOUND error in CreateShare --- .../remote/CreateShareRemoteOperation.java | 18 +++++++++++------- .../android/lib/utils/ShareXMLParser.java | 18 +++++++++++++++--- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index b8052864..3e985da2 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -129,14 +129,18 @@ public class CreateShareRemoteOperation extends RemoteOperation { InputStream is = new ByteArrayInputStream(response.getBytes()); ShareXMLParser xmlParser = new ShareXMLParser(); mShares = xmlParser.parseXMLResponse(is); - if (mShares != null) { - Log.d(TAG, "Shares: " + mShares.size()); - result = new RemoteOperationResult(ResultCode.OK); - ArrayList sharesObjects = new ArrayList(); - for (OCShare share: mShares) { - sharesObjects.add(share); + if (xmlParser.isSuccess()) { + if (mShares != null) { + Log.d(TAG, "Shares: " + mShares.size()); + result = new RemoteOperationResult(ResultCode.OK); + ArrayList sharesObjects = new ArrayList(); + for (OCShare share: mShares) { + sharesObjects.add(share); + } + result.setData(sharesObjects); } - result.setData(sharesObjects); + } else if (xmlParser.isFilNotFound()){ + result = new RemoteOperationResult(ResultCode.FILE_NOT_FOUND); } } else { diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 665c55d6..9ada0017 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -80,7 +80,10 @@ public class ShareXMLParser { private static final String NODE_URL = "url"; private static final String TYPE_FOLDER = "folder"; - + + private static final int SUCCESS = 100; + private static final int FAILURE = 403; + private static final int FILE_NOT_FOUND = 404; private String mStatus; private int mStatusCode; @@ -101,12 +104,21 @@ public class ShareXMLParser { public void setStatusCode(int statusCode) { this.mStatusCode = statusCode; } - // Constructor public ShareXMLParser() { - + mStatusCode = 100; } + public boolean isSuccess() { + return mStatusCode == SUCCESS; + } + public boolean isFailure() { + return mStatusCode == FAILURE; + } + public boolean isFilNotFound() { + return mStatusCode == FILE_NOT_FOUND; + } + /** * Parse is as response of Share API * @param is From 764fb1058fba09f5c06ba48cd700ed417d0f73a4 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Tue, 4 Feb 2014 14:15:34 +0100 Subject: [PATCH 09/14] Fixed creation of shares without password --- .../lib/operations/remote/CreateShareRemoteOperation.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index 3e985da2..171e7d6f 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -113,7 +113,9 @@ public class CreateShareRemoteOperation extends RemoteOperation { post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); post.addParameter(PARAM_SHARE_WITH, mShareWith); post.addParameter(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload)); - post.addParameter(PARAM_PASSWORD, mPassword); + if (mPassword != null && mPassword.length() > 0) { + post.addParameter(PARAM_PASSWORD, mPassword); + } post.addParameter(PARAM_PERMISSIONS, Integer.toString(mPermissions)); status = client.executeMethod(post); From 8689c7a6ca59a42fd35ca6118b76371bd79e1257 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 5 Feb 2014 09:36:55 +0100 Subject: [PATCH 10/14] Fix in set of parameters to get shares of a single file or folder --- .../remote/GetSharesForFileRemoteOperation.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java index 07c2fea9..ad1e6e61 100644 --- a/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/GetSharesForFileRemoteOperation.java @@ -94,13 +94,9 @@ public class GetSharesForFileRemoteOperation extends RemoteOperation { // Add Parameters to Get Method get.setQueryString(new NameValuePair[] { - new NameValuePair(PARAM_PATH, mPath) - }); - get.setQueryString(new NameValuePair[] { - new NameValuePair(PARAM_RESHARES, String.valueOf(mReshares)) - }); - get.setQueryString(new NameValuePair[] { - new NameValuePair(PARAM_SUBFILES, String.valueOf(mSubfiles)) + new NameValuePair(PARAM_PATH, mPath), + new NameValuePair(PARAM_RESHARES, String.valueOf(mReshares)), + new NameValuePair(PARAM_SUBFILES, String.valueOf(mSubfiles)) }); status = client.executeMethod(get); From e782cfa704097b709d8761f18b0aa0915f40bf74 Mon Sep 17 00:00:00 2001 From: masensio Date: Wed, 5 Feb 2014 16:37:12 +0100 Subject: [PATCH 11/14] OC-2840: Fix bug: It's not possible to share a folder which has special characters --- .../lib/operations/remote/CreateShareRemoteOperation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index 171e7d6f..7936315d 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -109,6 +109,7 @@ public class CreateShareRemoteOperation extends RemoteOperation { post = new PostMethod(client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); Log.d(TAG, "URL ------> " + client.getBaseUri() + ShareUtils.SHAREAPI_ROUTE); + post.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); // necessary for special characters post.addParameter(PARAM_PATH, mPath); post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); post.addParameter(PARAM_SHARE_WITH, mShareWith); From d96e31b5e595518dc6365e5b290dba124140dc26 Mon Sep 17 00:00:00 2001 From: masensio Date: Wed, 5 Feb 2014 17:57:29 +0100 Subject: [PATCH 12/14] OC-2845: Fix app crashes when trying to share the Shared folder --- .../lib/operations/remote/CreateShareRemoteOperation.java | 5 ++++- src/com/owncloud/android/lib/utils/ShareXMLParser.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java index 7936315d..968ca71e 100644 --- a/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/CreateShareRemoteOperation.java @@ -142,8 +142,11 @@ public class CreateShareRemoteOperation extends RemoteOperation { } result.setData(sharesObjects); } - } else if (xmlParser.isFilNotFound()){ + } else if (xmlParser.isFileNotFound()){ result = new RemoteOperationResult(ResultCode.FILE_NOT_FOUND); + + } else { + result = new RemoteOperationResult(false, status, post.getResponseHeaders()); } } else { diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 9ada0017..828714c5 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -115,7 +115,7 @@ public class ShareXMLParser { public boolean isFailure() { return mStatusCode == FAILURE; } - public boolean isFilNotFound() { + public boolean isFileNotFound() { return mStatusCode == FILE_NOT_FOUND; } From 858d5f106468ab2b78ee8f3ec6eeb8b00e8ff9a5 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 6 Feb 2014 19:52:55 +0100 Subject: [PATCH 13/14] Fixed path of shares on folders, and changed 'drectory' by 'folder' --- .../android/lib/operations/common/OCShare.java | 16 ++++++++-------- .../lib/utils/GetSharesForFileXMLParser.java | 2 +- .../android/lib/utils/ShareXMLParser.java | 10 +++++++++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/common/OCShare.java b/src/com/owncloud/android/lib/operations/common/OCShare.java index d7f051f4..898c0d18 100644 --- a/src/com/owncloud/android/lib/operations/common/OCShare.java +++ b/src/com/owncloud/android/lib/operations/common/OCShare.java @@ -52,7 +52,7 @@ public class OCShare implements Parcelable{ private long mExpirationDate; private String mToken; private String mSharedWithDisplayName; - private boolean mIsDirectory; + private boolean mIsFolder; private long mUserId; private long mIdRemoteShared; private String mShareLink; @@ -86,7 +86,7 @@ public class OCShare implements Parcelable{ mExpirationDate = 0; mToken = null; mSharedWithDisplayName = null; - mIsDirectory = false; + mIsFolder = false; mUserId = -1; mIdRemoteShared = -1; mShareLink = null; @@ -182,12 +182,12 @@ public class OCShare implements Parcelable{ this.mSharedWithDisplayName = sharedWithDisplayName; } - public boolean isDirectory() { - return mIsDirectory; + public boolean isFolder() { + return mIsFolder; } - public void setIsDirectory(boolean isDirectory) { - this.mIsDirectory = isDirectory; + public void setIsFolder(boolean isFolder) { + this.mIsFolder = isFolder; } public long getUserId() { @@ -255,7 +255,7 @@ public class OCShare implements Parcelable{ mExpirationDate = source.readLong(); mToken = source.readString(); mSharedWithDisplayName = source.readString(); - mIsDirectory = source.readInt() == 0; + mIsFolder = source.readInt() == 0; mUserId = source.readLong(); mIdRemoteShared = source.readLong(); mShareLink = source.readString(); @@ -281,7 +281,7 @@ public class OCShare implements Parcelable{ dest.writeLong(mExpirationDate); dest.writeString(mToken); dest.writeString(mSharedWithDisplayName); - dest.writeInt(mIsDirectory ? 1 : 0); + dest.writeInt(mIsFolder ? 1 : 0); dest.writeLong(mUserId); dest.writeLong(mIdRemoteShared); dest.writeString(mShareLink); diff --git a/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java b/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java index 3ad8b1b5..25c46e15 100644 --- a/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java +++ b/src/com/owncloud/android/lib/utils/GetSharesForFileXMLParser.java @@ -244,7 +244,7 @@ public class GetSharesForFileXMLParser { share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { - share.setIsDirectory(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 828714c5..4d456a7f 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -275,7 +275,8 @@ public class ShareXMLParser { share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { - share.setIsDirectory(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + fixPathForFolder(share); } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); @@ -295,6 +296,7 @@ public class ShareXMLParser { } else if (name.equalsIgnoreCase(NODE_PATH)) { share.setPath(readNode(parser, NODE_PATH)); + fixPathForFolder(share); } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); @@ -327,6 +329,12 @@ public class ShareXMLParser { return share; } + private void fixPathForFolder(OCShare share) { + if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 && !share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) { + share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR); + } + } + /** * Parse a node, to obtain its text. Needs readText method * @param parser From 546c19829c4139a95996faef619424b96347b15a Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 6 Feb 2014 20:09:02 +0100 Subject: [PATCH 14/14] OCShare made Serializable to be able to send it between components --- .../owncloud/android/lib/operations/common/OCShare.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/common/OCShare.java b/src/com/owncloud/android/lib/operations/common/OCShare.java index 898c0d18..9149ab73 100644 --- a/src/com/owncloud/android/lib/operations/common/OCShare.java +++ b/src/com/owncloud/android/lib/operations/common/OCShare.java @@ -24,6 +24,8 @@ package com.owncloud.android.lib.operations.common; +import java.io.Serializable; + import com.owncloud.android.lib.utils.FileUtils; import android.os.Parcel; @@ -37,9 +39,12 @@ import android.util.Log; * @author masensio * */ -public class OCShare implements Parcelable{ +public class OCShare implements Parcelable, Serializable { - private static final String TAG = OCShare.class.getSimpleName(); + /** Generated - should be refreshed every time the class changes!! */ + private static final long serialVersionUID = 4124975224281327921L; + + private static final String TAG = OCShare.class.getSimpleName(); private long mId; private long mFileSource;