diff -r 000000000000 -r d0791faffa3f mtpfws/mtpfw/dataproviders/devdp/src/cmtpdevicedpconfigmgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpdevicedpconfigmgr.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,277 @@ +// Copyright (c) 2006-2009 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" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include + +#include +#include +#include <102827af.rsg> +#include "cmtpdevicedpconfigmgr.h" + +enum PanicReason +{ +CMTPDeviceDpConfigMgrPanic = -1, +}; +#ifdef _DEBUG +_LIT(KPanicInvalidInt, "Panic is due to invalid Integer"); +_LIT(KPanicinvalidRssConfigParam, "Panic is due to invalid RSS Config Param"); +#endif + +// Class constants. +__FLOG_STMT(_LIT8(KComponent,"DeviceDpConfigMgr");) + +CMTPDeviceDpConfigMgr* CMTPDeviceDpConfigMgr::NewL(MMTPDataProviderFramework& aFramework) + { + CMTPDeviceDpConfigMgr* self = new (ELeave) CMTPDeviceDpConfigMgr(aFramework); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CMTPDeviceDpConfigMgr::CMTPDeviceDpConfigMgr(MMTPDataProviderFramework& aFramework) : + iFramework(aFramework) + { + } + +void CMTPDeviceDpConfigMgr::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("ConstructL - Entry")); + + iResourceId = iFramework.DataProviderConfig().UintValue(MMTPDataProviderConfig::EOpaqueResource); + + RResourceFile resFile; + CleanupClosePushL(resFile); + + resFile.OpenL(iFramework.Fs(), iFramework.DataProviderConfig().DesCValue(MMTPDataProviderConfig::EResourceFileName)); + HBufC8* res = resFile.AllocReadLC(iResourceId); + + TResourceReader reader; + reader.SetBuffer(res); + + // WORD - enumeration_iteration_length + iEnumItrLength = reader.ReadInt16(); + + // Do not read exclusion_list to conserve memory + // - instead read it in dynamically when requested + CleanupStack::PopAndDestroy(res); + CleanupStack::PopAndDestroy(&resFile); + + __FLOG(_L8("ConstructL - Exit")); + } + +CMTPDeviceDpConfigMgr::~CMTPDeviceDpConfigMgr() + { + __FLOG_CLOSE; + } + +#ifdef _DEBUG +TUint CMTPDeviceDpConfigMgr::UintValueL(TParameter aParam) const +#else +TUint CMTPDeviceDpConfigMgr::UintValueL(TParameter /*aParam*/) const +#endif // _DEBUG + { + __ASSERT_DEBUG(aParam == CMTPDeviceDpConfigMgr::EEnumerationIterationLength, User::Invariant()); + return iEnumItrLength; + } + + +#ifdef _DEBUG +CDesCArray* CMTPDeviceDpConfigMgr::GetArrayValueL(TParameter aParam) const +#else +CDesCArray* CMTPDeviceDpConfigMgr::GetArrayValueL(TParameter /*aParam*/) const +#endif // _DEBUG + { + __ASSERT_DEBUG(aParam == CMTPDeviceDpConfigMgr::EFolderExclusionList, User::Invariant()); + return ReadExclusionListL(); + } + +CDesCArray* CMTPDeviceDpConfigMgr::ReadExclusionListL() const + { + RResourceFile resFile; + CleanupClosePushL(resFile); + + resFile.OpenL(iFramework.Fs(), iFramework.DataProviderConfig().DesCValue(MMTPDataProviderConfig::EResourceFileName)); + HBufC8* res = resFile.AllocReadLC(iResourceId); + + TResourceReader reader; + reader.SetBuffer(res); + + // WORD - enumeration_iteration_length, skip it + reader.ReadInt16(); + + // ARRAY - exclusion_list + CDesCArrayFlat* exclusionList = reader.ReadDesCArrayL(); + + CleanupStack::PopAndDestroy(res); + CleanupStack::PopAndDestroy(&resFile); + return exclusionList; + } + +void CMTPDeviceDpConfigMgr::GetDriveInfoL(TInt aDriveNo, TDes& aVolumeName, TDes& aRootDirPath) + { + __FLOG(_L8("GetDriveInfoL - Entry")); + RResourceFile resFile; + resFile.OpenL(iFramework.Fs(), iFramework.DataProviderConfig().DesCValue(MMTPDataProviderConfig::EResourceFileName)); + CleanupClosePushL(resFile); + HBufC8* dataBuffer=resFile.AllocReadLC(DRIVES); + + TResourceReader reader; + reader.SetBuffer(dataBuffer); + TInt maxDrives = reader.ReadInt16(); + __FLOG_VA((_L8("aDriveNo = %d"), aDriveNo)); + TBool found = EFalse; + for(TInt driveIndex = 0; driveIndex < maxDrives; driveIndex++) + { + TInt driveNumber = reader.ReadInt16(); + TPtrC volumeName = reader.ReadTPtrC(); + TPtrC rootDirName = reader.ReadTPtrC(); + + if(driveNumber == aDriveNo) + { + found = ETrue; + __FLOG_VA((_L8("Found the drive! Drive Number = %d"), driveNumber)); + if ((KMaxFileName > volumeName.Length()) && + (KMaxFileName > rootDirName.Length()) + ) + { + aVolumeName = volumeName; + aRootDirPath = rootDirName; + } + else + { + __FLOG(_L8("VolumeName or RootDirName length is more than KMaxFileName")); + // volumeName and/or rootDirName specified in resource file is too lengthy. + User::Leave(KErrArgument); + } + break; + } + } + + if (!found) + { + __FLOG_VA((_L8("No match in resource file for Drive Number = %d"), aDriveNo)); + // Matching drive number was not found in resource file. + User::Leave(KErrNotFound); + } + + CleanupStack::PopAndDestroy(dataBuffer); + CleanupStack::PopAndDestroy(&resFile); + __FLOG(_L8("GetDriveInfoL - Exit")); + } + +void CMTPDeviceDpConfigMgr::GetFriendlyVolumeNameL(TInt aDriveNo, TDes& aVolumeName) + { + __FLOG(_L8("GetFriendlyVolumeNameL - Entry")); + RBuf rootDirPath; + rootDirPath.CreateL(KMaxFileName); + rootDirPath.CleanupClosePushL(); + GetDriveInfoL(aDriveNo, aVolumeName, rootDirPath); + CleanupStack::PopAndDestroy(); + __FLOG(_L8("GetFriendlyVolumeNameL - Exit")); + } + +void CMTPDeviceDpConfigMgr::GetRootDirPathL(TInt aDriveNo, TDes& aRootDirPath) + { + __FLOG(_L8("GetRootDirPathL - Entry")); + RBuf volumeName; + volumeName.CreateL(KMaxFileName); + volumeName.CleanupClosePushL(); + GetDriveInfoL(aDriveNo, volumeName, aRootDirPath); + CleanupStack::PopAndDestroy(); + __FLOG(_L8("GetRootDirPathL - Exit")); + } + +/** + *This method is to get the ordered format from the rss file + * + *@param aOrderInfoArray : is an array for storing ordered formats(out param). + * + */ + void CMTPDeviceDpConfigMgr::GetRssConfigInfoArrayL(RArray& aOrderInfoArray, TDevDPConfigRSSParams aParam) + { + __FLOG(_L8("GetOrderedFormatInfo - Entry")); + RResourceFile resFile; + resFile.OpenL(iFramework.Fs(), iFramework.DataProviderConfig().DesCValue(MMTPDataProviderConfig::EResourceFileName)); + CleanupClosePushL(resFile); + HBufC8* dataBuffer = NULL; + + switch(aParam) + { + case EDevDpFormats: + dataBuffer = resFile.AllocReadLC(FORMATS); + break; + + case EDevDpExtnUids: + dataBuffer = resFile.AllocReadLC(EXTNPLUGINUIDS); + break; + + default: + //should not come here raise panic + __ASSERT_DEBUG( 0, User::Panic(KPanicinvalidRssConfigParam, CMTPDeviceDpConfigMgrPanic)); + break; + } + + TResourceReader reader; + reader.SetBuffer(dataBuffer); + TInt noOfElem = reader.ReadInt16(); + //rewind to the begening else desc array can not read value. + reader.Rewind(sizeof(TInt16)); + if(0 != noOfElem) + { + CDesCArrayFlat* formatArray = reader.ReadDesCArrayL(); + CleanupStack::PushL(formatArray); + TInt numFormats = formatArray->Count(); + TUint formatInt; + TPtrC orderedFormat; + TInt errorCode = KErrNotFound; + for(TInt formtIndex = 0; formtIndex < numFormats; formtIndex++) + { + orderedFormat.Set(formatArray->MdcaPoint(formtIndex)); + TLex lex(orderedFormat); + errorCode = lex.Val(formatInt, EHex); + //panic in debug mode invalid string is provaided + __ASSERT_DEBUG((errorCode == KErrNone), User::Panic(KPanicInvalidInt, CMTPDeviceDpConfigMgrPanic)); + + if(errorCode ) + { + __FLOG(_L8("ERROR !!!Invalid entry in the config.rss file ")); + } + else + { + //Ignore the duplicate value. + if( aOrderInfoArray.Find(formatInt) == KErrNotFound ) + { + aOrderInfoArray.Append(formatInt); + } + } + } + CleanupStack::PopAndDestroy(formatArray); + CleanupStack::PopAndDestroy(dataBuffer); + CleanupStack::PopAndDestroy(&resFile); + + } + else + { + CleanupStack::PopAndDestroy(dataBuffer); + CleanupStack::PopAndDestroy(&resFile); + User::Leave(KErrArgument); + } + + __FLOG(_L8("GetOrderedFormatInfo - Exit")); + } +