kernel/eka/drivers/usbho/usbdescriptors/usbdescriptors.cpp
author hgs
Mon, 27 Sep 2010 10:52:00 +0100
changeset 273 6a75fa55495f
parent 189 a5496987b1da
permissions -rw-r--r--
201037_09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
     1
// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
     2
// All rights reserved.
a5496987b1da 201025_04
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a5496987b1da 201025_04
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a5496987b1da 201025_04
hgs
parents:
diff changeset
     7
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
     8
// Initial Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    10
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    11
// Description:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    12
// Symbian USBDI Descriptors Parsing Routines.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    13
// 
a5496987b1da 201025_04
hgs
parents:
diff changeset
    14
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    15
a5496987b1da 201025_04
hgs
parents:
diff changeset
    16
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
    17
 @file
a5496987b1da 201025_04
hgs
parents:
diff changeset
    18
 @publishedPartner
a5496987b1da 201025_04
hgs
parents:
diff changeset
    19
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
    20
a5496987b1da 201025_04
hgs
parents:
diff changeset
    21
#include <d32usbdescriptors.h>
a5496987b1da 201025_04
hgs
parents:
diff changeset
    22
#include "usbdescutils.h"
a5496987b1da 201025_04
hgs
parents:
diff changeset
    23
a5496987b1da 201025_04
hgs
parents:
diff changeset
    24
a5496987b1da 201025_04
hgs
parents:
diff changeset
    25
// ----------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
    26
// TUsbGenericDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
    27
// ----------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
    28
a5496987b1da 201025_04
hgs
parents:
diff changeset
    29
EXPORT_C TUsbGenericDescriptor::TUsbGenericDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
    30
	: iRecognisedAndParsed(EUnrecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    31
	, iNextPeer(NULL)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    32
	, iFirstChild(NULL)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    33
	, iParent(NULL)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    34
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    35
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    36
a5496987b1da 201025_04
hgs
parents:
diff changeset
    37
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
    38
Deletes all child and peer descriptors.  Does not delete this descriptor, the caller is responsible for
a5496987b1da 201025_04
hgs
parents:
diff changeset
    39
doing this separately.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    40
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
    41
EXPORT_C void TUsbGenericDescriptor::DestroyTree()
a5496987b1da 201025_04
hgs
parents:
diff changeset
    42
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    43
	// Store the tree pointers
a5496987b1da 201025_04
hgs
parents:
diff changeset
    44
	TUsbGenericDescriptor* child = this->iFirstChild;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    45
	TUsbGenericDescriptor* peer = this->iNextPeer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    46
a5496987b1da 201025_04
hgs
parents:
diff changeset
    47
	// Now we chop off the tree from the root node, by doing this
a5496987b1da 201025_04
hgs
parents:
diff changeset
    48
	// we don't need to NULL pointers as we go down (which makes
a5496987b1da 201025_04
hgs
parents:
diff changeset
    49
	// the iterative algorithm more efficient).
a5496987b1da 201025_04
hgs
parents:
diff changeset
    50
	this->iFirstChild = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    51
	this->iNextPeer = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    52
a5496987b1da 201025_04
hgs
parents:
diff changeset
    53
	// Now we walk and destroy the tree from the two pointers
a5496987b1da 201025_04
hgs
parents:
diff changeset
    54
	// we have
a5496987b1da 201025_04
hgs
parents:
diff changeset
    55
	WalkAndDelete(child);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    56
	WalkAndDelete(peer);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    57
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    58
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
    59
void TUsbGenericDescriptor::WalkAndDelete(TUsbGenericDescriptor* aDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    60
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    61
	if(!aDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    62
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    63
		return;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    64
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    65
a5496987b1da 201025_04
hgs
parents:
diff changeset
    66
	TUsbGenericDescriptor* topLevel = aDesc->iParent;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    67
	do
a5496987b1da 201025_04
hgs
parents:
diff changeset
    68
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    69
		if(aDesc->iFirstChild)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    70
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    71
			// walk down the tree depth first.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    72
			aDesc = aDesc->iFirstChild;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    73
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    74
		else if(aDesc->iNextPeer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    75
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    76
			// Walk along each peer at the "bottom"
a5496987b1da 201025_04
hgs
parents:
diff changeset
    77
			TUsbGenericDescriptor* peer = aDesc->iNextPeer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    78
			delete aDesc;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    79
			aDesc = peer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    80
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    81
		else
a5496987b1da 201025_04
hgs
parents:
diff changeset
    82
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    83
			// End of bottom tier, so we go back up to the parent
a5496987b1da 201025_04
hgs
parents:
diff changeset
    84
			// and null the first child pointer so we don't go back
a5496987b1da 201025_04
hgs
parents:
diff changeset
    85
			// down again.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    86
			TUsbGenericDescriptor* parent = aDesc->iParent;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    87
			delete aDesc;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    88
			aDesc = parent;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    89
			if(aDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    90
				{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    91
				aDesc->iFirstChild = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    92
				}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    93
			
a5496987b1da 201025_04
hgs
parents:
diff changeset
    94
			// if we have gone up to the top level for destruction then we don't
a5496987b1da 201025_04
hgs
parents:
diff changeset
    95
			// do anymore.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    96
			if(aDesc == topLevel)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    97
				{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    98
				break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    99
				}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   100
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   101
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   102
	while(aDesc);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   103
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   104
a5496987b1da 201025_04
hgs
parents:
diff changeset
   105
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   106
Utility method to retrieve a TUint8 value from a given offset in the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   107
@param aOffset The offset in the binary blob at which to retrieve the value.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   108
@return The value from the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   109
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   110
EXPORT_C TUint8 TUsbGenericDescriptor::TUint8At(TInt aOffset) const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   111
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   112
	return ParseTUint8(iBlob, aOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   113
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   114
a5496987b1da 201025_04
hgs
parents:
diff changeset
   115
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   116
Utility method to retrieve a TUint16 value from a given offset in the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   117
@param aOffset The offset in the binary blob at which to retrieve the value.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   118
@return The value from the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   119
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   120
EXPORT_C TUint16 TUsbGenericDescriptor::TUint16At(TInt aOffset) const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   121
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   122
	return ParseTUint16(iBlob, aOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   123
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   124
a5496987b1da 201025_04
hgs
parents:
diff changeset
   125
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   126
Utility method to retrieve a TUint32 value from a given offset in the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   127
@param aOffset The offset in the binary blob at which to retrieve the value.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   128
@return The value from the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   129
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   130
EXPORT_C TUint32 TUsbGenericDescriptor::TUint32At(TInt aOffset) const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   131
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   132
	return ParseTUint32(iBlob, aOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   133
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   134
a5496987b1da 201025_04
hgs
parents:
diff changeset
   135
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   136
Assignment operator to fill in the TUsbGenericDescriptor fields from a TUsbGenericDescriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   137
Note that if a TUsbGenericDescriptor derived class has additional member fields then
a5496987b1da 201025_04
hgs
parents:
diff changeset
   138
they should define a specialised assignment overload for that type.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   139
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   140
EXPORT_C TUsbGenericDescriptor& TUsbGenericDescriptor::operator=(const TUsbGenericDescriptor& aDescriptor)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   141
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   142
	ibLength = aDescriptor.ibLength;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   143
	ibDescriptorType = aDescriptor.ibDescriptorType;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   144
	iRecognisedAndParsed = aDescriptor.iRecognisedAndParsed;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   145
	iNextPeer = aDescriptor.iNextPeer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   146
	iFirstChild = aDescriptor.iFirstChild;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   147
	iParent = aDescriptor.iParent;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   148
	iBlob.Set(aDescriptor.iBlob);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   149
	return *this;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   150
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   151
a5496987b1da 201025_04
hgs
parents:
diff changeset
   152
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   153
This function determines whether the given USB descriptor is a parent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   154
of the descriptor the method is called on.  The implementation may be
a5496987b1da 201025_04
hgs
parents:
diff changeset
   155
specialised for each type of descriptor to ensure the tree is correctly
a5496987b1da 201025_04
hgs
parents:
diff changeset
   156
built up.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   157
@param aPotentialRelative The USB descriptor that is being queried to see if it is a parent or peer.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   158
@return TBool Efalse if the given USB descriptor is a parent of this USB descriptor, ETrue if a peer of this descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   159
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   160
/*virtual*/ TBool TUsbGenericDescriptor::IsParent(TUsbGenericDescriptor& aPotentialParent)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   161
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   162
	// As generic descriptors we consider all other "unknown" descriptors as peers, and
a5496987b1da 201025_04
hgs
parents:
diff changeset
   163
	// all "known" descriptors as parents of the descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   164
	switch(aPotentialParent.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   165
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   166
	case EDevice:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   167
	case EConfiguration:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   168
	case EString:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   169
	case EInterface:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   170
	case EEndpoint:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   171
	case EDeviceQualifier:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   172
	case EOtherSpeedConfiguration:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   173
	case EInterfacePower:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   174
	case EOTG:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   175
	case EDebug:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   176
	case EInterfaceAssociation:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   177
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   178
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   179
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   180
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   181
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   182
a5496987b1da 201025_04
hgs
parents:
diff changeset
   183
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   184
This function determines whether the given USB descriptor is a peer
a5496987b1da 201025_04
hgs
parents:
diff changeset
   185
of the descriptor the method is called on.  The implementation may be
a5496987b1da 201025_04
hgs
parents:
diff changeset
   186
specialised for each type of descriptor to ensure the tree is correctly
a5496987b1da 201025_04
hgs
parents:
diff changeset
   187
built up.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   188
@param aPotentialPeer The USB descriptor that is being queried to see if it is a peer.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   189
@return TBool EFalse if the given USB descriptor is a parent of this USB descriptor, ETrue if a peer of this descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   190
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   191
/*virtual*/ TBool TUsbGenericDescriptor::IsPeer(TUsbGenericDescriptor& /*aPotentialPeer*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   192
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   193
	// As generic descriptors we are very permissive in binding peers.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   194
	return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   195
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   196
a5496987b1da 201025_04
hgs
parents:
diff changeset
   197
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   198
This function determines whether the given USB descriptor is a child
a5496987b1da 201025_04
hgs
parents:
diff changeset
   199
of the descriptor the method is called on.  The implementation may be
a5496987b1da 201025_04
hgs
parents:
diff changeset
   200
specialised for each type of descriptor to ensure the tree is correctly
a5496987b1da 201025_04
hgs
parents:
diff changeset
   201
built up.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   202
@param aPotentialChild The USB descriptor that is being queried to see if it is a child.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   203
@return TBool ETrue if the given USB descriptor is a child of this USB descriptor, ETrue if a peer of this descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   204
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   205
/*virtual*/ TBool TUsbGenericDescriptor::IsChild(TUsbGenericDescriptor& /*aPotentialChild*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   206
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   207
	// We just use the logic in the IsParent.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   208
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   209
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   210
a5496987b1da 201025_04
hgs
parents:
diff changeset
   211
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   212
Ensures no memory is leaked if an owned TUsbGenericDescriptor is no longer needed.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   213
@param aPtr The TUsbGenericDescriptor that is to be cleaned up.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   214
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   215
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   216
EXPORT_C /*static*/ void TUsbGenericDescriptor::Cleanup(TAny* aPtr)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   217
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   218
	TUsbGenericDescriptor* ptr = static_cast<TUsbGenericDescriptor*>(aPtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   219
	ptr->DestroyTree(); // belt and braces really.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   220
	delete ptr;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   221
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   222
a5496987b1da 201025_04
hgs
parents:
diff changeset
   223
a5496987b1da 201025_04
hgs
parents:
diff changeset
   224
// ----------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   225
// TUsbDeviceDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   226
// See section 9.6.1 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   227
// ----------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   228
a5496987b1da 201025_04
hgs
parents:
diff changeset
   229
EXPORT_C TUsbDeviceDescriptor::TUsbDeviceDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   230
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   231
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   232
a5496987b1da 201025_04
hgs
parents:
diff changeset
   233
EXPORT_C /*static*/ TUsbDeviceDescriptor* TUsbDeviceDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   234
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   235
	TUsbDeviceDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   236
	// Only cast if correctly indentified as device descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   237
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   238
		aOriginal->ibDescriptorType == EDevice &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   239
		aOriginal->ibLength == TUsbDeviceDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   240
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   241
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   242
		ret = static_cast<TUsbDeviceDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   243
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   244
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   245
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   246
a5496987b1da 201025_04
hgs
parents:
diff changeset
   247
EXPORT_C TUint16 TUsbDeviceDescriptor::USBBcd() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   248
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   249
    return ParseTUint16(iBlob, EbcdUSB);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   250
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   251
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   252
EXPORT_C TUint8 TUsbDeviceDescriptor::DeviceClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   253
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   254
	return ParseTUint8(iBlob, EbDeviceClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   255
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   256
a5496987b1da 201025_04
hgs
parents:
diff changeset
   257
EXPORT_C TUint8 TUsbDeviceDescriptor::DeviceSubClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   258
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   259
	return ParseTUint8(iBlob, EbDeviceSubClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   260
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   261
a5496987b1da 201025_04
hgs
parents:
diff changeset
   262
EXPORT_C TUint8 TUsbDeviceDescriptor::DeviceProtocol() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   263
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   264
	return ParseTUint8(iBlob, EbDeviceProtocol);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   265
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   266
a5496987b1da 201025_04
hgs
parents:
diff changeset
   267
EXPORT_C TUint8 TUsbDeviceDescriptor::MaxPacketSize0() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   268
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   269
	return ParseTUint8(iBlob, EbMaxPacketSize0);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   270
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   271
a5496987b1da 201025_04
hgs
parents:
diff changeset
   272
EXPORT_C TUint16 TUsbDeviceDescriptor::VendorId() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   273
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   274
	return ParseTUint16(iBlob, EidVendor);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   275
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   276
a5496987b1da 201025_04
hgs
parents:
diff changeset
   277
EXPORT_C TUint16 TUsbDeviceDescriptor::ProductId() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   278
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   279
	return ParseTUint16(iBlob, EidProduct);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   280
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   281
a5496987b1da 201025_04
hgs
parents:
diff changeset
   282
EXPORT_C TUint16 TUsbDeviceDescriptor::DeviceBcd() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   283
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   284
	return ParseTUint16(iBlob, EbcdDevice);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   285
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   286
a5496987b1da 201025_04
hgs
parents:
diff changeset
   287
EXPORT_C TUint8 TUsbDeviceDescriptor::ManufacturerIndex() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   288
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   289
	return ParseTUint8(iBlob, EiManufacturer);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   290
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   291
a5496987b1da 201025_04
hgs
parents:
diff changeset
   292
EXPORT_C TUint8 TUsbDeviceDescriptor::ProductIndex() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   293
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   294
	return ParseTUint8(iBlob, EiProduct);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   295
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   296
a5496987b1da 201025_04
hgs
parents:
diff changeset
   297
EXPORT_C TUint8 TUsbDeviceDescriptor::SerialNumberIndex() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   298
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   299
	return ParseTUint8(iBlob, EiSerialNumber);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   300
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   301
a5496987b1da 201025_04
hgs
parents:
diff changeset
   302
EXPORT_C TUint8 TUsbDeviceDescriptor::NumConfigurations() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   303
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   304
	return ParseTUint8(iBlob, EbNumConfigurations);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   305
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   306
a5496987b1da 201025_04
hgs
parents:
diff changeset
   307
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   308
The parsing routine for device descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   309
Here the previous descriptor parameter is ignored - because logically a device descriptor can be neither a peer
a5496987b1da 201025_04
hgs
parents:
diff changeset
   310
nor a child.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   311
a5496987b1da 201025_04
hgs
parents:
diff changeset
   312
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   313
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   314
/*static*/ TUsbDeviceDescriptor* TUsbDeviceDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   315
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   316
	TUsbDeviceDescriptor* devDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   317
a5496987b1da 201025_04
hgs
parents:
diff changeset
   318
	const TInt KMinDeviceDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   319
	if(	aUsbDes.Length() >= KMinDeviceDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   320
		aUsbDes[KbDescriptorTypeOffset] == EDevice &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   321
		aUsbDes[KbLengthOffset] == TUsbDeviceDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   322
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   323
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   324
		if(aUsbDes.Length() < TUsbDeviceDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   325
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   326
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   327
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   328
			
a5496987b1da 201025_04
hgs
parents:
diff changeset
   329
		// Robustness check - check that the device descriptor is the first to be parsed.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   330
		if(aPreviousDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   331
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   332
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   333
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   334
a5496987b1da 201025_04
hgs
parents:
diff changeset
   335
		// Looks ok to be a device descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   336
		devDes = new(ELeave) TUsbDeviceDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   337
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
   338
		devDes->ibLength = TUsbDeviceDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   339
		devDes->ibDescriptorType = EDevice;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   340
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
   341
		devDes->iBlob.Set(aUsbDes.Left(TUsbDeviceDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   342
		
a5496987b1da 201025_04
hgs
parents:
diff changeset
   343
		devDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   344
a5496987b1da 201025_04
hgs
parents:
diff changeset
   345
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   346
		aUsbDes.Set(aUsbDes.Mid(TUsbDeviceDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   347
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   348
a5496987b1da 201025_04
hgs
parents:
diff changeset
   349
	return devDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   350
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   351
a5496987b1da 201025_04
hgs
parents:
diff changeset
   352
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   353
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   354
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   355
/*virtual*/ TBool TUsbDeviceDescriptor::IsParent(TUsbGenericDescriptor& /*aPotentialParent*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   356
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   357
	// The device descriptor should only come by itself in a bundle, so must be top-level.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   358
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   359
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   360
a5496987b1da 201025_04
hgs
parents:
diff changeset
   361
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   362
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   363
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   364
/*virtual*/ TBool TUsbDeviceDescriptor::IsPeer(TUsbGenericDescriptor& /*aPotentialPeer*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   365
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   366
	// The device descriptor should only come by itself in a bundle, so no other peers.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   367
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   368
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   369
a5496987b1da 201025_04
hgs
parents:
diff changeset
   370
a5496987b1da 201025_04
hgs
parents:
diff changeset
   371
// ------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   372
// TUsbDeviceQualifierDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   373
// See section 9.6.2 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   374
// ------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   375
a5496987b1da 201025_04
hgs
parents:
diff changeset
   376
EXPORT_C TUsbDeviceQualifierDescriptor::TUsbDeviceQualifierDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   377
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   378
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   379
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   380
EXPORT_C /*static*/ TUsbDeviceQualifierDescriptor* TUsbDeviceQualifierDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   381
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   382
	TUsbDeviceQualifierDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   383
	// Only cast if correctly indentified as device qualifier descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   384
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   385
		aOriginal->ibDescriptorType == EDeviceQualifier &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   386
		aOriginal->ibLength == TUsbDeviceQualifierDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   387
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   388
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   389
		ret = static_cast<TUsbDeviceQualifierDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   390
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   391
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   392
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   393
a5496987b1da 201025_04
hgs
parents:
diff changeset
   394
EXPORT_C TUint16 TUsbDeviceQualifierDescriptor::USBBcd() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   395
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   396
	return ParseTUint16(iBlob, EbcdUSB);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   397
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   398
a5496987b1da 201025_04
hgs
parents:
diff changeset
   399
EXPORT_C TUint8 TUsbDeviceQualifierDescriptor::DeviceClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   400
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   401
	return ParseTUint8(iBlob, EbDeviceClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   402
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   403
a5496987b1da 201025_04
hgs
parents:
diff changeset
   404
EXPORT_C TUint8 TUsbDeviceQualifierDescriptor::DeviceSubClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   405
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   406
	return ParseTUint8(iBlob, EbDeviceSubClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   407
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   408
a5496987b1da 201025_04
hgs
parents:
diff changeset
   409
EXPORT_C TUint8 TUsbDeviceQualifierDescriptor::DeviceProtocol() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   410
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   411
	return ParseTUint8(iBlob, EbDeviceProtocol);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   412
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   413
a5496987b1da 201025_04
hgs
parents:
diff changeset
   414
EXPORT_C TUint8 TUsbDeviceQualifierDescriptor::MaxPacketSize0() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   415
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   416
	return ParseTUint8(iBlob, EbMaxPacketSize0);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   417
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   418
a5496987b1da 201025_04
hgs
parents:
diff changeset
   419
EXPORT_C TUint8 TUsbDeviceQualifierDescriptor::NumConfigurations() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   420
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   421
	return ParseTUint8(iBlob, EbNumConfigurations);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   422
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   423
a5496987b1da 201025_04
hgs
parents:
diff changeset
   424
EXPORT_C TUint8 TUsbDeviceQualifierDescriptor::Reserved() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   425
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   426
	return ParseTUint8(iBlob, EbReserved);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   427
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   428
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   429
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   430
The parsing routine for device qualifier descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   431
a5496987b1da 201025_04
hgs
parents:
diff changeset
   432
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   433
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   434
/*static*/ TUsbDeviceQualifierDescriptor* TUsbDeviceQualifierDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   435
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   436
	TUsbDeviceQualifierDescriptor* devQualDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   437
a5496987b1da 201025_04
hgs
parents:
diff changeset
   438
	const TInt KMinDevQualDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   439
	if(	aUsbDes.Length() >= KMinDevQualDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   440
		aUsbDes[KbDescriptorTypeOffset] == EDeviceQualifier &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   441
		aUsbDes[KbLengthOffset] == TUsbDeviceQualifierDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   442
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   443
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   444
		if(aUsbDes.Length() < TUsbDeviceQualifierDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   445
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   446
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   447
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   448
a5496987b1da 201025_04
hgs
parents:
diff changeset
   449
		// Looks ok to be a device quialifier descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   450
		devQualDes = new(ELeave) TUsbDeviceQualifierDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   451
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
   452
		devQualDes->ibLength = TUsbDeviceQualifierDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   453
		devQualDes->ibDescriptorType = EDeviceQualifier;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   454
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
   455
		devQualDes->iBlob.Set(aUsbDes.Left(TUsbDeviceQualifierDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   456
a5496987b1da 201025_04
hgs
parents:
diff changeset
   457
		devQualDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   458
a5496987b1da 201025_04
hgs
parents:
diff changeset
   459
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   460
		aUsbDes.Set(aUsbDes.Mid(TUsbDeviceQualifierDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   461
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   462
a5496987b1da 201025_04
hgs
parents:
diff changeset
   463
	return devQualDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   464
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   465
a5496987b1da 201025_04
hgs
parents:
diff changeset
   466
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   467
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   468
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   469
/*virtual*/ TBool TUsbDeviceQualifierDescriptor::IsParent(TUsbGenericDescriptor& /*aPotentialParent*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   470
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   471
	// Like a device descriptor, they should be top-level.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   472
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   473
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   474
a5496987b1da 201025_04
hgs
parents:
diff changeset
   475
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   476
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   477
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   478
/*virtual*/ TBool TUsbDeviceQualifierDescriptor::IsPeer(TUsbGenericDescriptor& /*aPotentialPeer*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   479
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   480
	// Like a device descriptor, they should come by themselves.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   481
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   482
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   483
a5496987b1da 201025_04
hgs
parents:
diff changeset
   484
a5496987b1da 201025_04
hgs
parents:
diff changeset
   485
// ----------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   486
// TUsbConfigurationDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   487
// See section 9.6.3 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   488
// ----------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   489
a5496987b1da 201025_04
hgs
parents:
diff changeset
   490
EXPORT_C TUsbConfigurationDescriptor::TUsbConfigurationDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   491
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   492
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   493
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   494
EXPORT_C /*static*/ TUsbConfigurationDescriptor* TUsbConfigurationDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   495
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   496
	TUsbConfigurationDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   497
	// Only cast if correctly indentified as configuration descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   498
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   499
		aOriginal->ibDescriptorType == EConfiguration &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   500
		aOriginal->ibLength == TUsbConfigurationDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   501
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   502
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   503
		ret = static_cast<TUsbConfigurationDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   504
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   505
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   506
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   507
a5496987b1da 201025_04
hgs
parents:
diff changeset
   508
EXPORT_C TUint16 TUsbConfigurationDescriptor::TotalLength() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   509
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   510
	return ParseTUint16(iBlob, EwTotalLength);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   511
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   512
a5496987b1da 201025_04
hgs
parents:
diff changeset
   513
EXPORT_C TUint8 TUsbConfigurationDescriptor::NumInterfaces() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   514
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   515
	return ParseTUint8(iBlob, EbNumInterfaces);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   516
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   517
a5496987b1da 201025_04
hgs
parents:
diff changeset
   518
EXPORT_C TUint8 TUsbConfigurationDescriptor::ConfigurationValue() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   519
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   520
	return ParseTUint8(iBlob, EbConfigurationValue);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   521
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   522
a5496987b1da 201025_04
hgs
parents:
diff changeset
   523
EXPORT_C TUint8 TUsbConfigurationDescriptor::ConfigurationIndex() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   524
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   525
	return ParseTUint8(iBlob, EiConfiguration);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   526
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   527
a5496987b1da 201025_04
hgs
parents:
diff changeset
   528
EXPORT_C TUint8 TUsbConfigurationDescriptor::Attributes() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   529
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   530
	return ParseTUint8(iBlob, EbmAttributes);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   531
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   532
a5496987b1da 201025_04
hgs
parents:
diff changeset
   533
EXPORT_C TUint8 TUsbConfigurationDescriptor::MaxPower() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   534
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   535
	return ParseTUint8(iBlob, EbMaxPower);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   536
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   537
a5496987b1da 201025_04
hgs
parents:
diff changeset
   538
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   539
The parsing routine for configuration descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   540
a5496987b1da 201025_04
hgs
parents:
diff changeset
   541
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   542
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   543
/*static*/ TUsbConfigurationDescriptor* TUsbConfigurationDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   544
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   545
	TUsbConfigurationDescriptor* configDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   546
a5496987b1da 201025_04
hgs
parents:
diff changeset
   547
	const TInt KMinConfigDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   548
	if(	aUsbDes.Length() >= KMinConfigDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   549
		aUsbDes[KbDescriptorTypeOffset] == EConfiguration &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   550
		aUsbDes[KbLengthOffset] == TUsbConfigurationDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   551
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   552
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   553
		if(aUsbDes.Length() < TUsbConfigurationDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   554
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   555
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   556
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   557
			
a5496987b1da 201025_04
hgs
parents:
diff changeset
   558
		// Robustness check - check that there is sufficient data for whole bundle (wTotalLength)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   559
		const TInt KwTotalLengthOffset = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   560
		if(aUsbDes.Length() < ParseTUint16(aUsbDes, KwTotalLengthOffset))
a5496987b1da 201025_04
hgs
parents:
diff changeset
   561
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   562
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   563
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   564
a5496987b1da 201025_04
hgs
parents:
diff changeset
   565
		// Looks ok to be a configuration descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   566
		configDes = new(ELeave) TUsbConfigurationDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   567
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
   568
		configDes->ibLength = TUsbConfigurationDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   569
		configDes->ibDescriptorType = EConfiguration;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   570
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
   571
		configDes->iBlob.Set(aUsbDes.Left(TUsbConfigurationDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   572
a5496987b1da 201025_04
hgs
parents:
diff changeset
   573
		configDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   574
a5496987b1da 201025_04
hgs
parents:
diff changeset
   575
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   576
		aUsbDes.Set(aUsbDes.Mid(TUsbConfigurationDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   577
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   578
a5496987b1da 201025_04
hgs
parents:
diff changeset
   579
	return configDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   580
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   581
a5496987b1da 201025_04
hgs
parents:
diff changeset
   582
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   583
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   584
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   585
/*virtual*/ TBool TUsbConfigurationDescriptor::IsParent(TUsbGenericDescriptor& /*aPotentialParent*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   586
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   587
	// A configuration descriptor should always be the top-level descriptor in a configuration
a5496987b1da 201025_04
hgs
parents:
diff changeset
   588
	// bundle.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   589
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   590
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   591
a5496987b1da 201025_04
hgs
parents:
diff changeset
   592
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   593
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   594
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   595
/*virtual*/ TBool TUsbConfigurationDescriptor::IsPeer(TUsbGenericDescriptor& /*aPotentialPeer*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   596
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   597
	// There should only ever be one configuration descriptor in a bundle.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   598
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   599
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   600
a5496987b1da 201025_04
hgs
parents:
diff changeset
   601
a5496987b1da 201025_04
hgs
parents:
diff changeset
   602
// --------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   603
// TUsbOtherSpeedDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   604
// See section 9.6.4 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   605
// --------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   606
a5496987b1da 201025_04
hgs
parents:
diff changeset
   607
EXPORT_C TUsbOtherSpeedDescriptor::TUsbOtherSpeedDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   608
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   609
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   610
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   611
EXPORT_C /*static*/ TUsbOtherSpeedDescriptor* TUsbOtherSpeedDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   612
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   613
	TUsbOtherSpeedDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   614
	// Only cast if correctly indentified as other speed descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   615
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   616
		aOriginal->ibDescriptorType == EOtherSpeedConfiguration &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   617
		aOriginal->ibLength == TUsbOtherSpeedDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   618
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   619
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   620
		ret = static_cast<TUsbOtherSpeedDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   621
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   622
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   623
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   624
a5496987b1da 201025_04
hgs
parents:
diff changeset
   625
EXPORT_C TUint16 TUsbOtherSpeedDescriptor::TotalLength() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   626
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   627
	return ParseTUint16(iBlob, EwTotalLength);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   628
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   629
a5496987b1da 201025_04
hgs
parents:
diff changeset
   630
EXPORT_C TUint8 TUsbOtherSpeedDescriptor::NumInterfaces() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   631
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   632
	return ParseTUint8(iBlob, EbNumInterfaces);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   633
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   634
a5496987b1da 201025_04
hgs
parents:
diff changeset
   635
EXPORT_C TUint8 TUsbOtherSpeedDescriptor::ConfigurationValue() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   636
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   637
	return ParseTUint8(iBlob, EbConfigurationValue);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   638
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   639
a5496987b1da 201025_04
hgs
parents:
diff changeset
   640
EXPORT_C TUint8 TUsbOtherSpeedDescriptor::ConfigurationIndex() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   641
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   642
	return ParseTUint8(iBlob, EiConfiguration);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   643
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   644
a5496987b1da 201025_04
hgs
parents:
diff changeset
   645
EXPORT_C TUint8 TUsbOtherSpeedDescriptor::Attributes() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   646
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   647
	return ParseTUint8(iBlob, EbmAttributes);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   648
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   649
a5496987b1da 201025_04
hgs
parents:
diff changeset
   650
EXPORT_C TUint8 TUsbOtherSpeedDescriptor::MaxPower() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   651
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   652
	return ParseTUint8(iBlob, EbMaxPower);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   653
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   654
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   655
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   656
The parsing routine for other speed descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   657
a5496987b1da 201025_04
hgs
parents:
diff changeset
   658
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   659
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   660
/*static*/ TUsbOtherSpeedDescriptor* TUsbOtherSpeedDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   661
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   662
	TUsbOtherSpeedDescriptor* oSpeedDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   663
a5496987b1da 201025_04
hgs
parents:
diff changeset
   664
	const TInt KMinOtherSpeedDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   665
	if(	aUsbDes.Length() >= KMinOtherSpeedDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   666
		aUsbDes[KbDescriptorTypeOffset] == EOtherSpeedConfiguration &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   667
		aUsbDes[KbLengthOffset] == TUsbOtherSpeedDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   668
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   669
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   670
		if(aUsbDes.Length() < TUsbOtherSpeedDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   671
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   672
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   673
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   674
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   675
		// Robustness check - check that there is sufficient data for whole bundle (wTotalLength)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   676
		const TInt KwTotalLengthOffset = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   677
		if(aUsbDes.Length() < ParseTUint16(aUsbDes, KwTotalLengthOffset))
a5496987b1da 201025_04
hgs
parents:
diff changeset
   678
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   679
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   680
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   681
a5496987b1da 201025_04
hgs
parents:
diff changeset
   682
		// Looks ok to be an other speed descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   683
		oSpeedDes = new(ELeave) TUsbOtherSpeedDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   684
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
   685
		oSpeedDes->ibLength = TUsbOtherSpeedDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   686
		oSpeedDes->ibDescriptorType = EOtherSpeedConfiguration;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   687
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
   688
		oSpeedDes->iBlob.Set(aUsbDes.Left(TUsbOtherSpeedDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   689
a5496987b1da 201025_04
hgs
parents:
diff changeset
   690
		oSpeedDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   691
a5496987b1da 201025_04
hgs
parents:
diff changeset
   692
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   693
		aUsbDes.Set(aUsbDes.Mid(TUsbOtherSpeedDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   694
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   695
a5496987b1da 201025_04
hgs
parents:
diff changeset
   696
	return oSpeedDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   697
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   698
a5496987b1da 201025_04
hgs
parents:
diff changeset
   699
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   700
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   701
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   702
/*virtual*/ TBool TUsbOtherSpeedDescriptor::IsParent(TUsbGenericDescriptor& /*aPotentialParent*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   703
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   704
	// Other speed descriptor is like a configuration descriptor, in that it should
a5496987b1da 201025_04
hgs
parents:
diff changeset
   705
	// not have any parents in a bundle.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   706
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   707
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   708
a5496987b1da 201025_04
hgs
parents:
diff changeset
   709
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   710
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   711
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   712
/*virtual*/ TBool TUsbOtherSpeedDescriptor::IsPeer(TUsbGenericDescriptor& /*aPotentialPeer*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   713
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   714
	// There should only ever be one other speed descriptor in a bundle.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   715
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   716
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   717
a5496987b1da 201025_04
hgs
parents:
diff changeset
   718
a5496987b1da 201025_04
hgs
parents:
diff changeset
   719
// ------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   720
// TUsbInterfaceAssociationDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   721
// See the USB IAD ECN.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   722
// ------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   723
a5496987b1da 201025_04
hgs
parents:
diff changeset
   724
EXPORT_C TUsbInterfaceAssociationDescriptor::TUsbInterfaceAssociationDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   725
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   726
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   727
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   728
EXPORT_C /*static*/ TUsbInterfaceAssociationDescriptor* TUsbInterfaceAssociationDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   729
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   730
	TUsbInterfaceAssociationDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   731
	// Only cast if correctly indentified as interface association descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   732
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   733
		aOriginal->ibDescriptorType == EInterfaceAssociation &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   734
		aOriginal->ibLength == TUsbInterfaceAssociationDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   735
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   736
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   737
		ret = static_cast<TUsbInterfaceAssociationDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   738
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   739
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   740
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   741
a5496987b1da 201025_04
hgs
parents:
diff changeset
   742
EXPORT_C TUint8 TUsbInterfaceAssociationDescriptor::FirstInterface() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   743
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   744
	return ParseTUint8(iBlob, EbFirstInterface);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   745
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   746
a5496987b1da 201025_04
hgs
parents:
diff changeset
   747
EXPORT_C TUint8 TUsbInterfaceAssociationDescriptor::InterfaceCount() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   748
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   749
	return ParseTUint8(iBlob, EbInterfaceCount);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   750
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   751
a5496987b1da 201025_04
hgs
parents:
diff changeset
   752
EXPORT_C TUint8 TUsbInterfaceAssociationDescriptor::FunctionClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   753
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   754
	return ParseTUint8(iBlob, EbFunctionClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   755
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   756
a5496987b1da 201025_04
hgs
parents:
diff changeset
   757
EXPORT_C TUint8 TUsbInterfaceAssociationDescriptor::FunctionSubClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   758
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   759
	return ParseTUint8(iBlob, EbFunctionSubClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   760
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   761
a5496987b1da 201025_04
hgs
parents:
diff changeset
   762
EXPORT_C TUint8 TUsbInterfaceAssociationDescriptor::FunctionProtocol() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   763
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   764
	return ParseTUint8(iBlob, EbFunctionProtocol);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   765
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   766
a5496987b1da 201025_04
hgs
parents:
diff changeset
   767
EXPORT_C TUint8 TUsbInterfaceAssociationDescriptor::FunctionIndex() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   768
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   769
	return ParseTUint8(iBlob, EiFunction);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   770
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   771
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   772
/*static*/ TUsbInterfaceAssociationDescriptor* TUsbInterfaceAssociationDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   773
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   774
	TUsbInterfaceAssociationDescriptor* intAssocDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   775
a5496987b1da 201025_04
hgs
parents:
diff changeset
   776
	const TInt KMinIntAssocDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   777
	if(	aUsbDes.Length() >= KMinIntAssocDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   778
		aUsbDes[KbDescriptorTypeOffset] == EInterfaceAssociation &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   779
		aUsbDes[KbLengthOffset] == TUsbInterfaceAssociationDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   780
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   781
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   782
		if(aUsbDes.Length() < TUsbInterfaceAssociationDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   783
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   784
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   785
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   786
a5496987b1da 201025_04
hgs
parents:
diff changeset
   787
		// Looks ok to be a interface association descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   788
		intAssocDes = new(ELeave) TUsbInterfaceAssociationDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   789
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
   790
		intAssocDes->ibLength = TUsbInterfaceAssociationDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   791
		intAssocDes->ibDescriptorType = EInterfaceAssociation;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   792
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
   793
		intAssocDes->iBlob.Set(aUsbDes.Left(TUsbInterfaceAssociationDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   794
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   795
		intAssocDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   796
a5496987b1da 201025_04
hgs
parents:
diff changeset
   797
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   798
		aUsbDes.Set(aUsbDes.Mid(TUsbInterfaceAssociationDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   799
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   800
a5496987b1da 201025_04
hgs
parents:
diff changeset
   801
	return intAssocDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   802
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   803
a5496987b1da 201025_04
hgs
parents:
diff changeset
   804
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   805
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   806
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   807
/*virtual*/ TBool TUsbInterfaceAssociationDescriptor::IsParent(TUsbGenericDescriptor& aPotentialParent)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   808
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   809
	switch(aPotentialParent.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   810
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   811
	case EConfiguration:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   812
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   813
	case EOtherSpeedConfiguration:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   814
		return ETrue;	// I think this should be EFalse by my reading of the USB spec - however
a5496987b1da 201025_04
hgs
parents:
diff changeset
   815
						// it is not explicitly clear, so play it safe.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   816
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   817
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   818
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   819
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   820
a5496987b1da 201025_04
hgs
parents:
diff changeset
   821
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   822
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   823
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   824
/*virtual*/ TBool TUsbInterfaceAssociationDescriptor::IsPeer(TUsbGenericDescriptor& aPotentialPeer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   825
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   826
	switch(aPotentialPeer.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   827
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   828
	case EInterfaceAssociation:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   829
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   830
	case EInterface:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   831
		// Only interfaces are peers of IADs.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   832
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   833
			TUsbInterfaceDescriptor* intDesc = TUsbInterfaceDescriptor::Cast(&aPotentialPeer);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   834
			if(intDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   835
				{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   836
				TInt intNum = intDesc->InterfaceNumber();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   837
				intNum -= FirstInterface();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   838
				if(intNum < 0 || intNum >= InterfaceCount())
a5496987b1da 201025_04
hgs
parents:
diff changeset
   839
					{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   840
					// The interface number is outside the IAD region.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   841
					return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   842
					}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   843
				}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   844
			return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   845
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   846
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   847
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   848
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   849
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   850
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   851
/*virtual*/ TBool TUsbInterfaceAssociationDescriptor::IsChild(TUsbGenericDescriptor& aPotentialChild)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   852
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   853
	switch(aPotentialChild.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   854
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   855
	case EInterface:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   856
		// Only interfaces are children of IADs. And only if they are special.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   857
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   858
			TUsbInterfaceDescriptor* intDesc = TUsbInterfaceDescriptor::Cast(&aPotentialChild);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   859
			if(intDesc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   860
				{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   861
				TInt intNum = intDesc->InterfaceNumber();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   862
				intNum -= FirstInterface();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   863
				if(intNum >= 0 && intNum < InterfaceCount())
a5496987b1da 201025_04
hgs
parents:
diff changeset
   864
					{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   865
					// The interface number is within the IAD region required.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   866
					return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   867
					}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   868
				}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   869
			return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   870
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   871
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   872
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   873
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   874
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   875
a5496987b1da 201025_04
hgs
parents:
diff changeset
   876
a5496987b1da 201025_04
hgs
parents:
diff changeset
   877
// -------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   878
// TUsbInterfaceDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   879
// See section 9.6.5 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   880
// -------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   881
a5496987b1da 201025_04
hgs
parents:
diff changeset
   882
EXPORT_C TUsbInterfaceDescriptor::TUsbInterfaceDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   883
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   884
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   885
a5496987b1da 201025_04
hgs
parents:
diff changeset
   886
EXPORT_C /*static*/ TUsbInterfaceDescriptor* TUsbInterfaceDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   887
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   888
	TUsbInterfaceDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   889
	// Only cast if correctly indentified as interface descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   890
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   891
		aOriginal->ibDescriptorType == EInterface &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   892
		aOriginal->ibLength == TUsbInterfaceDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   893
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   894
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   895
		ret = static_cast<TUsbInterfaceDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   896
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   897
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   898
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   899
a5496987b1da 201025_04
hgs
parents:
diff changeset
   900
EXPORT_C TUint8 TUsbInterfaceDescriptor::InterfaceNumber() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   901
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   902
	return ParseTUint8(iBlob, EbInterfaceNumber);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   903
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   904
a5496987b1da 201025_04
hgs
parents:
diff changeset
   905
EXPORT_C TUint8 TUsbInterfaceDescriptor::AlternateSetting() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   906
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   907
	return ParseTUint8(iBlob, EbAlternateSetting);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   908
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   909
a5496987b1da 201025_04
hgs
parents:
diff changeset
   910
EXPORT_C TUint8 TUsbInterfaceDescriptor::NumEndpoints() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   911
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   912
	return ParseTUint8(iBlob, EbNumEndpoints);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   913
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   914
a5496987b1da 201025_04
hgs
parents:
diff changeset
   915
EXPORT_C TUint8 TUsbInterfaceDescriptor::InterfaceClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   916
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   917
	return ParseTUint8(iBlob, EbInterfaceClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   918
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   919
a5496987b1da 201025_04
hgs
parents:
diff changeset
   920
EXPORT_C TUint8 TUsbInterfaceDescriptor::InterfaceSubClass() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   921
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   922
	return ParseTUint8(iBlob, EbInterfaceSubClass);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   923
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   924
a5496987b1da 201025_04
hgs
parents:
diff changeset
   925
EXPORT_C TUint8 TUsbInterfaceDescriptor::InterfaceProtocol() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   926
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   927
	return ParseTUint8(iBlob, EbInterfaceProtocol);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   928
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   929
a5496987b1da 201025_04
hgs
parents:
diff changeset
   930
EXPORT_C TUint8 TUsbInterfaceDescriptor::Interface() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
   931
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   932
	return ParseTUint8(iBlob, EiInterface);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   933
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   934
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   935
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   936
The parsing routine for interface descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   937
a5496987b1da 201025_04
hgs
parents:
diff changeset
   938
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   939
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   940
/*static*/ TUsbInterfaceDescriptor* TUsbInterfaceDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   941
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   942
	TUsbInterfaceDescriptor* intDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   943
a5496987b1da 201025_04
hgs
parents:
diff changeset
   944
	const TInt KMinInterfaceDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   945
	if(	aUsbDes.Length() >= KMinInterfaceDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   946
		aUsbDes[KbDescriptorTypeOffset] == EInterface &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
   947
		aUsbDes[KbLengthOffset] == TUsbInterfaceDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   948
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   949
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   950
		if(aUsbDes.Length() < TUsbInterfaceDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   951
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   952
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   953
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   954
a5496987b1da 201025_04
hgs
parents:
diff changeset
   955
		// Looks ok to be an interface descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   956
		intDes = new(ELeave) TUsbInterfaceDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   957
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
   958
		intDes->ibLength = TUsbInterfaceDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   959
		intDes->ibDescriptorType = EInterface;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   960
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
   961
		intDes->iBlob.Set(aUsbDes.Left(TUsbInterfaceDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   962
a5496987b1da 201025_04
hgs
parents:
diff changeset
   963
		intDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   964
a5496987b1da 201025_04
hgs
parents:
diff changeset
   965
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
   966
		aUsbDes.Set(aUsbDes.Mid(TUsbInterfaceDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   967
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   968
a5496987b1da 201025_04
hgs
parents:
diff changeset
   969
	return intDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   970
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   971
a5496987b1da 201025_04
hgs
parents:
diff changeset
   972
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   973
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   974
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   975
/*virtual*/ TBool TUsbInterfaceDescriptor::IsParent(TUsbGenericDescriptor& aPotentialParent)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   976
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   977
	switch(aPotentialParent.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   978
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   979
	case EConfiguration:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   980
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   981
	case EOtherSpeedConfiguration:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   982
		return ETrue;	// I think this should be EFalse by my reading of the USB spec - however
a5496987b1da 201025_04
hgs
parents:
diff changeset
   983
						// it is not explicitly clear, so play it safe.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   984
	// case EInterfaceAssociation:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   985
	// 		We let the IAD descriptor handle the logic of how we bind to it.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   986
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   987
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   988
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   989
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   990
a5496987b1da 201025_04
hgs
parents:
diff changeset
   991
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   992
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
   993
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   994
/*virtual*/ TBool TUsbInterfaceDescriptor::IsPeer(TUsbGenericDescriptor& aPotentialPeer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   995
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   996
	switch(aPotentialPeer.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   997
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   998
	//case EInterfaceAssociation:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   999
	//		We let the IAD descriptor handle the logic of how we bind to it.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1000
	case EInterface:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1001
		// If another interface descriptor then it is a peer not child.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1002
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1003
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1004
		// Any other descriptors are ignored.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1005
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1006
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1007
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1008
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1009
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1010
// ------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1011
// TUsbEndpointDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1012
// See section 9.6.6 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1013
// ------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1014
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1015
EXPORT_C TUsbEndpointDescriptor::TUsbEndpointDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1016
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1017
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1018
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1019
EXPORT_C /*static*/ TUsbEndpointDescriptor* TUsbEndpointDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1020
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1021
	TUsbEndpointDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1022
	// Only cast if correctly indentified as endpoint descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1023
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1024
		aOriginal->ibDescriptorType == EEndpoint &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1025
		aOriginal->ibLength == TUsbEndpointDescriptor::KSizeInOctets &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1026
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1027
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1028
		ret = static_cast<TUsbEndpointDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1029
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1030
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1031
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1032
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1033
EXPORT_C TUint8 TUsbEndpointDescriptor::EndpointAddress() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1034
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1035
	return ParseTUint8(iBlob, EbEndpointAddress);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1036
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1037
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1038
EXPORT_C TUint8 TUsbEndpointDescriptor::Attributes() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1039
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1040
	return ParseTUint8(iBlob, EbmAttributes);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1041
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1042
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1043
EXPORT_C TUint16 TUsbEndpointDescriptor::MaxPacketSize() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1044
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1045
	return ParseTUint16(iBlob, EwMaxPacketSize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1046
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1047
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1048
EXPORT_C TUint8 TUsbEndpointDescriptor::Interval() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1049
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1050
	return ParseTUint8(iBlob, EbInterval);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1051
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1052
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1053
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1054
The parsing routine for endpoint descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1055
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1056
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1057
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1058
/*static*/ TUsbEndpointDescriptor* TUsbEndpointDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1059
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1060
	TUsbEndpointDescriptor* endDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1061
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1062
	const TInt KMinEndpointDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1063
	if(	aUsbDes.Length() >= KMinEndpointDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1064
		aUsbDes[KbDescriptorTypeOffset] == EEndpoint &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1065
		aUsbDes[KbLengthOffset] == TUsbEndpointDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1066
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1067
		// Robustness check - check the length field is valid, and that we have enough data.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1068
		if(aUsbDes.Length() < TUsbEndpointDescriptor::KSizeInOctets)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1069
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1070
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1071
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1072
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1073
		// Looks ok to be an endpoint descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1074
		endDes = new(ELeave) TUsbEndpointDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1075
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1076
		endDes->ibLength = TUsbEndpointDescriptor::KSizeInOctets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1077
		endDes->ibDescriptorType = EEndpoint;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1078
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1079
		endDes->iBlob.Set(aUsbDes.Left(TUsbEndpointDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1080
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1081
		endDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1082
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1083
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1084
		aUsbDes.Set(aUsbDes.Mid(TUsbEndpointDescriptor::KSizeInOctets));
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1085
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1086
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1087
	return endDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1088
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1089
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1090
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1091
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1092
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1093
/*virtual*/ TBool TUsbEndpointDescriptor::IsParent(TUsbGenericDescriptor& aPotentialParent)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1094
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1095
	switch(aPotentialParent.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1096
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1097
	case EInterface:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1098
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1099
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1100
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1101
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1102
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1103
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1104
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1105
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1106
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1107
/*virtual*/ TBool TUsbEndpointDescriptor::IsPeer(TUsbGenericDescriptor& aPotentialPeer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1108
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1109
	switch(aPotentialPeer.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1110
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1111
	case EEndpoint:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1112
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1113
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1114
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1115
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1116
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1117
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1118
// ------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1119
// TUsbOTGDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1120
// See section 6.4 of the USB 2.0 On-The-Go Supplement Revision 1.3
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1121
// ------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1122
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1123
EXPORT_C TUsbOTGDescriptor::TUsbOTGDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1124
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1125
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1126
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1127
EXPORT_C /*static*/ TUsbOTGDescriptor* TUsbOTGDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1128
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1129
	TUsbOTGDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1130
	// Only cast if correctly indentified as otg descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1131
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1132
		aOriginal->ibDescriptorType == EOTG &&
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1133
		TUsbOTGDescriptor::IsValidOTGDescriptorLength( aOriginal->ibLength ) &&
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1134
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1135
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1136
		ret = static_cast<TUsbOTGDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1137
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1138
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1139
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1140
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1141
EXPORT_C TUint8 TUsbOTGDescriptor::Attributes() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1142
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1143
	return ParseTUint8(iBlob, EbmAttributes);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1144
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1145
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1146
EXPORT_C TBool TUsbOTGDescriptor::HNPSupported() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1147
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1148
    return (ParseTUint8(iBlob, EbmAttributes) & 0x02) == 0x02;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1149
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1150
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1151
EXPORT_C TBool TUsbOTGDescriptor::SRPSupported() const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1152
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1153
    // Note: an illegal device (see 6.4.2 of the OTG specification) could
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1154
    // incorrectly return False for SRP and True for HNP
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1155
    // However this function just extracts the bit rather than attempting to
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1156
    // fix up a broken device.  Devices broken in this way wouldn't be expected on
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1157
    // the TPL.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1158
    return (ParseTUint8(iBlob, EbmAttributes) & 0x01) == 0x01;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1159
    }
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1160
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1161
EXPORT_C TUint16 TUsbOTGDescriptor::BcdOTG() const
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1162
	{
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1163
    TUint16 bcdOTG = 0x0000;
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1164
    if ( iBlob[EbmLength] > TUsbOTGDescriptor::KSizeInOctets )
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1165
	    {
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1166
        bcdOTG = ( iBlob[EbcdOTG] ) | ( iBlob[EbcdOTG + 1] << 8 );
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1167
	    }
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1168
    return bcdOTG;
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1169
	}
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1170
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1171
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1172
The parsing routine for OTG descriptors.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1173
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1174
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1175
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1176
/*static*/ TUsbOTGDescriptor* TUsbOTGDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1177
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1178
	TUsbOTGDescriptor* endDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1179
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1180
	TUint8 descriptorLength = aUsbDes[KbLengthOffset];
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1181
	const TInt KMinOTGDesDecisionLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1182
	if(	aUsbDes.Length() >= KMinOTGDesDecisionLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1183
		aUsbDes[KbDescriptorTypeOffset] == EOTG &&
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1184
		TUsbOTGDescriptor::IsValidOTGDescriptorLength( descriptorLength ) )
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1185
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1186
		// Robustness check - check the length field is valid, and that we have enough data.
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1187
		if(aUsbDes.Length() < descriptorLength)
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1188
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1189
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1190
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1191
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1192
		// Looks ok to be an OTG descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1193
		endDes = new(ELeave) TUsbOTGDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1194
		// Set the standard fields
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1195
		endDes->ibLength = descriptorLength;
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1196
		endDes->ibDescriptorType = EOTG;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1197
		// Set the blob appropriately
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1198
		endDes->iBlob.Set(aUsbDes.Left(descriptorLength));
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1199
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1200
		// Null the pointers
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1201
		endDes->iFirstChild = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1202
		endDes->iNextPeer = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1203
		endDes->iParent = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1204
		
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1205
		endDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1206
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1207
		// Update the data-left-to-parse Symbian descriptor
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1208
		aUsbDes.Set(aUsbDes.Mid(descriptorLength));
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1209
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1210
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1211
	return endDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1212
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1213
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1214
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1215
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1216
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1217
/*virtual*/ TBool TUsbOTGDescriptor::IsParent(TUsbGenericDescriptor& aPotentialParent)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1218
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1219
	switch(aPotentialParent.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1220
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1221
	case EConfiguration:    // we are part of a configuration descriptor, or standalone
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1222
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1223
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1224
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1225
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1226
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1227
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1228
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1229
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1230
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1231
/*virtual*/ TBool TUsbOTGDescriptor::IsPeer(TUsbGenericDescriptor& aPotentialPeer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1232
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1233
    switch(aPotentialPeer.ibDescriptorType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1234
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1235
	//case EInterfaceAssociation:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1236
	//		We let the IAD descriptor handle the logic of how we bind to it.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1237
	case EInterface:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1238
		// If another interface descriptor then it is a peer not child.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1239
		return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1240
	default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1241
		// Any other descriptors are ignored.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1242
		return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1243
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1244
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1245
273
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1246
/**
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1247
@internalComponent
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1248
*/
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1249
/*static*/ TBool TUsbOTGDescriptor::IsValidOTGDescriptorLength(TUint8 aLength)
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1250
	{
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1251
    TBool ret = EFalse;
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1252
    const TUint8 KOTG13DescriptorLength = 3; //OTG1.3 
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1253
    const TUint8 KOTG20DescriptorLength = 5; //OTG2.0
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1254
    if ( ( aLength == KOTG13DescriptorLength ) || ( aLength == KOTG20DescriptorLength ) )
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1255
        {
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1256
        ret = ETrue;
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1257
        }
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1258
    return ret;
6a75fa55495f 201037_09
hgs
parents: 189
diff changeset
  1259
	}
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1260
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1261
// ----------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1262
// TUsbStringDescriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1263
// See section 9.6.7 of the USB 2.0 specification.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1264
// ----------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1265
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1266
// The length of the header in a string descriptor (i.e. the same as every other standard USB descriptor).
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1267
static const TInt KStringDescriptorHeaderFieldLength = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1268
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1269
EXPORT_C TUsbStringDescriptor::TUsbStringDescriptor()
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1270
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1271
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1272
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1273
EXPORT_C /*static*/ TUsbStringDescriptor* TUsbStringDescriptor::Cast(TUsbGenericDescriptor* aOriginal)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1274
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1275
	TUsbStringDescriptor* ret = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1276
	// Only cast if correctly indentified as string descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1277
	if(	aOriginal &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1278
		aOriginal->ibDescriptorType == EString &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1279
		aOriginal->ibLength >= KStringDescriptorHeaderFieldLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1280
		aOriginal->iRecognisedAndParsed == ERecognised)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1281
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1282
		ret = static_cast<TUsbStringDescriptor*>(aOriginal);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1283
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1284
	return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1285
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1286
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1287
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1288
For string descriptor zero, this function allows a means to iterate through the list of supported languages
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1289
for strings on this device.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1290
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1291
@param aIndex Index into language ID table.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1292
@return The language ID at the requested index, or KErrNotFound if the end of the list has been reached.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1293
Note that the language IDs are unsigned 16-bit numbers, while the return from this function is signed 32-bit.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1294
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1295
EXPORT_C TInt TUsbStringDescriptor::GetLangId(TInt aIndex) const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1296
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1297
	__ASSERT_ALWAYS(aIndex >= 0, UsbDescPanic(UsbdiPanics::EUsbDescNegativeIndexToLangId));
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1298
	const TUint8 KSizeOfLangIdField = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1299
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1300
	TInt offset = KStringDescriptorHeaderFieldLength + KSizeOfLangIdField * aIndex;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1301
	if(offset >= ibLength)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1302
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1303
		return KErrNotFound;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1304
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1305
	return ParseTUint16(iBlob, offset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1306
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1307
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1308
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1309
Writes the string data into a Symbian descriptor of sufficient size.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1310
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1311
@param aString The Symbian descriptor that will have the string data written into it.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1312
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1313
EXPORT_C void TUsbStringDescriptor::StringData(TDes16& aString) const
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1314
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1315
	const TUint8 KUnicodeCharacterWidth = 2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1316
	aString.Zero();
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1317
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1318
	TInt index = KStringDescriptorHeaderFieldLength;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1319
	while(index+KUnicodeCharacterWidth <= ibLength)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1320
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1321
		aString.Append(ParseTUint16(iBlob, index));
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1322
		index += KUnicodeCharacterWidth;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1323
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1324
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1325
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1326
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1327
/*static*/ TUsbStringDescriptor* TUsbStringDescriptor::ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* /*aPreviousDesc*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1328
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1329
	TUsbStringDescriptor* stringDes = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1330
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1331
	if(	aUsbDes.Length() >= KStringDescriptorHeaderFieldLength &&
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1332
		aUsbDes[KbDescriptorTypeOffset] == EString)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1333
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1334
		TUint8 stringDesLen = aUsbDes[KbLengthOffset];
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1335
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1336
		// Robustness check - check the length field is valid
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1337
		if(aUsbDes.Length() < stringDesLen || stringDesLen < KStringDescriptorHeaderFieldLength)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1338
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1339
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1340
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1341
		// Robustness check - check the length is a multiple of two.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1342
		if(stringDesLen % 2 != 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1343
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1344
			User::Leave(KErrCorrupt);
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1345
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1346
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1347
		// Looks ok to be a string descriptor.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1348
		stringDes = new(ELeave) TUsbStringDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1349
		// Set the standard fields
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1350
		stringDes->ibLength = stringDesLen;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1351
		stringDes->ibDescriptorType = EString;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1352
		// Set the blob appropriately
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1353
		stringDes->iBlob.Set(aUsbDes.Left(stringDesLen));
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1354
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1355
		stringDes->iRecognisedAndParsed = ERecognised;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1356
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1357
		// Update the data-left-to-parse Symbian descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1358
		aUsbDes.Set(aUsbDes.Mid(stringDesLen));
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1359
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1360
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1361
	return stringDes;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1362
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1363
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1364
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1365
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1366
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1367
/*virtual*/ TBool TUsbStringDescriptor::IsParent(TUsbGenericDescriptor& /*aPotentialParent*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1368
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1369
	// String descriptors have no parents - they are standalone.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1370
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1371
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1372
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1373
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1374
@internalComponent
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1375
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1376
/*virtual*/ TBool TUsbStringDescriptor::IsPeer(TUsbGenericDescriptor& /*aPotentialPeer*/)
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1377
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1378
	// String descriptors have no peers - they are standalone.
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1379
	return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1380
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
  1381