1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-07 16:06:08 +00:00

Include and parse shareWithAdditionalInfo to be used in shares autocompletion and list

This commit is contained in:
davigonz 2019-01-23 10:49:21 +01:00 committed by David González Verdugo
parent 249e25768b
commit 59ed7e42ec
3 changed files with 481 additions and 459 deletions

View File

@ -36,6 +36,7 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; 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;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
@ -46,24 +47,24 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
/** /**
* Created by masensio on 08/10/2015. * Created by masensio on 08/10/2015.
* <p> *
* Retrieves a list of sharees (possible targets of a share) from the ownCloud server. * Retrieves a list of sharees (possible targets of a share) from the ownCloud server.
* <p> *
* Currently only handles users and groups. Users in other OC servers (federation) should be added later. * Currently only handles users and groups. Users in other OC servers (federation) should be added later.
* <p> *
* Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626} * Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626}
* <p> *
* Syntax: * Syntax:
* Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees * Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees
* HTTP method: GET * HTTP method: GET
* url argument: itemType - string, required * url argument: itemType - string, required
* url argument: format - string, optional * url argument: format - string, optional
* url argument: search - string, optional * url argument: search - string, optional
* url arguments: perPage - int, optional * url arguments: perPage - int, optional
* url arguments: page - int, optional * url arguments: page - int, optional
* <p> *
* Status codes: * Status codes:
* 100 - successful * 100 - successful
* *
* @author masensio * @author masensio
* @author David A. Velasco * @author David A. Velasco
@ -71,22 +72,22 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
*/ */
public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObject>> { public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObject>> {
public static final String NODE_VALUE = "value";
public static final String PROPERTY_LABEL = "label";
public static final String PROPERTY_SHARE_TYPE = "shareType";
public static final String PROPERTY_SHARE_WITH = "shareWith";
private static final String TAG = GetRemoteShareesOperation.class.getSimpleName(); private static final String TAG = GetRemoteShareesOperation.class.getSimpleName();
// OCS Routes // OCS Routes
private static final String OCS_ROUTE = "ocs/v2.php/apps/files_sharing/api/v1/sharees"; // from OC 8.2 private static final String OCS_ROUTE = "ocs/v2.php/apps/files_sharing/api/v1/sharees"; // from OC 8.2
// Arguments - names // Arguments - names
private static final String PARAM_FORMAT = "format"; private static final String PARAM_FORMAT = "format";
private static final String PARAM_ITEM_TYPE = "itemType"; private static final String PARAM_ITEM_TYPE = "itemType";
private static final String PARAM_SEARCH = "search"; private static final String PARAM_SEARCH = "search";
private static final String PARAM_PAGE = "page"; // default = 1 private static final String PARAM_PAGE = "page"; // default = 1
private static final String PARAM_PER_PAGE = "perPage"; // default = 200 private static final String PARAM_PER_PAGE = "perPage"; // default = 200
// Arguments - constant values // Arguments - constant values
private static final String VALUE_FORMAT = "json"; private static final String VALUE_FORMAT = "json";
private static final String VALUE_ITEM_TYPE = "file"; // to get the server search for users / groups private static final String VALUE_ITEM_TYPE = "file"; // to get the server search for users / groups
// JSON Node names // JSON Node names
private static final String NODE_OCS = "ocs"; private static final String NODE_OCS = "ocs";
private static final String NODE_DATA = "data"; private static final String NODE_DATA = "data";
@ -94,6 +95,12 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
private static final String NODE_USERS = "users"; private static final String NODE_USERS = "users";
private static final String NODE_GROUPS = "groups"; private static final String NODE_GROUPS = "groups";
private static final String NODE_REMOTES = "remotes"; private static final String NODE_REMOTES = "remotes";
public static final String NODE_VALUE = "value";
public static final String PROPERTY_LABEL = "label";
public static final String PROPERTY_SHARE_TYPE = "shareType";
public static final String PROPERTY_SHARE_WITH = "shareWith";
public static final String PROPERTY_SHARE_WITH_ADDITIONAL_INFO = "shareWithAdditionalInfo";
private String mSearchString; private String mSearchString;
private int mPage; private int mPage;
private int mPerPage; private int mPerPage;
@ -101,9 +108,9 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
/** /**
* Constructor * Constructor
* *
* @param searchString string for searching users, optional * @param searchString string for searching users, optional
* @param page page index in the list of results; beginning in 1 * @param page page index in the list of results; beginning in 1
* @param perPage maximum number of results in a single page * @param perPage maximum number of results in a single page
*/ */
public GetRemoteShareesOperation(String searchString, int page, int perPage) { public GetRemoteShareesOperation(String searchString, int page, int perPage) {
mSearchString = searchString; mSearchString = searchString;
@ -115,7 +122,7 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
protected RemoteOperationResult<ArrayList<JSONObject>> run(OwnCloudClient client) { protected RemoteOperationResult<ArrayList<JSONObject>> run(OwnCloudClient client) {
RemoteOperationResult<ArrayList<JSONObject>> result; RemoteOperationResult<ArrayList<JSONObject>> result;
try { try{
Uri requestUri = client.getBaseUri(); Uri requestUri = client.getBaseUri();
Uri.Builder uriBuilder = requestUri.buildUpon() Uri.Builder uriBuilder = requestUri.buildUpon()
.appendEncodedPath(OCS_ROUTE) .appendEncodedPath(OCS_ROUTE)
@ -132,7 +139,7 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
int status = client.executeHttpMethod(getMethod); int status = client.executeHttpMethod(getMethod);
String response = getMethod.getResponseBodyAsString(); String response = getMethod.getResponseBodyAsString();
if (isSuccess(status)) { if(isSuccess(status)) {
Log_OC.d(TAG, "Successful response: " + response); Log_OC.d(TAG, "Successful response: " + response);
// Parse the response // Parse the response
@ -156,8 +163,8 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
}; };
ArrayList<JSONObject> data = new ArrayList<>(); // For result data ArrayList<JSONObject> data = new ArrayList<>(); // For result data
for (int i = 0; i < 6; i++) { for (int i=0; i<6; i++) {
for (int j = 0; j < jsonResults[i].length(); j++) { for(int j=0; j< jsonResults[i].length(); j++){
JSONObject jsonResult = jsonResults[i].getJSONObject(j); JSONObject jsonResult = jsonResults[i].getJSONObject(j);
data.add(jsonResult); data.add(jsonResult);
Log_OC.d(TAG, "*** Added item: " + jsonResult.getString(PROPERTY_LABEL)); Log_OC.d(TAG, "*** Added item: " + jsonResult.getString(PROPERTY_LABEL));
@ -167,7 +174,7 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
result = new RemoteOperationResult<>(OK); result = new RemoteOperationResult<>(OK);
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<>(getMethod); result = new RemoteOperationResult<>(getMethod);

View File

@ -1,5 +1,5 @@
/* ownCloud Android Library is available under MIT license /* ownCloud Android Library is available under MIT license
* Copyright (C) 2017 ownCloud GmbH. * Copyright (C) 2019 ownCloud GmbH.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -24,22 +24,32 @@
package com.owncloud.android.lib.resources.shares; package com.owncloud.android.lib.resources.shares;
import java.io.File;
import java.io.Serializable;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.FileUtils;
import java.io.Serializable;
/** /**
* Contains the data of a Share from the Share API * Contains the data of a Share from the Share API
* *
* @author masensio * @author masensio
* @author David A. Velasco * @author David A. Velasco
* @author David González Verdugo
*/ */
public class OCShare implements Parcelable, Serializable { public class OCShare implements Parcelable, Serializable {
/**
* Generated - should be refreshed every time the class changes!!
*/
private static final long serialVersionUID = 4124975224281327921L;
private static final String TAG = OCShare.class.getSimpleName();
public static final int DEFAULT_PERMISSION = -1; public static final int DEFAULT_PERMISSION = -1;
public static final int READ_PERMISSION_FLAG = 1; public static final int READ_PERMISSION_FLAG = 1;
public static final int UPDATE_PERMISSION_FLAG = 2; public static final int UPDATE_PERMISSION_FLAG = 2;
@ -69,25 +79,7 @@ public class OCShare implements Parcelable, Serializable {
public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 =
FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 +
SHARE_PERMISSION_FLAG; SHARE_PERMISSION_FLAG;
/**
* Parcelable Methods
*/
public static final Parcelable.Creator<OCShare> CREATOR = new Parcelable.Creator<OCShare>() {
@Override
public OCShare createFromParcel(Parcel source) {
return new OCShare(source);
}
@Override
public OCShare[] newArray(int size) {
return new OCShare[size];
}
};
/**
* 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 mId;
private long mFileSource; private long mFileSource;
private long mItemSource; private long mItemSource;
@ -99,6 +91,7 @@ public class OCShare implements Parcelable, Serializable {
private long mExpirationDate; private long mExpirationDate;
private String mToken; private String mToken;
private String mSharedWithDisplayName; private String mSharedWithDisplayName;
private String mSharedWithAdditionalInfo;
private String mName; private String mName;
private boolean mIsFolder; private boolean mIsFolder;
private long mUserId; private long mUserId;
@ -119,17 +112,6 @@ public class OCShare implements Parcelable, Serializable {
mPath = path; mPath = path;
} }
/// Getters and Setters
/**
* Reconstruct from parcel
*
* @param source The source parcel
*/
protected OCShare(Parcel source) {
readFromParcel(source);
}
/** /**
* Used internally. Reset all file properties * Used internally. Reset all file properties
*/ */
@ -145,6 +127,7 @@ public class OCShare implements Parcelable, Serializable {
mExpirationDate = 0; mExpirationDate = 0;
mToken = ""; mToken = "";
mSharedWithDisplayName = ""; mSharedWithDisplayName = "";
mSharedWithAdditionalInfo = "";
mIsFolder = false; mIsFolder = false;
mUserId = -1; mUserId = -1;
mRemoteId = -1; mRemoteId = -1;
@ -152,6 +135,8 @@ public class OCShare implements Parcelable, Serializable {
mName = ""; mName = "";
} }
/// Getters and Setters
public long getId() { public long getId() {
return mId; return mId;
} }
@ -240,6 +225,14 @@ public class OCShare implements Parcelable, Serializable {
this.mSharedWithDisplayName = (sharedWithDisplayName != null) ? sharedWithDisplayName : ""; this.mSharedWithDisplayName = (sharedWithDisplayName != null) ? sharedWithDisplayName : "";
} }
public String getSharedWithAdditionalInfo() {
return mSharedWithAdditionalInfo;
}
public void setSharedWithAdditionalInfo(String sharedWithAdditionalInfo) {
this.mSharedWithAdditionalInfo = sharedWithAdditionalInfo;
}
public String getName() { public String getName() {
return mName; return mName;
} }
@ -284,6 +277,30 @@ public class OCShare implements Parcelable, Serializable {
return ShareType.PUBLIC_LINK.equals(mShareType) && mShareWith.length() > 0; return ShareType.PUBLIC_LINK.equals(mShareType) && mShareWith.length() > 0;
} }
/**
* Parcelable Methods
*/
public static final Parcelable.Creator<OCShare> CREATOR = new Parcelable.Creator<OCShare>() {
@Override
public OCShare createFromParcel(Parcel source) {
return new OCShare(source);
}
@Override
public OCShare[] newArray(int size) {
return new OCShare[size];
}
};
/**
* Reconstruct from parcel
*
* @param source The source parcel
*/
protected OCShare(Parcel source) {
readFromParcel(source);
}
public void readFromParcel(Parcel source) { public void readFromParcel(Parcel source) {
mId = source.readLong(); mId = source.readLong();
@ -301,6 +318,7 @@ public class OCShare implements Parcelable, Serializable {
mExpirationDate = source.readLong(); mExpirationDate = source.readLong();
mToken = source.readString(); mToken = source.readString();
mSharedWithDisplayName = source.readString(); mSharedWithDisplayName = source.readString();
mSharedWithAdditionalInfo = source.readString();
mIsFolder = source.readInt() == 0; mIsFolder = source.readInt() == 0;
mUserId = source.readLong(); mUserId = source.readLong();
mRemoteId = source.readLong(); mRemoteId = source.readLong();
@ -308,11 +326,13 @@ public class OCShare implements Parcelable, Serializable {
mName = source.readString(); mName = source.readString();
} }
@Override @Override
public int describeContents() { public int describeContents() {
return this.hashCode(); return this.hashCode();
} }
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(mId); dest.writeLong(mId);
@ -326,11 +346,11 @@ public class OCShare implements Parcelable, Serializable {
dest.writeLong(mExpirationDate); dest.writeLong(mExpirationDate);
dest.writeString(mToken); dest.writeString(mToken);
dest.writeString(mSharedWithDisplayName); dest.writeString(mSharedWithDisplayName);
dest.writeString(mSharedWithAdditionalInfo);
dest.writeInt(mIsFolder ? 1 : 0); dest.writeInt(mIsFolder ? 1 : 0);
dest.writeLong(mUserId); dest.writeLong(mUserId);
dest.writeLong(mRemoteId); dest.writeLong(mRemoteId);
dest.writeString(mShareLink); dest.writeString(mShareLink);
dest.writeString(mName); dest.writeString(mName);
} }
}
}

View File

@ -28,6 +28,7 @@ import android.util.Xml;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.FileUtils;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
@ -36,413 +37,407 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
//import android.util.Log;
/** /**
* Parser for Share API Response * Parser for Share API Response
*
* @author masensio * @author masensio
* @author David González Verdugo * @author David González Verdugo
*/ */
public class ShareXMLParser { public class ShareXMLParser {
//private static final String TAG = ShareXMLParser.class.getSimpleName(); //private static final String TAG = ShareXMLParser.class.getSimpleName();
// No namespaces // No namespaces
private static final String ns = null; private static final String ns = null;
// NODES for XML Parser // NODES for XML Parser
private static final String NODE_OCS = "ocs"; private static final String NODE_OCS = "ocs";
private static final String NODE_META = "meta"; private static final String NODE_META = "meta";
private static final String NODE_STATUS = "status"; private static final String NODE_STATUS = "status";
private static final String NODE_STATUS_CODE = "statuscode"; private static final String NODE_STATUS_CODE = "statuscode";
private static final String NODE_MESSAGE = "message"; private static final String NODE_MESSAGE = "message";
private static final String NODE_DATA = "data"; private static final String NODE_DATA = "data";
private static final String NODE_ELEMENT = "element"; private static final String NODE_ELEMENT = "element";
private static final String NODE_ID = "id"; private static final String NODE_ID = "id";
private static final String NODE_ITEM_TYPE = "item_type"; private static final String NODE_ITEM_TYPE = "item_type";
private static final String NODE_ITEM_SOURCE = "item_source"; private static final String NODE_ITEM_SOURCE = "item_source";
private static final String NODE_PARENT = "parent"; private static final String NODE_PARENT = "parent";
private static final String NODE_SHARE_TYPE = "share_type"; private static final String NODE_SHARE_TYPE = "share_type";
private static final String NODE_SHARE_WITH = "share_with"; private static final String NODE_SHARE_WITH = "share_with";
private static final String NODE_FILE_SOURCE = "file_source"; private static final String NODE_FILE_SOURCE = "file_source";
private static final String NODE_PATH = "path"; private static final String NODE_PATH = "path";
private static final String NODE_PERMISSIONS = "permissions"; private static final String NODE_PERMISSIONS = "permissions";
private static final String NODE_STIME = "stime"; private static final String NODE_STIME = "stime";
private static final String NODE_EXPIRATION = "expiration"; private static final String NODE_EXPIRATION = "expiration";
private static final String NODE_TOKEN = "token"; private static final String NODE_TOKEN = "token";
private static final String NODE_STORAGE = "storage"; private static final String NODE_STORAGE = "storage";
private static final String NODE_MAIL_SEND = "mail_send"; private static final String NODE_MAIL_SEND = "mail_send";
private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname"; private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname";
private static final String NODE_NAME = "name"; private static final String NODE_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info";
private static final String NODE_NAME = "name";
private static final String NODE_URL = "url";
private static final String NODE_URL = "url";
private static final String TYPE_FOLDER = "folder";
private static final String TYPE_FOLDER = "folder";
private static final int SUCCESS = 200;
private static final int ERROR_WRONG_PARAMETER = 400; private static final int SUCCESS = 200;
private static final int ERROR_FORBIDDEN = 403; private static final int ERROR_WRONG_PARAMETER = 400;
private static final int ERROR_NOT_FOUND = 404; private static final int ERROR_FORBIDDEN = 403;
private static final int ERROR_NOT_FOUND = 404;
private String mStatus;
private int mStatusCode; private String mStatus;
private String mMessage; private int mStatusCode;
private String mMessage;
// Constructor
public ShareXMLParser() { // Getters and Setters
mStatusCode = -1; public String getStatus() {
} return mStatus;
}
// Getters and Setters
public String getStatus() { public void setStatus(String status) {
return mStatus; this.mStatus = status;
} }
public void setStatus(String status) { public int getStatusCode() {
this.mStatus = status; return mStatusCode;
} }
public int getStatusCode() { public void setStatusCode(int statusCode) {
return mStatusCode; this.mStatusCode = statusCode;
} }
public void setStatusCode(int statusCode) { public String getMessage() {
this.mStatusCode = statusCode; return mMessage;
} }
public String getMessage() { public void setMessage(String message) {
return mMessage; this.mMessage = message;
} }
public void setMessage(String message) { // Constructor
this.mMessage = message; public ShareXMLParser() {
} mStatusCode = -1;
}
public boolean isSuccess() {
return mStatusCode == SUCCESS; public boolean isSuccess() {
} return mStatusCode == SUCCESS;
}
public boolean isForbidden() {
return mStatusCode == ERROR_FORBIDDEN; public boolean isForbidden() {
} return mStatusCode == ERROR_FORBIDDEN;
}
public boolean isNotFound() {
return mStatusCode == ERROR_NOT_FOUND; public boolean isNotFound() {
} return mStatusCode == ERROR_NOT_FOUND;
}
public boolean isWrongParameter() {
return mStatusCode == ERROR_WRONG_PARAMETER; public boolean isWrongParameter() {
} return mStatusCode == ERROR_WRONG_PARAMETER;
}
/**
* Parse is as response of Share API /**
* * Parse is as response of Share API
* @param is * @param is
* @return List of ShareRemoteFiles * @return List of ShareRemoteFiles
* @throws XmlPullParserException * @throws XmlPullParserException
* @throws IOException * @throws IOException
*/ */
public ArrayList<OCShare> parseXMLResponse(InputStream is) throws XmlPullParserException, public ArrayList<OCShare> parseXMLResponse(InputStream is) throws XmlPullParserException,
IOException { IOException {
try { try {
// XMLPullParser // XMLPullParser
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true); factory.setNamespaceAware(true);
XmlPullParser parser = Xml.newPullParser(); XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(is, null); parser.setInput(is, null);
parser.nextTag(); parser.nextTag();
return readOCS(parser); return readOCS(parser);
} finally { } finally {
is.close(); is.close();
} }
} }
/** /**
* Parse OCS node * Parse OCS node
* * @param parser
* @param parser * @return List of ShareRemoteFiles
* @return List of ShareRemoteFiles * @throws XmlPullParserException
* @throws XmlPullParserException * @throws IOException
* @throws IOException */
*/ private ArrayList<OCShare> readOCS (XmlPullParser parser) throws XmlPullParserException,
private ArrayList<OCShare> readOCS(XmlPullParser parser) throws XmlPullParserException, IOException {
IOException { ArrayList<OCShare> shares = new ArrayList<>();
ArrayList<OCShare> shares = new ArrayList<>(); parser.require(XmlPullParser.START_TAG, ns , NODE_OCS);
parser.require(XmlPullParser.START_TAG, ns, NODE_OCS); while (parser.next() != XmlPullParser.END_TAG) {
while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) { continue;
continue; }
} String name = parser.getName();
String name = parser.getName(); // read NODE_META and NODE_DATA
// read NODE_META and NODE_DATA if (name.equalsIgnoreCase(NODE_META)) {
if (name.equalsIgnoreCase(NODE_META)) { readMeta(parser);
readMeta(parser); } else if (name.equalsIgnoreCase(NODE_DATA)) {
} else if (name.equalsIgnoreCase(NODE_DATA)) { shares = readData(parser);
shares = readData(parser); } else {
} else { skip(parser);
skip(parser); }
}
}
} return shares;
return shares; }
}
/**
/** * Parse Meta node
* Parse Meta node * @param parser
* * @throws XmlPullParserException
* @param parser * @throws IOException
* @throws XmlPullParserException */
* @throws IOException private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException {
*/ parser.require(XmlPullParser.START_TAG, ns, NODE_META);
private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException { //Log_OC.d(TAG, "---- NODE META ---");
parser.require(XmlPullParser.START_TAG, ns, NODE_META); while (parser.next() != XmlPullParser.END_TAG) {
//Log_OC.d(TAG, "---- NODE META ---"); if (parser.getEventType() != XmlPullParser.START_TAG) {
while (parser.next() != XmlPullParser.END_TAG) { continue;
if (parser.getEventType() != XmlPullParser.START_TAG) { }
continue; String name = parser.getName();
}
String name = parser.getName(); if (name.equalsIgnoreCase(NODE_STATUS)) {
setStatus(readNode(parser, NODE_STATUS));
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 if (name.equalsIgnoreCase(NODE_STATUS_CODE)) {
setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); } else if (name.equalsIgnoreCase(NODE_MESSAGE)) {
setMessage(readNode(parser, NODE_MESSAGE));
} else if (name.equalsIgnoreCase(NODE_MESSAGE)) {
setMessage(readNode(parser, NODE_MESSAGE)); } else {
skip(parser);
} else { }
skip(parser);
} }
}
}
} /**
* Parse Data node
/** * @param parser
* Parse Data node * @return
* * @throws XmlPullParserException
* @param parser * @throws IOException
* @return */
* @throws XmlPullParserException private ArrayList<OCShare> readData(XmlPullParser parser) throws XmlPullParserException,
* @throws IOException IOException {
*/ ArrayList<OCShare> shares = new ArrayList<OCShare>();
private ArrayList<OCShare> readData(XmlPullParser parser) throws XmlPullParserException, OCShare share = null;
IOException {
ArrayList<OCShare> shares = new ArrayList<OCShare>(); parser.require(XmlPullParser.START_TAG, ns, NODE_DATA);
OCShare share = null; //Log_OC.d(TAG, "---- NODE DATA ---");
while (parser.next() != XmlPullParser.END_TAG) {
parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); if (parser.getEventType() != XmlPullParser.START_TAG) {
//Log_OC.d(TAG, "---- NODE DATA ---"); continue;
while (parser.next() != XmlPullParser.END_TAG) { }
if (parser.getEventType() != XmlPullParser.START_TAG) { String name = parser.getName();
continue; if (name.equalsIgnoreCase(NODE_ELEMENT)) {
} readElement(parser, shares);
String name = parser.getName();
if (name.equalsIgnoreCase(NODE_ELEMENT)) { } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response
readElement(parser, shares); share = new OCShare();
String value = readNode(parser, NODE_ID);
} else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response share.setIdRemoteShared(Integer.parseInt(value));
share = new OCShare();
String value = readNode(parser, NODE_ID); } else if (name.equalsIgnoreCase(NODE_URL)) {
share.setIdRemoteShared(Integer.parseInt(value)); // NOTE: this field is received in all the public shares from OC 9.0.0
// in previous versions, it's received in the result of POST requests, but not
} else if (name.equalsIgnoreCase(NODE_URL)) { // in GET requests
// NOTE: this field is received in all the public shares from OC 9.0.0 share.setShareType(ShareType.PUBLIC_LINK);
// in previous versions, it's received in the result of POST requests, but not String value = readNode(parser, NODE_URL);
// in GET requests share.setShareLink(value);
share.setShareType(ShareType.PUBLIC_LINK);
String value = readNode(parser, NODE_URL); } else if (name.equalsIgnoreCase(NODE_TOKEN)) {
share.setShareLink(value); share.setToken(readNode(parser, NODE_TOKEN));
} else if (name.equalsIgnoreCase(NODE_TOKEN)) { } else {
share.setToken(readNode(parser, NODE_TOKEN)); skip(parser);
} else { }
skip(parser); }
} if (share != null) {
} // this is the response of a request for creation; don't pass to isValidShare()
shares.add(share);
if (share != null) { }
// this is the response of a request for creation; don't pass to isValidShare()
shares.add(share); return shares;
}
}
return shares;
} /**
* Parse Element node
/** * @param parser
* Parse Element node * @return
* * @throws XmlPullParserException
* @param parser * @throws IOException
* @return */
* @throws XmlPullParserException private void readElement(XmlPullParser parser, ArrayList<OCShare> shares)
* @throws IOException throws XmlPullParserException, IOException {
*/ parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT);
private void readElement(XmlPullParser parser, ArrayList<OCShare> shares)
throws XmlPullParserException, IOException { OCShare share = new OCShare();
parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT);
//Log_OC.d(TAG, "---- NODE ELEMENT ---");
OCShare share = new OCShare(); while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
//Log_OC.d(TAG, "---- NODE ELEMENT ---"); continue;
while (parser.next() != XmlPullParser.END_TAG) { }
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue; String name = parser.getName();
}
if (name.equalsIgnoreCase(NODE_ELEMENT)) {
String name = parser.getName(); // patch to work around servers responding with extra <element> surrounding all
// the shares on the same file before
if (name.equalsIgnoreCase(NODE_ELEMENT)) { // https://github.com/owncloud/core/issues/6992 was fixed
// patch to work around servers responding with extra <element> surrounding all readElement(parser, shares);
// the shares on the same file before
// https://github.com/owncloud/core/issues/6992 was fixed } else if (name.equalsIgnoreCase(NODE_ID)) {
readElement(parser, shares); share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID)));
} else if (name.equalsIgnoreCase(NODE_ID)) { } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) {
share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER));
fixPathForFolder(share);
} else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) {
share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) {
fixPathForFolder(share); share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)));
} else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { } else if (name.equalsIgnoreCase(NODE_PARENT)) {
share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); readNode(parser, NODE_PARENT);
} else if (name.equalsIgnoreCase(NODE_PARENT)) { } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) {
readNode(parser, NODE_PARENT); int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE));
share.setShareType(ShareType.fromValue(value));
} else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) {
int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)); } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) {
share.setShareType(ShareType.fromValue(value)); share.setShareWith(readNode(parser, NODE_SHARE_WITH));
} else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) {
share.setShareWith(readNode(parser, NODE_SHARE_WITH)); share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE)));
} else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { } else if (name.equalsIgnoreCase(NODE_PATH)) {
share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); share.setPath(readNode(parser, NODE_PATH));
fixPathForFolder(share);
} else if (name.equalsIgnoreCase(NODE_PATH)) {
share.setPath(readNode(parser, NODE_PATH)); } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) {
fixPathForFolder(share); share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS)));
} else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { } else if (name.equalsIgnoreCase(NODE_STIME)) {
share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME)));
} else if (name.equalsIgnoreCase(NODE_STIME)) { } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) {
share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); String value = readNode(parser, NODE_EXPIRATION);
if (!(value.length() == 0)) {
} else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { share.setExpirationDate(WebdavUtils.parseResponseDate(value).getTime());
String value = readNode(parser, NODE_EXPIRATION); }
if (!(value.length() == 0)) {
share.setExpirationDate(WebdavUtils.parseResponseDate(value).getTime()); } else if (name.equalsIgnoreCase(NODE_TOKEN)) {
} share.setToken(readNode(parser, NODE_TOKEN));
} else if (name.equalsIgnoreCase(NODE_TOKEN)) { } else if (name.equalsIgnoreCase(NODE_STORAGE)) {
share.setToken(readNode(parser, NODE_TOKEN)); readNode(parser, NODE_STORAGE);
} else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) {
} else if (name.equalsIgnoreCase(NODE_STORAGE)) { readNode(parser, NODE_MAIL_SEND);
readNode(parser, NODE_STORAGE);
} else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) { } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) {
readNode(parser, NODE_MAIL_SEND); share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME));
} else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) { } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_ADDITIONAL_INFO)) {
share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); share.setSharedWithAdditionalInfo(readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO));
} else if (name.equalsIgnoreCase(NODE_URL)) { } else if (name.equalsIgnoreCase(NODE_URL)) {
String value = readNode(parser, NODE_URL); String value = readNode(parser, NODE_URL);
share.setShareLink(value); share.setShareLink(value);
} else if (name.equalsIgnoreCase(NODE_NAME)) { } else if (name.equalsIgnoreCase(NODE_NAME)) {
share.setName(readNode(parser, NODE_NAME)); share.setName(readNode(parser, NODE_NAME));
} else { } else {
skip(parser); skip(parser);
} }
} }
if (isValidShare(share)) { if (isValidShare(share)) {
shares.add(share); shares.add(share);
} }
} }
private boolean isValidShare(OCShare share) { private boolean isValidShare(OCShare share) {
return (share.getRemoteId() > -1); return (share.getRemoteId() > -1);
} }
private void fixPathForFolder(OCShare share) { private void fixPathForFolder(OCShare share) {
if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 && if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 &&
!share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) { !share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) {
share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR); share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR);
} }
} }
/** /**
* Parse a node, to obtain its text. Needs readText method * Parse a node, to obtain its text. Needs readText method
* * @param parser
* @param parser * @param node
* @param node * @return Text of the node
* @return Text of the node * @throws XmlPullParserException
* @throws XmlPullParserException * @throws IOException
* @throws IOException */
*/ private String readNode (XmlPullParser parser, String node) throws XmlPullParserException,
private String readNode(XmlPullParser parser, String node) throws XmlPullParserException, IOException{
IOException { parser.require(XmlPullParser.START_TAG, ns, node);
parser.require(XmlPullParser.START_TAG, ns, node); String value = readText(parser);
String value = readText(parser); //Log_OC.d(TAG, "node= " + node + ", value= " + value);
//Log_OC.d(TAG, "node= " + node + ", value= " + value); parser.require(XmlPullParser.END_TAG, ns, node);
parser.require(XmlPullParser.END_TAG, ns, node); return value;
return value; }
}
/**
/** * Read the text from a node
* Read the text from a node * @param parser
* * @return Text of the node
* @param parser * @throws IOException
* @return Text of the node * @throws XmlPullParserException
* @throws IOException */
* @throws XmlPullParserException private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
*/ String result = "";
private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { if (parser.next() == XmlPullParser.TEXT) {
String result = ""; result = parser.getText();
if (parser.next() == XmlPullParser.TEXT) { parser.nextTag();
result = parser.getText(); }
parser.nextTag(); return result;
} }
return result;
} /**
* Skip tags in parser procedure
/** * @param parser
* Skip tags in parser procedure * @throws XmlPullParserException
* * @throws IOException
* @param parser */
* @throws XmlPullParserException private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
* @throws IOException if (parser.getEventType() != XmlPullParser.START_TAG) {
*/ throw new IllegalStateException();
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { }
if (parser.getEventType() != XmlPullParser.START_TAG) { int depth = 1;
throw new IllegalStateException(); while (depth != 0) {
} switch (parser.next()) {
int depth = 1; case XmlPullParser.END_TAG:
while (depth != 0) { depth--;
switch (parser.next()) { break;
case XmlPullParser.END_TAG: case XmlPullParser.START_TAG:
depth--; depth++;
break; break;
case XmlPullParser.START_TAG: }
depth++; }
break; }
}
}
}
} }