18f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown/*
28f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Copyright (C) 2013 The Android Open Source Project
38f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *
48f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
58f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * you may not use this file except in compliance with the License.
68f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * You may obtain a copy of the License at
78f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *
88f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
98f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown *
108f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Unless required by applicable law or agreed to in writing, software
118f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
128f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * See the License for the specific language governing permissions and
148f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * limitations under the License.
158f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown */
168f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
178f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownpackage com.android.accessorydisplay.source;
188f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
198f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport com.android.accessorydisplay.common.Logger;
208f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport com.android.accessorydisplay.common.Transport;
218f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
228f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbAccessory;
238f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.os.ParcelFileDescriptor;
248f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
258f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport java.io.FileInputStream;
268f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport java.io.FileOutputStream;
278f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport java.io.IOException;
288f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
298f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown/**
308f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Sends or receives messages over a file descriptor associated with a {@link UsbAccessory}.
318f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown */
328f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownpublic class UsbAccessoryStreamTransport extends Transport {
338f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private ParcelFileDescriptor mFd;
348f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private FileInputStream mInputStream;
358f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    private FileOutputStream mOutputStream;
368f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
378f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    public UsbAccessoryStreamTransport(Logger logger, ParcelFileDescriptor fd) {
388f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        super(logger, 16384);
398f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mFd = fd;
408f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mInputStream = new FileInputStream(fd.getFileDescriptor());
418f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mOutputStream = new FileOutputStream(fd.getFileDescriptor());
428f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
438f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
448f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    @Override
458f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    protected void ioClose() {
468f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        try {
478f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            mFd.close();
488f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        } catch (IOException ex) {
498f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        }
508f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mFd = null;
518f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mInputStream = null;
528f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mOutputStream = null;
538f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
548f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
558f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    @Override
568f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    protected int ioRead(byte[] buffer, int offset, int count) throws IOException {
578f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        if (mInputStream == null) {
588f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            throw new IOException("Stream was closed.");
598f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        }
608f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        return mInputStream.read(buffer, offset, count);
618f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
628f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown
638f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    @Override
648f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    protected void ioWrite(byte[] buffer, int offset, int count) throws IOException {
658f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        if (mOutputStream == null) {
668f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown            throw new IOException("Stream was closed.");
678f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        }
688f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown        mOutputStream.write(buffer, offset, count);
698f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown    }
708f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown}
71