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

// This file is autogenerated by:
//     mojo/public/tools/bindings/mojom_bindings_generator.py
// For:
//     mojom/vanadium/discovery.mojom
//

package io.v.mojo.discovery;

public interface Update extends org.chromium.mojo.bindings.Interface {

    public interface Proxy extends Update, org.chromium.mojo.bindings.Interface.Proxy {
    }

    Manager<Update, Update.Proxy> MANAGER = Update_Internal.MANAGER;

    void isLost(IsLostResponse callback);
    interface IsLostResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<Boolean> { }

    void getId(GetIdResponse callback);
    interface GetIdResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<byte[]> { }

    void getInterfaceName(GetInterfaceNameResponse callback);
    interface GetInterfaceNameResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<String> { }

    void getAddresses(GetAddressesResponse callback);
    interface GetAddressesResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<String[]> { }

    void getAttribute(String name, GetAttributeResponse callback);
    interface GetAttributeResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<String> { }

    void getAttachment(String name, GetAttachmentResponse callback);
    interface GetAttachmentResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<org.chromium.mojo.system.DataPipe.ConsumerHandle> { }

    void getAdvertisement(GetAdvertisementResponse callback);
    interface GetAdvertisementResponse extends org.chromium.mojo.bindings.Callbacks.Callback1<Advertisement> { }
}

