diff -r 4ddb65515edd -r f3a1ae528dee usbmgmt/usbmgr/usbman/server/SRC/CUsbDevice.cpp --- a/usbmgmt/usbmgr/usbman/server/SRC/CUsbDevice.cpp Fri Jun 25 13:07:44 2010 +0800 +++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbDevice.cpp Fri Jun 25 13:19:39 2010 +0800 @@ -1,5 +1,5 @@ /* -* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -21,33 +21,32 @@ @file */ -#include "CUsbDevice.h" -#include "CUsbDeviceStateWatcher.h" #include -#include "MUsbDeviceNotify.h" -#include "UsbSettings.h" -#include "CUsbServer.h" #include #include -#include "UsbUtils.h" #include - -#ifdef USE_DUMMY_CLASS_CONTROLLER -#include "CUsbDummyClassController.h" -#endif - #include #include #include #include #include -#include #include #include #include #include #include //Publish & Subscribe header +#ifdef USE_DUMMY_CLASS_CONTROLLER +#include "CUsbDummyClassController.h" +#endif +#include "MUsbDeviceNotify.h" +#include "UsbSettings.h" +#include "CUsbServer.h" +#include "UsbUtils.h" +#include "CUsbDevice.h" +#include "CUsbDeviceStateWatcher.h" #include "CPersonality.h" +#include "usbmancenrepmanager.h" +#include "usbmanprivatecrkeys.h" _LIT(KUsbLDDName, "eusbc"); //Name used in call to User::LoadLogicalDevice _LIT(KUsbLDDFreeName, "Usbc"); //Name used in call to User::FreeLogicalDevice @@ -108,6 +107,11 @@ iSupportedClassUids.Close(); iExtensionPlugins.ResetAndDestroy(); + + delete iCenRepManager; + + delete iDeviceConfiguration.iManufacturerName; + delete iDeviceConfiguration.iProductName; if(iEcom) iEcom->Close(); @@ -165,8 +169,11 @@ iEcom = &(REComSession::OpenL()); iUsbClassControllerIterator = new(ELeave) CUsbClassControllerIterator(iSupportedClasses); + iCenRepManager = CUsbManCenRepManager::NewL(*this); -#ifndef __OVER_DUMMYUSBDI__ + iDeviceConfiguration.iManufacturerName = HBufC::NewL(KUsbStringDescStringMaxSize); + iDeviceConfiguration.iProductName = HBufC::NewL(KUsbStringDescStringMaxSize); +#ifndef __OVER_DUMMYUSBDI__ #ifndef __WINS__ LOGTEXT(_L8("About to load LDD")); TInt err = User::LoadLogicalDevice(KUsbLDDName); @@ -787,7 +794,7 @@ LOGTEXT2(_L8("\tiMaxPacketSize is: 0x%02x"), aDeviceDescriptor.iMaxPacketSize); LOGTEXT2(_L8("\tVendorId is: 0x%04x"), aDeviceDescriptor.iIdVendor); - LOGTEXT2(_L8("\tProductId is: 0x%04x"), aDeviceDescriptor.iIdProduct); + LOGTEXT2(_L8("\tProductId is: 0x%04x"), aDeviceDescriptor.iProductId); LOGTEXT2(_L8("\tBcdDevice is: 0x%04x"), aDeviceDescriptor.iBcdDevice); LOGTEXT2(_L8("\tiManufacturer is: 0x%04x"), aDeviceDescriptor.iManufacturer); @@ -839,7 +846,8 @@ } else { - SetUsbDeviceSettingsL(*deviceDescriptor); + LOGTEXT(_L8("USB configuration is not read")); + LEAVEL(KErrNotFound); } #ifndef __OVER_DUMMYUSBDI__ @@ -870,140 +878,7 @@ aDeviceDescriptor.iDeviceSubClass = KUsbDefaultDeviceSubClass; aDeviceDescriptor.iDeviceProtocol = KUsbDefaultDeviceProtocol; aDeviceDescriptor.iIdVendor = KUsbDefaultVendorId; - aDeviceDescriptor.iIdProduct = KUsbDefaultProductId; - } - -void CUsbDevice::SetUsbDeviceSettingsL(CUsbDevice::TUsbDeviceDescriptor& aDeviceDescriptor) -/** - * Configure the USB device, reading in the settings from a - * resource file where possible. - * - * @param aDeviceDescriptor The device descriptor for the USB device - */ - { - LOG_FUNC - - // First, use the default values - LOGTEXT(_L8("Setting default values for the configuration")); - SetUsbDeviceSettingsDefaultsL(aDeviceDescriptor); - - // Now try to get the configuration from the resource file - RFs fs; - LEAVEIFERRORL(fs.Connect()); - CleanupClosePushL(fs); - - RResourceFile resource; - TRAPD(err, resource.OpenL(fs, KUsbManagerResource)); - LOGTEXT2(_L8("Opened resource file with error %d"), err); - - if (err != KErrNone) - { - LOGTEXT(_L8("Unable to open resource file: using default settings")); - CleanupStack::PopAndDestroy(&fs); - return; - } - - CleanupClosePushL(resource); - - resource.ConfirmSignatureL(KUsbManagerResourceVersion); - - HBufC8* id = resource.AllocReadLC(USB_CONFIG); - - // The format of the USB resource structure is: - // - // STRUCT usb_configuration - // { - // WORD vendorId = 0x0e22; - // WORD productId = 0x000b; - // WORD bcdDevice = 0x0000; - // LTEXT manufacturer = "Symbian Ltd."; - // LTEXT product = "Symbian OS"; - // } - // - // Note that the resource must be read in this order! - - TResourceReader reader; - reader.SetBuffer(id); - - aDeviceDescriptor.iIdVendor = static_cast(reader.ReadUint16()); - aDeviceDescriptor.iIdProduct = static_cast(reader.ReadUint16()); - aDeviceDescriptor.iBcdDevice = static_cast(reader.ReadUint16()); - - // Try to read device and manufacturer name from new SysUtil API - TPtrC16 sysUtilModelName; - TPtrC16 sysUtilManuName; - - // This method returns ownership. - CDeviceTypeInformation* deviceInfo = SysUtil::GetDeviceTypeInfoL(); - CleanupStack::PushL(deviceInfo); - TInt gotSysUtilModelName = deviceInfo->GetModelName(sysUtilModelName); - TInt gotSysUtilManuName = deviceInfo->GetManufacturerName(sysUtilManuName); - - TPtrC manufacturerString = reader.ReadTPtrC(); - TPtrC productString = reader.ReadTPtrC(); - - // If we succesfully read the manufacturer or device name from SysUtil API - // then set these results, otherwise use the values defined in resource file -#ifndef __OVER_DUMMYUSBDI__ -#ifndef __WINS__ - if (gotSysUtilManuName == KErrNone) - { - LEAVEIFERRORL(iLdd.SetManufacturerStringDescriptor(sysUtilManuName)); - } - else - { - LEAVEIFERRORL(iLdd.SetManufacturerStringDescriptor(manufacturerString)); - } - - if (gotSysUtilModelName == KErrNone) - { - LEAVEIFERRORL(iLdd.SetProductStringDescriptor(sysUtilModelName)); - } - else - { - LEAVEIFERRORL(iLdd.SetProductStringDescriptor(productString)); - } - -#endif -#endif // __OVER_DUMMYUSBDI__ - -#ifdef __FLOG_ACTIVE - PrintDescriptor(aDeviceDescriptor); - TBuf8 narrowString; - narrowString.Copy(manufacturerString); - LOGTEXT2(_L8("Manufacturer is: '%S'"), &narrowString); - narrowString.Copy(productString); - LOGTEXT2(_L8("Product is: '%S'"), &narrowString); -#endif // __FLOG_ACTIVE - -#ifndef __OVER_DUMMYUSBDI__ -#ifndef __WINS__ - //Read the published serial number. The key is the UID KUidUsbmanServer = 0x101FE1DB - TBuf16 serNum; - TInt r = RProperty::Get(KUidSystemCategory,0x101FE1DB,serNum); - if(r==KErrNone) - { -#ifdef __FLOG_ACTIVE - TBuf8 narrowString; - narrowString.Copy(serNum); - LOGTEXT2(_L8("Setting published SerialNumber: %S"), &narrowString); -#endif // __FLOG_ACTIVE - //USB spec doesn't give any constraints on what constitutes a valid serial number. - //As long as it is a string descriptor it is valid. - LEAVEIFERRORL(iLdd.SetSerialNumberStringDescriptor(serNum)); - } -#ifdef __FLOG_ACTIVE - else - { - LOGTEXT(_L8("SerialNumber has not been published")); - } -#endif // __FLOG_ACTIVE - -#endif -#endif // __OVER_DUMMYUSBDI__ - - - CleanupStack::PopAndDestroy(4, &fs); // deviceInfo, id, resource, fs + aDeviceDescriptor.iProductId = KUsbDefaultProductId; } void CUsbDevice::SetUsbDeviceSettingsFromPersonalityL(CUsbDevice::TUsbDeviceDescriptor& aDeviceDescriptor) @@ -1020,20 +895,19 @@ SetUsbDeviceSettingsDefaultsL(aDeviceDescriptor); // Now try to get the configuration from the current personality - const CUsbDevice::TUsbDeviceDescriptor& deviceDes = iCurrentPersonality->DeviceDescriptor(); - aDeviceDescriptor.iDeviceClass = deviceDes.iDeviceClass; - aDeviceDescriptor.iDeviceSubClass = deviceDes.iDeviceSubClass; - aDeviceDescriptor.iDeviceProtocol = deviceDes.iDeviceProtocol; - aDeviceDescriptor.iIdVendor = deviceDes.iIdVendor; - aDeviceDescriptor.iIdProduct = deviceDes.iIdProduct; - aDeviceDescriptor.iBcdDevice = deviceDes.iBcdDevice; - aDeviceDescriptor.iSerialNumber = deviceDes.iSerialNumber; - aDeviceDescriptor.iNumConfigurations = deviceDes.iNumConfigurations; + aDeviceDescriptor.iDeviceClass = iCurrentPersonality->DeviceClass(); + aDeviceDescriptor.iDeviceSubClass = iCurrentPersonality->DeviceSubClass(); + aDeviceDescriptor.iDeviceProtocol = iCurrentPersonality->DeviceProtocol(); + aDeviceDescriptor.iIdVendor = iDeviceConfiguration.iVendorId; + aDeviceDescriptor.iProductId = iCurrentPersonality->ProductId(); + aDeviceDescriptor.iBcdDevice = iCurrentPersonality->BcdDevice(); + aDeviceDescriptor.iNumConfigurations = iCurrentPersonality->NumConfigurations(); + #ifndef __OVER_DUMMYUSBDI__ #ifndef __WINS__ - LEAVEIFERRORL(iLdd.SetManufacturerStringDescriptor(*(iCurrentPersonality->Manufacturer()))); - LEAVEIFERRORL(iLdd.SetProductStringDescriptor(*(iCurrentPersonality->Product()))); + LEAVEIFERRORL(iLdd.SetManufacturerStringDescriptor(*(iDeviceConfiguration.iManufacturerName))); + LEAVEIFERRORL(iLdd.SetProductStringDescriptor(*(iDeviceConfiguration.iProductName))); //Read the published serial number. The key is the UID KUidUsbmanServer = 0x101FE1DB TBuf16 serNum; @@ -1171,15 +1045,17 @@ TInt personalityCount = iSupportedPersonalities.Count(); for (TInt i = 0; i < personalityCount; i++) { - const RArray& classUids = iSupportedPersonalities[i]->SupportedClasses(); - TInt uidCount = classUids.Count(); + const RArray& classes = iSupportedPersonalities[i]->SupportedClasses(); + TInt uidCount = classes.Count(); for (TInt j = 0; j < uidCount; j++) { TInt ccCount = iSupportedClassUids.Count(); TInt k; + LOGTEXT2(_L8("iSupportedClassUids Count = %d"),ccCount); for (k = 0; k < ccCount; k++) { - if (iSupportedClassUids[k] == classUids[j]) + LOGTEXT5(_L8("iSupportedClassUids %d %x classes %d %x"), k, iSupportedClassUids[k].iUid, j, classes[j].iClassUid.iUid); + if (iSupportedClassUids[k] == classes[j].iClassUid) { break; } @@ -1204,6 +1080,7 @@ */ void CUsbDevice::ConvertUidsL(const TDesC& aStr, RArray& aUidArray) { + LOG_FUNC // Function assumes that aUIDs is empty __ASSERT_DEBUG( aUidArray.Count() == 0, _USB_PANIC(KUsbDevicePanicCategory, EUidArrayNotEmpty) ); @@ -1228,214 +1105,36 @@ } void CUsbDevice::ReadPersonalitiesL() -/** - * Reads configured personalities from the resource file - */ - { - LOG_FUNC - iPersonalityCfged = EFalse; - // Now try to connect to file server - RFs fs; - LEAVEIFERRORL(fs.Connect()); - CleanupClosePushL(fs); - - TFileName resourceFileName; - ResourceFileNameL(resourceFileName); - RResourceFile resource; - TRAPD(err, resource.OpenL(fs, resourceFileName)); - LOGTEXT2(_L8("Opened resource file with error %d"), err); - - if (err != KErrNone) - { - LOGTEXT(_L8("Unable to open resource file")); - CleanupStack::PopAndDestroy(&fs); - return; - } - - CleanupClosePushL(resource); - - TInt resourceVersion = resource.SignatureL(); - LOGTEXT2(_L8("Resource file signature is %d"), resourceVersion); - // Check for the version is valid(EUsbManagerResourceVersionOne, EUsbManagerResourceVersionTwo - // or EUsbManagerResourceVersionThree). - if(resourceVersion > EUsbManagerResourceVersionThree) - { - LOGTEXT2(_L8("Version of resource file is valid (>%d)"), EUsbManagerResourceVersionThree); - User::LeaveIfError(KErrNotSupported); - } - - resource.ConfirmSignatureL(resourceVersion); - - HBufC8* personalityBuf = 0; - TRAPD(ret, personalityBuf = resource.AllocReadL(DEVICE_PERSONALITIES)); - // If personalities resource is not found, swallow the error and return - // as no specified personalities is a valid configuration - if (ret == KErrNotFound) - { - LOGTEXT(_L8("Personalities are not configured")); - CleanupStack::PopAndDestroy(2, &fs); - return; - } - // Otherwise leave noisily if the AllocRead fails - LEAVEIFERRORL(ret); - CleanupStack::PushL(personalityBuf); - - // The format of the USB resource structure is: - // - // STRUCT PERSONALITY - // { - // WORD bcdDeviceClass; - // WORD bcdDeviceSubClass; - // WORD protocol; - // WORD numConfigurations; - // WORD vendorId; - // WORD productId; - // WORD bcdDevice; - // LTEXT manufacturer; - // LTEXT product; - // WORD id; // personality id - // LTEXT class_uids; - // LTEXT description; // personality description - // LTEXT detailedDescription; //detailed description. This is in version 2 - // LONG Property; - // } - // - // Note that the resource must be read in this order! - - TResourceReader reader; - reader.SetBuffer(personalityBuf); - - TUint16 personalityCount = static_cast(reader.ReadUint16()); - - // Read the manufacturer and device name (product) here from SysUtil class - TPtrC16 sysUtilModelName; - TPtrC16 sysUtilManuName; - - // This method returns ownership. - CDeviceTypeInformation* deviceInfo = SysUtil::GetDeviceTypeInfoL(); - CleanupStack::PushL(deviceInfo); - TInt gotSysUtilModelName = deviceInfo->GetModelName(sysUtilModelName); - TInt gotSysUtilManuName = deviceInfo->GetManufacturerName(sysUtilManuName); - - for (TInt idx = 0; idx < personalityCount; idx++) - { - // read a personality - TUint8 bDeviceClass = static_cast(reader.ReadUint8()); - TUint8 bDeviceSubClass = static_cast(reader.ReadUint8()); - TUint8 protocol = static_cast(reader.ReadUint8()); - TUint8 numConfigurations = static_cast(reader.ReadUint8()); - TUint16 vendorId = static_cast(reader.ReadUint16()); - TUint16 productId = static_cast(reader.ReadUint16()); - TUint16 bcdDevice = static_cast(reader.ReadUint16()); - TPtrC manufacturer = reader.ReadTPtrC(); - TPtrC product = reader.ReadTPtrC(); - TUint16 id = static_cast(reader.ReadUint16()); - TPtrC uidsStr = reader.ReadTPtrC(); - TPtrC description = reader.ReadTPtrC(); - - RArray uids; - CleanupClosePushL(uids); - ConvertUidsL(uidsStr, uids); - // creates a CPersonality object - CPersonality* personality = CPersonality::NewL(); - CleanupStack::PushL(personality); - - personality->SetVersion(resourceVersion); - - // populates personality object - personality->SetId(id); - - for (TInt uidIdx = 0; uidIdx < uids.Count(); uidIdx++) - { - LEAVEIFERRORL(personality->AddSupportedClasses(TUid::Uid(uids[uidIdx]))); - } - - // gets a handle to iDeviceDescriptor of personality - CUsbDevice::TUsbDeviceDescriptor& dvceDes = personality->DeviceDescriptor(); - if (gotSysUtilManuName == KErrNone) - { - personality->SetManufacturer(&sysUtilManuName); - } - else - { - personality->SetManufacturer(&manufacturer); - } - - if (gotSysUtilModelName == KErrNone) - { - personality->SetProduct(&sysUtilModelName); - } - else - { - personality->SetProduct(&product); - } - - personality->SetDescription(&description); - dvceDes.iDeviceClass = bDeviceClass; - dvceDes.iDeviceSubClass = bDeviceSubClass; - dvceDes.iDeviceProtocol = protocol; - dvceDes.iIdVendor = vendorId; - dvceDes.iIdProduct= productId; - dvceDes.iBcdDevice = bcdDevice; - dvceDes.iNumConfigurations = numConfigurations; - - //detailedDescription is only supported after EUsbManagerResourceVersionTwo - if(resourceVersion >= EUsbManagerResourceVersionTwo) - { - TPtrC detailedDescription = reader.ReadTPtrC(); - personality->SetDetailedDescription(&detailedDescription); -#ifdef __FLOG_ACTIVE - TBuf8 narrowLongBuf; - narrowLongBuf.Copy(detailedDescription); - LOGTEXT2(_L8("detailed description = '%S'"), &narrowLongBuf); -#endif // __FLOG_ACTIVE - } - - //Property is only supported after EUsbManagerResourceVersionThree - if(resourceVersion >= EUsbManagerResourceVersionThree) - { - TUint32 property = static_cast(reader.ReadUint32()); - personality->SetProperty(property); -#ifdef __FLOG_ACTIVE - LOGTEXT2(_L8("property = %d\n"), property); -#endif // __FLOG_ACTIVE - } - - // Append personality to iSupportedPersonalities - iSupportedPersonalities.AppendL(personality); - // Now pop off personality - CleanupStack::Pop(personality); -#ifdef __FLOG_ACTIVE - // Debugging - LOGTEXT2(_L8("personalityCount = %d\n"), personalityCount); - LOGTEXT2(_L8("bDeviceClass = %d\n"), bDeviceClass); - LOGTEXT2(_L8("bDeviceSubClass = %d\n"), bDeviceSubClass); - LOGTEXT2(_L8("protocol = %d\n"), protocol); - LOGTEXT2(_L8("numConfigurations = %d\n"), numConfigurations); - LOGTEXT2(_L8("vendorId = %d\n"), vendorId); - LOGTEXT2(_L8("productId = %d\n"), productId); - LOGTEXT2(_L8("bcdDevice = %d\n"), bcdDevice); - TBuf8 narrowBuf; - narrowBuf.Copy(manufacturer); - LOGTEXT2(_L8("manufacturer = '%S'"), &narrowBuf); - narrowBuf.Copy(product); - LOGTEXT2(_L8("product = '%S'"), &narrowBuf); - LOGTEXT2(_L8("id = %d\n"), id); - LOGTEXT(_L8("ClassUids{")); - for (TInt k = 0; k < uids.Count(); k++) - { - LOGTEXT2(_L8("%d"), uids[k]); - } - LOGTEXT(_L8("}")); - narrowBuf.Copy(description); - LOGTEXT2(_L8("description = '%S'"), &narrowBuf); -#endif // __FLOG_ACTIVE - CleanupStack::PopAndDestroy(&uids); // close uid array - } - - CleanupStack::PopAndDestroy(4, &fs); // deviceInfo, personalityBuf, resource, fs - iPersonalityCfged = ETrue; - } + { + LOG_FUNC + TPtrC16 sysUtilModelName; + TPtrC16 sysUtilManuName; + + iPersonalityCfged = EFalse; + + iCenRepManager->ReadDeviceConfigurationL(iDeviceConfiguration); + + iCenRepManager->ReadPersonalitiesL(iSupportedPersonalities); + + //update info for SetManufacturer & SetProduct + CDeviceTypeInformation* deviceInfo = SysUtil::GetDeviceTypeInfoL(); + CleanupStack::PushL(deviceInfo); + TInt gotSysUtilModelName = deviceInfo->GetModelName(sysUtilModelName); + TInt gotSysUtilManuName = deviceInfo->GetManufacturerName(sysUtilManuName); + + //To overlap info + if (gotSysUtilManuName == KErrNone) + { + iDeviceConfiguration.iManufacturerName->Des().Copy(sysUtilManuName); + } + + if (gotSysUtilModelName == KErrNone) + { + iDeviceConfiguration.iProductName->Des().Copy(sysUtilModelName); + } + CleanupStack::PopAndDestroy(deviceInfo); + iPersonalityCfged = ETrue; + } void CUsbDevice::SelectClassControllersL() /** @@ -1443,8 +1142,19 @@ */ { LOG_FUNC - - CreateClassControllersL(iCurrentPersonality->SupportedClasses()); + const RArray& classes = iCurrentPersonality->SupportedClasses(); + RArray classUids; + CleanupClosePushL( classUids ); + TInt classCount = classes.Count(); + for(TInt classIndex = 0; classIndex& /* aClassUids*/) @@ -1489,7 +1199,6 @@ TInt smallestId = iSupportedPersonalities[0]->PersonalityId(); TInt count = iSupportedPersonalities.Count(); - for (TInt i = 1; i < count; i++) { if(iSupportedPersonalities[i]->PersonalityId() < smallestId) @@ -1497,7 +1206,7 @@ smallestId = iSupportedPersonalities[i]->PersonalityId(); } } - + SetCurrentPersonalityL(smallestId); SelectClassControllersL(); } @@ -1516,44 +1225,6 @@ CreateClassControllersL(iSupportedClassUids); } -void CUsbDevice::ResourceFileNameL(TFileName& aFileName) -/** - * Gets resource file name - * - * @param aFileName Descriptor to populate with resource file name - */ - { - LOG_FUNC - - RFs fs; - LEAVEIFERRORL(fs.Connect()); - CleanupClosePushL(fs); - -#ifdef __WINS__ - // If we are running in the emulator then read the resource file from system drive. - // This makes testing with different resource files easier. - _LIT(KPrivatePath, ":\\Private\\101fe1db\\"); - aFileName.Append(RFs::GetSystemDriveChar()); //get the name of system drive - aFileName.Append(KPrivatePath); -#else - const TDriveNumber KResourceDrive = EDriveZ; - - TDriveUnit driveUnit(KResourceDrive); - TDriveName drive=driveUnit.Name(); - aFileName.Insert(0, drive); - // append private path - TPath privatePath; - fs.PrivatePath(privatePath); - aFileName.Append(privatePath); -#endif //WINS - - // Find the nearest match of resource file for the chosen locale - aFileName.Append(_L("usbman.rsc")); - BaflUtils::NearestLanguageFile(fs, aFileName); // if a match is not found, usbman.rsc will be used - - CleanupStack::PopAndDestroy(&fs); // fs no longer needed - } - RDevUsbcClient& CUsbDevice::MuepoDoDevUsbcClient() /** * Inherited from MUsbmanExtensionPluginObserver - Function used by plugins to