11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.components.devtools_bridge; 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.nio.ByteBuffer; 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/** 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Represents a pair of connected AbstractDataChannel's. Sends to one channel 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * come to another and vice versa. 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic class DataPipe { 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final SignalingThreadMock mSignalingThread = new SignalingThreadMock(); 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final PairedDataChannel mDC0 = new PairedDataChannel(); 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final PairedDataChannel mDC1 = new PairedDataChannel(); 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void connect() { 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC0.setPair(mDC1); 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC1.setPair(mDC0); 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC0.open(); 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC1.open(); 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void disconnect() { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC0.setPair(null); 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC1.setPair(null); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC0.close(); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC1.close(); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public AbstractDataChannel dataChannel(int index) { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (index) { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case 0: 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mDC0; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case 1: 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mDC1; 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci throw new IllegalArgumentException("index"); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void dispose() { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC0.dispose(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mDC1.dispose(); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mSignalingThread.dispose(); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private class PairedDataChannel extends DataChannelMock { 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private PairedDataChannel mPair; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public PairedDataChannel() { 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci super(mSignalingThread); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void setPair(final PairedDataChannel pair) { 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mSignalingThread.invoke(new Runnable() { 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void run() { 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mPair = pair; 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected void sendOnSignalingThread(ByteBuffer message) { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assert message.remaining() > 0; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (mPair == null) return; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mPair.notifyMessageOnSignalingThread(message); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected void disposeSignalingThread() { 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Ignore. Will dispose in DataPipe.dispose. 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 80