| // 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.sys2; | 
 |  | 
 | using fuchsia.io2; | 
 | using fuchsia.component; | 
 | using fuchsia.data; | 
 |  | 
 | /// Declares a capability offered by a component to one of its children, which | 
 | /// may have been offered by the component's containing realm, the component | 
 | /// itself, or one of its other children. | 
 | flexible union OfferDecl { | 
 |     1: OfferServiceDecl service; | 
 |     2: OfferProtocolDecl protocol; | 
 |     3: OfferDirectoryDecl directory; | 
 |     4: OfferStorageDecl storage; | 
 |     5: OfferRunnerDecl runner; | 
 |     6: OfferResolverDecl resolver; | 
 |     7: OfferEventDecl event; | 
 | }; | 
 |  | 
 | /// Describes the type of dependency implied by the capability. | 
 | enum DependencyType { | 
 |     /// A strong dependency which may be required by components that use it. | 
 |     STRONG = 1; | 
 |     /// A weak dependency specifically used to mark cyclic dependencies of | 
 |     /// migrated components. Components that use a weak dependency must support | 
 |     /// the dependency being unavailable at arbitrary times. | 
 |     WEAK_FOR_MIGRATION = 2; | 
 | }; | 
 |  | 
 | /// Declares a service offered by a component to one of its children, which may | 
 | /// have been offered by the component's containing realm, the component itself, | 
 | /// or one of its other children. | 
 | /// | 
 | /// To learn more about services, see: | 
 | /// https://fuchsia.dev/fuchsia-src/glossary#service | 
 | table OfferServiceDecl { | 
 |     /// The provider of the capability relative to the component itself. Must be | 
 |     /// `parent`, `self`, or `child`. | 
 |     1: Ref source; | 
 |  | 
 |     /// Name identifying the service being offered. | 
 |     2: fuchsia.component.name source_name; | 
 |  | 
 |     /// Reference to the target. Must be `child` or `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// The name under which the capability is being offered. | 
 |     4: fuchsia.component.name target_name; | 
 | }; | 
 |  | 
 | /// Declares a protocol offered by a component to one of its children, | 
 | /// which may have been offered by the component's containing realm, the | 
 | /// component itself, or one of its other children. | 
 | /// | 
 | /// To learn more about protocols, see: | 
 | /// https://fuchsia.dev/fuchsia-src/glossary#protocol | 
 | table OfferProtocolDecl { | 
 |     /// The provider of the capability relative to the component itself. Must be | 
 |     /// `parent`, `self`, or `child`. | 
 |     1: Ref source; | 
 |  | 
 |     /// Name identifying the protocol being offered. | 
 |     2: fuchsia.component.name source_name; | 
 |  | 
 |     /// Reference to the target. Must be `child` or `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// The name by which the capability is being offered. | 
 |     4: fuchsia.component.name target_name; | 
 |  | 
 |     /// The dependency type this offer represents. A component which recieves a | 
 |     /// weak offer must support the offered capability being unavailable at any | 
 |     /// point. | 
 |     5: DependencyType dependency_type; | 
 | }; | 
 |  | 
 | /// Declares a directory offered by a component to one of its children, which | 
 | /// may have been offered by the component's containing realm, the component | 
 | /// itself, or one of its other children. | 
 | table OfferDirectoryDecl { | 
 |     /// The provider of the capability relative to the component itself. Must be | 
 |     /// `parent`, `self`, or `child`. | 
 |     1: Ref source; | 
 |  | 
 |     /// Name identifying the directory being offered. | 
 |     2: fuchsia.component.name source_name; | 
 |  | 
 |     /// Reference to the target of the capability. Must be `child` or | 
 |     /// `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// The name by which the capability is being offered. | 
 |     4: fuchsia.component.name target_name; | 
 |  | 
 |     /// The maximum rights that can be set by a component using this directory, | 
 |     /// required iff `source == self`. | 
 |     5: fuchsia.io2.Rights rights; | 
 |  | 
 |     /// The subdirectory of this directory to offer instead of the root. Optional. | 
 |     6: string:fuchsia.component.MAX_PATH_LENGTH subdir; | 
 |  | 
 |     /// The dependency type this offer represents. A component which recieves a | 
 |     /// weak offer must support the offered capability being unavailable at any | 
 |     /// point. | 
 |     7: DependencyType dependency_type; | 
 | }; | 
 |  | 
 | /// Declares a storage capability offered by a component to one of its children, | 
 | /// such as meta storage offered by the component's containing realm or cache | 
 | /// storage offered by the component itself. | 
 | table OfferStorageDecl { | 
 |     /// The name of the storage capability being offered | 
 |     1: fuchsia.component.name source_name; | 
 |  | 
 |     /// The source of the storage capability. Must be `parent` or `storage`. | 
 |     2: Ref source; | 
 |  | 
 |     /// Reference to the target of the capability. Must be `child` or | 
 |     /// `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// The name the storage capability is being offered as | 
 |     4: fuchsia.component.name target_name; | 
 | }; | 
 |  | 
 | /// Declares a runner offered by a component to one of its children, which may | 
 | /// have been offered by the component's containing realm, the component itself, | 
 | /// or one of its other children. | 
 | table OfferRunnerDecl { | 
 |     /// The provider of the capability relative to the component itself. Must be | 
 |     /// `parent`, `self`, or `child`. | 
 |     1: Ref source; | 
 |  | 
 |     /// Name of the runner being offered. | 
 |     2: fuchsia.component.name source_name; | 
 |  | 
 |     /// Reference to the target of the capability. Must be `child` or | 
 |     /// `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// Name under which the capability is being offered. | 
 |     4: fuchsia.component.name target_name; | 
 | }; | 
 |  | 
 | /// Declares a resolver capability offered by a component to one of its children, which | 
 | /// may have been offered by the component's containing realm, the component itself, | 
 | /// or one of its other children. | 
 | table OfferResolverDecl { | 
 |     /// The provider of the capability relative to the component itself. Must be | 
 |     /// `parent`, `self`, or `child`. | 
 |     1: Ref source; | 
 |  | 
 |     /// Name of the resolver being offered. | 
 |     2: fuchsia.component.name source_name; | 
 |  | 
 |     /// Reference to the target of the capability. Must be `child` or | 
 |     /// `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// Name under which the capability is being offered. | 
 |     4: fuchsia.component.name target_name; | 
 | }; | 
 |  | 
 | /// Declares an event offered by a component. | 
 | table OfferEventDecl { | 
 |     /// The provider of the event. Must be `parent`. | 
 |     1: Ref source; | 
 |  | 
 |     /// Name of the event being offered. | 
 |     2: fuchsia.component.name source_name; | 
 |  | 
 |     /// Reference to the target of the event. Must be `child` or `collection`. | 
 |     3: Ref target; | 
 |  | 
 |     /// Name under which the event is being offered. | 
 |     4: fuchsia.component.name target_name; | 
 |  | 
 |     /// Filter for the event. The structure of the filter depends on the event type. May be absent | 
 |     /// for some events. | 
 |     5: fuchsia.data.Dictionary filter; | 
 | }; |