sbUSBDeviceUtils.cpp
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set sw=2 :miv */
3 /*
4  *=BEGIN SONGBIRD GPL
5  *
6  * This file is part of the Songbird web player.
7  *
8  * Copyright(c) 2005-2010 POTI, Inc.
9  * http://www.songbirdnest.com
10  *
11  * This file may be licensed under the terms of of the
12  * GNU General Public License Version 2 (the ``GPL'').
13  *
14  * Software distributed under the License is distributed
15  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
16  * express or implied. See the GPL for the specific language
17  * governing rights and limitations.
18  *
19  * You should have received a copy of the GPL along with this
20  * program. If not, go to http://www.gnu.org/licenses/gpl.html
21  * or write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  *=END SONGBIRD GPL
25  */
26 
27 //------------------------------------------------------------------------------
28 //
29 // Songbird USB device utilities services.
30 //
31 //------------------------------------------------------------------------------
32 
38 //------------------------------------------------------------------------------
39 //
40 // Songbird USB device utilities imported services.
41 //
42 //------------------------------------------------------------------------------
43 
44 // Self import.
45 #include "sbUSBDeviceUtils.h"
46 
47 // Mozilla imports.
48 #include <nsStringGlue.h>
49 
50 
51 //------------------------------------------------------------------------------
52 //
53 // Songbird USB device services.
54 //
55 //------------------------------------------------------------------------------
56 
66 nsresult
68  PRUint8 aUSBClass,
69  PRBool* aImplementsClass)
70 {
71  // Validate arguments.
72  NS_ENSURE_ARG_POINTER(aImplementsClass);
73 
74  // Function variables.
75  PRBool implementsClass = PR_FALSE;
76 
77  // Check all device and interface descriptors for the specified class.
78  for (PRUint32 i = 0; i < aDescriptorList.Length(); i++) {
79  // Get the next descriptor.
80  sbUSBDescriptor* descriptor = aDescriptorList[i];
81  sbUSBDescriptorHeader* descriptorHeader = descriptor->GetHeader();
82 
83  // Get the class from device and interface descriptors. Skip other
84  // descriptors.
85  PRUint8 usbClass;
86  PRBool hasClass = PR_TRUE;
87  switch (descriptorHeader->bDescriptorType) {
89  {
90  sbUSBDeviceDescriptor* deviceDescriptor =
91  reinterpret_cast<sbUSBDeviceDescriptor*>(descriptorHeader);
92  usbClass = deviceDescriptor->bDeviceClass;
93  }
94  break;
95 
97  {
98  sbUSBInterfaceDescriptor* interfaceDescriptor =
99  reinterpret_cast<sbUSBInterfaceDescriptor*>(descriptorHeader);
100  usbClass = interfaceDescriptor->bInterfaceClass;
101  }
102  break;
103 
104  default :
105  hasClass = PR_FALSE;
106  break;
107  }
108  if (!hasClass)
109  continue;
110 
111  // Check for a match.
112  if (usbClass == aUSBClass)
113  {
114  implementsClass = PR_TRUE;
115  break;
116  }
117  }
118 
119  // Return results.
120  *aImplementsClass = implementsClass;
121 
122  return NS_OK;
123 }
124 
125 
139 nsresult
141  PRUint8 aDescriptorType,
142  PRUint8 aDescriptorIndex,
143  PRUint16 aDescriptorIndex2,
144  sbUSBDescriptor** aDescriptor)
145 {
146  // Validate arguments.
147  NS_ENSURE_ARG_POINTER(aDeviceRef);
148  NS_ENSURE_ARG_POINTER(aDescriptor);
149 
150  // Function variables.
151  PRUint16 descriptorLength = 0;
152  nsresult rv;
153 
154  // Get the descriptor length for fixed size descriptors.
155  switch (aDescriptorType) {
157  descriptorLength = sizeof(sbUSBDeviceDescriptor);
158  break;
159 
161  descriptorLength = sizeof(sbUSBConfigurationDescriptor);
162  break;
163 
164  default :
165  break;
166  }
167 
168  // If length unknown, get the descriptor header to get the length.
169  if (!descriptorLength) {
170  // Get the descriptor header.
171  nsRefPtr<sbUSBDescriptor> sbDescriptorHeader;
172  rv = sbUSBDeviceGetDescriptor(aDeviceRef,
173  aDescriptorType,
174  aDescriptorIndex,
175  aDescriptorIndex2,
176  sizeof(sbUSBDescriptorHeader),
177  getter_AddRefs(sbDescriptorHeader));
178  NS_ENSURE_SUCCESS(rv, rv);
179 
180  // Get the descriptor length.
181  sbUSBDescriptorHeader* descriptorHeader = sbDescriptorHeader->GetHeader();
182  descriptorLength = descriptorHeader->bLength;
183  }
184 
185  // Read the descriptor.
186  nsRefPtr<sbUSBDescriptor> descriptor;
187  rv = sbUSBDeviceGetDescriptor(aDeviceRef,
188  aDescriptorType,
189  aDescriptorIndex,
190  aDescriptorIndex2,
191  descriptorLength,
192  getter_AddRefs(descriptor));
193  NS_ENSURE_SUCCESS(rv, rv);
194 
195  // If getting a configuration descriptor, read all descriptors.
196  if (aDescriptorType == SB_USB_DESCRIPTOR_TYPE_CONFIGURATION) {
197  // Get the total length of configuration data.
198  sbUSBConfigurationDescriptor* configurationDescriptor =
199  descriptor->GetConfiguration();
200  PRUint16 totalLength = configurationDescriptor->wTotalLength;
201 
202  // Read all configuration descriptors.
203  rv = sbUSBDeviceGetDescriptor(aDeviceRef,
204  aDescriptorType,
205  aDescriptorIndex,
206  aDescriptorIndex2,
207  totalLength,
208  getter_AddRefs(descriptor));
209  NS_ENSURE_SUCCESS(rv, rv);
210  }
211 
212  // Return results.
213  descriptor.forget(aDescriptor);
214 
215  return NS_OK;
216 }
217 
218 
231 nsresult
233  PRUint8 aDescriptorIndex,
234  PRUint16 aDescriptorIndex2,
235  nsAString& aString)
236 {
237  // Validate arguments.
238  NS_ENSURE_ARG_POINTER(aDeviceRef);
239 
240  // Function variables.
241  nsresult rv;
242 
243  // Get the USB string descriptor.
244  nsRefPtr<sbUSBDescriptor> sbStringDescriptor;
245  rv = sbUSBDeviceGetDescriptor(aDeviceRef,
247  aDescriptorIndex,
248  aDescriptorIndex2,
249  getter_AddRefs(sbStringDescriptor));
250  NS_ENSURE_SUCCESS(rv, rv);
251  sbUSBStringDescriptor* stringDescriptor = sbStringDescriptor->GetString();
252 
253  // Return results.
254  PRUint32 length = (stringDescriptor->bLength -
255  offsetof(sbUSBStringDescriptor, bString)) /
256  sizeof(PRUnichar);
257  aString.Assign(stringDescriptor->bString, length);
258 
259  return NS_OK;
260 }
261 
262 
271 nsresult
273  nsTArray<PRUint16>& aLanguageList)
274 {
275  // Validate arguments.
276  NS_ENSURE_ARG_POINTER(aDeviceRef);
277 
278  // Function variables.
279  nsresult rv;
280 
281  // Get the string language descriptor.
282  nsRefPtr<sbUSBDescriptor> sbLanguageDescriptor;
283  rv = sbUSBDeviceGetDescriptor(aDeviceRef,
285  0,
286  0,
287  getter_AddRefs(sbLanguageDescriptor));
288  NS_ENSURE_SUCCESS(rv, rv);
289  sbUSBStringDescriptor* languageDescriptor = sbLanguageDescriptor->GetString();
290 
291  // Get the string language list.
292  PRUint32 languageCount = (languageDescriptor->bLength -
293  offsetof(sbUSBStringDescriptor, bString)) /
294  sizeof(PRUnichar);
295  aLanguageList.Clear();
296  for (PRUint32 i = 0; i < languageCount; i++) {
297  aLanguageList.AppendElement
298  (static_cast<PRUint16>(languageDescriptor->bString[i]));
299  }
300 
301  return NS_OK;
302 }
303 
304 
315 nsresult
317  PRUint8 aConfigurationIndex,
318  sbUSBDescriptorList& aDescriptorList)
319 {
320  // Validate arguments.
321  NS_ENSURE_ARG_POINTER(aDeviceRef);
322 
323  // Function variables.
324  nsresult rv;
325 
326  // Get the configuration descriptor.
327  nsRefPtr<sbUSBDescriptor> sbConfigurationDescriptor;
328  rv = sbUSBDeviceGetDescriptor(aDeviceRef,
330  aConfigurationIndex,
331  0,
332  getter_AddRefs(sbConfigurationDescriptor));
333  NS_ENSURE_SUCCESS(rv, rv);
334 
335  // Add the configuration descriptors to the descriptor list.
336  sbUSBDescriptorHeader* descriptorHeader =
337  sbConfigurationDescriptor->GetHeader();
338  sbUSBConfigurationDescriptor* configurationDescriptor =
339  sbConfigurationDescriptor->GetConfiguration();
340  PRUint16 bytesRemaining = configurationDescriptor->wTotalLength;
341  while ((bytesRemaining > sizeof(sbUSBDescriptorHeader)) &&
342  (bytesRemaining > descriptorHeader->bLength)) {
343  // Create a Songbird USB descriptor.
344  nsRefPtr<sbUSBDescriptor> descriptor =
345  new sbUSBDescriptor(descriptorHeader);
346  NS_ENSURE_TRUE(descriptor, NS_ERROR_OUT_OF_MEMORY);
347  NS_ENSURE_TRUE(descriptor->Get(), NS_ERROR_OUT_OF_MEMORY);
348 
349  // Add the descriptor to the descriptor list.
350  NS_ENSURE_TRUE(aDescriptorList.AppendElement(descriptor),
351  NS_ERROR_OUT_OF_MEMORY);
352 
353  // Add the next configuration descriptor.
354  bytesRemaining -= descriptorHeader->bLength;
355  descriptorHeader = reinterpret_cast<sbUSBDescriptorHeader*>
356  (((reinterpret_cast<PRUint8*>(descriptorHeader)) +
357  descriptorHeader->bLength));
358  }
359 
360  return NS_OK;
361 }
362 
363 
364 //------------------------------------------------------------------------------
365 //
366 // Songbird USB device system services.
367 //
368 // These services must be provided by a system dependent sources.
369 //
370 //------------------------------------------------------------------------------
371 
372 #if 0 // Must be implemented by system dependent sources.
373 
389 nsresult
391  PRUint8 aDescriptorType,
392  PRUint8 aDescriptorIndex,
393  PRUint16 aDescriptorIndex2,
394  PRUint16 aDescriptorLength,
395  sbUSBDescriptor** aDescriptor)
396 {
397 }
398 
399 
400 #endif
401 
402 
403 //------------------------------------------------------------------------------
404 //
405 // Songbird USB descriptor class.
406 //
407 //------------------------------------------------------------------------------
408 
409 NS_IMPL_ISUPPORTS0(sbUSBDescriptor)
410 
return NS_OK
nsTArray< nsRefPtr< sbUSBDescriptor > > sbUSBDescriptorList
#define SB_USB_DESCRIPTOR_TYPE_INTERFACE
nsresult sbUSBDeviceGetLanguageList(sbUSBDeviceRef *aDeviceRef, nsTArray< PRUint16 > &aLanguageList)
#define SB_USB_DESCRIPTOR_TYPE_DEVICE
nsresult sbUSBDeviceGetDescriptor(sbUSBDeviceRef *aDeviceRef, PRUint8 aDescriptorType, PRUint8 aDescriptorIndex, PRUint16 aDescriptorIndex2, sbUSBDescriptor **aDescriptor)
sbUSBDescriptorHeader * GetHeader()
nsresult sbUSBDeviceImplementsClass(sbUSBDescriptorList &aDescriptorList, PRUint8 aUSBClass, PRBool *aImplementsClass)
#define SB_USB_DESCRIPTOR_TYPE_STRING
nsresult sbUSBDeviceAddConfigurationDescriptors(sbUSBDeviceRef *aDeviceRef, PRUint8 aConfigurationIndex, sbUSBDescriptorList &aDescriptorList)
nsresult sbUSBDeviceGetStringDescriptor(sbUSBDeviceRef *aDeviceRef, PRUint8 aDescriptorIndex, PRUint16 aDescriptorIndex2, nsAString &aString)
Songbird USB Device Utilities Definitions.
#define SB_USB_DESCRIPTOR_TYPE_CONFIGURATION
_getSelectedPageStyle s i