12ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson/*
22ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Copyright (C) 2011 The Android Open Source Project
32ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson *
42ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Licensed under the Apache License, Version 2.0 (the "License");
52ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * you may not use this file except in compliance with the License.
62ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * You may obtain a copy of the License at
72ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson *
82ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson *      http://www.apache.org/licenses/LICENSE-2.0
92ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson *
102ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Unless required by applicable law or agreed to in writing, software
112ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * distributed under the License is distributed on an "AS IS" BASIS,
122ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * See the License for the specific language governing permissions and
142ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * limitations under the License.
152ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson */
162ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
172ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonpackage com.android.nfc;
182ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
194a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamiltonimport android.util.Log;
204a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
212ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport java.io.IOException;
222ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport java.util.LinkedList;
232ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport java.util.List;
242ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
254a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamiltonpublic class MockLlcpSocket implements DeviceHost.LlcpSocket {
262ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private static final String TAG = "mockLlcpSocket";
272ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private MockLlcpSocket mPairedSocket;
282ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private List<byte[]> mReceivedPackets = new LinkedList<byte[]>();
292ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private boolean mClosed = false;
302ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
312ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    @Override
322ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void close() throws IOException {
332ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        mClosed = true;
342ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        mPairedSocket.mClosed = true;
352ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
362ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
372ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    @Override
384a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public void connectToSap(int sap) throws IOException {
392ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        throw new UnsupportedOperationException("Use MockLlcpSocket.bind(client, server)");
402ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
412ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
422ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    @Override
432ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void send(byte[] data) throws IOException {
442ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        if (mClosed || mPairedSocket == null) {
452ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Socket not connected");
462ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
472ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        synchronized (mPairedSocket.mReceivedPackets) {
482ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            Log.d(TAG, "sending packet");
492ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            mPairedSocket.mReceivedPackets.add(data);
502ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            mPairedSocket.mReceivedPackets.notify();
512ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
522ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
532ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
542ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    @Override
552ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public int receive(byte[] receiveBuffer) throws IOException {
562ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        synchronized (mReceivedPackets) {
572ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            while (!mClosed && mReceivedPackets.size() == 0) {
582ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
592ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    mReceivedPackets.wait(1000);
602ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (InterruptedException e) {}
612ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            }
622ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            if (mClosed) {
632ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                throw new IOException("Socket closed.");
642ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            }
652ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            byte[] arr = mReceivedPackets.remove(0);
662ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            System.arraycopy(arr, 0, receiveBuffer, 0, arr.length);
672ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            return arr.length;
682ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
692ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
702ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
712ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public static void bind(MockLlcpSocket client, MockLlcpSocket server) {
722ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        client.mPairedSocket = server;
732ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        server.mPairedSocket = client;
742ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
754a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
764a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    @Override
774a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public void connectToService(String serviceName) throws IOException {
784a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton        throw new UnsupportedOperationException();
794a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    }
804a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
814a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    @Override
824a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public int getRemoteMiu() {
834a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton        throw new UnsupportedOperationException();
844a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    }
854a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
864a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    @Override
874a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public int getRemoteRw() {
884a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton        throw new UnsupportedOperationException();
894a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    }
904a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
914a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    @Override
924a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public int getLocalSap() {
934a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton        throw new UnsupportedOperationException();
944a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    }
954a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
964a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    @Override
974a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public int getLocalMiu() {
984a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton        throw new UnsupportedOperationException();
994a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    }
1004a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton
1014a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    @Override
1024a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    public int getLocalRw() {
1034a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton        throw new UnsupportedOperationException();
1044a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    }
1052ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson}