blob: 68ade1b6e97d1a1ca371b5b47d9c5ef629cbe750 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.net.impl;
import org.chromium.net.BidirectionalStream;
import org.chromium.net.CronetEngine;
import org.chromium.net.CronetException;
import org.chromium.net.NetworkQualityRttListener;
import org.chromium.net.NetworkQualityThroughputListener;
import org.chromium.net.RequestFinishedInfo;
import org.chromium.net.UploadDataProvider;
import org.chromium.net.UploadDataSink;
import org.chromium.net.UrlRequest;
import org.chromium.net.UrlResponseInfo;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.concurrent.Executor;
/**
* This class contains wrapper classes for all Cronet API callback/listener classes. These classes
* only permit callbacks that the version of the client API is known to support. For example, if
* version 2 of the API adds a callback onFoo() but the client API this class is implementing is
* version 1, these wrapper classes should not call {@code mWrappedCallback.onFoo()} and should
* instead silently drop the callback.
*
* When adding any callback wrapping here, be sure you add the proper version check. Only callbacks
* supported in all versions of the API should forgo a version check.
*/
public class VersionSafeCallbacks {
/** Wrap a {@link UrlRequest.Callback} in a version safe manner. */
public static final class UrlRequestCallback extends UrlRequest.Callback {
private final UrlRequest.Callback mWrappedCallback;
public UrlRequestCallback(UrlRequest.Callback callback) {
mWrappedCallback = callback;
}
@Override
public void onRedirectReceived(
UrlRequest request, UrlResponseInfo info, String newLocationUrl) throws Exception {
mWrappedCallback.onRedirectReceived(request, info, newLocationUrl);
}
@Override
public void onResponseStarted(UrlRequest request, UrlResponseInfo info) throws Exception {
mWrappedCallback.onResponseStarted(request, info);
}
@Override
public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer)
throws Exception {
mWrappedCallback.onReadCompleted(request, info, byteBuffer);
}
@Override
public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
mWrappedCallback.onSucceeded(request, info);
}
@Override
public void onFailed(UrlRequest request, UrlResponseInfo info, CronetException error) {
mWrappedCallback.onFailed(request, info, error);
}
@Override
public void onCanceled(UrlRequest request, UrlResponseInfo info) {
mWrappedCallback.onCanceled(request, info);
}
}
/** Wrap a {@link UrlRequest.StatusListener} in a version safe manner. */
public static final class UrlRequestStatusListener extends UrlRequest.StatusListener {
private final UrlRequest.StatusListener mWrappedListener;
public UrlRequestStatusListener(UrlRequest.StatusListener listener) {
mWrappedListener = listener;
}
@Override
public void onStatus(int status) {
mWrappedListener.onStatus(status);
}
}
/** Wrap a {@link BidirectionalStream.Callback} in a version safe manner. */
public static final class BidirectionalStreamCallback extends BidirectionalStream.Callback {
private final BidirectionalStream.Callback mWrappedCallback;
public BidirectionalStreamCallback(BidirectionalStream.Callback callback) {
mWrappedCallback = callback;
}
@Override
public void onStreamReady(BidirectionalStream stream) {
mWrappedCallback.onStreamReady(stream);
}
@Override
public void onResponseHeadersReceived(BidirectionalStream stream, UrlResponseInfo info) {
mWrappedCallback.onResponseHeadersReceived(stream, info);
}
@Override
public void onReadCompleted(
BidirectionalStream stream,
UrlResponseInfo info,
ByteBuffer buffer,
boolean endOfStream) {
mWrappedCallback.onReadCompleted(stream, info, buffer, endOfStream);
}
@Override
public void onWriteCompleted(
BidirectionalStream stream,
UrlResponseInfo info,
ByteBuffer buffer,
boolean endOfStream) {
mWrappedCallback.onWriteCompleted(stream, info, buffer, endOfStream);
}
@Override
public void onResponseTrailersReceived(
BidirectionalStream stream,
UrlResponseInfo info,
UrlResponseInfo.HeaderBlock trailers) {
mWrappedCallback.onResponseTrailersReceived(stream, info, trailers);
}
@Override
public void onSucceeded(BidirectionalStream stream, UrlResponseInfo info) {
mWrappedCallback.onSucceeded(stream, info);
}
@Override
public void onFailed(
BidirectionalStream stream, UrlResponseInfo info, CronetException error) {
mWrappedCallback.onFailed(stream, info, error);
}
@Override
public void onCanceled(BidirectionalStream stream, UrlResponseInfo info) {
mWrappedCallback.onCanceled(stream, info);
}
}
/** Wrap a {@link UploadDataProvider} in a version safe manner. */
public static final class UploadDataProviderWrapper extends UploadDataProvider {
private final UploadDataProvider mWrappedProvider;
public UploadDataProviderWrapper(UploadDataProvider provider) {
mWrappedProvider = provider;
}
@Override
public long getLength() throws IOException {
return mWrappedProvider.getLength();
}
@Override
public void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer) throws IOException {
mWrappedProvider.read(uploadDataSink, byteBuffer);
}
@Override
public void rewind(UploadDataSink uploadDataSink) throws IOException {
mWrappedProvider.rewind(uploadDataSink);
}
@Override
public void close() throws IOException {
mWrappedProvider.close();
}
}
/** Wrap a {@link RequestFinishedInfo.Listener} in a version safe manner. */
public static final class RequestFinishedInfoListener extends RequestFinishedInfo.Listener {
private final RequestFinishedInfo.Listener mWrappedListener;
public RequestFinishedInfoListener(RequestFinishedInfo.Listener listener) {
super(listener.getExecutor());
mWrappedListener = listener;
}
@Override
public void onRequestFinished(RequestFinishedInfo requestInfo) {
mWrappedListener.onRequestFinished(requestInfo);
}
@Override
public Executor getExecutor() {
return mWrappedListener.getExecutor();
}
}
/**
* Wrap a {@link NetworkQualityRttListener} in a version safe manner.
* NOTE(pauljensen): Delegates equals() and hashCode() to wrapped listener to
* facilitate looking up by wrapped listener in an ArrayList.indexOf().
*/
public static final class NetworkQualityRttListenerWrapper extends NetworkQualityRttListener {
private final NetworkQualityRttListener mWrappedListener;
public NetworkQualityRttListenerWrapper(NetworkQualityRttListener listener) {
super(listener.getExecutor());
mWrappedListener = listener;
}
@Override
public void onRttObservation(int rttMs, long whenMs, int source) {
mWrappedListener.onRttObservation(rttMs, whenMs, source);
}
@Override
public Executor getExecutor() {
return mWrappedListener.getExecutor();
}
@Override
public int hashCode() {
return mWrappedListener.hashCode();
}
@Override
public boolean equals(Object o) {
if (o == null || !(o instanceof NetworkQualityRttListenerWrapper)) {
return false;
}
return mWrappedListener.equals(((NetworkQualityRttListenerWrapper) o).mWrappedListener);
}
}
/**
* Wrap a {@link NetworkQualityThroughputListener} in a version safe manner.
* NOTE(pauljensen): Delegates equals() and hashCode() to wrapped listener to
* facilitate looking up by wrapped listener in an ArrayList.indexOf().
*/
public static final class NetworkQualityThroughputListenerWrapper
extends NetworkQualityThroughputListener {
private final NetworkQualityThroughputListener mWrappedListener;
public NetworkQualityThroughputListenerWrapper(NetworkQualityThroughputListener listener) {
super(listener.getExecutor());
mWrappedListener = listener;
}
@Override
public void onThroughputObservation(int throughputKbps, long whenMs, int source) {
mWrappedListener.onThroughputObservation(throughputKbps, whenMs, source);
}
@Override
public Executor getExecutor() {
return mWrappedListener.getExecutor();
}
@Override
public int hashCode() {
return mWrappedListener.hashCode();
}
@Override
public boolean equals(Object o) {
if (o == null || !(o instanceof NetworkQualityThroughputListenerWrapper)) {
return false;
}
return mWrappedListener.equals(
((NetworkQualityThroughputListenerWrapper) o).mWrappedListener);
}
}
/** Wrap a {@link CronetEngine.Builder.LibraryLoader} in a version safe manner. */
public static final class LibraryLoader extends CronetEngine.Builder.LibraryLoader {
private final CronetEngine.Builder.LibraryLoader mWrappedLoader;
public LibraryLoader(CronetEngine.Builder.LibraryLoader libraryLoader) {
mWrappedLoader = libraryLoader;
}
@Override
public void loadLibrary(String libName) {
mWrappedLoader.loadLibrary(libName);
}
}
}