// Copyright 2017 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.modular;

using fuchsia.sys;
using zx;

/// Provided to all component instances in their incoming namespace.
@discoverable
protocol ComponentContext {
    /// DEPRECATED: use the component's incoming namespace (for C++, see sys.ComponentContext)
    /// to connect to services provided by agents. See
    /// /docs/concepts/modular/guide/how_to_write_an_agent_cc.md for an example.
    ///
    /// Used to start an agent in the user scope if it isn't already running, and
    /// connect to it.
    @transitional
    DeprecatedConnectToAgent(resource struct {
        url string:MAX;
        incoming_services server_end:fuchsia.sys.ServiceProvider;
        controller server_end:AgentController;
    });

    /// DEPRECATED: use the component's incoming namespace (for C++, see sys.ComponentContext)
    /// to connect to services provided by agents. See
    /// /docs/concepts/modular/guide/how_to_write_an_agent_cc.md for an example.
    ///
    /// Connects to an agent that provides the given `request.service_name`, and
    /// then connects the given `request.channel` to that service.
    ///
    /// If an error is encountered, the `request.channel` will be closed with
    /// a status code, such as:
    ///   * `ZX_ERR_NOT_FOUND` -- if a `request.handler` agent URL is not
    ///     specified, and an agent for the `request.service_name` is not found
    ///   * `ZX_ERR_PEER_CLOSED` -- if `request.service_name` is not available from
    ///     the agent (either specified or discovered)
    @transitional
    DeprecatedConnectToAgentService(resource struct {
        request AgentServiceRequest;
    });
};

/// Used by ComponentContext.ConnectToAgentService
type AgentServiceRequest = resource table {
    /// The name of the requested service.
    1: service_name string:MAX;

    /// The channel that will be used to communicate with the requested service.
    2: channel zx.handle:CHANNEL;

    /// The component URL of the Agent that is to provide the specified service.
    /// If no handler is specified, the framework will perform resolution to
    /// find an appropriate handler.
    3: handler fuchsia.sys.component_url;

    /// The AgentController handle is optional. If provided, the channel
    /// will be kept open until the agent providing `service_name` is terminated.
    4: agent_controller server_end:AgentController;
};
