lafagnosticuifoundation/cone/src/CoeDataStorage.cpp
changeset 0 2f259fa3e83a
child 30 56e9a0aaad89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/cone/src/CoeDataStorage.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,280 @@
+// Copyright (c) 2005-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 <e32base.h>
+#include <s32mem.h>
+#include <centralrepository.h>
+#include <coemain.h>
+#include "coedatastorage.h"
+#include <coedef.h>
+#include <gulcolor.h>
+#include <barsread.h>
+#include "coepanic.h"
+#include <bautils.h>
+#include "coedefkeys.h"
+
+const TUint KUidSystemColorRepository=0x10272619;
+const TUint KSystemColorRepositoryKey=0;
+const TInt KColorListBufferGranularity=1024;
+const TUint KUidFepSpecificSettingsRepository=0x10009793; // also defined in fepbase\source\Fepbase.cpp
+
+// CCoeDataStorage
+
+EXPORT_C CCoeDataStorage& CCoeDataStorage::GetL(CCoeEnv& aCoeEnv)
+	{ // static
+	COwner* owner=STATIC_CAST(COwner*, aCoeEnv.FindStatic(TUid::Uid(COwner::ECoeStaticUid)));
+	if (owner==NULL)
+		{
+		CCoeDataStorage* const dataStorage=NewL();
+		CleanupStack::PushL(dataStorage);
+		owner=new(ELeave) COwner(dataStorage);
+		CleanupStack::Pop(dataStorage);
+		}
+	return *owner->DataStorage();
+	}
+
+EXPORT_C CCoeDataStorage* CCoeDataStorage::NewL()
+	{ // static
+	return new(ELeave) CCoeDataStorage;
+	}
+
+EXPORT_C CCoeDataStorage::~CCoeDataStorage()
+	{
+	delete iFepFrameworkRepository;
+	delete iFepSpecificSettingsRepository;
+	delete iSystemColorListRepository;
+	}
+
+EXPORT_C void CCoeDataStorage::GetInstalledFepIdL(TDes& aFepId)
+	{
+	CRepository& repository=FepFrameworkRepositoryL();
+	if (repository.Get(ERepositoryKey_DynamicFepId, aFepId)!=KErrNone)
+		{
+		User::LeaveIfError(repository.Get(ERepositoryKey_DefaultFepId, aFepId));
+		}
+	}
+
+EXPORT_C void CCoeDataStorage::SetInstalledFepIdL(const TDesC& aFepId)
+	{
+	User::LeaveIfError(FepFrameworkRepositoryL().Set(ERepositoryKey_DynamicFepId, aFepId));
+	}
+
+EXPORT_C void CCoeDataStorage::GetFepAttributeL(TUid aAttributeUid, TDes8& aAttributeData)
+	{
+	CRepository& repository=FepSpecificSettingsRepositoryL();
+	User::LeaveIfError(repository.Get(aAttributeUid.iUid, aAttributeData));
+	}
+
+EXPORT_C void CCoeDataStorage::SetFepAttributeL(TUid aAttributeUid, const TDesC8& aAttributeData)
+	{
+	User::LeaveIfError(FepSpecificSettingsRepositoryL().Set(aAttributeUid.iUid, aAttributeData));
+	}
+
+/** This method will return a new CColorList object poplulated with the color information
+read from a configuration ini-file. If the ini-file cannot be found, this method will return NULL, 
+in which case the color list should be read from resource file. This is the action taken by PopulateColorArrayL(). */
+EXPORT_C CColorList* CCoeDataStorage::GetSystemColorListL()
+	{
+	TBool doesExist = EFalse;
+	CBufFlat* const buffer = GetSystemColorListBufferLC(doesExist);
+	CColorList* colorList = NULL;
+	if (doesExist)
+		{
+		colorList=CColorList::NewLC();
+		RBufReadStream readStream(*buffer);
+		TRAPD(err,colorList->InternalizeL(readStream));
+		CleanupStack::Pop(colorList);
+		if (err != KErrNone)
+			{
+			delete colorList;
+			colorList=NULL;
+			}
+		}
+	CleanupStack::PopAndDestroy(buffer);
+	return colorList;
+	}
+
+EXPORT_C CBufBase* CCoeDataStorage::GetSystemColorListBufferL()
+	{
+	TBool exists=EFalse;
+	CBufFlat* const buffer=GetSystemColorListBufferLC(exists);
+	if (!exists)
+		{
+		buffer->Reset();
+		}
+	CleanupStack::Pop(buffer);
+	return buffer;
+	}
+
+EXPORT_C void CCoeDataStorage::SetSystemColorListL(const CColorList& aColorList)
+	{
+	CBufFlat* const buffer=CBufFlat::NewL(KColorListBufferGranularity);
+	CleanupStack::PushL(buffer);
+	RBufWriteStream writeStream(*buffer);
+	aColorList.ExternalizeL(writeStream);
+	writeStream.CommitL();
+	const TPtrC8 data(buffer->Ptr(0));
+	SetSystemColorListFromBufferL(data);
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+EXPORT_C void CCoeDataStorage::SetSystemColorListFromBufferL(const TDesC8& aBuffer)
+	{
+	User::LeaveIfError(SystemColorListRepositoryL().Set(KSystemColorRepositoryKey, aBuffer));
+	}
+
+/**
+Returns a new color list object. The list will be populated from a configuration ini-file.
+If the ini-file cannot be found, the list will be populated with the default colors from eikpriv.rsc.
+*/
+EXPORT_C CColorList* CCoeDataStorage::PopulateColorArrayL()
+	{
+	CColorList* colorList =GetSystemColorListL();
+	if (colorList==NULL)
+		{
+		TInt numGrays=0;
+		TInt numColors=0;
+		RFs fs;
+		CleanupClosePushL(fs);
+		User::LeaveIfError(fs.Connect());
+		RWsSession ws;
+		CleanupClosePushL(ws);
+		User::LeaveIfError(ws.Connect(fs));
+		TDisplayMode defaultMode=ws.GetDefModeMaxNumColors(numColors,numGrays);
+		const TInt resourceId=(defaultMode>=EColor16? KCoeColorColor16:KCoeColorGray4);
+		_LIT(KResourceFileName,"z:\\Resource\\Uiklaf\\eikpriv.rsc");
+		TFileName resourceFileName(KResourceFileName);
+		BaflUtils::NearestLanguageFile(fs,resourceFileName);
+		if (!(BaflUtils::FileExists(fs, resourceFileName)))
+			{
+			_LIT(KAppResourceFileName,"z:\\Resource\\Apps\\eikpriv.rsc");
+			resourceFileName = KAppResourceFileName;
+			BaflUtils::NearestLanguageFile(fs,resourceFileName);
+			}
+		RResourceFile resourceFile;
+		resourceFile.OpenL(fs, resourceFileName);
+		CleanupClosePushL(resourceFile);
+		resourceFile.ConfirmSignatureL(ECoeResourceSignatureValue);
+		resourceFile.Offset();
+		
+		HBufC8* resource= resourceFile.AllocReadLC(resourceId);
+		TResourceReader reader;
+		reader.SetBuffer(resource);
+		const TInt listId=reader.ReadInt32();
+		const TInt extrasId=reader.ReadInt32();
+		HBufC8* resourceList =resourceFile.AllocReadLC(listId);
+		reader.SetBuffer(resourceList);			
+		CColorArray* colorArray=CColorArray::NewLC();
+		ResourceUtils::PopulateColorArrayL(*colorArray,reader);
+		__ASSERT_ALWAYS(colorArray->Count()==EColorLabelHighlightFullEmphasis+1,Panic(ECoePanicInvalidColorRange));
+		CArrayFix<TRgb>* colors=new(ELeave) CArrayFixFlat<TRgb>(8);
+		CleanupStack::PushL(colors);
+		for (TInt ii=EColorWindowBackground;ii<=EColorLabelHighlightFullEmphasis;ii++)
+			{
+			__ASSERT_ALWAYS(colorArray->Contains(ii),Panic(ECoePanicLogicalColorNotFound));
+			colors->InsertL(STATIC_CAST(TLogicalColor,ii),colorArray->Color(ii));
+			}
+		colorList=CColorList::NewL(colors);
+		CleanupStack::Pop(colors); // colors
+		CleanupStack::PushL(colorList);
+		CColorArray* extrasArray=CColorArray::NewLC();
+		HBufC8* resourceExtras=resourceFile.AllocReadLC(extrasId);
+		reader.SetBuffer(resourceExtras);		
+		ResourceUtils::PopulateColorArrayL(*extrasArray,reader);
+		colorList->AddColorArrayL(TUid::Uid(KCoeCustomColorsArrayValue),extrasArray);
+		CleanupStack::PopAndDestroy(resourceExtras);
+		CleanupStack::Pop(extrasArray); // extrasArray
+		TRAP_IGNORE(SetSystemColorListL(*colorList) );
+		CleanupStack::Pop(colorList);
+		CleanupStack::PopAndDestroy(colorArray); // colorArray
+		CleanupStack::PopAndDestroy(resourceList);
+		CleanupStack::PopAndDestroy(resource);
+		CleanupStack::PopAndDestroy(3); // resourceFile,ws, fs
+		}
+	return colorList;
+	}
+
+
+CRepository& CCoeDataStorage::FepFrameworkRepositoryL()
+	{
+	if (iFepFrameworkRepository==NULL)
+		{
+		iFepFrameworkRepository=CRepository::NewL(TUid::Uid(KUidFepFrameworkRepository));
+		}
+	return *iFepFrameworkRepository;
+	}
+
+CRepository& CCoeDataStorage::FepSpecificSettingsRepositoryL()
+	{
+	if (iFepSpecificSettingsRepository==NULL)
+		{
+		iFepSpecificSettingsRepository=CRepository::NewL(TUid::Uid(KUidFepSpecificSettingsRepository));
+		}
+	return *iFepSpecificSettingsRepository;
+	}
+
+CRepository& CCoeDataStorage::SystemColorListRepositoryL()
+	{
+	if (iSystemColorListRepository==NULL)
+		{
+		iSystemColorListRepository=CRepository::NewL(TUid::Uid(KUidSystemColorRepository));
+		}
+	return *iSystemColorListRepository;
+	}
+
+CBufFlat* CCoeDataStorage::GetSystemColorListBufferLC(TBool& aExists)
+	{
+	aExists=ETrue;
+	CRepository& repository=SystemColorListRepositoryL();
+	CBufFlat* const buffer=CBufFlat::NewL(2048);
+	CleanupStack::PushL(buffer);
+	FOREVER
+		{
+		TInt sizeOfBufferToAllocate=0;
+		TPtr8 bufferAsDescriptor(buffer->Ptr(0));
+		const TInt error=repository.Get(KSystemColorRepositoryKey, bufferAsDescriptor, sizeOfBufferToAllocate);
+		if (error==KErrOverflow)
+			{
+			buffer->ResizeL(sizeOfBufferToAllocate);
+			}
+		else
+			{
+			if (error==KErrNotFound)
+				{
+				aExists=EFalse;
+				}
+			else
+				{
+				User::LeaveIfError(error);
+				}
+			break;
+			}
+		}
+	return buffer;
+	}
+
+// CCoeDataStorage::COwner
+
+CCoeDataStorage::COwner::COwner(CCoeDataStorage* aDataStorage)
+	:CCoeStatic(TUid::Uid(ECoeStaticUid), KMinTInt), // the second parameter (aDestructionPriority) must be less than zero so that this CCoeStatic object still exists when the CCoeEnv's iExtra->iFepTracker is destroyed, as CCoeFepTracker's destructor uses this CCoeStatic object (via CCoeFepTracker's iRepository reference)
+	 iDataStorage(aDataStorage)
+	{
+	}
+
+CCoeDataStorage::COwner::~COwner()
+	{
+	delete iDataStorage;
+	}
+