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