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

using fuchsia.sys;

// Special value for GetKnownDeviceNames version_last_seen parameter to
// get the current status immediately.
const uint64 kInitialKnownDeviceNames = 0;

// Primary netconnector service definition.
[Discoverable]
protocol NetConnector {
    // Registers a running responding service. |service_name| identifies the
    // service and is the same name used in |ConnectToService|. |service_provider|
    // provides the service. This method is provided so that responding services
    // running in a user context can register with a |netconnector| running in a
    // device context.
    RegisterServiceProvider(string service_name,
                            fuchsia.sys.ServiceProvider service_provider);

    // Gets a provider for services on the specified device. Services provided
    // on the local device can be accessed by passing a |device_name| of "local"
    // or the actual name of the local device.
    GetDeviceServiceProvider(string device_name,
                             request<fuchsia.sys.ServiceProvider> service_provider);

    // Gets the names of known devices. To get the list immediately, call
    // |GetKnownDeviceNames(kInitialKnownDeviceNames)|. To get updates thereafter,
    // pass the version sent in the previous callback.
    GetKnownDeviceNames(uint64 version_last_seen)
        -> (uint64 version, vector<string> devices);
};
