// Copyright 2019 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;

/// Resolves font packages from a registry.
///
/// This interface is intended to be implemented by package resolver components, and used
/// exclusively by fuchsia.fonts.Provider.
///
/// DEPRECATED. This is an interim solution, and will be revisited when Component Framework v2
/// becomes available and allows non-component packages and easier directory routing.
[Deprecated = "For use only in Font Provider. To be replaced after Components v2 launch.",
Discoverable]
protocol FontResolver {
    /// Populates or updates the cache of a font package, fetching it if it is not present on the
    /// local system.
    ///
    /// + request `package_url` The package URL of a font package.
    /// + request `update_policy` Freshness and caching policies to be used when the
    ///   `FontResolver` is fetching packages.
    /// + request `directory_request` Request for a directory that will be resolved when the package
    ///   has been successfully cached. The directory should contain a single file, corresponding to
    ///   the asset filename. The client should retain the directory handle for as long as needed to
    ///   prevent the package from being evicted from cache.
    ///
    /// - response `status` Outcome of the request.
    ///   * `ZX_OK` if the package was successfully opened.
    ///   * `ZX_ERR_ACCESS_DENIED` if the resolver does not have permission to fetch a package blob.
    ///   * `ZX_ERR_IO` if there is some other unspecified error during I/O.
    ///   * `ZX_ERR_NOT_FOUND` if the font package or a package blob does not exist, or is not known
    ///     to be a font package.
    ///   * `ZX_ERR_NO_SPACE` if there is no space available to store the package.
    ///   * `ZX_ERR_UNAVAILABLE` if the resolver is currently unable to fetch a package blob.
    Resolve(
        string package_url,
        UpdatePolicy update_policy,
        request<fuchsia.io.Directory> directory_request
        )
        -> (zx.status status);
};
