applayerprotocols/httpexamples/uaprof/examplecpimanager/examplecpimanager.cpp
changeset 0 b16258d2340f
--- /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 <http/thttphdrval.h>
+
+// 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<HBufC8>& CExampleCpiManager::GetProfiles()
+/**	Gets the Profile data stored on the device
+	@since		8.0
+	@return		An array of Profiles
+*/
+	{
+	return iProfileData;
+	}
+	
+EXPORT_C RPointerArray<HBufC8>& 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
+	}
+