blob: eb2906df0b1201f7df8b159e5d25e2926f9549ce [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_DRIVE_MODEL_DRIVE_LIST_H_
#define IOS_CHROME_BROWSER_DRIVE_MODEL_DRIVE_LIST_H_
#import <Foundation/Foundation.h>
#import <vector>
#import "base/functional/callback.h"
@protocol SystemIdentity;
@class UIImage;
// A Drive item (file, folder or shared drive).
struct DriveItem {
DriveItem();
DriveItem(const DriveItem& other);
DriveItem(DriveItem&& other);
~DriveItem();
DriveItem& operator=(const DriveItem& other);
DriveItem& operator=(DriveItem&& other);
// Possible types of image for an item.
enum class ImageType {
// A generic icon which usually depends on the file type.
kIcon,
// A thumbnail i.e. preview of the file.
kThumbnail,
// A background image, only for shared drives.
kBackground,
// A shortcut image which depends on the target mime type (for shortcuts).
kShortcut,
};
// Returns whether this is a folder, shortcut to a folder or shared drive.
bool CanBeBrowsed() const;
// Returns the placeholder image for `item`.
UIImage* GetPlaceholderImage() const;
// Returns the type of image which should be used for this item.
ImageType GetImageType() const;
// Returns the appropriate image link to use for a given `item`.
// If there is no such link, returns nil instead.
NSString* GetImageLink() const;
// Comparison operator relies on `identifier` only.
bool operator==(const DriveItem& rhs) const {
return [identifier isEqualToString:rhs.identifier];
}
// Unique identifier for this item.
NSString* identifier = nil;
// The name of this item.
NSString* name = nil;
// Link to the item's icon.
NSString* icon_link = nil;
// Link to the item's thumbnail, if available.
NSString* thumbnail_link = nil;
// Link to this shared drive's background image. Only populated for shared
// drives.
NSString* background_image_link = nil;
// The time the item was created.
NSDate* created_time = nil;
// The last time the item was modified by anyone.
NSDate* modified_time = nil;
// The last time the item was modified by the user.
NSDate* modified_by_me_time = nil;
// The last time the item was viewed by the user.
NSDate* viewed_by_me_time = nil;
// The time the item was shared with the current user.
NSDate* shared_with_me_time = nil;
// Identifier of the item's parent folder.
NSString* parent_identifier = nil;
// Whether the item is a shortcut.
bool is_shortcut = false;
// If the item is a shortcut, the identifier of the target.
NSString* shortcut_target_identifier = nil;
// If the item is a shortcut, the MIME type of the target.
NSString* shortcut_target_mime_type = nil;
// Whether the item is a shared drive.
bool is_shared_drive = false;
// Whether the item is a folder.
bool is_folder = false;
// If this item is a file, the MIME type of the file.
NSString* mime_type = nil;
// Size in bytes. Will be 0 for folders or files that have no size, like
// shortcuts.
int64_t size = 0;
// If this item is a file, whether the user can download this file directly.
// If this is a file which cannot be downloaded directly, then it can only be
// exported to a different MIME type.
bool can_download = false;
// If this item is a file, the MD5 checksum of that file.
NSString* md5_checksum = nil;
};
// std::hash specialization for DriveItem.
template <>
struct std::hash<DriveItem> {
size_t operator()(const DriveItem& item) const {
return size_t{item.identifier.hash};
}
};
// Results reported by the completion block of a query to list/search for files.
struct DriveListResult {
DriveListResult();
DriveListResult(const DriveListResult& other);
DriveListResult(DriveListResult&& other);
~DriveListResult();
DriveListResult& operator=(const DriveListResult& other);
DriveListResult& operator=(DriveListResult&& other);
// List of items, if list/search succeeded.
std::vector<DriveItem> items;
// If there are more items to list/search, this token will be populated and
// can be used to continue the list/search.
NSString* next_page_token = nil;
// Error object, if list/search failed. Empty results are not treated as
// errors.
NSError* error = nil;
};
// Query object defining filtering/sorting criteria to search Drive items.
struct DriveListQuery {
// Lists/searches Drive for items in folder with `folder_identifier`.
NSString* folder_identifier = nil;
// If not nil, only files including `contains` are returned.
NSString* contains = nil;
// If not nil, only file starting with `filename_prefix` are returned.
NSString* filename_prefix = nil;
// See
// https://developers.google.com/drive/api/reference/rest/v3/files/list#query-parameters.
// `extra_term` should not contain any term related to 'trashed', 'contains',
// 'parents' or 'fullText', which are handled based on other properties.
// `extra_term` is parenthesized and anded with the other terms. For example,
// extraTerm could be:
// @"mimeType = 'image/jpg' or mimeType = 'image/png'".
NSString* extra_term = nil;
// See
// https://developers.google.com/drive/api/reference/rest/v3/files/list#query-parameters.
// Order by which to sort the results.
NSString* order_by = nil;
// The maximum number of items to return per page. Default value is 20.
// If `pageSize <= 0`, then the Drive API default page size will be used.
// See
// https://developers.google.com/drive/api/reference/rest/v3/files/list#query-parameters.
NSInteger page_size = 20;
// If not nil, the page token to use to continue a previous list/search. The
// other fields in this object need to be the same as in previous requests.
NSString* page_token = nil;
};
using DriveListCompletionCallback =
base::OnceCallback<void(const DriveListResult&)>;
// This interface is used to perform list/search queries in a user's Drive.
class DriveList {
public:
DriveList();
virtual ~DriveList();
// Returns the identity used to perform queries.
virtual id<SystemIdentity> GetIdentity() const = 0;
// Returns whether a query is currently being executed by this uploader.
virtual bool IsExecutingQuery() const = 0;
// Cancels the query currently being executed by this uploader.
virtual void CancelCurrentQuery() = 0;
// List items in Drive matching the given `query`.
// The final result, including possible error details, is returned
// asynchronously through `completion_callback`.
// TODO(crbug.com/344812086): This is being replaced with `ListFiles`. When
// subclasses do not override this method anymore, remove it.
virtual void ListItems(const DriveListQuery& query,
DriveListCompletionCallback completion_callback);
// List files and folders in Drive matching the given `query`.
// The final result, including possible error details, is returned
// asynchronously through `completion_callback`.
// TODO(crbug.com/344812086): Make pure virtual once implemented everywhere.
virtual void ListFiles(const DriveListQuery& query,
DriveListCompletionCallback completion_callback);
// List shared drives in Drive matching the given `query`.
// The final result, including possible error details, is returned
// asynchronously through `completion_callback`.
// TODO(crbug.com/344812086): Make pure virtual once implemented everywhere.
virtual void ListSharedDrives(
const DriveListQuery& query,
DriveListCompletionCallback completion_callback);
};
#endif // IOS_CHROME_BROWSER_DRIVE_MODEL_DRIVE_LIST_H_