diff -r 000000000000 -r b16258d2340f applayerprotocols/httpexamples/uaprof/examplecpimanager/examplecpimanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httpexamples/uaprof/examplecpimanager/examplecpimanager.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,192 @@ +// Copyright (c) 2003-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: +// + +// System Includes +#include + +// User Includes +#include "examplecpimanager.h" + + +// The storage location for CPI files on the device. +_LIT(KTxtCpiFilesLocation, "c:\\system\\data\\uaprof\\"); + +// Each CPI file contains two UIDs before the actual CPI data. +// The first UID is to indicate that the file is a UAProf CPI file. +// The second UID is used to differentiate between Profile and Profile-Diff information. +static const TUid KUidUaProfCpi = {0x101F55EE}; +static const TUid KUidProfile = {0x101F55F0}; +static const TUid KUidProfileDiff = {0x101F55F1}; + +// Length in bytes of the two UIDs (Cpi File UID and either either a Profile or Profile-Diff +// file UID) included at the start of all CPI files. +const TInt KFileUIDLength = sizeof(TUint) * 2; + +// The index of the second UID in a CPI file +const TInt KUID2Index = 1; + + +EXPORT_C CExampleCpiManager* CExampleCpiManager::NewL(RStringPool aStringPool) +/** Standard C class construction method + @since 8.0 + @param aStringPool The string pool to use for the creation of all strings in this manager + @return A pointer to a fully constructed CExampleCpiManager +*/ + { + CExampleCpiManager* cpiManager = new (ELeave) CExampleCpiManager(aStringPool); + CleanupStack::PushL(cpiManager); + cpiManager->ConstructL(); + CleanupStack::Pop(cpiManager); + return cpiManager; + } + +CExampleCpiManager::CExampleCpiManager(RStringPool aStringPool) + : iStringPool(aStringPool) +/** Standard constructor + @since 8.0 + @param aStringPool The string pool to use for the creation of all strings in this manager +*/ + { + } + +void CExampleCpiManager::ConstructL() +/** Standard 2nd phase constructor + @since 8.0 +*/ + { + User::LeaveIfError(iFs.Connect()); + FindCpiFilesL(); + DiscoverProfilesL(); + } + +EXPORT_C CExampleCpiManager::~CExampleCpiManager() +/** Standard destructor + @since 8.0 +*/ + { + iCpiFileList.ResetAndDestroy(); + iProfileData.ResetAndDestroy(); + iProfileDiffData.ResetAndDestroy(); + iFs.Close(); + } + +EXPORT_C RPointerArray& CExampleCpiManager::GetProfiles() +/** Gets the Profile data stored on the device + @since 8.0 + @return An array of Profiles +*/ + { + return iProfileData; + } + +EXPORT_C RPointerArray& CExampleCpiManager::GetProfileDiffs() +/** Gets the Profile-Diff data stored on the device + @since 8.0 + @return An array of Profile-Diffs +*/ + { + return iProfileDiffData; + } + +void CExampleCpiManager::FindCpiFilesL() +/** Looks in the UAProf directory for any CPI files and adds them to the array of CPI files + @since 8.0 +*/ + { + TUidType uidType(KUidUaProfCpi); + CDir* dir; + // Get a list of files that match the CPI UID + TInt err = iFs.GetDir(KTxtCpiFilesLocation, uidType, ESortByUid, dir); + CleanupStack::PushL(dir); + if (err == KErrPathNotFound) + User::LeaveIfError(iFs.MkDirAll(KTxtCpiFilesLocation())); + else + User::LeaveIfError(err); + + const TInt fileCount = dir->Count(); + for (TInt i = 0; i < fileCount; ++i) + { + TEntry* entry = NULL; + entry = new (ELeave) TEntry((*dir)[i]); + entry->iName = KTxtCpiFilesLocation(); + (entry->iName.Des()).Append((*dir)[i].iName); + User::LeaveIfError(iCpiFileList.Append(entry)); + } + CleanupStack::PopAndDestroy(dir); + } + +void CExampleCpiManager::DiscoverProfilesL() +/** Loop through the array of CPI files determining, through looking at the UID in + the second array element, whether the CPI files are Profile or Profile-Diff files. + @since 8.0 +*/ + { + const TInt fileCount = iCpiFileList.Count(); + for (TInt ii = 0; ii < fileCount; ++ii) + { + // Look to see if the UID of the file matches that of the UID assigned + // to Profile files. + if ((*iCpiFileList[ii])[KUID2Index] == KUidProfile) + BuildProfilesL(*iCpiFileList[ii], EProfile); + + // Look to see if the UID of the file matches that of the UID assigned + // to Profile-Diff files. + else if ((*iCpiFileList[ii])[KUID2Index] == KUidProfileDiff) + BuildProfilesL(*iCpiFileList[ii], EProfileDiff); + else + User::Leave(KErrCorrupt); + } + } + +void CExampleCpiManager::BuildProfilesL(TEntry& aEntry, CExampleCpiManager::TCpiType aCpiType) +/** Appends the Profile and Profile-Diff data discovered to an array of Profile and + Profile-Diff data respectively + @since 8.0 + @param aEntry The CPI file to extract the Profile or Profile-Diff data from + @param aCpiType The type of CPI the file contains i.e. Profile or Profile-Diff +*/ + { + RFile cpiFile; + User::LeaveIfError(cpiFile.Open(iFs, aEntry.iName, EFileShareExclusive)); + CleanupClosePushL(cpiFile); + + TInt fileSize = 0; + User::LeaveIfError(cpiFile.Size(fileSize)); + + HBufC8* fileReader = HBufC8::NewLC(fileSize); + TPtr8 dataBuffer = fileReader->Des(); + // Start reading from the file following the 2 UIDs found at the beginning of the file + cpiFile.Read(KFileUIDLength, dataBuffer); + HBufC8* cpiData = dataBuffer.AllocLC(); + + switch(aCpiType) + { + case EProfile: + { + User::LeaveIfError(iProfileData.Append(cpiData)); + break; + } + case EProfileDiff: + { + User::LeaveIfError(iProfileDiffData.Append(cpiData)); + break; + } + default: + break; + } + CleanupStack::Pop(cpiData); + CleanupStack::PopAndDestroy(2, &cpiFile); // fileReader, cpiFile + } +