// Copyright © 2006-2010 Travis Robinson. All rights reserved. // // website: http://sourceforge.net/projects/libusbdotnet // e-mail: libusbdotnet@gmail.com // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or // visit www.gnu.org. // // using System; using System.Collections.Generic; using System.Collections.ObjectModel; using LibUsbDotNet.Descriptors; using LibUsbDotNet.Main; using LibUsbDotNet.LudnMonoLibUsb; using MonoLibUsb.Descriptors; namespace LibUsbDotNet.Info { /// Contains all Configuration information for the current . /// public class UsbConfigInfo : UsbBaseInfo { private readonly List mInterfaceList = new List(); internal readonly UsbConfigDescriptor mUsbConfigDescriptor; private String mConfigString; internal UsbDevice mUsbDevice; internal UsbConfigInfo(UsbDevice usbDevice, UsbConfigDescriptor descriptor, ref List rawDescriptors) { mUsbDevice = usbDevice; mUsbConfigDescriptor = descriptor; mRawDescriptors = rawDescriptors; UsbInterfaceInfo currentInterface = null; for (int iRawDescriptor = 0; iRawDescriptor < rawDescriptors.Count; iRawDescriptor++) { byte[] bytesRawDescriptor = rawDescriptors[iRawDescriptor]; switch (bytesRawDescriptor[1]) { case (byte) DescriptorType.Interface: currentInterface = new UsbInterfaceInfo(usbDevice, bytesRawDescriptor); mRawDescriptors.RemoveAt(iRawDescriptor); mInterfaceList.Add(currentInterface); iRawDescriptor--; break; case (byte) DescriptorType.Endpoint: if (currentInterface == null) throw new UsbException(this, "Recieved and endpoint descriptor before receiving an interface descriptor."); currentInterface.mEndpointInfo.Add(new UsbEndpointInfo(bytesRawDescriptor)); mRawDescriptors.RemoveAt(iRawDescriptor); iRawDescriptor--; break; default: if (currentInterface != null) { currentInterface.mRawDescriptors.Add(bytesRawDescriptor); mRawDescriptors.RemoveAt(iRawDescriptor); iRawDescriptor--; } break; } } } internal UsbConfigInfo(MonoUsbDevice usbDevice, MonoUsbConfigDescriptor configDescriptor) { mUsbDevice = usbDevice; mUsbConfigDescriptor = new UsbConfigDescriptor(configDescriptor); List monoUSBInterfaces = configDescriptor.InterfaceList; foreach (MonoUsbInterface usbInterface in monoUSBInterfaces) { List monoUSBAltInterfaces = usbInterface.AltInterfaceList; foreach (MonoUsbAltInterfaceDescriptor monoUSBAltInterface in monoUSBAltInterfaces) { UsbInterfaceInfo usbInterfaceInfo = new UsbInterfaceInfo(mUsbDevice, monoUSBAltInterface); mInterfaceList.Add(usbInterfaceInfo); } } } /// /// Gets the actual for the current config. /// public UsbConfigDescriptor Descriptor { get { return mUsbConfigDescriptor; } } /// /// Gets the string representation of the string index. /// public String ConfigString { get { if (ReferenceEquals(mConfigString, null)) { mConfigString = String.Empty; if (Descriptor.StringIndex > 0) { mUsbDevice.GetString(out mConfigString, mUsbDevice.Info.CurrentCultureLangID, Descriptor.StringIndex); } } return mConfigString; } } /// /// Gets the collection of USB device interfaces associated with this instance. /// public ReadOnlyCollection InterfaceInfoList { get { return mInterfaceList.AsReadOnly(); } } /// ///Returns a that represents the current . /// /// /// ///A that represents the current . /// public override string ToString() { return ToString("", UsbDescriptor.ToStringParamValueSeperator, UsbDescriptor.ToStringFieldSeperator); } /// ///Returns a that represents the current . /// /// ///The field prefix string. ///The field/value seperator string. ///The value suffix string. ///A formatted representation of the . public string ToString(string prefixSeperator, string entitySperator, string suffixSeperator) { Object[] values = {ConfigString}; string[] names = {"ConfigString"}; return Descriptor.ToString(prefixSeperator, entitySperator, suffixSeperator) + Helper.ToString(prefixSeperator, names, entitySperator, values, suffixSeperator); } } }