A framework for building convergent cross-platform Nextcloud clients using Flutter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

99 lines
3.3 KiB

part of '../../nextcloud.dart';
// ignore: public_member_api_docs
extension WebDavMultistatusFile on WebDavMultistatus {
/// Convert the [WebDavMultistatus] into a [WebDavFile] for easier handling
List<WebDavFile> toWebDavFiles(final WebDavClient client) => responses
.where((final response) => response.href != null)
.map(
(final response) => WebDavFile(
basePath: client.basePath,
response: response,
),
)
.toList();
}
/// WebDavFile class
class WebDavFile {
/// Creates a new WebDavFile object with the given path
WebDavFile({
required final String basePath,
required final WebDavResponse response,
}) : _basePath = basePath,
_response = response;
final String _basePath;
final WebDavResponse _response;
/// Get the props of the file
late final WebDavProp props =
_response.propstats.singleWhere((final propstat) => propstat.status.contains('200')).prop;
/// The path of file
late final String path =
Uri.decodeFull(_response.href!.substring(Uri.encodeFull(_basePath).length, _response.href!.length));
/// The fileid namespaced by the instance id, globally unique
late final String? id = props.ocid;
/// The unique id for the file within the instance
late final String? fileId = props.ocfileid;
/// Whether this is a collection resource type
late final bool? isCollection = props.davresourcetype != null ? props.davresourcetype!.collection != null : null;
/// Mime-type of the file
late final String? mimeType = props.davgetcontenttype;
/// ETag of the file
late final String? etag = props.davgetetag;
/// File content length or folder size
late final int? size = props.ocsize ?? props.davgetcontentlength;
/// The user id of the owner of a shared file
late final String? ownerId = props.ocownerid;
/// The display name of the owner of a shared file
late final String? ownerDisplay = props.ocownerdisplayname;
/// Share note
late final String? note = props.ncnote;
/// Last modified date of the file
late final DateTime? lastModified = () {
if (props.davgetlastmodified != null) {
return webdavDateFormat.parseUtc(props.davgetlastmodified!);
}
return null;
}();
/// Upload date of the file
late final DateTime? uploadedDate =
props.ncuploadtime != null ? DateTime.fromMillisecondsSinceEpoch(props.ncuploadtime! * 1000) : null;
/// Creation date of the file as provided by uploader
late final DateTime? createdDate =
props.nccreationtime != null ? DateTime.fromMillisecondsSinceEpoch(props.nccreationtime! * 1000) : null;
/// Whether this file is marked as favorite
late final bool? favorite = props.ocfavorite == null ? null : props.ocfavorite == 1;
/// Whether this file has a preview image
late final bool? hasPreview = props.nchaspreview;
/// Returns the decoded name of the file / folder without the whole path
late final String name = () {
// normalised path (remove trailing slash)
final end = path.endsWith('/') ? path.length - 1 : path.length;
final segments = Uri.parse(path, 0, end).pathSegments;
if (segments.isNotEmpty) {
return segments.last;
}
return '';
}();
/// Returns if the file is a directory
late final bool isDirectory = (isCollection ?? false) || path.endsWith('/');
}