// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// fileManagerPrivate API.
// This is a private API used by the file browser of ChromeOS.
[platforms=("chromeos"),
 implemented_in="chrome/browser/chromeos/extensions/file_manager/file_manager_private_api_functions.h"]
namespace fileManagerPrivate {
// Type of the mounted volume.
enum VolumeType { drive, downloads, removable, archive, cloud_device, provided,
                  mtp, testing };

// Device type. Available if this is removable volume.
enum DeviceType { usb, sd, optical, mobile, unknown };

// Additional data about mount, for example, that the filesystem is not
// supported.
enum MountCondition { unknown, unsupported };

// Is the event raised for mounting or unmounting.
enum MountCompletedEventType { mount, unmount };

// Event type that tells listeners if mount was successful or an error
// occurred. It also specifies the error.
enum MountCompletedStatus {
  success,
  error_unknown,
  error_internal,
  error_invalid_argument,
  error_invalid_path,
  error_path_already_mounted,
  error_path_not_mounted,
  error_directory_creation_failed,
  error_invalid_mount_options,
  error_invalid_unmount_options,
  error_insufficient_permissions,
  error_mount_program_not_found,
  error_mount_program_failed,
  error_invalid_device_path,
  error_unknown_filesystem,
  error_unsupported_filesystem,
  error_invalid_archive,
  error_authentication,
  error_path_unmounted
};

// File transfer progress state.
enum TransferState { added, started, in_progress, completed, failed };

// Defines file transfer direction.
enum TransferType { upload, download };

// The type of the progress event.
enum CopyProgressStatusType {
  // "begin_copy_entry" is fired for each entry (file or directory) before
  // starting the copy operation.
  begin_copy_entry,

  // "end_copy_entry" is fired for each entry (file or directory) after ending
  // the copy operation.
  end_copy_entry,

  // "progress" is fired periodically to report progress of a file copy (not
  // directory).
  progress,

  // "success" is fired after all entries are copied.
  success,

  // "error" is fired when an error occurs.
  error
};

// Specifies type of event that is raised.
enum FileWatchEventType { changed, error };

// Specifies type of change in file watch event.
enum ChangeType { add_or_update, delete };

// The type of entry that is needed. Default to ALL.
enum SearchType { EXCLUDE_DIRECTORIES, SHARED_WITH_ME, OFFLINE, ALL };

// Zooming mode.
enum ZoomOperationType { in, out, reset };

// Specifies how to open inspector.
enum InspectionType {
  // Open inspector for foreground page.
  normal,
  // Open inspector for foreground page and bring focus to the console.
  console,
  // Open inspector for foreground page in inspect element mode.
  element,
  // Open inspector for background page.
  background
};

// Device event type.
enum DeviceEventType {
  // If the device is disabled by preference.
  disabled,
  // Device is removed.
  removed,
  // Device is hard unplugged.
  hard_unplugged,
  // Format started.
  format_start,
  // Format succeeded.
  format_success,
  // Format failed.
  format_fail
};

// Drive sync error type.
// Keep it synced with DriveSyncErrorType in operation_observer.h.
enum DriveSyncErrorType {
  // Request to delete a file without permission.
  delete_without_permission,
  // Google Drive is temporarily unavailable.
  service_unavailable,
  // Miscellaneous errors other than listed above.
  misc
};

// Result of task execution.
enum TaskResult {
  // The task execution succeeded and a new window/tab was opened.
  opened,
  // The task execution succeeded and the message was sent to the proper
  // extension.
  message_sent,
  // The task execution failed.
  failed,
  // No URL is specified.
  empty
};

// Drive share type.
enum DriveShareType {
  can_edit,
  can_comment,
  can_view
};

// ImageSet that represents multi-scale images.
dictionary ImageSet {
  // 1x scale URL.
  DOMString scale1xUrl;
  // 2x scale URL.
  DOMString scale2xUrl;
};

// A file task represents an action that the file manager can perform over the
// currently selected files. See
// chrome/browser/chromeos/extensions/file_manager/file_tasks.h for details
// about how file tasks are handled.
dictionary FileTask {
  // The unique identifier of the task.
  DOMString taskId;

  // Task title (ex. App name).
  DOMString title;

  // Task icon url (from chrome://extension-icon/...)
  DOMString iconUrl;

  // True if this task is a default task for the selected files.
  boolean isDefault;

  // True if this task is from generic file handler. Generic file handler is a
  // file handler which handles any type of files (e.g. extensions: ["*"],
  // types: ["*/*"]). Partial wild card (e.g. types: ["image/*"]) is not
  // generic file handler.
  boolean isGenericFileHandler;
};

// Additional entry properties.
dictionary EntryProperties {
  // Size of this file.
  double? fileSize;

  // Timestamp of entry update time, in milliseconds past the epoch.
  double? lastModifiedTime;

  // URL to the Drive thumbnail image for this file.
  DOMString? thumbnailUrl;

  // Width, if the entry is an image.
  long? imageWidth;

  // Height, if the entry is an image.
  long? imageHeight;

  // Rotation in clockwise degrees, if the entry is an image.
  long? imageRotation;

  // True if the file is pinned in cache.
  boolean? isPinned;

  // True if the file is present in cache.
  boolean? isPresent;

  // True if the file is hosted on a server instead of local.
  boolean? isHosted;

  // True if the file is available offline.
  boolean? isAvailableOffline;

  // True if the file is available on metered connection.
  boolean? isAvailableWhenMetered;

  // URL to the custom icon for this file.
  DOMString? customIconUrl;

  // Drive MIME type for this file.
  DOMString? contentMimeType;

  // True if the entry is labeled as shared-with-me.
  boolean? sharedWithMe;

  // True if the entry is labeled as shared (either from me to others or to me
  // by others.)
  boolean? shared;

  // External file URL to open the file in browser.
  DOMString? externalFileUrl;
};

// Information about total and remaining size on the mount point.
dictionary MountPointSizeStats {
  // Approximate total available size on the mount point.
  double totalSize;

  // Approximate remaining available size on the mount point.
  double remainingSize;
};

// Information about a profile.
dictionary ProfileInfo {
  // Profile ID. This is currently e-mail address of the profile.
  DOMString profileId;

  // The name of the profile for display purpose.
  DOMString displayName;

  // True if the profile is the one running the current file manager instance.
  // TODO(hirono): Remove the property because of the design change of
  // multi-profile suuport.
  boolean isCurrentProfile;
};

// Mounted disk volume metadata.
dictionary VolumeMetadata {
  // ID of the disk volume.
  DOMString volumeId;

  // Id the provided file system (for proviided file systems).
  DOMString? fileSystemId;

  // Extension providing this volume (for provided file systems).
  DOMString? extensionId;

  // Label of the volume (if available).
  DOMString? volumeLabel;

  // Description of the profile where the volume belongs.
  // TODO(hirono): Remove the property because of the design change of
  // multi-profile support.
  ProfileInfo profile;

  // The path to the mounted device, archive file or network resource.
  DOMString? sourcePath;

  // Type of the mounted volume.
  VolumeType volumeType;

  // Device type. Available if this is removable volume.
  DeviceType? deviceType;

  // Path to identify the device. This is consistent with DeviceEvent's
  // devicePath.
  DOMString? devicePath;

  // Whether the device is parent or not (i.e. sdb rather than sdb1).
  boolean? isParentDevice;

  // Flag that specifies if volume is mounted in read-only mode.
  boolean isReadOnly;

  // Flag that specifies whether the volume contains media.
  boolean hasMedia;
  
  // Additional data about mount, for example, that the filesystem is not
  // supported.
  MountCondition? mountCondition;
};

// Payload data for mount event.
dictionary MountCompletedEvent {
  // Is the event raised for mounting or unmounting.
  MountCompletedEventType eventType;

  // Event type that tells listeners if mount was successful or an error
  // occurred. It also specifies the error.
  MountCompletedStatus status;

  // Metadata of the mounted volume.
  VolumeMetadata volumeMetadata;

  // Whether the volume event should be notified or not.
  boolean shouldNotify;
};

// Payload data for file transfer status updates.
dictionary FileTransferStatus {
  // URL of file that is being transfered.
  DOMString fileUrl;

  // File transfer progress state.
  TransferState transferState;

  // Defines file transfer direction.
  TransferType transferType;

  // Approximated completed portion of the transfer operation.
  double? processed;

  // Approximated total size of transfer operation.
  double? total;

  // Total number of jobs.
  long num_total_jobs;
};

// Error during the drive sync.
dictionary DriveSyncErrorEvent {
  // Error type.
  DriveSyncErrorType type;

  // File URL of the entry that the error happens to.
  DOMString fileUrl;
};

// Payload data for copy status progress updates.
dictionary CopyProgressStatus {
  // The type of the progress event.
  CopyProgressStatusType type;

  // URL for the entry currently being copied. This field is particularly useful
  // when a directory copy is initiated with startCopy(). The field tells what
  // file/directory in that directory is now being copied.
  DOMString? sourceUrl;

  // URL for the entry currently being created. This field is particularly
  // useful when a directory copy is initiated with startCopy(). The field tells
  // what file/directory in that directory is being created. Available only for
  // end_copy_entry and success.
  DOMString? destinationUrl;

  // Number of processed bytes for the file currently being copied. Available
  // only for "progress" event. To show the progress bar, a caller needs to
  // pre-compute the size of files being copied for the file (not directory).
  double? size;

  // DOMError's name. Available only for ERROR event.
  DOMString? error;
};

// Payload data for file transfer cancel response.
dictionary FileTransferCancelStatus {
  // URL of file that is being transfered.
  DOMString fileUrl;

  // True if ongoing transfer operation was found and canceled.
  boolean canceled;
};

// Detailed information of change.
dictionary FileChange {
  // URL of changed file (or directory).
  DOMString url;

  // Type of change, which may be multiple.
  ChangeType[] changes;
};

// Directory change notification details.
dictionary FileWatchEvent {
  // Specifies type of event that is raised.
  FileWatchEventType eventType;

  // An Entry object which represents a changed directory. The conversion into a
  // kind of FileEntry object is done in
  // file_browser_handler_custom_bindings.cc. For filesystem API's Entry
  // interface, see <a
  // href='http://www.w3.org/TR/file-system-api/#the-entry-interface'>The Entry
  // interface</a>.
  [instanceOf=Entry] object entry;

  // Detailed change information of change. It would be null if the detailed
  // information is not available.
  FileChange[]? changedFiles;
};

dictionary Preferences {
  boolean driveEnabled;
  boolean cellularDisabled;
  boolean hostedFilesDisabled;
  boolean use24hourClock;
  boolean allowRedeemOffers;
};

dictionary PreferencesChange {
  boolean? cellularDisabled;
  boolean? hostedFilesDisabled;
};

dictionary SearchParams {
  // Search query.
  DOMString query;

  // ID of the search feed that should be fetched next. Value passed here should
  // be gotten from previous searchDrive call. It can be empty for the initial
  // search request.
  DOMString nextFeed;
};

dictionary SearchMetadataParams {
  // Search query. It can be empty. Any filename matches to an empty query.
  DOMString query;

  // The type of entry that is needed. Default to ALL.
  SearchType types;

  // Maximum number of results.
  long maxResults;
};

// Entry and Drive-related properties representing a search result.
dictionary SearchResult {
  // A dictionary object which represents a Drive file. This will be converted
  // into a kind of FileEntry object. See
  // file_browser_handler_custom_bindings.cc for details. For filesystem API's
  // Entry interface, see <a
  // href='http://www.w3.org/TR/file-system-api/#the-entry-interface'>The Entry
  // interface</a>.
  [instanceOf=Entry] object entry;

  // The base name of a Drive file that matched the search query. The matched
  // sub strings are highlighted with <b> element. Meta characters are escaped
  // like &lt;.
  DOMString highlightedBaseName;
};

dictionary DriveConnectionState {
  DOMString type;

  // Reasons of offline.
  DOMString? reason;

  // Whether the device has a cellular network access or not. i.e. the |type|
  // can be 'metered' or not.
  boolean hasCellularNetworkAccess;
};

// Device event dispatched to listeners of onDeviceChaged.  See also
// DeviceEventType to know when the event dispatched.
dictionary DeviceEvent {
  // Event type of the device event.
  DeviceEventType type;
  // Device path to identify the device.
  DOMString devicePath;
};

// Callback that does not take arguments.
callback SimpleCallback = void();

// |result| Result of the task execution.
callback ExecuteTaskCallback = void(TaskResult result);

// |tasks| The list of matched file URL patterns for this task.
callback GetFileTasksCallback = void(FileTask[] tasks);

// |result| Hash containing the string assets.
callback GetStringsCallback = void(object result);

// |success| True when file watch is successfully added.
callback AddFileWatchCallback = void(optional boolean success);

// |success| True when file watch is successfully removed.
callback RemoveFileWatchCallback = void(optional boolean success);

// |fileSystem| A DOMFileSystem instance for local file system access. null if
// the caller has no appropriate permissions.
callback RequestFileSystemCallback = void(optional object fileSystem);

// |entryProperties| A dictionary containing properties of the requested
// entries.
callback GetEntryPropertiesCallback =
    void(EntryProperties[] entryProperties);

// |sourcePath| Source path of the mount.
callback AddMountCallback = void(DOMString sourcePath);

// |volumeMetadataList| The list of VolumeMetadata representing mounted volumes.
callback GetVolumeMetadataListCallback =
    void(VolumeMetadata[] volumeMetadataList);

// |fileTransferCancelStatuses| The list of FileTransferCancelStatus.
callback CancelFileTransfersCallback =
    void(FileTransferCancelStatus[] fileTransferCancelStatuses);

// |copyId| ID of the copy task. Can be used to identify the progress, and to
// cancel the task.
callback StartCopyCallback = void(long copyId);

// |sizeStats| Name/value pairs of size stats. Will be undefined if stats could
// not be determined.
callback GetSizeStatsCallback = void(optional MountPointSizeStats sizeStats);

callback GetPreferencesCallback = void(Preferences result);

// |entries|
// |nextFeed| ID of the feed that contains next chunk of the search result.
//     Should be sent to the next searchDrive request to perform
//     incremental search.
callback SearchDriveCallback =
    void([instanceOf=Entry] object[] entries, DOMString nextFeed);

callback SearchDriveMetadataCallback = void(SearchResult[] results);

callback ZipSelectionCallback = void(optional boolean success);

callback GetDriveConnectionStateCallback = void(DriveConnectionState result);

// |result| true if the length is in the valid range, false otherwise.
callback ValidatePathNameLengthCallback = void(boolean result);

// |accessToken| OAuth2 access token, or an empty string if failed to fetch.
callback RequestAccessTokenCallback = void(DOMString accessToken);

// |accessToken| OAuth2 access token, or an empty string if failed to fetch.
callback RequestWebStoreAccessTokenCallback = void(DOMString accessToken);

// |url| Result url.
callback GetUrlCallback = void(DOMString url);

// |profiles| List of profile information.
// |runningProfile| ID of the profile that runs the application instance.
// |showingProfile| ID of the profile that shows the application window.
callback GetProfilesCallback = void(ProfileInfo[] profiles,
                                    DOMString runningProfile,
                                    DOMString displayProfile);

// |entryUrl| URL of an entry in a normal file system.
callback ResolveEntriesCallback =
    void([instanceOf=FileEntry] object[] entries);

interface Functions {
  // Logout the current user for navigating to the re-authentication screen for
  // the Google account.
  static void logoutUserForReauthentication();

  // Cancels file selection.
  static void cancelDialog();

  // Executes file browser task over selected files.
  // |taskId| The unique identifier of task to execute.
  // |fileUrls| Array of file URLs
  // |callback|
  static void executeTask(DOMString taskId,
                          DOMString[] fileUrls,
                          optional ExecuteTaskCallback callback);

  // Sets the default task for the supplied MIME types and suffixes of the
  // supplied file URLs. Lists of MIME types and URLs may contain duplicates.
  // |taskId| The unique identifier of task to mark as default.
  // |fileUrls| Array of selected file URLs to extract suffixes from.
  // |mimeTypes| Array of selected file MIME types.
  // |callback|
  static void setDefaultTask(DOMString taskId,
                             DOMString[] fileUrls,
                             optional DOMString[] mimeTypes,
                             optional SimpleCallback callback);

  // Gets the list of tasks that can be performed over selected files.
  // |fileUrls| Array of selected file URLs
  // |callback|
  static void getFileTasks(DOMString[] fileUrls,
                           GetFileTasksCallback callback);

  // Gets localized strings and initialization data.
  // |callback|
  static void getStrings(GetStringsCallback callback);

  // Adds file watch.
  // |fileUrl| URL of file to watch
  // |callback|
  static void addFileWatch(DOMString fileUrl, AddFileWatchCallback callback);

  // Removes file watch.
  // |fileUrl| URL of watched file to remove
  // |callback|
  static void removeFileWatch(DOMString fileUrl,
                              RemoveFileWatchCallback callback);

  // Requests access to a file system volume.
  // |volumeId| The ID of the file system volume to request. The volume ID is
  //     delivered to JavaScript as part of VolumeMetadata. By specifying
  //     "compatible", this function behaves in the compatible mode, where the
  //     returned FileSystem object gives access to all file system volumes such
  //     as Downloads folder and removal media like SD cards (i.e. all volumes
  //     are provided inside the single FileSystem object). In the new
  //     "per-volume FileSystem object model" crbug.com/322305, a separate
  //     FileSystem object is created for each volume. "compatible" parameter
  //     will be removed once Files.app is switched to the per-volume FileSystem
  //     object model.
  // |callback|
  static void requestFileSystem(DOMString volumeId,
                                RequestFileSystemCallback callback);

  // Selects multiple files.
  // |selectedPaths| Array of selected paths
  // |shouldReturnLocalPath| true if paths need to be resolved to local paths.
  // |callback|
  static void selectFiles(DOMString[] selectedPaths,
                          boolean shouldReturnLocalPath,
                          SimpleCallback callback);

  // Selects a file.
  // |selectedPath| A selected path
  // |index| Index of Filter
  // |forOpening| true if paths are selected for opening. false if for saving.
  // |shouldReturnLocalPath| true if paths need to be resolved to local paths.
  // |callback|
  static void selectFile(DOMString selectedPath,
                         long index,
                         boolean forOpening,
                         boolean shouldReturnLocalPath,
                         SimpleCallback callback);

  // Requests additional properties for files.
  // |fileUrls| list of URLs of files
  // |callback|
  static void getEntryProperties(
      DOMString[] fileUrls,
      GetEntryPropertiesCallback callback);

  // Pins/unpins a Drive file in the cache.
  // |fileUrl| URL of a file to pin/unpin.
  // |pin| Pass true to pin the file.
  // |callback| Completion callback. $(ref:runtime.lastError) will be set if
  //     there was an error.
  static void pinDriveFile(DOMString fileUrl,
                           boolean pin,
                           optional SimpleCallback callback);

  // Resolves file entries in the isolated file system and returns corresponding
  // entries in the external file system mounted to Chrome OS file manager
  // backend. If resolving entry fails, the entry will be just ignored and the
  // corresponding entry does not appear in the result.
  [nocompile]
  static void resolveIsolatedEntries(
      [instanceOf=FileEntry] object[] entries,
      ResolveEntriesCallback callback);

  // Mount a resource or a file.
  // |source| Mount point source. For compressed files it is relative file path
  //     within external file system
  // |callback|
  static void addMount(DOMString source, AddMountCallback callback);

  // Unmounts a mounted resource.
  // |volumeId| An ID of the volume.
  static void removeMount(DOMString volumeId);

  // Get the list of mounted volumes.
  // |callback|
  static void getVolumeMetadataList(GetVolumeMetadataListCallback callback);

  // Cancels ongoing file transfers for selected files.
  // |fileUrls| Array of files for which ongoing transfer should be canceled.
  //     If this is absent, all jobs are canceled.
  // |callback| Completion callback of the cancel.
  static void cancelFileTransfers(
      optional DOMString[] fileUrls,
      optional CancelFileTransfersCallback callback);

  // Starts to copy an entry. If the source is a directory, the copy is done
  // recursively.
  // |sourceUrl| URL of the source entry to be copied.
  // |parent| URL of the destination directory.
  // |newName| Name of the new entry. It shouldn't contain '/'.
  // |callback| Completion callback.
  static void startCopy(DOMString sourceUrl,
                        DOMString parent,
                        DOMString newName,
                        StartCopyCallback callback);

  // Cancels the running copy task.
  // |copyId| ID of the copy task to be cancelled.
  // |callback| Completion callback of the cancel.
  static void cancelCopy(long copyId, optional SimpleCallback callback);

  // Retrieves total and remaining size of a mount point.
  // |volumeId| ID of the volume to be checked.
  // |callback|
  static void getSizeStats(DOMString volumeId, GetSizeStatsCallback callback);

  // Formats a mounted volume.
  // |volumeId| ID of the volume to be formatted.
  static void formatVolume(DOMString volumeId);

  // Retrieves file manager preferences.
  // |callback|
  static void getPreferences(GetPreferencesCallback callback);

  // Sets file manager preferences.
  // |changeInfo|
  static void setPreferences(PreferencesChange changeInfo);

  // Performs drive content search.
  // |searchParams|
  // |callback|
  static void searchDrive(SearchParams searchParams,
                          SearchDriveCallback callback);

  // Performs drive metadata search.
  // |searchParams|
  // |callback|
  static void searchDriveMetadata(SearchMetadataParams searchParams,
                                  SearchDriveMetadataCallback callback);

  // Create a zip file for the selected files.
  // |dirURL| URL of the directory containing the selected files.
  // |selectionUrls| URLs of the selected files. The files must be under the
  //     directory specified by dirURL.
  // |destName| Name of the destination zip file. The zip file will be created
  //     under the directory specified by dirURL.
  // |callback|
  static void zipSelection(DOMString dirURL,
                           DOMString[] selectionUrls,
                           DOMString destName,
                           optional ZipSelectionCallback callback);

  // Retrieves the state of the current drive connection.
  // |callback|
  static void getDriveConnectionState(GetDriveConnectionStateCallback callback);

  // Checks whether the path name length fits in the limit of the filesystem.
  // |parent_directory_url| The URL of the parent directory entry.
  // |name| The name of the file.
  // |callback| Called back when the check is finished.
  static void validatePathNameLength(DOMString parent_directory_url,
                                     DOMString name,
                                     ValidatePathNameLengthCallback callback);

  // Changes the zoom factor of the Files.app.
  // |operation| Zooming mode.
  static void zoom(ZoomOperationType operation);

  // Requests a Drive API OAuth2 access token.
  // |refresh| Whether the token should be refetched instead of using the cached
  //     one.
  // |callback|
  static void requestAccessToken(boolean refresh,
                                 RequestAccessTokenCallback callback);

  // Requests a Webstore API OAuth2 access token.
  // |callback|
  static void requestWebStoreAccessToken(
      RequestWebStoreAccessTokenCallback callback);

  // Requests a share dialog url for the specified file.
  // |url| Url for the file.
  // |callback|
  static void getShareUrl(DOMString url, GetUrlCallback callback);

  // Requests a download url to download the file contents.
  // |url| Url for the file.
  // |callback|
  static void getDownloadUrl(DOMString url, GetUrlCallback callback);

  // Requests to share drive files.
  // |url| URL of a file to be shared.
  // |shareType| Type of access that is getting granted.
  static void requestDriveShare(DOMString url,
                                DriveShareType shareType,
                                SimpleCallback callback);

  // Requests to install a webstore item.
  // |item_id| The id of the item to install.
  // |silentInstallation| False to show installation prompt. True not to show.
  // |callback|
  static void installWebstoreItem(DOMString itemId,
                                  boolean silentInstallation,
                                  SimpleCallback callback);

  // Obtains a list of profiles that are logged-in.
  static void getProfiles(GetProfilesCallback callback);

  // Moves the window to other user's desktop.
  static void visitDesktop(DOMString profileId,
                           optional SimpleCallback callback);

  // Opens inspector window.
  // |type| InspectionType which specifies how to open inspector.
  static void openInspector(InspectionType type);
};

interface Events {
  static void onMountCompleted(MountCompletedEvent event);

  static void onFileTransfersUpdated(FileTransferStatus event);

  static void onCopyProgress(long copyId, CopyProgressStatus status);

  static void onDirectoryChanged(FileWatchEvent event);

  static void onPreferencesChanged();

  static void onDriveConnectionStatusChanged();

  static void onDeviceChanged(DeviceEvent event);

  static void onDriveSyncError(DriveSyncErrorEvent event);
};
};
