// Copyright 2016 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.

library fuchsia.sys;

// An FDIO file descriptor.
// TODO(abarth): Use the real FDIO declaration once FDIO converts to FIDL2.
struct FileDescriptor {
    // The FDIO types of the handle (e.g., FA_FDIO_REMOTE).
    int32 type0;
    int32 type1;
    int32 type2;

    // The handles for the file descriptor (e.g., a channel).
    handle? handle0;
    handle? handle1;
    handle? handle2;
};

// Information used to create an instance of a component and obtain
// services from it.
struct LaunchInfo {
    // The location from which to retrieve this component.
    //
    // This field will probably be replaced with a stronger notion of identity,
    // such as an unforgeable token. This field is included in this iteration to
    // ease the transition from the previous component interfaces.
    string url;

    // The arguments to be provided to the component.
    vector<string>? arguments;

    // The file descriptor to use for stdout.
    //
    // If null, the component will use the default stdout for the environment.
    FileDescriptor? out;

    // The file descriptor to use for stderr.
    //
    // If null, the component will use the default stderr for the environment.
    FileDescriptor? err;

    // The interface request for a Directory that is passed through to the
    // component and arrives in the component as its |directory_request|
    // interface request.
    handle<channel>? directory_request;

    // A custom namespace that can be appended to the namespace generated by
    // appmgr and provided to this component.
    // Adding a mount point at standard paths like 'pkg' or 'svc' will be ignored.
    // HACK(alhaad): Adding mount points for deprecated default directories like
    // '/data' will override the default.
    FlatNamespace? flat_namespace;

    // A list of services to be added to this component's svc namespace. These
    // services are in addition to those coming from Environment.
    ServiceList? additional_services;
};

struct ServiceList {
    // A list of services that can be requested from |provider|.
    vector<string> names;

    // A service provider to get the services listed in |names| from.
    ServiceProvider? provider;

    // A channel to the directory hosting the services in |names|.
    // TODO(CP-124): Support |host_directory| for CreateComponent and deprecate
    // |provider|.
    handle<channel>? host_directory;
};

// An interface for creating component instances.
//
// Typically obtained via |Environment.GetLauncher|.
[Discoverable]
protocol Launcher {
    // Creates a new instance of the component described by |launch_info|.
    //
    // The component instance is created in the |Environment|
    // associated with this |Launcher|. When creating the component,
    // the environment requests the environment services for this component from
    // its |EnvironmentHost|.
    //
    // The |controller| can be used to control the lifecycle of the created
    // component instance. If an |ComponentController|'s interface is
    // requested, the component instance is killed when the interface is closed.
    CreateComponent(LaunchInfo launch_info,
                    request<ComponentController>? controller);
};
