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