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

library fuchsia.pkg;

using fuchsia.io;
using zx;

/// Manages the system package cache.
///
/// This interface is intended to be implemented by the package manager component and used by
/// package resolver components.
[Discoverable]
protocol PackageCache {
    /// Gets the package directory if it is present on the local system. If it is not, the
    /// `missing_blobs` iterator will provide all the blobs in the package that are missing from
    /// the system, and the ability to write those blobs to blobfs. If all the missing blobs are
    /// downloaded and written to by the client, the `dir` directory will be resolved. This method
    /// will return `ZX_OK` when the package has been fully resolved, or an error if the client
    /// closes `needed_blobs` or `dir` handle before the package has been resolved.
    ///
    /// Arguments:
    /// * `meta_far_blob` is the blob info for the package's meta.far.
    /// * `selectors` are the package selectors (TODO: link to docs).
    /// * `needed_blobs` is an iterator over all the blobs in the package that
    ///   are not present on the system.
    /// * `dir` is an optional request for a directory that will be resolved when the package has
    ///   been successfully cached.
    ///
    /// Return Values:
    /// * `ZX_OK` if the package was successfully cached.
    /// * `ZX_ERR_UNAVAILABLE` if the client closed `needed_blobs` or `dir` handles before the
    ///   all the missing blobs were downloaded to the system.
    Get(
        BlobInfo meta_far_blob,
        vector<string> selectors,
        request<NeededBlobs> needed_blobs,
        request<fuchsia.io.Directory>? dir
        ) -> (zx.status status);

    /// Opens the package, or error out if it is not present on the local system.
    ///
    /// Arguments:
    /// * `meta_far_blob_id` is the blob id for the package's meta.far.
    /// * `selectors` are the package selectors (TODO: link to docs).
    /// * `dir` is a request for a directory that will be resolved when the package has been
    ///   successfully cached.
    ///
    /// Return Values:
    /// * `ZX_OK` if the package was successfully opened.
    /// * `ZX_ERR_NOT_FOUND` if the package does not exist.
    Open(
        BlobId meta_far_blob_id,
        vector<string> selectors,
        request<fuchsia.io.Directory> dir
        ) -> (zx.status status);
};

/// The `NeededBlobs` is an abstract interface that is provided by a `PackageCache` to the
/// `PackageResolver` to fetch one or more blobs that are not present on the local system for a
/// given package.
protocol NeededBlobs {
    /// Returns a vector of blobs that are not present on the system that must be downloaded and
    /// written to blobfs with the `Open` method before a package can be resolved. This method
    /// should continue to be called until it returns an empty vector. This signifies all the
    /// missing blobs have been successfully downloaded.
    GetMissingBlobs() -> (vector<BlobInfo> blobs);

    /// Open a blob for writing.
    ///
    /// Arguments:
    /// * `blob_id` is the blob id describing this blob.
    /// * `file` resolves to an opened writable file must be truncated to the correct size by the
    ///   caller.
    ///
    /// Return Values:
    /// * `ZX_OK` if successful.
    /// * `ZX_ERR_ACCESS_DENIED` if the package does not contain this blob.
    /// * `ZX_ERR_IO` if there is some other unspecified error during I/O.
    /// * `ZX_ERR_NO_SPACE` if there is no space available to store the package.
    Open(BlobId blob_id, request<fuchsia.io.File> file) -> (zx.status status);
};
