// 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]
interface 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.
  1: CreateComponent(LaunchInfo launch_info,
                     request<ComponentController>? controller);
};
