Java tutorial
// Copyright 2016 The Vanadium Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package io.v.mojo.discovery; import android.util.Log; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import java.nio.ByteBuffer; import java.util.List; import org.chromium.mojo.system.Core; import org.chromium.mojo.system.DataPipe; import org.chromium.mojo.system.DataPipe.ConsumerHandle; import org.chromium.mojo.system.DataPipe.ProducerHandle; import org.chromium.mojo.system.Pair; import org.chromium.mojo.system.MojoException; import io.v.v23.context.VContext; import io.v.v23.verror.VException; class UpdateImpl implements Update { private static final DataPipe.WriteFlags WRITE_FLAG = DataPipe.WriteFlags.none().setAllOrNone(true); private final Core mCore; private final VContext mContext; private final io.v.v23.discovery.Update mUpdate; UpdateImpl(Core core, VContext context, io.v.v23.discovery.Update update) { mCore = core; mContext = context; mUpdate = update; } @Override public void isLost(IsLostResponse callback) { callback.call(new Boolean(mUpdate.isLost())); } @Override public void getId(GetIdResponse callback) { callback.call(mUpdate.getId().toPrimitiveArray()); } @Override public void getInterfaceName(GetInterfaceNameResponse callback) { callback.call(mUpdate.getInterfaceName()); } @Override public void getAddresses(GetAddressesResponse callback) { List<String> addresses = mUpdate.getAddresses(); callback.call(addresses.toArray(new String[addresses.size()])); } @Override public void getAttribute(String name, GetAttributeResponse callback) { callback.call(mUpdate.getAttribute(name)); } @Override public void getAttachment(String name, GetAttachmentResponse callback) { Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = mCore.createDataPipe(null); callback.call(handles.second); final DataPipe.ProducerHandle producer = handles.first; try { Futures.addCallback(mUpdate.getAttachment(mContext, name), new FutureCallback<byte[]>() { @Override public void onSuccess(byte[] attachment) { try { ByteBuffer buf = ByteBuffer.allocateDirect(attachment.length); buf.put(attachment); producer.writeData(buf, WRITE_FLAG); } catch (MojoException e) { Log.e(DiscoveryApp.TAG, e.toString()); } finally { producer.close(); } } @Override public void onFailure(Throwable t) { // TODO(jhahn): Any way to notify an error to the requester? Log.e(DiscoveryApp.TAG, t.toString()); producer.close(); } }); } catch (VException e) { Log.e(DiscoveryApp.TAG, e.toString()); producer.close(); } } @Override public void getAdvertisement(GetAdvertisementResponse callback) { callback.call(Util.v2mAd(mUpdate.getAdvertisement())); } @Override public void close() { } @Override public void onConnectionError(MojoException e) { } }