1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.server.usb.descriptors.tree; 17 18 import com.android.server.usb.descriptors.UsbACInterface; 19 import com.android.server.usb.descriptors.UsbConfigDescriptor; 20 import com.android.server.usb.descriptors.UsbDescriptor; 21 import com.android.server.usb.descriptors.UsbDescriptorParser; 22 import com.android.server.usb.descriptors.UsbDeviceDescriptor; 23 import com.android.server.usb.descriptors.UsbEndpointDescriptor; 24 import com.android.server.usb.descriptors.UsbInterfaceDescriptor; 25 import com.android.server.usb.descriptors.report.ReportCanvas; 26 27 import java.util.ArrayList; 28 29 /* 30 * The general layout of the tree looks like this, though no guarentee about 31 * ordering of descriptors beyond the Device -> Config -> Interface. 32 * 33 * Device Descriptor 34 * +- Config Descriptor 35 * +- Interface Descriptor 36 * | +- Audio Class Interface 37 * | +- Audio Class Interface 38 * | +- Audio Class Interface 39 * | +- Endpoint Descriptor 40 * | +- Endpoint Descriptor 41 * +- Interface Descriptor 42 * +- Endpoint Descriptor 43 */ 44 /** 45 * @hide 46 * 47 * A class which builds a tree representation from the results of a (linear) 48 * parse of USB descriptors. 49 * 50 * @see {@link com.android.server.usb.descriptors.UsbDescriptorsParser UsbDescriptorsParser} 51 */ 52 public final class UsbDescriptorsTree { 53 private static final String TAG = "UsbDescriptorsTree"; 54 55 private UsbDescriptorsDeviceNode mDeviceNode; 56 private UsbDescriptorsConfigNode mConfigNode; // being parsed 57 private UsbDescriptorsInterfaceNode mInterfaceNode; // being parsed 58 59 /** 60 * Adds THE device descriptor as the root of the tree. 61 */ addDeviceDescriptor(UsbDeviceDescriptor deviceDescriptor)62 private void addDeviceDescriptor(UsbDeviceDescriptor deviceDescriptor) { 63 mDeviceNode = new UsbDescriptorsDeviceNode(deviceDescriptor); 64 } 65 66 /** 67 * Adds A config descriptor to the tree. 68 */ addConfigDescriptor(UsbConfigDescriptor configDescriptor)69 private void addConfigDescriptor(UsbConfigDescriptor configDescriptor) { 70 mConfigNode = new UsbDescriptorsConfigNode(configDescriptor); 71 mDeviceNode.addConfigDescriptorNode(mConfigNode); 72 } 73 74 /** 75 * Adds AN interface descriptor to the current configuration in the tree. 76 */ addInterfaceDescriptor(UsbInterfaceDescriptor interfaceDescriptor)77 private void addInterfaceDescriptor(UsbInterfaceDescriptor interfaceDescriptor) { 78 mInterfaceNode = new UsbDescriptorsInterfaceNode(interfaceDescriptor); 79 mConfigNode.addInterfaceNode(mInterfaceNode); 80 } 81 82 /** 83 * Adds an endpoint descriptor to the current interface in the tree. 84 */ addEndpointDescriptor(UsbEndpointDescriptor endpointDescriptor)85 private void addEndpointDescriptor(UsbEndpointDescriptor endpointDescriptor) { 86 mInterfaceNode.addEndpointNode(new UsbDescriptorsEndpointNode(endpointDescriptor)); 87 } 88 89 /** 90 * Adds an audio-class interface descriptor to the current interface in the tree. 91 */ addACInterface(UsbACInterface acInterface)92 private void addACInterface(UsbACInterface acInterface) { 93 mInterfaceNode.addACInterfaceNode(new UsbDescriptorsACInterfaceNode(acInterface)); 94 } 95 96 /** 97 * Parses the linear descriptor list contained in the parser argument, into a tree 98 * representation corresponding to the logical structure of the USB descriptors. 99 */ parse(UsbDescriptorParser parser)100 public void parse(UsbDescriptorParser parser) { 101 102 ArrayList<UsbDescriptor> descriptors = parser.getDescriptors(); 103 104 for (int descrIndex = 0; descrIndex < descriptors.size(); descrIndex++) { 105 UsbDescriptor descriptor = descriptors.get(descrIndex); 106 switch (descriptor.getType()) { 107 // 108 // Basic Descriptors 109 // 110 case UsbDescriptor.DESCRIPTORTYPE_DEVICE: 111 addDeviceDescriptor((UsbDeviceDescriptor) descriptor); 112 break; 113 114 case UsbDescriptor.DESCRIPTORTYPE_CONFIG: 115 addConfigDescriptor((UsbConfigDescriptor) descriptor); 116 break; 117 118 case UsbDescriptor.DESCRIPTORTYPE_INTERFACE: 119 addInterfaceDescriptor((UsbInterfaceDescriptor) descriptor); 120 break; 121 122 case UsbDescriptor.DESCRIPTORTYPE_ENDPOINT: 123 addEndpointDescriptor((UsbEndpointDescriptor) descriptor); 124 break; 125 126 // 127 // Audio Class Descriptors 128 // 129 case UsbDescriptor.DESCRIPTORTYPE_AUDIO_INTERFACE: 130 addACInterface((UsbACInterface) descriptor); 131 break; 132 133 case UsbDescriptor.DESCRIPTORTYPE_AUDIO_ENDPOINT: 134 break; 135 } 136 } 137 } 138 139 /** 140 * Generate a report of the descriptors tree. 141 */ report(ReportCanvas canvas)142 public void report(ReportCanvas canvas) { 143 mDeviceNode.report(canvas); 144 } 145 } 146