// 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.
@available(added=7)
library fuchsia.factory;
using fuchsia.io;

// NOTE: This API will be completely removed when components v2 is implemented.
// TODO(mbrunson): Add link to factory scaffolding library when available to
// allow easier transition to components v2 for clients.

/// This protocol is a base protocol for all providers of factory store
/// directories. It exposes a single method to allow clients to establish a
/// connection to a directory containing the relevant factory data. All files
/// surfaced by a component that implements FactoryStoreProvider (or any
/// protocol that depends on it) are expected to be validated for consistency
/// before being exposed to clients.
closed protocol FactoryStoreProvider {
    strict GetFactoryStore(resource struct {
        dir server_end:fuchsia.io.Directory;
    });
};

/// This protocol exposes a method to connect to a directory containing
/// Cast-specific factory data: public certificates and keys for
/// authentication with Cast servers.
@discoverable
closed protocol CastCredentialsFactoryStoreProvider {
    compose FactoryStoreProvider;
};

/// This protocol exposes a method to connect to a directory containing
/// Widevine-specific factory data: public certificates and keys for
/// authentication with Widevine systems.
@discoverable
closed protocol WidevineFactoryStoreProvider {
    compose FactoryStoreProvider;
};

/// This protocol exposes a method to connect to a directory containing
/// PlayReady-specific factory data: public certificates and keys for
/// authentication with PlayReady systems.
@discoverable
closed protocol PlayReadyFactoryStoreProvider {
    compose FactoryStoreProvider;
};

/// This protocol  exposes a method to connect to a directory containing
/// Weave-specific factory data: public certificates, signing keys, and
/// identity files for interoperation with a Weave-based home-area-network.
@discoverable
closed protocol WeaveFactoryStoreProvider {
    compose FactoryStoreProvider;
};

/// This protocol exposes a method to connect to a directory containing
/// miscellaneous factory data such as tuning/calibration files, region-specific
/// audio files, factory process metadata files, and more. Any raw files not
/// covered by other FactoryStoreProviders or methods in fuchsia.hwinfo will
/// appear here.
@discoverable
closed protocol MiscFactoryStoreProvider {
    compose FactoryStoreProvider;
};

@discoverable
closed protocol AlphaFactoryStoreProvider {
    compose FactoryStoreProvider;
};
