sl@0: // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32test/usb/t_usbdev/src/config.cpp sl@0: // USB Test Program T_USB_DEVICE. sl@0: // Reading and converting the XML configuration file. sl@0: // sl@0: // sl@0: sl@0: #include "general.h" sl@0: #include "config.h" sl@0: sl@0: _LIT(KCfgLDD,"LDD"); sl@0: _LIT(KCfgLDD1,"ENDPOINTS"); sl@0: _LIT(KCfgLDD2,"SOFTCONNECT"); sl@0: _LIT(KCfgLDD3,"SELFPOWER"); sl@0: _LIT(KCfgLDD4,"REMOTEWAKEUP"); sl@0: _LIT(KCfgLDD5,"HIGHSPEED"); sl@0: _LIT(KCfgLDD6,"FEATURES"); sl@0: _LIT(KCfgLDD7,"MAXPOWER"); sl@0: _LIT(KCfgLDD8,"EPSTALL"); sl@0: _LIT(KCfgLDD9,"SPEC"); sl@0: _LIT(KCfgLDD10,"VID"); sl@0: _LIT(KCfgLDD11,"PID"); sl@0: _LIT(KCfgLDD12,"RELEASE"); sl@0: _LIT(KCfgLDD13,"MANUFACTURER"); sl@0: _LIT(KCfgLDD14,"PRODUCT"); sl@0: _LIT(KCfgLDD15,"SERIALNUMBER"); sl@0: _LIT(KCfgLDD16,"OTG"); sl@0: _LIT(KCfgIF,"INTERFACE"); sl@0: _LIT(KCfgIFS,"ALT_SETTING"); sl@0: _LIT(KCfgIF1,"CLASS"); sl@0: _LIT(KCfgIF2,"SUBCLASS"); sl@0: _LIT(KCfgIF3,"PROTOCOL"); sl@0: _LIT(KCfgIF4,"DESCRIPTOR"); sl@0: _LIT(KCfgIF5,"BANDWIDTH_IN"); sl@0: _LIT(KCfgIF6,"BANDWIDTH_OUT"); sl@0: _LIT(KCfgEP,"ENDPOINT"); sl@0: _LIT(KCfgEP1,"SIZE"); sl@0: _LIT(KCfgEP2,"INTERVAL"); sl@0: _LIT(KCfgEP3,"HSINTERVAL"); sl@0: _LIT(KCfgEP4,"HSTRANSACTIONS"); sl@0: _LIT(KCfgEP5,"DMA"); sl@0: _LIT(KCfgEP6,"DOUBLEBUFF"); sl@0: _LIT(KCfgEP7,"EXTRA"); sl@0: _LIT(KCfgEP8,"BUFFERSIZE"); sl@0: _LIT(KCfgEP9,"READSIZE"); sl@0: sl@0: sl@0: _LIT(KAttributeName,"name="); sl@0: _LIT(KAttributeNumber,"number="); sl@0: _LIT(KAttributeType,"type="); sl@0: _LIT(KAttributeDirection,"direction="); sl@0: sl@0: _LIT(KEpBulk,"\"BULK\""); sl@0: _LIT(KEpInterrupt,"\"INTERRUPT\""); sl@0: _LIT(KEpIsochronous,"\"ISOCHRONOUS\""); sl@0: _LIT(KEpIn,"\"IN\""); sl@0: _LIT(KEpOut,"\"OUT\""); sl@0: sl@0: static const TInt8 KMaxXMLNesting = 3; // max 3 levels of xml nesting sl@0: sl@0: static const TPtrC xmlKeys[] = sl@0: { sl@0: (TDesC&)KCfgLDD, (TDesC&)KCfgLDD1, (TDesC&)KCfgLDD2, (TDesC&)KCfgLDD3, (TDesC&)KCfgLDD4, (TDesC&)KCfgLDD5, (TDesC&)KCfgLDD6, sl@0: (TDesC&)KCfgLDD7, (TDesC&)KCfgLDD8, (TDesC&)KCfgLDD9, (TDesC&)KCfgLDD10, (TDesC&)KCfgLDD11, (TDesC&)KCfgLDD12, (TDesC&)KCfgLDD13, sl@0: (TDesC&)KCfgLDD14, (TDesC&)KCfgLDD15, (TDesC&)KCfgLDD16, sl@0: (TDesC&)KCfgIF, (TDesC&)KCfgIFS, (TDesC&)KCfgIF1, (TDesC&)KCfgIF2, (TDesC&)KCfgIF3, (TDesC&)KCfgIF4, (TDesC&)KCfgIF5, (TDesC&)KCfgIF6, sl@0: (TDesC&)KCfgEP, (TDesC&)KCfgEP1, (TDesC&)KCfgEP2, (TDesC&)KCfgEP3, (TDesC&)KCfgEP4, (TDesC&)KCfgEP5, (TDesC&)KCfgEP6, (TDesC&)KCfgEP7, (TDesC&)KCfgEP8, (TDesC&)KCfgEP9 sl@0: }; sl@0: sl@0: enum xmlIndex sl@0: { sl@0: ExiLdd = 0, // xmlKeys index for LDD sl@0: ExiEndpoints, sl@0: ExiSoftconnect, sl@0: ExiSelfPower, sl@0: ExiRemoteWakeup, sl@0: ExiHighSpeed, sl@0: ExiFeatures, sl@0: ExiMaxPower, sl@0: ExiEpStall, sl@0: ExiSpec, sl@0: ExiVID, sl@0: ExiPID, sl@0: ExiRelease, sl@0: ExiManufacturer, sl@0: ExiProduct, sl@0: ExiSerialNumber, sl@0: ExiOTG, sl@0: ExiInterface, // xmlKeys index for Interface sl@0: ExiSetting, sl@0: ExiClass, sl@0: ExiSubclass, sl@0: ExiProtocol, sl@0: ExiDescriptor, sl@0: ExiBandwidthIn, sl@0: ExiBandwidthOut, sl@0: ExiEndpoint, // xmlKeys index for Endpoint sl@0: ExiSize, sl@0: ExiInterval, sl@0: ExiHSInterval, sl@0: ExiHSTransactions, sl@0: ExiDMA, sl@0: ExiDoubleBuff, sl@0: ExiExtra, sl@0: ExiBufferSize, sl@0: ExiReadSize, sl@0: ExiLAST sl@0: }; sl@0: sl@0: // This array provides the index into xmlKeys for each level of xml key sl@0: // the first index for level n being defined by xmlLevels[n] sl@0: // and the last index for level n being defined by xmlLevels[n+1] - 1 sl@0: // this means this must have two more entries than the number of nesting levels sl@0: // and the last entry must be the size of xmlKeys sl@0: static const TUint8 xmlLevels[] = sl@0: { sl@0: ExiLdd,ExiLdd+1,ExiSetting+1,ExiEndpoint+1,ExiLAST sl@0: }; sl@0: sl@0: LDDConfig::LDDConfig (TPtrC aName) sl@0: { sl@0: iPtrNext = NULL; sl@0: iIFPtr = NULL; sl@0: iName = aName; sl@0: iSoftConnect = ETrue; sl@0: iSelfPower = ETrue; sl@0: iRemoteWakeup = ETrue; sl@0: iHighSpeed = ETrue; sl@0: iEPStall = ETrue; sl@0: iNumEndpoints = 15; sl@0: iNumChannels = 0; sl@0: iFeatures = 1; sl@0: iMaxPower = 50; sl@0: iSpec = 0x0200; sl@0: iVid = 0x0E22; sl@0: iPid = 0x1111; sl@0: iRelease = 0x0305; sl@0: iManufacturer = NULL; sl@0: iProduct = NULL; sl@0: iSerialNumber = NULL; sl@0: iOtg_A = ETrue; sl@0: iOtg_altA = ETrue; sl@0: iOtg_altB = ETrue; sl@0: }; sl@0: sl@0: IFConfig::IFConfig(TUint8 aNumber) sl@0: { sl@0: iPtrNext = NULL; sl@0: iNumber = aNumber; sl@0: iAlternateSetting = EFalse; sl@0: #ifdef USB_SC sl@0: iInfoPtr = new TUsbcScInterfaceInfo(0xFF,0xFF,0xFF); sl@0: #else sl@0: iInfoPtr = new TUsbcInterfaceInfo(0xFF,0xFF,0xFF); sl@0: iBandwidthIn = EUsbcBandwidthINDefault; sl@0: iBandwidthOut = EUsbcBandwidthOUTDefault; sl@0: #endif sl@0: } sl@0: sl@0: ConfigPtrs::ConfigPtrs (LDDConfigPtr * aLDDPtrPtr) sl@0: { sl@0: iNextLDDPtrPtr = aLDDPtrPtr; sl@0: iThisLDDPtr = * aLDDPtrPtr; sl@0: iThisIFPtr = NULL; sl@0: iNextIFPtrPtr = &iThisIFPtr; // initialised to prevent warning sl@0: } sl@0: sl@0: extern RTest test; sl@0: extern TBool gVerbose; sl@0: extern TBool gSkip; sl@0: extern TBool gStopOnFail; sl@0: extern TInt gSoakCount; sl@0: sl@0: bool ProcessConfigFile (RFile aConfigFile,CConsoleBase* iConsole, LDDConfigPtr * LDDPtrPtr) sl@0: { sl@0: TUSB_PRINT ("Processing Configuration File"); sl@0: sl@0: TBuf8<100> configBuf; sl@0: TBuf<101> stringBuf; sl@0: bool done = false; sl@0: bool error = false; sl@0: TInt rStatus; sl@0: XMLState state = EEmpty; sl@0: TChar nextChar(' '); sl@0: TChar lastChar(' '); sl@0: TBuf<50> keyString; sl@0: TBuf<50> endkeyString; sl@0: TBuf<50> attributeString; sl@0: TBuf<50> valueString; sl@0: TInt level = -1; sl@0: TInt levelKeys[KMaxXMLNesting+1]; sl@0: sl@0: * LDDPtrPtr = NULL; sl@0: ConfigPtrsPtr cpPtr = new ConfigPtrs (LDDPtrPtr); sl@0: sl@0: while (!done && !error) sl@0: { sl@0: rStatus = aConfigFile.Read((TDes8&)configBuf); sl@0: if (rStatus != KErrNone) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1("Config file error %d", rStatus); sl@0: } sl@0: else sl@0: { sl@0: if (configBuf.Length() == 0) sl@0: { sl@0: done = true; sl@0: } sl@0: else sl@0: { sl@0: stringBuf.Copy(configBuf); sl@0: for (TInt i = 0; i < stringBuf.Length() && !error; i++) sl@0: { sl@0: lastChar = nextChar; sl@0: nextChar = stringBuf[i]; sl@0: if (((nextChar == '<') && !((state == EEmpty) || (state == EValue))) || sl@0: ((nextChar == '>') && ((state == EEmpty) || (state == EValue))) || sl@0: ((nextChar == '/') && (lastChar != '<'))) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT2 ("Config File Syntax Error at index %d of %s",i,stringBuf.PtrZ()); sl@0: } sl@0: switch (state) sl@0: { sl@0: case EEmpty: sl@0: if (nextChar == '<') sl@0: { sl@0: state = EStartKey; sl@0: } sl@0: else sl@0: if (!nextChar.IsSpace()) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT2 ("Config File Syntax Error at index %d of %s",i,stringBuf.PtrZ()); sl@0: } sl@0: break; sl@0: sl@0: case EStartKey: sl@0: if (nextChar == '/') sl@0: { sl@0: state = EEndKey; sl@0: endkeyString.SetLength(0); sl@0: } sl@0: else sl@0: { sl@0: if (nextChar == '>') sl@0: { sl@0: level++; sl@0: if (level > KMaxXMLNesting) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1 ("Config File Too Many levels %s",stringBuf.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: levelKeys[level] = CheckXmlKey (keyString,level); sl@0: if (levelKeys[level] < 0) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1 ("Invalid XML key %s",keyString.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: if (CheckAttribute(iConsole,cpPtr,levelKeys[level],attributeString)) sl@0: { sl@0: state = EValue; sl@0: TUSB_VERBOSE_PRINT2 ("Start key: %s level %d",keyString.PtrZ(),level); sl@0: } sl@0: else sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1 ("No attribute for XML key %s",keyString.PtrZ()); sl@0: } sl@0: } sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (lastChar == '<') sl@0: { sl@0: keyString.SetLength(0); sl@0: valueString.SetLength(0); sl@0: attributeString.SetLength(0); sl@0: if (nextChar.IsSpace()) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT2 ("Config File Syntax Error at index %d of %s",i,stringBuf.PtrZ()); sl@0: } sl@0: } sl@0: if (nextChar.IsSpace()) sl@0: { sl@0: state = EAttribute; sl@0: } sl@0: else sl@0: { sl@0: keyString.Append(nextChar); sl@0: } sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case EEndKey: sl@0: if (nextChar == '>') sl@0: { sl@0: if (levelKeys[level] != CheckXmlKey (endkeyString,level)) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1 ("Invalid XML end key %s",endkeyString.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: if (CheckValue(iConsole,cpPtr,levelKeys[level],valueString)) sl@0: { sl@0: state = EEmpty; sl@0: TUSB_VERBOSE_PRINT2 ("End Key: %s value %s",endkeyString.PtrZ(),valueString.PtrZ()); sl@0: level--; sl@0: valueString.SetLength(0); sl@0: } sl@0: else sl@0: { sl@0: error = true; sl@0: TUSB_PRINT2 ("Incorrect value string %s for XML key %s",valueString.PtrZ(),endkeyString.PtrZ()); sl@0: } sl@0: } sl@0: } sl@0: if (nextChar.IsSpace()) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT2 ("Config File Syntax Error at index %d of %s",i,stringBuf.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: endkeyString.Append(nextChar); sl@0: } sl@0: break; sl@0: sl@0: case EAttribute: sl@0: if (nextChar == '>') sl@0: { sl@0: level++; sl@0: if (level > KMaxXMLNesting) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1 ("Config File Too Many levels %s",stringBuf.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: levelKeys[level] = CheckXmlKey (keyString,level); sl@0: if (levelKeys[level] < 0) sl@0: { sl@0: error = true; sl@0: TUSB_PRINT1 ("Invalid XML key %s",keyString.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: if (CheckAttribute(iConsole,cpPtr,levelKeys[level],attributeString)) sl@0: { sl@0: state = EValue; sl@0: TUSB_VERBOSE_PRINT3 ("Start key: %s level %d attribute %s",keyString.PtrZ(),level,attributeString.PtrZ()); sl@0: } sl@0: else sl@0: { sl@0: error = true; sl@0: TUSB_PRINT2 ("Incorrect attribute %s for XML key %s",attributeString.PtrZ(),keyString.PtrZ()); sl@0: } sl@0: } sl@0: } sl@0: } sl@0: else sl@0: { sl@0: attributeString.Append(nextChar); sl@0: } sl@0: break; sl@0: sl@0: case EValue: sl@0: if (nextChar == '<') sl@0: { sl@0: state = EStartKey; sl@0: } sl@0: else sl@0: { sl@0: // Don't add any leading spaces sl@0: if (!nextChar.IsSpace() || valueString.Length() != 0) sl@0: { sl@0: valueString.Append(nextChar); sl@0: } sl@0: } sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: delete cpPtr; sl@0: sl@0: return !error; sl@0: } sl@0: sl@0: sl@0: sl@0: TBool CheckAttribute (CConsoleBase* iConsole, ConfigPtrsPtr cpPtr,TInt aKeyIndex, TPtrC aDes) sl@0: { sl@0: TBool retValue = ETrue; sl@0: TBuf<50> attrib = aDes; sl@0: TInt typePos; sl@0: TInt dirPos; sl@0: TInt typeLen; sl@0: TInt dirLen; sl@0: TUint epType = 0; sl@0: TUint epDir = 0; sl@0: TUint ifNumber = 0; sl@0: sl@0: _LIT (KQuote,"\""); sl@0: sl@0: switch (aKeyIndex) sl@0: { sl@0: // level 0 index LDD sl@0: case ExiLdd : sl@0: if (attrib.Find(KAttributeName) == 0) sl@0: { sl@0: attrib.Delete(0,((TDesC&)KAttributeName).Length()); sl@0: if (attrib[0] == ((TDesC&)KQuote)[0] && attrib[attrib.Length()-1] == ((TDesC&)KQuote)[0]) sl@0: { sl@0: TUSB_VERBOSE_PRINT1 ("LDD with attribute name %s",attrib.PtrZ()); sl@0: cpPtr->iThisLDDPtr = new LDDConfig (attrib.MidTPtr(1,attrib.Length()-2)); sl@0: *cpPtr->iNextLDDPtrPtr = cpPtr->iThisLDDPtr; sl@0: cpPtr->iNextLDDPtrPtr = &(cpPtr->iThisLDDPtr->iPtrNext); sl@0: cpPtr->iNextIFPtrPtr = &(cpPtr->iThisLDDPtr->iIFPtr); sl@0: } sl@0: else sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: break; sl@0: sl@0: // level 1 index INTERFACE sl@0: case ExiInterface : sl@0: if (attrib.Find(KAttributeNumber) == 0) sl@0: { sl@0: attrib.Delete(0,((TDesC&)KAttributeNumber).Length()); sl@0: if (attrib[0] == ((TDesC&)KQuote)[0] && attrib[attrib.Length()-1] == ((TDesC&)KQuote)[0]) sl@0: { sl@0: if (TDesToTUint(attrib.MidTPtr(1,attrib.Length()-2), &ifNumber)) sl@0: { sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: { sl@0: TUSB_PRINT ("No LDD container for interface"); sl@0: retValue = EFalse; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: TUSB_PRINT2 ("Number conversion error %s %d",attrib.PtrZ(),ifNumber); sl@0: retValue = EFalse; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: TUSB_PRINT1 ("Attribute number not in \"\" %s",attrib.PtrZ()); sl@0: retValue = EFalse; sl@0: } sl@0: } sl@0: if (retValue) sl@0: { sl@0: TUSB_VERBOSE_PRINT1 ("Interface number %d",ifNumber); sl@0: cpPtr->iThisIFPtr = new IFConfig ((TUint8)ifNumber); sl@0: * cpPtr->iNextIFPtrPtr = cpPtr->iThisIFPtr; sl@0: cpPtr->iNextIFPtrPtr = &cpPtr->iThisIFPtr->iPtrNext; sl@0: cpPtr->iThisLDDPtr->iNumChannels++; sl@0: } sl@0: break; sl@0: sl@0: sl@0: // level 1 index Setting sl@0: case ExiSetting : sl@0: if (aDes.Length() != 0) sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: { sl@0: TUSB_PRINT ("No LDD container for interface"); sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: TUSB_VERBOSE_PRINT ("Alternate Interface Setting"); sl@0: cpPtr->iThisIFPtr = new IFConfig (0); sl@0: * cpPtr->iNextIFPtrPtr = cpPtr->iThisIFPtr; sl@0: cpPtr->iNextIFPtrPtr = &cpPtr->iThisIFPtr->iPtrNext; sl@0: cpPtr->iThisIFPtr->iAlternateSetting = ETrue; sl@0: } sl@0: } sl@0: break; sl@0: sl@0: // level 2 index ENDPOINT sl@0: case ExiEndpoint : sl@0: typePos = attrib.Find(KAttributeType); sl@0: dirPos = attrib.Find(KAttributeDirection); sl@0: sl@0: if (typePos == KErrNotFound || dirPos == KErrNotFound) sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: if (typePos < dirPos) sl@0: { sl@0: typePos += ((TDesC&)KAttributeType).Length(); sl@0: typeLen = dirPos - typePos; sl@0: dirPos += ((TDesC&)KAttributeDirection).Length(); sl@0: dirLen = attrib.Length() - dirPos; sl@0: } sl@0: else sl@0: { sl@0: dirPos += ((TDesC&)KAttributeDirection).Length(); sl@0: dirLen = typePos - dirPos; sl@0: typePos += ((TDesC&)KAttributeType).Length(); sl@0: typeLen = attrib.Length() - typePos; sl@0: } sl@0: TPtr attribPtr = attrib.MidTPtr(typePos,typeLen); sl@0: attribPtr.UpperCase(); sl@0: attribPtr.TrimAll(); sl@0: if (attribPtr == KEpBulk) sl@0: { sl@0: epType = KUsbEpTypeBulk; sl@0: } sl@0: else sl@0: { sl@0: if (attribPtr == KEpInterrupt) sl@0: { sl@0: epType = KUsbEpTypeInterrupt; sl@0: } sl@0: else sl@0: { sl@0: if (attribPtr == KEpIsochronous) sl@0: { sl@0: epType = KUsbEpTypeIsochronous; sl@0: } sl@0: else sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: } sl@0: } sl@0: attribPtr = attrib.MidTPtr(dirPos,dirLen); sl@0: attribPtr.UpperCase(); sl@0: attribPtr.TrimAll(); sl@0: if (attribPtr == KEpIn) sl@0: { sl@0: epDir = KUsbEpDirIn; sl@0: } sl@0: else sl@0: { sl@0: if (attribPtr == KEpOut) sl@0: { sl@0: epDir = KUsbEpDirOut; sl@0: } sl@0: else sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: } sl@0: if (retValue) sl@0: { sl@0: if (cpPtr->iThisIFPtr == NULL) sl@0: { sl@0: TUSB_PRINT ("No Interface container for Endpoint"); sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: TUint epIndex = cpPtr->iThisIFPtr->iInfoPtr->iTotalEndpointsUsed; sl@0: TUSB_VERBOSE_PRINT2 ("Endpoint with type %d %d",epType,epDir); sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iType = epType; sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iDir = epDir; sl@0: #ifdef USB_SC sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iBufferSize = 65536; sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iReadSize = 4096; sl@0: #endif sl@0: cpPtr->iThisIFPtr->iEpDMA[epIndex] = EFalse; sl@0: cpPtr->iThisIFPtr->iEpDoubleBuff[epIndex] = EFalse; sl@0: cpPtr->iThisIFPtr->iInfoPtr->iTotalEndpointsUsed++; sl@0: } sl@0: } sl@0: } sl@0: break; sl@0: sl@0: default : sl@0: if (aDes.Length() != 0) sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: } sl@0: sl@0: return retValue; sl@0: } sl@0: sl@0: TBool CheckValue (CConsoleBase* iConsole, ConfigPtrsPtr cpPtr, TInt aKeyIndex, TPtrC16 aDes) sl@0: { sl@0: TBool retValue = ETrue; sl@0: TBool boolValue; sl@0: TUint uintValue; sl@0: TInt epIndex = -1; sl@0: sl@0: if (cpPtr->iThisIFPtr != NULL) sl@0: { sl@0: epIndex = cpPtr->iThisIFPtr->iInfoPtr->iTotalEndpointsUsed -1; sl@0: } sl@0: sl@0: TUSB_VERBOSE_PRINT2 ("CheckValue keyIndex %d %s",aKeyIndex,aDes.Ptr()); sl@0: switch (aKeyIndex) sl@0: { sl@0: case ExiLdd: // xmlKeys index for LDD sl@0: case ExiInterface: // xmlKeys index for Interface sl@0: case ExiEndpoint: // xmlKeys index for Endpoint sl@0: if (aDes.Length() != 0) sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: break; sl@0: sl@0: case ExiEndpoints: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (uintValue == 0 || uintValue > 128) sl@0: { sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: cpPtr->iThisLDDPtr->iNumEndpoints = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiSoftconnect: sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iSoftConnect = boolValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiSelfPower: sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iSelfPower = boolValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiRemoteWakeup: sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iRemoteWakeup = boolValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiHighSpeed: sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iHighSpeed = boolValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiFeatures: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iFeatures = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiMaxPower: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisLDDPtr == NULL || uintValue > 50) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iMaxPower = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiEpStall: sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iEPStall = boolValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiSpec: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iSpec = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiVID: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iVid = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiPID: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iPid = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiRelease: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisLDDPtr == NULL) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisLDDPtr->iRelease = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiManufacturer: sl@0: cpPtr->iThisLDDPtr->iManufacturer = aDes.Alloc(); sl@0: break; sl@0: sl@0: case ExiProduct: sl@0: cpPtr->iThisLDDPtr->iProduct = aDes.Alloc(); sl@0: break; sl@0: sl@0: case ExiSerialNumber: sl@0: cpPtr->iThisLDDPtr->iSerialNumber = aDes.Alloc(); sl@0: break; sl@0: sl@0: case ExiOTG: sl@0: break; sl@0: sl@0: case ExiClass: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisIFPtr == NULL || uintValue > 0xFF) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iClass.iClassNum = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiSubclass: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisIFPtr == NULL || uintValue > 0xFF) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iClass.iSubClassNum = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiProtocol: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisIFPtr == NULL || uintValue > 0xFF) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iClass.iProtocolNum = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiDescriptor: sl@0: cpPtr->iThisIFPtr->iInfoPtr->iString = aDes.Alloc(); sl@0: break; sl@0: sl@0: case ExiBandwidthIn: sl@0: #ifdef USB_SC sl@0: retValue = EFalse; sl@0: #else sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisIFPtr == NULL || uintValue > 3) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: switch (uintValue) sl@0: { sl@0: case 0: sl@0: cpPtr->iThisIFPtr->iBandwidthIn = EUsbcBandwidthINDefault; sl@0: break; sl@0: case 1: sl@0: cpPtr->iThisIFPtr->iBandwidthIn = EUsbcBandwidthINPlus1; sl@0: break; sl@0: case 2: sl@0: cpPtr->iThisIFPtr->iBandwidthIn = EUsbcBandwidthINPlus2; sl@0: break; sl@0: case 3: sl@0: cpPtr->iThisIFPtr->iBandwidthIn = EUsbcBandwidthINMaximum; sl@0: break; sl@0: } sl@0: } sl@0: #endif sl@0: break; sl@0: sl@0: case ExiBandwidthOut: sl@0: #ifdef USB_SC sl@0: retValue = EFalse; sl@0: #else sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (cpPtr->iThisIFPtr == NULL || uintValue > 3) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: switch (uintValue) sl@0: { sl@0: case 0: sl@0: cpPtr->iThisIFPtr->iBandwidthOut = EUsbcBandwidthOUTDefault; sl@0: break; sl@0: case 1: sl@0: cpPtr->iThisIFPtr->iBandwidthOut = EUsbcBandwidthOUTPlus1; sl@0: break; sl@0: case 2: sl@0: cpPtr->iThisIFPtr->iBandwidthOut = EUsbcBandwidthOUTPlus2; sl@0: break; sl@0: case 3: sl@0: cpPtr->iThisIFPtr->iBandwidthOut = EUsbcBandwidthOUTMaximum; sl@0: break; sl@0: } sl@0: } sl@0: #endif sl@0: break; sl@0: sl@0: case ExiSize: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: TBool defaultIF = cpPtr->iThisLDDPtr->iIFPtr == cpPtr->iThisIFPtr; sl@0: switch (cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iType) sl@0: { sl@0: case KUsbEpTypeBulk : sl@0: if (cpPtr->iThisLDDPtr->iHighSpeed) sl@0: { sl@0: if (uintValue != 512) sl@0: retValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: if (!(uintValue == 8 || uintValue == 16 || uintValue == 32 || uintValue == 64)) sl@0: retValue = EFalse; sl@0: } sl@0: break; sl@0: sl@0: case KUsbEpTypeInterrupt : sl@0: if ((defaultIF && uintValue > 64) || sl@0: (!cpPtr->iThisLDDPtr->iHighSpeed && uintValue > 64) || sl@0: (!defaultIF && cpPtr->iThisLDDPtr->iHighSpeed && uintValue > 1024)) sl@0: retValue = EFalse; sl@0: break; sl@0: sl@0: case KUsbEpTypeIsochronous : sl@0: if ((defaultIF && uintValue > 0) || sl@0: (!defaultIF && !cpPtr->iThisLDDPtr->iHighSpeed && uintValue > 1023) || sl@0: (!defaultIF && cpPtr->iThisLDDPtr->iHighSpeed && uintValue > 1024)) sl@0: retValue = EFalse; sl@0: break; sl@0: } sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iSize = uintValue; sl@0: } sl@0: } sl@0: sl@0: break; sl@0: sl@0: case ExiInterval: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: switch (cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iType) sl@0: { sl@0: case KUsbEpTypeBulk : sl@0: retValue = EFalse; sl@0: break; sl@0: sl@0: case KUsbEpTypeInterrupt : sl@0: if (uintValue < 1 || uintValue > 255) sl@0: retValue = EFalse; sl@0: break; sl@0: sl@0: case KUsbEpTypeIsochronous : sl@0: if (uintValue < 1 || uintValue > 16) sl@0: retValue = EFalse; sl@0: break; sl@0: } sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iInterval = uintValue; sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case ExiHSInterval: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0 || !cpPtr->iThisLDDPtr->iHighSpeed) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: switch (cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iType) sl@0: { sl@0: case KUsbEpTypeBulk : sl@0: if (uintValue > 255) sl@0: retValue = EFalse; sl@0: break; sl@0: sl@0: case KUsbEpTypeInterrupt : sl@0: if (uintValue < 1 || uintValue > 16) sl@0: retValue = EFalse; sl@0: break; sl@0: sl@0: case KUsbEpTypeIsochronous : sl@0: if (uintValue < 1 || uintValue > 16) sl@0: retValue = EFalse; sl@0: break; sl@0: } sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iInterval_Hs = uintValue; sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case ExiHSTransactions: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0 || !cpPtr->iThisLDDPtr->iHighSpeed) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: if (uintValue > 2) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iTransactions = uintValue; sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case ExiDMA: sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (epIndex < 0) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iEpDMA[epIndex] = boolValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiDoubleBuff: sl@0: #ifdef USB_SC sl@0: retValue = EFalse; sl@0: #else sl@0: retValue = TDesToBool (aDes, &boolValue); sl@0: if (epIndex < 0) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iEpDoubleBuff[epIndex] = boolValue; sl@0: } sl@0: #endif sl@0: break; sl@0: sl@0: case ExiExtra: sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iExtra = uintValue; sl@0: } sl@0: break; sl@0: sl@0: case ExiBufferSize: sl@0: #ifdef USB_SC sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0 || uintValue < 4096) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iBufferSize = uintValue; sl@0: } sl@0: #else sl@0: retValue = EFalse; sl@0: #endif sl@0: break; sl@0: sl@0: case ExiReadSize: sl@0: #ifdef USB_SC sl@0: retValue = TDesToTUint (aDes, &uintValue); sl@0: if (epIndex < 0 || uintValue < 1024) sl@0: retValue = EFalse; sl@0: if (retValue) sl@0: { sl@0: cpPtr->iThisIFPtr->iInfoPtr->iEndpointData[epIndex].iReadSize = uintValue; sl@0: } sl@0: #else sl@0: retValue = EFalse; sl@0: #endif sl@0: break; sl@0: } sl@0: sl@0: return retValue; sl@0: } sl@0: sl@0: TInt CheckXmlKey (TPtrC aKey,TInt aLevel) sl@0: { sl@0: TInt keyIndex = -1; sl@0: sl@0: for (TInt i = xmlLevels[aLevel]; i < xmlLevels[aLevel+1]; i++) sl@0: { sl@0: if (aKey == xmlKeys[i]) sl@0: { sl@0: keyIndex = i; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: return keyIndex; sl@0: } sl@0: sl@0: TBool TDesToTUint (TPtrC aDes, TUint * aValue) sl@0: { sl@0: _LIT (KHexPrefix,"0x"); sl@0: TBuf<50> numDes = aDes; sl@0: TBool hexBase = EFalse; sl@0: TBool conversionOK = ETrue; sl@0: TUint8 desIndex = 0; sl@0: * aValue = 0; sl@0: sl@0: if (numDes.LeftTPtr(((TDesC&)KHexPrefix).Length()) == KHexPrefix) sl@0: { sl@0: hexBase = ETrue; sl@0: desIndex = ((TDesC&)KHexPrefix).Length(); sl@0: } sl@0: sl@0: while (desIndex < numDes.Length() && conversionOK) sl@0: { sl@0: if (hexBase) sl@0: { sl@0: TUint maxValue = 0xFFFFFFFF >> 4; sl@0: if (((TChar)numDes[desIndex]).IsHexDigit() && * aValue <= maxValue) sl@0: { sl@0: * aValue <<= 4; sl@0: * aValue += ((TChar)numDes[desIndex]).IsDigit() ? numDes[desIndex] - '0' : ((TChar)numDes[desIndex]).GetUpperCase() - 'A' + 10; sl@0: } sl@0: else sl@0: { sl@0: conversionOK = EFalse; sl@0: * aValue = 111; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: TUint maxValue = 0xFFFFFFFF / 10; sl@0: if (((TChar)numDes[desIndex]).IsDigit()) sl@0: { sl@0: TUint digit = numDes[desIndex] - '0'; sl@0: if ((* aValue < maxValue) || (* aValue == maxValue && digit <= 5)) sl@0: { sl@0: * aValue *= 10; sl@0: * aValue += digit; sl@0: } sl@0: else sl@0: { sl@0: conversionOK = EFalse; sl@0: * aValue = 222; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: conversionOK = EFalse; sl@0: * aValue = 333; sl@0: } sl@0: sl@0: } sl@0: desIndex++; sl@0: } sl@0: sl@0: return conversionOK; sl@0: } sl@0: sl@0: TBool TDesToBool (TPtrC aDes, TBool * aValue) sl@0: { sl@0: _LIT (KBoolY,"Y"); sl@0: _LIT (KBoolN,"N"); sl@0: TBool conversionOK = ETrue; sl@0: TBuf<50> boolDes = aDes; sl@0: sl@0: boolDes.TrimAll(); sl@0: boolDes.UpperCase(); sl@0: if (boolDes == KBoolY) sl@0: { sl@0: * aValue = ETrue; sl@0: } sl@0: else sl@0: { sl@0: if (boolDes == KBoolN) sl@0: { sl@0: * aValue = EFalse; sl@0: } sl@0: else sl@0: { sl@0: conversionOK = EFalse; sl@0: } sl@0: } sl@0: sl@0: return conversionOK; sl@0: }