correctly check if an item is a folder or file. closes https://github.com/PhilippC/keepass2android/issues/2589
This commit is contained in:
@@ -290,7 +290,10 @@ public class WebDavStorage extends JavaFileStorageBase {
|
|||||||
e.sizeInBytes = -1;
|
e.sizeInBytes = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e.isDirectory = r.href.endsWith("/");
|
|
||||||
|
e.isDirectory = r.href.endsWith("/") || okprop.IsCollection;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
e.displayName = okprop.DisplayName;
|
e.displayName = okprop.DisplayName;
|
||||||
if (e.displayName == null)
|
if (e.displayName == null)
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ public class PropfindXmlParser
|
|||||||
public String DisplayName;
|
public String DisplayName;
|
||||||
public String LastModified;
|
public String LastModified;
|
||||||
public String ContentLength;
|
public String ContentLength;
|
||||||
|
|
||||||
|
public boolean IsCollection;
|
||||||
}
|
}
|
||||||
public String status;
|
public String status;
|
||||||
public Prop prop;
|
public Prop prop;
|
||||||
@@ -191,6 +193,8 @@ public class PropfindXmlParser
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String name = parser.getName();
|
String name = parser.getName();
|
||||||
|
String namespace = parser.getNamespace();
|
||||||
|
|
||||||
|
|
||||||
android.util.Log.d("PARSE", "4name = " + name);
|
android.util.Log.d("PARSE", "4name = " + name);
|
||||||
if (name.equals("getcontentlength"))
|
if (name.equals("getcontentlength"))
|
||||||
@@ -200,6 +204,9 @@ public class PropfindXmlParser
|
|||||||
prop.LastModified = readText(parser);
|
prop.LastModified = readText(parser);
|
||||||
} else if (name.equals("displayname")) {
|
} else if (name.equals("displayname")) {
|
||||||
prop.DisplayName = readText(parser);
|
prop.DisplayName = readText(parser);
|
||||||
|
} else if (name.equals("resourcetype") && namespace.equals(ns)) {
|
||||||
|
// We found the <d:resourcetype> tag
|
||||||
|
prop.IsCollection = readResourceType(parser);
|
||||||
} else {
|
} else {
|
||||||
skip(parser);
|
skip(parser);
|
||||||
}
|
}
|
||||||
@@ -208,6 +215,37 @@ public class PropfindXmlParser
|
|||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean readResourceType(XmlPullParser parser) throws IOException, XmlPullParserException {
|
||||||
|
boolean isCollection = false;
|
||||||
|
parser.require(XmlPullParser.START_TAG, ns, "resourcetype");
|
||||||
|
|
||||||
|
while (parser.next() != XmlPullParser.END_TAG) {
|
||||||
|
|
||||||
|
if (parser.getEventType() != XmlPullParser.START_TAG) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String name = parser.getName();
|
||||||
|
String namespace = parser.getNamespace();
|
||||||
|
|
||||||
|
if (name.equals("collection") && namespace.equals(ns)) {
|
||||||
|
// We found <d:collection/>, so it's a folder
|
||||||
|
isCollection = true;
|
||||||
|
// Since <d:collection/> is usually an empty tag, just consume it.
|
||||||
|
// It might contain text if there's whitespace, so consume text then end tag.
|
||||||
|
if (parser.next() == XmlPullParser.TEXT) {
|
||||||
|
parser.nextTag(); // Move to the end tag
|
||||||
|
}
|
||||||
|
parser.require(XmlPullParser.END_TAG, ns, "collection");
|
||||||
|
} else {
|
||||||
|
// Skip any other unexpected tags within <d:resourcetype>
|
||||||
|
skip(parser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// After reading all children of <d:resourcetype>, ensure we are at its END_TAG
|
||||||
|
parser.require(XmlPullParser.END_TAG, ns, "resourcetype");
|
||||||
|
return isCollection;
|
||||||
|
}
|
||||||
|
|
||||||
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
|
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
|
||||||
android.util.Log.d("PARSE", "skipping " + parser.getName());
|
android.util.Log.d("PARSE", "skipping " + parser.getName());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user